1 line
9.0 KiB
Plaintext
1 line
9.0 KiB
Plaintext
{"version":3,"file":"ReadOnlyViewer-BHxi7oIo.chunk.mjs","sources":["../src/components/ReadOnlyViewer.tsx"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { memo, useEffect, useMemo, useState } from 'react'\nimport { t } from '@nextcloud/l10n'\nimport { Excalidraw as ExcalidrawComponent, restoreElements } from '@nextcloud/excalidraw'\nimport type {\n\tAppState,\n\tBinaryFiles,\n\tExcalidrawElement,\n\tExcalidrawInitialDataState,\n} from '@nextcloud/excalidraw/dist/types/excalidraw/types'\n\nimport '@excalidraw/excalidraw/index.css'\n\nimport logger from '../utils/logger'\nimport type { WhiteboardAppProps } from '../App'\nimport { initialDataState } from '../constants/excalidraw'\nimport { useThemeHandling } from '../hooks/useThemeHandling'\nimport { sanitizeAppStateForSync } from '../utils/sanitizeAppState'\n\nconst ReadOnlyExcalidraw = memo(ExcalidrawComponent)\n\ntype ParsedVersionContent = {\n\telements?: unknown\n\tfiles?: unknown\n\tappState?: unknown\n\tscrollToContent?: boolean\n}\n\ntype SceneState = ExcalidrawInitialDataState & {\n\tscrollToContent?: boolean\n}\n\nconst sanitizeElements = (elements: unknown): ExcalidrawElement[] => {\n\tif (!Array.isArray(elements)) {\n\t\treturn []\n\t}\n\treturn restoreElements(elements as ExcalidrawElement[], null) as ExcalidrawElement[]\n}\n\nconst sanitizeFiles = (files: unknown): BinaryFiles => {\n\tif (files && typeof files === 'object') {\n\t\treturn files as BinaryFiles\n\t}\n\treturn {}\n}\n\nconst sanitizeAppState = (state: unknown): Partial<AppState> => {\n\tconst fallback = { ...initialDataState.appState }\n\tif (!state || typeof state !== 'object') {\n\t\treturn fallback\n\t}\n\tconst parsed = sanitizeAppStateForSync(state as Partial<AppState>)\n\treturn {\n\t\t...fallback,\n\t\t...parsed,\n\t}\n}\n\nconst resolveVersionSource = (source: string) => {\n\ttry {\n\t\tconst url = new URL(source, window.location.origin)\n\t\treturn url.toString()\n\t} catch {\n\t\treturn source\n\t}\n}\n\nexport default function ReadOnlyViewer({\n\tfileName,\n\tversionSource,\n\tfileVersion,\n}: WhiteboardAppProps) {\n\tconst [scene, setScene] = useState<SceneState | null>(null)\n\tconst [error, setError] = useState<string | null>(null)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst { theme } = useThemeHandling()\n\n\tconst langCode = useMemo(() => document.documentElement.lang || 'en', [])\n\n\tuseEffect(() => {\n\t\tif (!versionSource) {\n\t\t\tsetError(t('whiteboard', 'This version is missing its source file'))\n\t\t\tsetScene(null)\n\t\t\treturn\n\t\t}\n\n\t\tconst abortController = new AbortController()\n\n\t\tconst loadScene = async () => {\n\t\t\tsetIsLoading(true)\n\t\t\tsetError(null)\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(resolveVersionSource(versionSource), {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\tcredentials: 'include',\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Unexpected response ${response.status}`)\n\t\t\t\t}\n\n\t\t\t\tconst rawContent = await response.text()\n\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlet parsed: ParsedVersionContent = {}\n\t\t\t\tif (rawContent.trim().length > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tparsed = JSON.parse(rawContent) as ParsedVersionContent\n\t\t\t\t\t} catch (parseError) {\n\t\t\t\t\t\tthrow new Error('Failed to parse version JSON')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst elements = sanitizeElements(parsed.elements)\n\t\t\t\tconst files = sanitizeFiles(parsed.files)\n\t\t\t\tconst appState = sanitizeAppState(parsed.appState)\n\n\t\t\t\tsetScene({\n\t\t\t\t\telements,\n\t\t\t\t\tfiles,\n\t\t\t\t\tappState,\n\t\t\t\t\tscrollToContent: parsed.scrollToContent ?? true,\n\t\t\t\t})\n\t\t\t} catch (fetchError) {\n\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlogger.error('[ReadOnlyViewer] Failed to load scene', fetchError)\n\t\t\t\tsetError(t('whiteboard', 'Could not load this version'))\n\t\t\t\tsetScene(null)\n\t\t\t} finally {\n\t\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tloadScene()\n\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t}, [versionSource])\n\n\tconst title = useMemo(() => {\n\t\tif (!fileVersion) {\n\t\t\treturn fileName\n\t\t}\n\t\treturn t('whiteboard', '{fileName} – Version {version}', {\n\t\t\tfileName,\n\t\t\tversion: fileVersion,\n\t\t})\n\t}, [fileName, fileVersion])\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"App App--version-preview\" style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t<div>{error}</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (isLoading || !scene) {\n\t\treturn (\n\t\t\t<div className=\"App\" style={{ display: 'flex', flexDirection: 'column' }}>\n\t\t\t\t<div className=\"App-loading\" style={{\n\t\t\t\t\tflex: 1,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t}}>\n\t\t\t\t\t{t('whiteboard', 'Loading version...')}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tconst canvasActions = {\n\t\tchangeViewBackgroundColor: false,\n\t\tclearCanvas: false,\n\t\texport: false,\n\t\tloadScene: false,\n\t\tsaveAsImage: false,\n\t\tsaveToActiveFile: false,\n\t\ttoggleTheme: false,\n\t}\n\n\treturn (\n\t\t<div className=\"App App--version-preview\" style={{ display: 'flex', flexDirection: 'column' }}>\n\t\t\t<div className=\"excalidraw-wrapper\" style={{ flex: 1, height: '100%', position: 'relative' }}>\n\t\t\t\t<ReadOnlyExcalidraw\n\t\t\t\t\tinitialData={scene}\n\t\t\t\t\tviewModeEnabled\n\t\t\t\t\tzenModeEnabled={false}\n\t\t\t\t\tgridModeEnabled={false}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t\tname={title}\n\t\t\t\t\tUIOptions={{ canvasActions }}\n\t\t\t\t\tlangCode={langCode}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"names":["ReadOnlyExcalidraw","memo","ExcalidrawComponent","sanitizeElements","elements","restoreElements","sanitizeFiles","files","sanitizeAppState","state","fallback","initialDataState","parsed","sanitizeAppStateForSync","resolveVersionSource","source","ReadOnlyViewer","fileName","versionSource","fileVersion","scene","setScene","useState","error","setError","isLoading","setIsLoading","theme","useThemeHandling","langCode","useMemo","useEffect","t","abortController","response","rawContent","appState","fetchError","logger","title","React","canvasActions"],"mappings":"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"} |