@apoorvdwi/excalidraw-collab
Version:
Excalidraw as a React component
183 lines (182 loc) • 11.4 kB
TypeScript
/// <reference types="lodash" />
import { PureComponent } from "react";
import { ExcalidrawImperativeAPI } from "../../types";
import { ImportedDataState } from "../../data/types";
import { ExcalidrawElement } from "../../element/types";
import { Gesture } from "../../types";
import { SocketUpdateDataSource, SyncableExcalidrawElement } from "../data";
import Portal from "./Portal";
import { UserIdleState } from "../../types";
import { FileManager } from "../data/FileManager";
import Video from "twilio-video";
export declare const collabAPIAtom: import("jotai").Atom<CollabAPI | null> & {
write: (get: {
<Value>(atom: import("jotai").Atom<Value | Promise<Value>>): Value;
<Value_1>(atom: import("jotai").Atom<Promise<Value_1>>): Value_1;
<Value_2>(atom: import("jotai").Atom<Value_2>): Value_2 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_2;
} & {
<Value_3>(atom: import("jotai").Atom<Value_3 | Promise<Value_3>>, options: {
unstable_promise: true;
}): Value_3 | Promise<Value_3>;
<Value_4>(atom: import("jotai").Atom<Promise<Value_4>>, options: {
unstable_promise: true;
}): Value_4 | Promise<Value_4>;
<Value_5>(atom: import("jotai").Atom<Value_5>, options: {
unstable_promise: true;
}): (Value_5 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_5) | Promise<Value_5 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_5>;
}, set: {
<Value_6, Result extends void | Promise<void>>(atom: import("jotai").WritableAtom<Value_6, undefined, Result>): Result;
<Value_7, Update, Result_1 extends void | Promise<void>>(atom: import("jotai").WritableAtom<Value_7, Update, Result_1>, update: Update): Result_1;
}, update: CollabAPI | ((prev: CollabAPI | null) => CollabAPI | null) | null) => void;
onMount?: (<S extends (update: CollabAPI | ((prev: CollabAPI | null) => CollabAPI | null) | null) => void>(setAtom: S) => void | (() => void)) | undefined;
} & {
init: CollabAPI | null;
};
export declare const collabDialogShownAtom: import("jotai").Atom<boolean> & {
write: (get: {
<Value>(atom: import("jotai").Atom<Value | Promise<Value>>): Value;
<Value_1>(atom: import("jotai").Atom<Promise<Value_1>>): Value_1;
<Value_2>(atom: import("jotai").Atom<Value_2>): Value_2 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_2;
} & {
<Value_3>(atom: import("jotai").Atom<Value_3 | Promise<Value_3>>, options: {
unstable_promise: true;
}): Value_3 | Promise<Value_3>;
<Value_4>(atom: import("jotai").Atom<Promise<Value_4>>, options: {
unstable_promise: true;
}): Value_4 | Promise<Value_4>;
<Value_5>(atom: import("jotai").Atom<Value_5>, options: {
unstable_promise: true;
}): (Value_5 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_5) | Promise<Value_5 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_5>;
}, set: {
<Value_6, Result extends void | Promise<void>>(atom: import("jotai").WritableAtom<Value_6, undefined, Result>): Result;
<Value_7, Update, Result_1 extends void | Promise<void>>(atom: import("jotai").WritableAtom<Value_7, Update, Result_1>, update: Update): Result_1;
}, update: boolean | ((prev: boolean) => boolean)) => void;
onMount?: (<S extends (update: boolean | ((prev: boolean) => boolean)) => void>(setAtom: S) => void | (() => void)) | undefined;
} & {
init: boolean;
};
export declare const isCollaboratingAtom: import("jotai").Atom<boolean> & {
write: (get: {
<Value>(atom: import("jotai").Atom<Value | Promise<Value>>): Value;
<Value_1>(atom: import("jotai").Atom<Promise<Value_1>>): Value_1;
<Value_2>(atom: import("jotai").Atom<Value_2>): Value_2 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_2;
} & {
<Value_3>(atom: import("jotai").Atom<Value_3 | Promise<Value_3>>, options: {
unstable_promise: true;
}): Value_3 | Promise<Value_3>;
<Value_4>(atom: import("jotai").Atom<Promise<Value_4>>, options: {
unstable_promise: true;
}): Value_4 | Promise<Value_4>;
<Value_5>(atom: import("jotai").Atom<Value_5>, options: {
unstable_promise: true;
}): (Value_5 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_5) | Promise<Value_5 extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? V extends Promise<infer V> ? any : V : V : V : V : V : V : V : V : V : V : Value_5>;
}, set: {
<Value_6, Result extends void | Promise<void>>(atom: import("jotai").WritableAtom<Value_6, undefined, Result>): Result;
<Value_7, Update, Result_1 extends void | Promise<void>>(atom: import("jotai").WritableAtom<Value_7, Update, Result_1>, update: Update): Result_1;
}, update: boolean | ((prev: boolean) => boolean)) => void;
onMount?: (<S extends (update: boolean | ((prev: boolean) => boolean)) => void>(setAtom: S) => void | (() => void)) | undefined;
} & {
init: boolean;
};
interface CollabState {
errorMessage: string;
user: {
name: string;
color: string;
};
activeRoomLink: string;
}
declare type CollabInstance = InstanceType<typeof Collab>;
export interface CollabAPI {
/** function so that we can access the latest value from stale callbacks */
isCollaborating: () => boolean;
onPointerUpdate: CollabInstance["onPointerUpdate"];
startCollaboration: CollabInstance["startCollaboration"];
stopCollaboration: CollabInstance["stopCollaboration"];
syncElements: CollabInstance["syncElements"];
fetchImageFilesFromFirebase: CollabInstance["fetchImageFilesFromFirebase"];
setUsername: (user: {
name: string;
color: string;
}) => void;
}
interface PublicProps {
excalidrawAPI: ExcalidrawImperativeAPI;
user: {
name: string;
color: string;
};
room: Video.Room;
firebaseConfig: any;
}
declare type Props = PublicProps & {
modalIsShown: boolean;
};
declare class Collab extends PureComponent<Props, CollabState> {
portal: Portal;
fileManager: FileManager;
excalidrawAPI: Props["excalidrawAPI"];
activeIntervalId: number | null;
idleTimeoutId: number | null;
private socketInitializationTimer?;
private lastBroadcastedOrReceivedSceneVersion;
private collaborators;
constructor(props: Props);
componentDidMount(): void;
componentWillUnmount(): void;
isCollaborating: () => boolean;
private setIsCollaborating;
private onUnload;
private beforeUnload;
saveCollabRoomToFirebase: (syncableElements: readonly SyncableExcalidrawElement[]) => Promise<void>;
stopCollaboration: (keepRemoteState?: boolean) => void;
private destroySocketClient;
private fetchImageFilesFromFirebase;
private decryptPayload;
private fallbackInitializationHandler;
startCollaboration: (existingRoomLinkData: null | {
roomId: string;
roomKey: string;
}) => Promise<ImportedDataState | null>;
private initializeRoom;
private reconcileElements;
private loadImageFiles;
private handleRemoteSceneUpdate;
private onPointerMove;
private onVisibilityChange;
private reportIdle;
private reportActive;
private initializeIdleDetector;
setCollaborators(sockets: string[]): void;
setLastBroadcastedOrReceivedSceneVersion: (version: number) => void;
getLastBroadcastedOrReceivedSceneVersion: () => number;
getSceneElementsIncludingDeleted: () => readonly ExcalidrawElement[];
onPointerUpdate: import("lodash").DebouncedFunc<(payload: {
pointer: SocketUpdateDataSource["MOUSE_LOCATION"]["payload"]["pointer"];
button: SocketUpdateDataSource["MOUSE_LOCATION"]["payload"]["button"];
pointersMap: Gesture["pointers"];
}) => void>;
onIdleStateChange: (userState: UserIdleState) => void;
broadcastElements: (elements: readonly ExcalidrawElement[]) => void;
syncElements: (elements: readonly ExcalidrawElement[]) => void;
queueBroadcastAllElements: import("lodash").DebouncedFunc<() => void>;
queueSaveToFirebase: import("lodash").DebouncedFunc<() => void>;
handleClose: () => void;
setUsername: (user: {
name: string;
color: string;
}) => void;
onUsernameChange: (user: {
name: string;
color: string;
}) => void;
render(): JSX.Element;
}
declare global {
interface Window {
collab: InstanceType<typeof Collab>;
}
}
declare const _Collab: React.FC<PublicProps>;
export default _Collab;
export declare type TCollabClass = Collab;