"use client" import { useMemo, useState } from "react" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { useDriveMountMutations } from "@/lib/api/hooks/use-drive-queries" import { useCurrentUser } from "@/lib/api/hooks/use-current-user" import { driveMountOAuthProvider, buildDriveMountOAuthRedirectURI, isDriveMountOAuthConfigured, openDriveMountOAuthPopup } from "@/lib/drive/drive-mount-oauth" type BackendChoice = "webdav" | "googledrive" | "dropbox" | "onedrive" const OAUTH_BACKENDS: BackendChoice[] = ["googledrive", "dropbox", "onedrive"] export function DriveAddMountDialog({ open, onOpenChange, }: { open: boolean onOpenChange: (open: boolean) => void }) { const { createMount, fetchOAuthURL } = useDriveMountMutations() const { data: user } = useCurrentUser() const configuredProviders = user?.org_drive?.configured_mount_oauth_providers ?? [] const redirectUri = buildDriveMountOAuthRedirectURI() const [displayName, setDisplayName] = useState("") const [backend, setBackend] = useState("webdav") const [host, setHost] = useState("") const [root, setRoot] = useState("/") const [userName, setUserName] = useState("") const [password, setPassword] = useState("") const [secure, setSecure] = useState(true) const [error, setError] = useState(null) const oauthConfigured = useMemo( () => isDriveMountOAuthConfigured(backend, configuredProviders), [backend, configuredProviders] ) const reset = () => { setDisplayName("") setBackend("webdav") setHost("") setRoot("/") setUserName("") setPassword("") setSecure(true) setError(null) } const startOAuthConnect = async (mountId: string) => { const { oauth_url: oauthUrl } = await fetchOAuthURL(mountId, redirectUri) if (!oauthUrl) { throw new Error("URL OAuth indisponible") } openDriveMountOAuthPopup(oauthUrl, mountId) } const handleSubmit = async () => { setError(null) if (!displayName.trim()) return if (OAUTH_BACKENDS.includes(backend) && !oauthConfigured) { setError("Ce fournisseur cloud n'est pas configuré par l'administration.") return } try { if (backend === "webdav") { if (!host.trim() || !userName.trim()) return await createMount.mutateAsync({ scope: "user", display_name: displayName.trim(), backend_type: "webdav", webdav: { host: host.trim(), root: root.trim() || "/", user: userName.trim(), password, secure, }, }) reset() onOpenChange(false) return } const mount = await createMount.mutateAsync({ scope: "user", display_name: displayName.trim(), backend_type: backend, oauth_backend: backend, }) reset() onOpenChange(false) if (mount.needs_oauth || mount.status === "pending_oauth") { await startOAuthConnect(mount.id) } } catch (err) { const message = err instanceof Error ? err.message : "Impossible d'ajouter le volume" setError(message) } } const providerLabel = driveMountOAuthProvider(backend) return ( { if (!next) reset() onOpenChange(next) }} > Ajouter un volume monté
setDisplayName(e.target.value)} placeholder="Mon NAS" />
{backend === "webdav" ? ( <>
setHost(e.target.value)} placeholder="nas.example.com" />
setRoot(e.target.value)} placeholder="/remote.php/dav/files/user" />
setUserName(e.target.value)} />
setPassword(e.target.value)} />
) : (

Après création, vous serez invité à vous connecter avec{" "} {providerLabel === "google" ? "Google" : providerLabel === "dropbox" ? "Dropbox" : "Microsoft"}.

{redirectUri ? (

Redirect URI : {redirectUri}

) : null}
)} {error ?

{error}

: null}
) }