import { App, TLEventMapHandler, Tldraw } from '@tldraw/tldraw' import '@tldraw/tldraw/editor.css' import '@tldraw/tldraw/ui.css' import { TLUiEventHandler } from '@tldraw/ui/src/lib/hooks/useEventsProvider' import { useCallback, useEffect, useState } from 'react' export default function Example() { const [app, setApp] = useState() const setAppToState = useCallback((app: App) => { setApp(app) }, []) const [uiEvents, setUiEvents] = useState([]) const handleEvent = useCallback((source, name, data) => { setUiEvents((events) => [ data ? `${source} ${name} ${JSON.stringify(data)}` : `${source} ${name}`, ...events, ]) }, []) useEffect(() => { if (!app) return function logChangeEvent(eventName: string) { setUiEvents((events) => [eventName, ...events]) } // This is the fire hose, it will be called at the end of every transaction const handleChangeEvent: TLEventMapHandler<'change'> = (change) => { if (change.source === 'user') { // Added for (const record of Object.values(change.changes.added)) { if (record.typeName === 'shape') { logChangeEvent(`created shape (${record.type})`) } } // Updated for (const [from, to] of Object.values(change.changes.updated)) { if ( from.typeName === 'instance' && to.typeName === 'instance' && from.currentPageId !== to.currentPageId ) { logChangeEvent(`changed page (${from.currentPageId}, ${to.currentPageId})`) } } // Removed for (const record of Object.values(change.changes.removed)) { if (record.typeName === 'shape') { logChangeEvent(`deleted shape (${record.type})`) } } } } app.on('change', handleChangeEvent) return () => { app.off('change', handleChangeEvent) } }, [app]) return (
{uiEvents.map((t, i) => (
{t}
))}
) }