import { useEffect, useRef, useState } from "react";
import { createYjsProvider } from "@y-sweet/client";
import * as Y from "yjs";
import { SuperDoc } from "superdoc";
import "superdoc/style.css";
const AUTH_ENDPOINT = "http://localhost:3001/api/auth";
const DOC_ID = "my-document";
export default function Editor() {
const superdocRef = useRef<SuperDoc | null>(null);
const [users, setUsers] = useState<any[]>([]);
useEffect(() => {
const ydoc = new Y.Doc();
const provider = createYjsProvider(ydoc, DOC_ID, AUTH_ENDPOINT);
provider.on("sync", (synced: boolean) => {
if (!synced) return;
superdocRef.current = new SuperDoc({
selector: "#superdoc",
documentMode: "editing",
user: {
name: `User ${Math.floor(Math.random() * 1000)}`,
email: "[email protected]",
},
modules: {
collaboration: { ydoc, provider },
},
onAwarenessUpdate: ({ states }) => {
setUsers(states.filter((s) => s.user));
},
});
});
return () => {
superdocRef.current?.destroy();
provider.destroy();
};
}, []);
return (
<div>
<div className="users">
{users.map((u, i) => (
<span key={i} style={{ background: u.user?.color }}>
{u.user?.name}
</span>
))}
</div>
<div id="superdoc" style={{ height: "100vh" }} />
</div>
);
}