{"version":3,"file":"history-version-preview.cjs","sources":["../../src/version-history/history-version-preview.tsx"],"sourcesContent":["import { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { EditorRefPlugin } from \"@lexical/react/LexicalEditorRefPlugin\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport type { Binding, Provider } from \"@lexical/yjs\";\nimport {\n  createBinding,\n  syncLexicalUpdateToYjs,\n  syncYjsChangesToLexical,\n} from \"@lexical/yjs\";\nimport type { HistoryVersion } from \"@liveblocks/core\";\nimport { useHistoryVersionData } from \"@liveblocks/react\";\nimport { useOverrides } from \"@liveblocks/react-ui\";\nimport {\n  Button,\n  cn,\n  List,\n  RestoreIcon,\n  SpinnerIcon,\n  User,\n} from \"@liveblocks/react-ui/_private\";\nimport type { LexicalEditor } from \"lexical\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { forwardRef, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport type { Transaction, YEvent } from \"yjs\";\nimport { applyUpdate, Doc } from \"yjs\";\n\nimport { liveblocksConfig } from \"../liveblocks-config\";\n\nconst AUTHORS_TRUNCATE = 3;\n\nexport interface HistoryVersionPreviewProps extends ComponentPropsWithoutRef<\"div\"> {\n  version: HistoryVersion;\n  onVersionRestore?: (version: HistoryVersion) => void;\n}\n\nfunction createNoOpProvider(): Provider {\n  const emptyFunction = () => {};\n\n  return {\n    awareness: {\n      getLocalState: () => null,\n      setLocalStateField: emptyFunction,\n      getStates: () => new Map(),\n      off: emptyFunction,\n      on: emptyFunction,\n      setLocalState: emptyFunction,\n    },\n    connect: emptyFunction,\n    disconnect: emptyFunction,\n    off: emptyFunction,\n    on: emptyFunction,\n  };\n}\n\nfunction registerCollaborationListeners(\n  editor: LexicalEditor,\n  provider: Provider,\n  binding: Binding\n): () => void {\n  const unsubscribeUpdateListener = editor.registerUpdateListener(\n    ({\n      dirtyElements,\n      dirtyLeaves,\n      editorState,\n      normalizedNodes,\n      prevEditorState,\n      tags,\n    }) => {\n      if (tags.has(\"skip-collab\") === false) {\n        syncLexicalUpdateToYjs(\n          binding,\n          provider,\n          prevEditorState,\n          editorState,\n          dirtyElements,\n          dirtyLeaves,\n          normalizedNodes,\n          tags\n        );\n      }\n    }\n  );\n\n  const observer = (events: Array<YEvent<any>>, transaction: Transaction) => {\n    if (transaction.origin !== binding) {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      syncYjsChangesToLexical(binding, provider, events, false);\n    }\n  };\n\n  binding.root.getSharedType().observeDeep(observer);\n\n  return () => {\n    unsubscribeUpdateListener();\n    binding.root.getSharedType().unobserveDeep(observer);\n  };\n}\n\n/**\n * Displays a specific version of the current Lexical document.\n *\n * @example\n * <HistoryVersionPreview version={version} />\n */\nexport const HistoryVersionPreview = forwardRef<\n  HTMLDivElement,\n  HistoryVersionPreviewProps\n>(({ version, onVersionRestore, className, ...props }, forwardedRef) => {\n  const [parentEditor, parentContext] = useLexicalComposerContext();\n  const editor = useRef<LexicalEditor>();\n  const $ = useOverrides();\n  const { isLoading, data, error } = useHistoryVersionData(version.id);\n\n  const initialConfig = useMemo(() => {\n    const nodes = Array.from(parentEditor._nodes.values()).map((n) => n.klass);\n\n    return liveblocksConfig({\n      namespace: \"VersionPreview\",\n      theme: parentContext.getTheme() || {},\n      nodes,\n      editable: false,\n      onError: (err) => console.error(err),\n    });\n  }, [parentEditor, parentContext]);\n\n  useEffect(() => {\n    if (error || !data || !editor.current || !data.length) {\n      return;\n    }\n    const doc = new Doc();\n    const docMap = new Map([[version.id, doc]]);\n    const provider = createNoOpProvider();\n    const binding = createBinding(\n      editor.current,\n      provider,\n      version.id,\n      doc,\n      docMap\n    );\n    const unsubscribe = registerCollaborationListeners(\n      editor.current,\n      provider,\n      binding\n    );\n\n    try {\n      applyUpdate(doc, data);\n    } catch (err) {\n      console.warn(err);\n    }\n\n    return unsubscribe;\n  }, [data, version.id, isLoading, error]);\n\n  const restore = useCallback(() => {\n    if (!editor.current || !parentEditor) {\n      return;\n    }\n\n    parentEditor.setEditorState(editor.current.getEditorState());\n    onVersionRestore?.(version);\n  }, [parentEditor, onVersionRestore, version]);\n\n  return (\n    <div\n      {...props}\n      className={cn(\n        \"lb-root lb-history-version-preview lb-lexical-version-preview\",\n        className\n      )}\n      ref={forwardedRef}\n    >\n      {isLoading ? (\n        <div className=\"lb-loading lb-history-version-preview-loading\">\n          <SpinnerIcon />\n        </div>\n      ) : error ? (\n        <div className=\"lb-error lb-history-version-preview-error\">\n          {$.HISTORY_VERSION_PREVIEW_ERROR(error)}\n        </div>\n      ) : (\n        <div className=\"lb-history-version-preview-content lb-lexical-editor-container lb-lexical-version-preview-editor-container\">\n          <LexicalComposer initialConfig={initialConfig}>\n            <EditorRefPlugin editorRef={editor} />\n            <RichTextPlugin\n              contentEditable={<ContentEditable />}\n              placeholder={\n                <div className=\"lb-empty lb-history-version-preview-empty\">\n                  {$.HISTORY_VERSION_PREVIEW_EMPTY}\n                </div>\n              }\n              ErrorBoundary={LexicalErrorBoundary}\n            />\n          </LexicalComposer>\n        </div>\n      )}\n      <div className=\"lb-history-version-preview-footer\">\n        <span className=\"lb-history-version-preview-authors\">\n          {$.HISTORY_VERSION_PREVIEW_AUTHORS_LIST(\n            <List\n              values={version.authors.map((author) => (\n                <User key={author.id} userId={author.id} replaceSelf />\n              ))}\n              formatRemaining={$.LIST_REMAINING_USERS}\n              truncate={AUTHORS_TRUNCATE}\n              locale={$.locale}\n            />\n          )}\n        </span>\n        <div className=\"lb-history-version-preview-actions\">\n          <Button\n            onClick={restore}\n            disabled={!data || !parentEditor}\n            variant=\"primary\"\n            size=\"large\"\n            className=\"lb-history-version-preview-action\"\n            icon={<RestoreIcon />}\n          >\n            {$.HISTORY_VERSION_PREVIEW_RESTORE}\n          </Button>\n        </div>\n      </div>\n    </div>\n  );\n});\n"],"names":["syncLexicalUpdateToYjs","syncYjsChangesToLexical","forwardRef","useLexicalComposerContext","useRef","useOverrides","useHistoryVersionData","useMemo","liveblocksConfig","useEffect","Doc","createBinding","applyUpdate","useCallback","jsxs","cn","jsx","SpinnerIcon","LexicalComposer","EditorRefPlugin","RichTextPlugin","ContentEditable","LexicalErrorBoundary","List","User","Button","RestoreIcon"],"mappings":"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"}