"use client" import { useParams, useRouter } from "next/navigation" import { useEffect, useState } from "react" import { Lock } from "lucide-react" import { PublicShareChrome, PublicShareViewPanel, } from "@/components/drive/public-share-view" import { DocsLoadingSplash } from "@/components/drive/richtext/docs-loading-splash" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { usePublicShare } from "@/lib/api/hooks/use-public-share-queries" import { folderPathFromPublicSegments } from "@/lib/api/public-share" import { shouldOpenInOnlyOffice, shouldOpenInRichTextEditor, shouldOpenInUltidrawEditor, } from "@/lib/drive/drive-preview" import { sharePermCanEdit } from "@/lib/drive/drive-share-permissions" import { buildPublicShareEditHref } from "@/lib/drive/public-share-url" import { sharePathLooksLikeEditorFile } from "@/lib/drive/share-path-looks-like-editor" export default function PublicSharePage() { const params = useParams() const router = useRouter() const token = String(params.token ?? "") const pathSegments = params.path as string[] | undefined const path = folderPathFromPublicSegments(pathSegments) const pathHintsEditor = sharePathLooksLikeEditorFile(path) const [passwordInput, setPasswordInput] = useState("") const [password, setPassword] = useState(undefined) const [redirectingToEditor, setRedirectingToEditor] = useState(false) const { data, isLoading, isError, error, refetch, isFetching } = usePublicShare( token, path, password ) const needsPassword = isError && error instanceof Error && error.message === "password_required" const file = data?.item_type === "file" ? data.file : null const isEditorFile = Boolean( file && (shouldOpenInRichTextEditor(file) || shouldOpenInUltidrawEditor(file) || shouldOpenInOnlyOffice(file)) ) const showDocsSplash = pathHintsEditor || redirectingToEditor || (Boolean(data) && isEditorFile) useEffect(() => { if (password && typeof window !== "undefined") { sessionStorage.setItem(`public-share-pw:${token}`, password) } }, [password, token]) useEffect(() => { if (!file || !data || !isEditorFile) return setRedirectingToEditor(true) const canEdit = sharePermCanEdit(data.permissions ?? 1) const returnTo = typeof window !== "undefined" ? window.location.pathname + window.location.search : undefined const editor = shouldOpenInUltidrawEditor(file) ? "ultidraw" : shouldOpenInRichTextEditor(file) ? "richtext" : "office" router.replace( buildPublicShareEditHref( token, file.path, returnTo, canEdit ? "edit" : "view", file.name, editor, data.item_type ) ) }, [data, file, isEditorFile, router, token]) const submitPassword = (event: React.FormEvent) => { event.preventDefault() const trimmed = passwordInput.trim() if (!trimmed) return setPassword(trimmed) } if ( showDocsSplash && !needsPassword && (isLoading || (isFetching && !data) || redirectingToEditor || isEditorFile) ) { const splashTitle = file?.name ?? path.split("/").filter(Boolean).pop() return } return ( {isLoading || (isFetching && !data) ? ( ) : needsPassword ? (

Lien protégé par mot de passe

Saisissez le mot de passe pour accéder à ce partage.

setPasswordInput(e.target.value)} />
) : isError || !data ? (

Partage indisponible

Ce lien est expiré, révoqué ou incorrect.

) : ( )}
) }