ultisuite-client/lib/drive/public-share-url.ts
R3D347HR4Y cdff12490a
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
hocuspocus
2026-06-09 14:31:07 +02:00

81 lines
2.6 KiB
TypeScript

export type PublicShareRootType = "file" | "folder"
export function publicShareRootTypeStorageKey(token: string): string {
return `public-share-root-type:${token}`
}
export function persistPublicShareRootType(token: string, rootType: PublicShareRootType): void {
if (typeof window === "undefined") return
sessionStorage.setItem(publicShareRootTypeStorageKey(token), rootType)
}
export function readPublicShareRootType(token: string): PublicShareRootType | null {
if (typeof window === "undefined") return null
const value = sessionStorage.getItem(publicShareRootTypeStorageKey(token))
return value === "file" || value === "folder" ? value : null
}
/** Hide back on single-file shares — no folder listing to return to. */
export function shouldShowPublicShareEditorBack(
rootType: PublicShareRootType | null | undefined,
returnTo?: string | null,
filePath?: string
): boolean {
if (rootType === "file") return false
if (rootType === "folder") return true
const path = (filePath ?? "/").replace(/^\/+|\/+$/g, "")
if (!path && !returnTo) return false
return true
}
export function buildPublicShareEditHref(
token: string,
filePath: string,
returnTo?: string,
mode: "edit" | "view" = "edit",
displayName?: string,
editor: "office" | "richtext" = "office",
shareRoot?: PublicShareRootType
): string {
const trimmed = filePath.replace(/^\/+|\/+$/g, "")
const base = `/drive/s/${encodeURIComponent(token)}/edit/${trimmed.split("/").map(encodeURIComponent).join("/")}`
const params = new URLSearchParams()
if (returnTo && returnTo.startsWith("/drive/s/")) {
params.set("returnTo", returnTo)
}
if (mode === "view") {
params.set("mode", "view")
}
if (editor === "richtext") {
params.set("editor", "richtext")
}
if (displayName?.trim()) {
params.set("name", displayName.trim())
}
if (shareRoot) {
params.set("shareRoot", shareRoot)
}
const qs = params.toString()
return qs ? `${base}?${qs}` : base
}
export function resolvePublicShareEditReturnTo(
token: string,
returnTo: string | null | undefined,
filePath: string
): string {
if (returnTo && returnTo.startsWith("/drive/s/")) return returnTo
const parent = filePath.replace(/\/[^/]+$/, "") || "/"
const trimmed = parent.replace(/^\/+|\/+$/g, "")
if (!trimmed) return `/drive/s/${encodeURIComponent(token)}`
return `/drive/s/${encodeURIComponent(token)}/${trimmed.split("/").map(encodeURIComponent).join("/")}`
}
export function filePathFromPublicEditSegments(
token: string,
segments: string[] | undefined
): string {
if (!segments?.length) return "/"
return "/" + segments.map((s) => decodeURIComponent(s)).join("/")
}