import { useEffect, useRef, useState } from "react";
import { HocuspocusProvider } from "@hocuspocus/provider";
import * as Y from "yjs";
import { SuperDoc } from "superdoc";
import "superdoc/style.css";
export default function Editor() {
const superdocRef = useRef<SuperDoc | null>(null);
const [users, setUsers] = useState<any[]>([]);
useEffect(() => {
const ydoc = new Y.Doc();
const provider = new HocuspocusProvider({
url: "ws://localhost:1234",
name: "my-document",
document: ydoc,
});
provider.on("synced", () => {
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>
);
}