diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx index 0cde3120..860d424e 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/DocEditor.tsx @@ -1,31 +1,63 @@ -import { Loader } from '@openfun/cunningham-react'; -import { useRouter } from 'next/router'; -import { useEffect, useState } from 'react'; +import { useEffect } from 'react'; import { css } from 'styled-components'; -import * as Y from 'yjs'; -import { Box, Loading, Text, TextErrors } from '@/components'; -import { DocHeader, DocVersionHeader } from '@/docs/doc-header/'; -import { - Doc, - base64ToBlocknoteXmlFragment, - useProviderStore, -} from '@/docs/doc-management'; +import { Box, Loading } from '@/components'; +import { DocHeader } from '@/docs/doc-header/'; +import { Doc, useProviderStore } from '@/docs/doc-management'; import { TableContent } from '@/docs/doc-table-content/'; -import { Versions, useDocVersion } from '@/docs/doc-versioning/'; import { useSkeletonStore } from '@/features/skeletons'; import { useResponsiveStore } from '@/stores'; -import { BlockNoteEditor, BlockNoteEditorVersion } from './BlockNoteEditor'; +import { BlockNoteEditor } from './BlockNoteEditor'; + +interface DocEditorContainerProps { + docHeader: React.ReactNode; + docEditor: React.ReactNode; +} + +export const DocEditorContainer = ({ + docHeader, + docEditor, +}: DocEditorContainerProps) => { + const { isDesktop } = useResponsiveStore(); + + return ( + <> + + + {docHeader} + + + + + {docEditor} + + + + + ); +}; interface DocEditorProps { doc: Doc; - versionId?: Versions['version_id']; } -export const DocEditor = ({ doc, versionId }: DocEditorProps) => { +export const DocEditor = ({ doc }: DocEditorProps) => { const { isDesktop } = useResponsiveStore(); - const isVersion = !!versionId && typeof versionId === 'string'; const { provider, isReady } = useProviderStore(); const { setIsSkeletonVisible } = useSkeletonStore(); const isProviderReady = isReady && provider; @@ -42,7 +74,7 @@ export const DocEditor = ({ doc, versionId }: DocEditorProps) => { return ( <> - {isDesktop && !isVersion && ( + {isDesktop && ( { )} - - - {isVersion ? : } - - - - - {isVersion ? ( - - ) : ( - - )} - - - + } + docEditor={} + /> ); }; - -interface DocVersionEditorProps { - docId: Doc['id']; - versionId: Versions['version_id']; -} - -export const DocVersionEditor = ({ - docId, - versionId, -}: DocVersionEditorProps) => { - const { - data: version, - isLoading, - isError, - error, - } = useDocVersion({ - docId, - versionId, - }); - - const { replace } = useRouter(); - const [initialContent, setInitialContent] = useState(); - - useEffect(() => { - if (!version?.content) { - return; - } - - setInitialContent(base64ToBlocknoteXmlFragment(version.content)); - }, [version?.content]); - - if (isError && error) { - if (error.status === 404) { - void replace(`/404`); - return null; - } - - return ( - - - wifi_off - - ) : undefined - } - /> - - ); - } - - if (isLoading || !version || !initialContent) { - return ( - - - - ); - } - - return ; -}; diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/index.ts b/src/frontend/apps/impress/src/features/docs/doc-editor/components/index.ts index 3a390c33..2e24346d 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/index.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/index.ts @@ -1,3 +1,4 @@ +export * from './BlockNoteEditor'; export * from './DocEditor'; export * from './EmojiPicker'; export * from './custom-blocks/'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/index.ts b/src/frontend/apps/impress/src/features/docs/doc-header/components/index.ts index ce2b58d4..b0e56b2d 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/index.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/index.ts @@ -1,2 +1,2 @@ export * from './DocHeader'; -export * from './DocVersionHeader'; +export * from './DocTitle'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx new file mode 100644 index 00000000..652a61ee --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionEditor.tsx @@ -0,0 +1,83 @@ +import { Loader } from '@openfun/cunningham-react'; +import { useRouter } from 'next/router'; +import { useEffect, useState } from 'react'; +import * as Y from 'yjs'; + +import { Box, Text, TextErrors } from '@/components'; +import { BlockNoteEditorVersion, DocEditorContainer } from '@/docs/doc-editor/'; +import { Doc, base64ToBlocknoteXmlFragment } from '@/docs/doc-management'; +import { Versions, useDocVersion } from '@/docs/doc-versioning/'; + +import { DocVersionHeader } from './DocVersionHeader'; + +interface DocVersionEditorProps { + docId: Doc['id']; + versionId: Versions['version_id']; +} + +export const DocVersionEditor = ({ + docId, + versionId, +}: DocVersionEditorProps) => { + const { + data: version, + isLoading, + isError, + error, + } = useDocVersion({ + docId, + versionId, + }); + + const { replace } = useRouter(); + const [initialContent, setInitialContent] = useState(); + + useEffect(() => { + if (!version?.content) { + return; + } + + setInitialContent(base64ToBlocknoteXmlFragment(version.content)); + }, [version?.content]); + + if (isError && error) { + if (error.status === 404) { + void replace(`/404`); + return null; + } + + return ( + + + wifi_off + + ) : undefined + } + /> + + ); + } + + if (isLoading || !version || !initialContent) { + return ( + + + + ); + } + + return ( + } + docEditor={} + /> + ); +}; diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocVersionHeader.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionHeader.tsx similarity index 92% rename from src/frontend/apps/impress/src/features/docs/doc-header/components/DocVersionHeader.tsx rename to src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionHeader.tsx index 511b803c..b3cc0a88 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocVersionHeader.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/DocVersionHeader.tsx @@ -2,8 +2,7 @@ import { useTranslation } from 'react-i18next'; import { Box, HorizontalSeparator } from '@/components'; import { useCunninghamTheme } from '@/cunningham'; - -import { DocTitleText } from './DocTitle'; +import { DocTitleText } from '@/docs/doc-header'; export const DocVersionHeader = () => { const { spacingsTokens } = useCunninghamTheme(); diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx index b8efa43c..8c8b9a63 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/ModalSelectVersion.tsx @@ -4,11 +4,11 @@ import { useTranslation } from 'react-i18next'; import { createGlobalStyle, css } from 'styled-components'; import { Box, ButtonCloseModal, Text } from '@/components'; -import { DocEditor } from '@/docs/doc-editor'; import { Doc } from '@/docs/doc-management'; import { Versions } from '../types'; +import { DocVersionEditor } from './DocVersionEditor'; import { ModalConfirmationVersion } from './ModalConfirmationVersion'; import { VersionList } from './VersionList'; @@ -81,7 +81,10 @@ export const ModalSelectVersion = ({ $align="center" > {selectedVersionId && ( - + )} {!selectedVersionId && (