MVP-1: helpdesk core with dashboard, Telegram channel, customer portal
Next.js 16 + Drizzle/SQLite (matching ~/project-claude conventions), SSE-based realtime updates, admin dashboard with status columns, ticket thread view, Telegram long-polling integration (inbound + outbound), token-based customer portal, Docker Compose packaging. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QcXH24ky6zjk2UyK5oZUPH
This commit is contained in:
1 parent
888b7b82ba
commit
cf0b6cf58e
59 files changed
+12556
No files matched your search
@@ -0,0 +1,24 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useLayoutEffect, useRef } from "react";
|
||||
import type { TicketEvent } from "@/lib/events/bus";
|
||||
|
||||
/** Subscribes to a ticket-events SSE endpoint for the lifetime of the component. */
|
||||
export function useTicketEvents(url: string, onEvent: (event: TicketEvent) => void) {
|
||||
const handlerRef = useRef(onEvent);
|
||||
useLayoutEffect(() => {
|
||||
handlerRef.current = onEvent;
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const source = new EventSource(url);
|
||||
source.onmessage = (e) => {
|
||||
try {
|
||||
handlerRef.current(JSON.parse(e.data) as TicketEvent);
|
||||
} catch {
|
||||
// malformed payload — ignore rather than crash the subscription
|
||||
}
|
||||
};
|
||||
return () => source.close();
|
||||
}, [url]);
|
||||
}
|
||||
Reference in new issue
Block a user