web/app/collab/components/collab-provider.tsxblame
View source
0b4b5821"use client";
0b4b5822
0b4b5823import { createContext, useContext, type ReactNode, type MutableRefObject } from "react";
0b4b5824import { useCollabSocket, type CollabUser, type CollabNote } from "../hooks/use-collab-socket";
0b4b5825
0b4b5826interface CollabContextValue {
0b4b5827 connected: boolean;
0b4b5828 users: Record<string, CollabUser>;
0b4b5829 notes: Record<string, CollabNote[]>;
0b4b58210 emit: (event: string, data?: any) => void;
0b4b58211 onCursorUpdated: MutableRefObject<((data: any) => void) | null>;
0b4b58212 onCursorRemoved: MutableRefObject<((data: any) => void) | null>;
0b4b58213 onDiagramCode: MutableRefObject<((data: any) => void) | null>;
0b4b58214 onYjsSync: MutableRefObject<((data: any) => void) | null>;
0b4b58215 onYjsUpdate: MutableRefObject<((data: any) => void) | null>;
0b4b58216}
0b4b58217
0b4b58218const CollabContext = createContext<CollabContextValue | null>(null);
0b4b58219
0b4b58220export function useCollab() {
0b4b58221 const ctx = useContext(CollabContext);
0b4b58222 if (!ctx) throw new Error("useCollab must be used within CollabProvider");
0b4b58223 return ctx;
0b4b58224}
0b4b58225
0b4b58226export function CollabProvider({
0b4b58227 owner,
0b4b58228 repo,
0b4b58229 children,
0b4b58230}: {
0b4b58231 owner: string;
0b4b58232 repo: string;
0b4b58233 children: ReactNode;
0b4b58234}) {
0b4b58235 const collab = useCollabSocket({ owner, repo });
0b4b58236
0b4b58237 return (
0b4b58238 <CollabContext.Provider value={collab}>
0b4b58239 {children}
0b4b58240 </CollabContext.Provider>
0b4b58241 );
0b4b58242}