|
2 | 2 | * post-interactions.js |
3 | 3 | * - いいね(Like)とブックマークのクライアント実装 |
4 | 4 | * - localStorage を利用したフォールバック(サーバーが無くても動作) |
5 | | - * - window.__POST_INTERACTIONS_CONFIG に API のベース URL が埋め込まれていれば |
6 | | - * 可能な限り API と同期を試みる(API の仕様に応じて修正してください) |
| 5 | + * - window.__POST_INTERACTIONS_CONFIG に GAS Web App URL が埋め込まれていれば |
| 6 | + * GET クエリ(action=get|like|unlike&postId=...)を使って API と同期 |
7 | 7 | * |
8 | 8 | * 実装方針(軽量): |
9 | 9 | * - Bookmark: localStorage に保存(ユーザー毎のブックマーク) |
10 | | - * - Like: ユーザー単体の「自分がいいねしたか」は localStorage。総数は localStorage に保存(グローバル永続化には API が必要) |
| 10 | + * - Like: ユーザー単体の「自分がいいねしたか」は localStorage。総数は API から取得(グローバル永続化) |
11 | 11 | * |
12 | 12 | * 依存なし(Vanilla JS) |
13 | 13 | */ |
|
96 | 96 | else btn.classList.remove("is-bookmarked"); |
97 | 97 | } |
98 | 98 |
|
99 | | - // API 呼び出し(あくまで「試みる」実装。実際のエンドポイント仕様に合わせて調整してください) |
| 99 | + // GAS Web App API 呼び出し |
| 100 | + // GET: action=get|like|unlike&postId=... |
| 101 | + // レスポンス: { likes: number, ... } |
100 | 102 | async function fetchLikeCountFromApi(postId) { |
101 | 103 | if (!API_BASE) return null; |
102 | 104 | try { |
103 | | - const res = await fetch( |
104 | | - `${API_BASE.replace(/\/$/, "")}/posts/${encodeURIComponent(postId)}`, |
105 | | - ); |
| 105 | + const url = new URL(API_BASE); |
| 106 | + url.searchParams.set("action", "get"); |
| 107 | + url.searchParams.set("postId", postId); |
| 108 | + const res = await fetch(url.toString()); |
106 | 109 | if (!res.ok) return null; |
107 | 110 | const json = await res.json(); |
108 | | - // 期待: { likes: number, ... } |
109 | 111 | return typeof json.likes === "number" |
110 | 112 | ? json.likes |
111 | 113 | : null; |
|
117 | 119 | async function sendLikeToggleToApi(postId, action) { |
118 | 120 | if (!API_BASE) return null; |
119 | 121 | try { |
120 | | - const res = await fetch( |
121 | | - `${API_BASE.replace(/\/$/, "")}/posts/${encodeURIComponent(postId)}/like`, |
122 | | - { |
123 | | - method: "POST", |
124 | | - headers: { "Content-Type": "application/json" }, |
125 | | - body: JSON.stringify({ action }), // action: 'like' or 'unlike' |
126 | | - }, |
127 | | - ); |
| 122 | + const url = new URL(API_BASE); |
| 123 | + url.searchParams.set("action", action); // 'like' or 'unlike' |
| 124 | + url.searchParams.set("postId", postId); |
| 125 | + const res = await fetch(url.toString()); |
128 | 126 | if (!res.ok) return null; |
129 | 127 | const json = await res.json(); |
130 | 128 | return typeof json.likes === "number" |
|
0 commit comments