diff --git a/internal/auth/cookie.go b/internal/auth/cookie.go index e426edd..14fdfa5 100644 --- a/internal/auth/cookie.go +++ b/internal/auth/cookie.go @@ -10,11 +10,6 @@ import ( // Shared by password login, registration, and WebAuthn login. func SetSessionCookie(w http.ResponseWriter, cookieName, token string, duration time.Duration) { secure := os.Getenv("COOKIE_SECURE") == "true" - - sameSite := http.SameSiteLaxMode - if secure { - sameSite = http.SameSiteStrictMode - } http.SetCookie(w, &http.Cookie{ Name: cookieName, @@ -22,7 +17,7 @@ func SetSessionCookie(w http.ResponseWriter, cookieName, token string, duration Path: "/", HttpOnly: true, Secure: secure, - SameSite: sameSite, + SameSite: http.SameSiteDefaultMode, MaxAge: int(duration.Seconds()), }) } diff --git a/web/src/components/ChatArea.tsx b/web/src/components/ChatArea.tsx index b77fff8..d387d9e 100644 --- a/web/src/components/ChatArea.tsx +++ b/web/src/components/ChatArea.tsx @@ -82,10 +82,10 @@ export function ChatArea() { {messages.map((message) => (
- [{formatTime(message.createdAt)}] + [{formatTime(message.created_at)}] {" "} - <{message.author.username}> + <{message.author_username}> {" "} {message.content}
diff --git a/web/src/stores/message.ts b/web/src/stores/message.ts index 01448df..031dc6c 100644 --- a/web/src/stores/message.ts +++ b/web/src/stores/message.ts @@ -1,14 +1,15 @@ -import { create } from 'zustand'; -import { api } from '../lib/api.ts'; -import type { User } from './auth.ts'; +import { create } from "zustand"; +import { api } from "../lib/api.ts"; export interface Message { id: string; - channelId: string; - author: User; + channel_id: string; + author_id: string; + author_username: string; + author_display_name: string | null; content: string; - createdAt: string; - updatedAt?: string; + created_at: string; + edited_at: string | null; } interface MessageState { @@ -30,22 +31,33 @@ export const useMessageStore = create((set) => ({ fetchMessages: async (channelId, before) => { set({ isLoading: true, error: null }); try { - const params = before ? `?before=${encodeURIComponent(before)}` : ''; - const messages = await api.get(`/channels/${channelId}/messages${params}`); + const params = before ? `?before=${encodeURIComponent(before)}` : ""; + const messages = await api.get( + `/channels/${channelId}/messages${params}`, + ); set((state) => ({ - messagesByChannel: { ...state.messagesByChannel, [channelId]: messages }, + messagesByChannel: { + ...state.messagesByChannel, + [channelId]: Array.isArray(messages) ? messages : [], + }, isLoading: false, })); } catch (error) { set({ isLoading: false, - error: error instanceof Error ? error.message : 'Failed to fetch messages', + error: + error instanceof Error + ? error.message + : "Failed to fetch messages", }); } }, sendMessage: async (channelId, content) => { - const message = await api.post(`/channels/${channelId}/messages`, { content }); + const message = await api.post( + `/channels/${channelId}/messages`, + { content }, + ); set((state) => { const list = state.messagesByChannel[channelId] || []; return { @@ -60,25 +72,27 @@ export const useMessageStore = create((set) => ({ addMessage: (message) => set((state) => { - const list = state.messagesByChannel[message.channelId] || []; + const list = state.messagesByChannel[message.channel_id] || []; if (list.some((m) => m.id === message.id)) { return state; } return { messagesByChannel: { ...state.messagesByChannel, - [message.channelId]: [...list, message], + [message.channel_id]: [...list, message], }, }; }), updateMessage: (message) => set((state) => { - const list = state.messagesByChannel[message.channelId] || []; + const list = state.messagesByChannel[message.channel_id] || []; return { messagesByChannel: { ...state.messagesByChannel, - [message.channelId]: list.map((m) => (m.id === message.id ? message : m)), + [message.channel_id]: list.map((m) => + m.id === message.id ? message : m, + ), }, }; }), diff --git a/web/src/stores/ws.ts b/web/src/stores/ws.ts index 4238525..5f1974d 100644 --- a/web/src/stores/ws.ts +++ b/web/src/stores/ws.ts @@ -50,14 +50,14 @@ function extractServer(payload: UnknownPayload): Server | null { } function extractIds(payload: UnknownPayload): { channelId: string; messageId: string } | null { - if (typeof payload.channelId !== 'string' || typeof payload.messageId !== 'string') { + if (typeof payload.channel_id !== 'string' || typeof payload.message_id !== 'string') { return null; } - return { channelId: payload.channelId, messageId: payload.messageId }; + return { channelId: payload.channel_id, messageId: payload.message_id }; } function extractChannelId(payload: UnknownPayload): string | null { - return typeof payload.channelId === 'string' ? payload.channelId : null; + return typeof payload.channel_id === 'string' ? payload.channel_id : null; } export const useWebSocketStore = create((set, get) => ({ @@ -142,7 +142,7 @@ export const useWebSocketStore = create((set, get) => ({ } case 'message_deleted': { const ids = extractIds(data.payload); - if (ids) removeMessage(ids.channelId, ids.messageId); + if (ids) removeMessage(ids.channel_id, ids.message_id); break; } case 'channel_created': {