1.2 KB43 lines
Blame
1"use client";
2
3import { createContext, useContext, type ReactNode, type MutableRefObject } from "react";
4import { useCollabSocket, type CollabUser, type CollabNote } from "../hooks/use-collab-socket";
5
6interface CollabContextValue {
7 connected: boolean;
8 users: Record<string, CollabUser>;
9 notes: Record<string, CollabNote[]>;
10 emit: (event: string, data?: any) => void;
11 onCursorUpdated: MutableRefObject<((data: any) => void) | null>;
12 onCursorRemoved: MutableRefObject<((data: any) => void) | null>;
13 onDiagramCode: MutableRefObject<((data: any) => void) | null>;
14 onYjsSync: MutableRefObject<((data: any) => void) | null>;
15 onYjsUpdate: MutableRefObject<((data: any) => void) | null>;
16}
17
18const CollabContext = createContext<CollabContextValue | null>(null);
19
20export function useCollab() {
21 const ctx = useContext(CollabContext);
22 if (!ctx) throw new Error("useCollab must be used within CollabProvider");
23 return ctx;
24}
25
26export function CollabProvider({
27 owner,
28 repo,
29 children,
30}: {
31 owner: string;
32 repo: string;
33 children: ReactNode;
34}) {
35 const collab = useCollabSocket({ owner, repo });
36
37 return (
38 <CollabContext.Provider value={collab}>
39 {children}
40 </CollabContext.Provider>
41 );
42}
43