From d7fedb629503d88cc5e7abe78adb1c09fb810c5b Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 Oct 2026 00:38:44 +0000 Subject: [PATCH] Update static/js/01-api.js --- static/js/01-api.js | 109 ++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 60 deletions(-) diff --git a/static/js/01-api.js b/static/js/01-api.js index f3cd213..1b5457c 100644 --- a/static/js/01-api.js +++ b/static/js/01-api.js @@ -1,8 +1,6 @@ // static/js/01-api.js "use strict"; - window.Glow = window.Glow || {}; - Glow.refreshCsrfToken = async () => { const response = await fetch("/api/csrf", { credentials: "same-origin", @@ -10,15 +8,12 @@ Glow.refreshCsrfToken = async () => { Accept: "application/json" } }); - if (!response.ok) { throw new Error("Could not refresh security token."); } - const data = await response.json(); Glow.state.csrfToken = data.csrf_token || ""; }; - Glow.handleUnauthorized = () => { Glow.state.currentUser = null; Glow.state.csrfToken = ""; @@ -55,11 +50,9 @@ Glow.handleUnauthorized = () => { Glow.state.calls.signalLastSeenId = 0; Glow.state.calls.incomingCall = null; Glow.state.calls.pendingOffer = null; - clearTimeout(Glow.state.pollTimer); clearTimeout(Glow.state.typingTimer); clearTimeout(Glow.state.calls.pollTimer); - Glow.clearMessages?.(); Glow.clearFeed?.(); Glow.clearDms?.(); @@ -67,53 +60,41 @@ Glow.handleUnauthorized = () => { Glow.closeReactionPopup?.(); Glow.closeMediaModal?.(); Glow.endLocalCallUi?.(); - Glow.setSelectedAttachment?.([]); Glow.setSelectedThreadAttachment?.([]); - Glow.els.threadBox?.replaceChildren(); Glow.els.pagesBox?.replaceChildren(); Glow.els.pageDetailBox?.replaceChildren(); Glow.els.profileBox?.replaceChildren(); - if (Glow.els.teamSelect) { Glow.els.teamSelect.replaceChildren(); Glow.els.teamSelect.disabled = true; } - if (Glow.els.roomSelect) { Glow.els.roomSelect.replaceChildren(); Glow.els.roomSelect.disabled = true; } - if (Glow.els.typingBar) { Glow.els.typingBar.textContent = ""; Glow.els.typingBar.classList.add("hidden"); } - if (Glow.els.presenceLabel) { Glow.els.presenceLabel.textContent = ""; Glow.els.presenceLabel.classList.add("hidden"); } - Glow.state.activeView = "feed"; - Glow.updateAuthUI?.(); Glow.showAuthNotice?.("Your session has expired. Please sign in again."); Glow.els.authOverlay.classList.remove("hidden"); }; - Glow.apiRequest = async (url, options = {}, retryCsrf = true) => { const method = (options.method || "GET").toUpperCase(); const headers = new Headers(options.headers || {}); headers.set("Accept", "application/json"); - if (!["GET", "HEAD"].includes(method)) { headers.set("X-CSRF-Token", Glow.state.csrfToken || ""); } - let response; - try { response = await fetch(url, { credentials: "same-origin", @@ -126,29 +107,23 @@ Glow.apiRequest = async (url, options = {}, retryCsrf = true) => { error.code = "network"; throw error; } - let data = {}; - try { data = await response.json(); } catch (_) { data = {}; } - if (response.status === 403 && data.code === "blacklisted") { Glow.showBlocked(data.error); throw new Error(data.error || "Access blocked."); } - if (response.status === 403 && data.code === "csrf" && retryCsrf) { await Glow.refreshCsrfToken(); return Glow.apiRequest(url, options, false); } - if (response.status === 401) { Glow.handleUnauthorized(); } - if (!response.ok) { const error = new Error(data.error || "Request failed."); error.status = response.status; @@ -158,11 +133,9 @@ Glow.apiRequest = async (url, options = {}, retryCsrf = true) => { error.data = data; throw error; } - if (data.csrf_token) { Glow.state.csrfToken = data.csrf_token; } - return data; }; @@ -174,10 +147,8 @@ Glow.apiUpdateMyProfile = payload => headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiGetPublicProfile = username => Glow.apiRequest(`/api/profiles/${encodeURIComponent(username)}`); - Glow.apiGetMySettings = () => Glow.apiRequest("/api/settings"); Glow.apiUpdateMySettings = payload => Glow.apiRequest("/api/settings", { @@ -186,6 +157,54 @@ Glow.apiUpdateMySettings = payload => body: JSON.stringify(payload) }); +/* pins / shares / bookmarks / schedule */ +Glow.apiPinMessage = messageId => + Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/pin`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({}) + }); +Glow.apiUnpinMessage = messageId => + Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/pin`, { + method: "DELETE" + }); +Glow.apiListPins = (scope, scopeId) => + Glow.apiRequest(`/api/pins?scope=${encodeURIComponent(scope)}&scope_id=${encodeURIComponent(scopeId)}`); +Glow.apiCreateMessageShare = messageId => + Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/share`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({}) + }); +Glow.apiCreateAttachmentShare = attachmentId => + Glow.apiRequest(`/api/attachments/${encodeURIComponent(attachmentId)}/share`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({}) + }); +Glow.apiBookmarkMessage = messageId => + Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/bookmark`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({}) + }); +Glow.apiUnbookmarkMessage = messageId => + Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/bookmark`, { + method: "DELETE" + }); +Glow.apiListBookmarks = () => Glow.apiRequest("/api/bookmarks"); +Glow.apiCreateScheduledMessage = payload => + Glow.apiRequest("/api/scheduled-messages", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload) + }); +Glow.apiListScheduledMessages = () => Glow.apiRequest("/api/scheduled-messages"); +Glow.apiCancelScheduledMessage = id => + Glow.apiRequest(`/api/scheduled-messages/${encodeURIComponent(id)}`, { + method: "DELETE" + }); + /* teams/channels */ Glow.apiCreateTeam = payload => Glow.apiRequest("/api/teams", { @@ -193,21 +212,18 @@ Glow.apiCreateTeam = payload => headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiUpdateTeam = (teamSlug, payload) => Glow.apiRequest(`/api/teams/${encodeURIComponent(teamSlug)}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiCreateChannel = (teamSlug, payload) => Glow.apiRequest(`/api/teams/${encodeURIComponent(teamSlug)}/channels`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiUpdateChannel = (teamSlug, channelSlug, payload) => Glow.apiRequest( `/api/teams/${encodeURIComponent(teamSlug)}/channels/${encodeURIComponent(channelSlug)}`, @@ -217,23 +233,19 @@ Glow.apiUpdateChannel = (teamSlug, channelSlug, payload) => body: JSON.stringify(payload) } ); - Glow.apiDeleteChannel = (teamSlug, channelSlug) => Glow.apiRequest( `/api/teams/${encodeURIComponent(teamSlug)}/channels/${encodeURIComponent(channelSlug)}`, { method: "DELETE" } ); - Glow.apiListTeamMembers = teamSlug => Glow.apiRequest(`/api/teams/${encodeURIComponent(teamSlug)}/members`); - Glow.apiAddTeamMember = (teamSlug, payload) => Glow.apiRequest(`/api/teams/${encodeURIComponent(teamSlug)}/members`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiUpdateTeamMember = (teamSlug, userId, payload) => Glow.apiRequest( `/api/teams/${encodeURIComponent(teamSlug)}/members/${encodeURIComponent(userId)}`, @@ -243,20 +255,17 @@ Glow.apiUpdateTeamMember = (teamSlug, userId, payload) => body: JSON.stringify(payload) } ); - Glow.apiRemoveTeamMember = (teamSlug, userId) => Glow.apiRequest( `/api/teams/${encodeURIComponent(teamSlug)}/members/${encodeURIComponent(userId)}`, { method: "DELETE" } ); - Glow.apiCreateTeamInvite = (teamSlug, payload = {}) => Glow.apiRequest(`/api/teams/${encodeURIComponent(teamSlug)}/invites`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiAcceptTeamInvite = token => Glow.apiRequest(`/api/team-invites/${encodeURIComponent(token)}/accept`, { method: "POST", @@ -271,7 +280,6 @@ Glow.apiCreateRoom = payload => headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiUpdateRoom = (roomSlug, payload) => Glow.apiRequest(`/api/rooms/${encodeURIComponent(roomSlug)}`, { method: "PATCH", @@ -282,14 +290,12 @@ Glow.apiUpdateRoom = (roomSlug, payload) => /* reactions */ Glow.apiGetMessageReactions = messageId => Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/reactions`); - Glow.apiAddReaction = (messageId, emoji) => Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/reactions`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ emoji }) }); - Glow.apiRemoveReaction = (messageId, emoji) => Glow.apiRequest( `/api/messages/${encodeURIComponent(messageId)}/reactions/${encodeURIComponent(emoji)}`, @@ -303,38 +309,30 @@ Glow.apiEditMessage = (messageId, payload) => headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiSearch = query => Glow.apiRequest(`/api/search?q=${encodeURIComponent(query)}`); - Glow.apiMarkRead = messageIds => Glow.apiRequest("/api/read-receipts", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message_ids: messageIds }) }); - Glow.apiGetMessageReceipts = messageId => Glow.apiRequest(`/api/messages/${encodeURIComponent(messageId)}/receipts`); - Glow.apiPingPresence = payload => Glow.apiRequest("/api/presence", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiGetRoomPresence = roomSlug => Glow.apiRequest(`/api/rooms/${encodeURIComponent(roomSlug)}/presence`); - Glow.apiGetChannelPresence = (teamSlug, channelSlug) => Glow.apiRequest( `/api/teams/${encodeURIComponent(teamSlug)}/channels/${encodeURIComponent(channelSlug)}/presence` ); - Glow.apiGetDmPresence = dmId => Glow.apiRequest(`/api/dms/${encodeURIComponent(dmId)}/presence`); - Glow.apiLoadHistory = params => { const qs = new URLSearchParams(params); return Glow.apiRequest(`/api/messages/history?${qs.toString()}`); @@ -342,31 +340,26 @@ Glow.apiLoadHistory = params => { /* DMs */ Glow.apiListDms = () => Glow.apiRequest("/api/dms"); - Glow.apiCreateDm = payload => Glow.apiRequest("/api/dms", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiGetDmMessages = (dmId, afterId = null) => { const base = `/api/dms/${encodeURIComponent(dmId)}/messages`; return Glow.apiRequest( afterId == null ? base : `${base}?after_id=${encodeURIComponent(afterId)}` ); }; - Glow.apiSendDmMessage = (dmId, payload) => Glow.apiRequest(`/api/dms/${encodeURIComponent(dmId)}/messages`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiGetDmTyping = dmId => Glow.apiRequest(`/api/dms/${encodeURIComponent(dmId)}/typing`); - Glow.apiSetDmTyping = (dmId, typing) => Glow.apiRequest(`/api/dms/${encodeURIComponent(dmId)}/typing`, { method: "POST", @@ -381,25 +374,21 @@ Glow.apiCreateCall = dmId => headers: { "Content-Type": "application/json" }, body: JSON.stringify({}) }); - Glow.apiGetCall = callId => Glow.apiRequest(`/api/calls/${encodeURIComponent(callId)}`); - Glow.apiPostCallSignal = (callId, payload) => Glow.apiRequest(`/api/calls/${encodeURIComponent(callId)}/signal`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); - Glow.apiGetCallSignals = (callId, afterId = 0) => Glow.apiRequest( `/api/calls/${encodeURIComponent(callId)}/signals?after_id=${encodeURIComponent(afterId)}` ); - Glow.apiEndCall = callId => Glow.apiRequest(`/api/calls/${encodeURIComponent(callId)}/end`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({}) - }); + }); \ No newline at end of file