Merge pull request #57 from kitpdr/fix/message-display-and-idle-status
fix: message display and idle status validation
2 files · +11 -1
M src/lib/states/chat.svelte.ts +10 -0
| @@ -558,6 +558,16 @@ class ChatState { | |||
| 558 | 558 | } | |
| 559 | 559 | ||
| 560 | 560 | console.debug('Message sent successfully:', data.message); | |
| 561 | + | ||
| 562 | + | // Add message to state immediately for instant display (optimistic update) | |
| 563 | + | // SSE deduplication will handle any duplicate when the broadcast arrives | |
| 564 | + | if (data.message) { | |
| 565 | + | this.messages = Array.from( | |
| 566 | + | new Map([...this.messages, data.message].map((m) => [m.id, m])).values() | |
| 567 | + | ); | |
| 568 | + | this.messages.sort((a, b) => a.timestamp - b.timestamp); | |
| 569 | + | } | |
| 570 | + | ||
| 561 | 571 | await invalidate('chat:messages'); | |
| 562 | 572 | return data; | |
| 563 | 573 | } catch (error) { | |
| @@ -558,6 +558,16 @@ class ChatState { | |||||
| 558 | } | 558 | } | ||
| 559 | 559 | ||||
| 560 | console.debug('Message sent successfully:', data.message); | 560 | console.debug('Message sent successfully:', data.message); | ||
| 561 | + | ||||
| 562 | + | // Add message to state immediately for instant display (optimistic update) | |||
| 563 | + | // SSE deduplication will handle any duplicate when the broadcast arrives | |||
| 564 | + | if (data.message) { | |||
| 565 | + | this.messages = Array.from( | |||
| 566 | + | new Map([...this.messages, data.message].map((m) => [m.id, m])).values() | |||
| 567 | + | ); | |||
| 568 | + | this.messages.sort((a, b) => a.timestamp - b.timestamp); | |||
| 569 | + | } | |||
| 570 | + | ||||
| 561 | await invalidate('chat:messages'); | 571 | await invalidate('chat:messages'); | ||
| 562 | return data; | 572 | return data; | ||
| 563 | } catch (error) { | 573 | } catch (error) { | ||
M src/routes/api/status/+server.ts +1 -1
| @@ -21,7 +21,7 @@ export const POST: RequestHandler = async ({ request, cookies, locals }) => { | |||
| 21 | 21 | ||
| 22 | 22 | try { | |
| 23 | 23 | const { status } = await request.json(); | |
| 24 | - | const validStatuses = ['online', 'away', 'busy', 'offline']; | |
| 24 | + | const validStatuses = ['online', 'away', 'busy', 'offline', 'idle']; | |
| 25 | 25 | if (!validStatuses.includes(status)) { | |
| 26 | 26 | log.warn('Invalid status received', { status }); | |
| 27 | 27 | return new Response(JSON.stringify({ success: false, error: 'Invalid status' }), { | |
| @@ -21,7 +21,7 @@ export const POST: RequestHandler = async ({ request, cookies, locals }) => { | |||||
| 21 | 21 | ||||
| 22 | try { | 22 | try { | ||
| 23 | const { status } = await request.json(); | 23 | const { status } = await request.json(); | ||
| 24 | - | const validStatuses = ['online', 'away', 'busy', 'offline']; | 24 | + | const validStatuses = ['online', 'away', 'busy', 'offline', 'idle']; |
| 25 | if (!validStatuses.includes(status)) { | 25 | if (!validStatuses.includes(status)) { | ||
| 26 | log.warn('Invalid status received', { status }); | 26 | log.warn('Invalid status received', { status }); | ||
| 27 | return new Response(JSON.stringify({ success: false, error: 'Invalid status' }), { | 27 | return new Response(JSON.stringify({ success: false, error: 'Invalid status' }), { | ||