f7cloud_client/apps/whiteboard/js/ReadOnlyViewer-BHxi7oIo.chunk.mjs.map
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

1 line
9.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"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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"}