UNPKG

tldraw

Version:

A tiny little drawing editor.

8 lines (7 loc) 4.23 kB
{ "version": 3, "sources": ["../../../../src/lib/ui/context/dialogs.tsx"], "sourcesContent": ["import { Atom, Editor, tlmenus, uniqueId, useAtom } from '@tldraw/editor'\nimport { ComponentType, ReactNode, createContext, useContext, useMemo } from 'react'\nimport { useUiEvents } from './events'\n\n/** @public */\nexport interface TLUiDialogProps {\n\tonClose(): void\n}\n\n/** @public */\nexport interface TLUiDialog {\n\tid: string\n\tonClose?(): void\n\tcomponent: ComponentType<TLUiDialogProps>\n\tpreventBackgroundClose?: boolean\n}\n\n/** @public */\nexport interface TLUiDialogsContextType {\n\taddDialog(dialog: Omit<TLUiDialog, 'id'> & { id?: string }): string\n\tremoveDialog(id: string): string\n\tclearDialogs(): void\n\tdialogs: Atom<TLUiDialog[]>\n}\n\n/** @internal */\nexport const DialogsContext = createContext<TLUiDialogsContextType | null>(null)\n\n/** @public */\nexport interface TLUiDialogsProviderProps {\n\tcontext?: string\n\toverrides?(editor: Editor): TLUiDialogsContextType\n\tchildren: ReactNode\n}\n\n/** @public @react */\nexport function TldrawUiDialogsProvider({ context, children }: TLUiDialogsProviderProps) {\n\tconst ctx = useContext(DialogsContext)\n\tconst trackEvent = useUiEvents()\n\n\tconst dialogs = useAtom<TLUiDialog[]>('dialogs', [])\n\n\tconst content = useMemo(() => {\n\t\treturn {\n\t\t\tdialogs,\n\t\t\taddDialog(dialog: Omit<TLUiDialog, 'id'> & { id?: string }) {\n\t\t\t\tconst id = dialog.id ?? uniqueId()\n\t\t\t\tdialogs.update((d) => {\n\t\t\t\t\treturn [...d.filter((m) => m.id !== dialog.id), { ...dialog, id }]\n\t\t\t\t})\n\t\t\t\ttrackEvent('open-menu', { source: 'dialog', id })\n\t\t\t\ttlmenus.addOpenMenu(id, context)\n\t\t\t\treturn id\n\t\t\t},\n\t\t\tremoveDialog(id: string) {\n\t\t\t\tconst dialog = dialogs.get().find((d) => d.id === id)\n\t\t\t\tif (dialog) {\n\t\t\t\t\tdialog.onClose?.()\n\t\t\t\t\ttrackEvent('close-menu', { source: 'dialog', id })\n\t\t\t\t\ttlmenus.deleteOpenMenu(id, context)\n\t\t\t\t\tdialogs.update((d) => d.filter((m) => m !== dialog))\n\t\t\t\t}\n\t\t\t\treturn id\n\t\t\t},\n\t\t\tclearDialogs() {\n\t\t\t\tconst current = dialogs.get()\n\t\t\t\tif (current.length === 0) return\n\t\t\t\tcurrent.forEach((d) => {\n\t\t\t\t\td.onClose?.()\n\t\t\t\t\ttrackEvent('close-menu', { source: 'dialog', id: d.id })\n\t\t\t\t\ttlmenus.deleteOpenMenu(d.id, context)\n\t\t\t\t})\n\t\t\t\tdialogs.set([])\n\t\t\t},\n\t\t}\n\t}, [trackEvent, dialogs, context])\n\n\t// if the user has already provided a context higher up, reuse that one\n\tif (ctx) return <>{children}</>\n\n\treturn <DialogsContext.Provider value={content}>{children}</DialogsContext.Provider>\n}\n\n/** @public */\nexport function useDialogs() {\n\tconst ctx = useContext(DialogsContext)\n\n\tif (!ctx) {\n\t\tthrow new Error('useDialogs must be used within a DialogsProvider')\n\t}\n\n\treturn ctx\n}\n"], "mappings": "AA8EiB;AA9EjB,SAAuB,SAAS,UAAU,eAAe;AACzD,SAAmC,eAAe,YAAY,eAAe;AAC7E,SAAS,mBAAmB;AAwBrB,MAAM,iBAAiB,cAA6C,IAAI;AAUxE,SAAS,wBAAwB,EAAE,SAAS,SAAS,GAA6B;AACxF,QAAM,MAAM,WAAW,cAAc;AACrC,QAAM,aAAa,YAAY;AAE/B,QAAM,UAAU,QAAsB,WAAW,CAAC,CAAC;AAEnD,QAAM,UAAU,QAAQ,MAAM;AAC7B,WAAO;AAAA,MACN;AAAA,MACA,UAAU,QAAkD;AAC3D,cAAM,KAAK,OAAO,MAAM,SAAS;AACjC,gBAAQ,OAAO,CAAC,MAAM;AACrB,iBAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,CAAC;AAAA,QAClE,CAAC;AACD,mBAAW,aAAa,EAAE,QAAQ,UAAU,GAAG,CAAC;AAChD,gBAAQ,YAAY,IAAI,OAAO;AAC/B,eAAO;AAAA,MACR;AAAA,MACA,aAAa,IAAY;AACxB,cAAM,SAAS,QAAQ,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACpD,YAAI,QAAQ;AACX,iBAAO,UAAU;AACjB,qBAAW,cAAc,EAAE,QAAQ,UAAU,GAAG,CAAC;AACjD,kBAAQ,eAAe,IAAI,OAAO;AAClC,kBAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA,QACpD;AACA,eAAO;AAAA,MACR;AAAA,MACA,eAAe;AACd,cAAM,UAAU,QAAQ,IAAI;AAC5B,YAAI,QAAQ,WAAW,EAAG;AAC1B,gBAAQ,QAAQ,CAAC,MAAM;AACtB,YAAE,UAAU;AACZ,qBAAW,cAAc,EAAE,QAAQ,UAAU,IAAI,EAAE,GAAG,CAAC;AACvD,kBAAQ,eAAe,EAAE,IAAI,OAAO;AAAA,QACrC,CAAC;AACD,gBAAQ,IAAI,CAAC,CAAC;AAAA,MACf;AAAA,IACD;AAAA,EACD,GAAG,CAAC,YAAY,SAAS,OAAO,CAAC;AAGjC,MAAI,IAAK,QAAO,gCAAG,UAAS;AAE5B,SAAO,oBAAC,eAAe,UAAf,EAAwB,OAAO,SAAU,UAAS;AAC3D;AAGO,SAAS,aAAa;AAC5B,QAAM,MAAM,WAAW,cAAc;AAErC,MAAI,CAAC,KAAK;AACT,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACnE;AAEA,SAAO;AACR;", "names": [] }