ultisuite-client/lib/api/hooks/use-mail-attachment-thumb.ts
R3D347HR4Y 6ec95262af Add OnlyOffice integration and update project configurations
- Updated .env.example to include configuration for OnlyOffice Document Server.
- Modified the workspace configuration to remove the drive-suite path.
- Adjusted TypeScript environment imports for consistency.
- Enhanced Next.js configuration to disable canvas in Webpack.
- Updated package.json to include new dependencies for OnlyOffice and PDF.js.
- Added global styles for OnlyOffice theme integration in the CSS.
- Created new layout and page components for the Drive feature, including public sharing and editing functionalities.
- Updated metadata handling across various layouts to reflect the new app structure.
2026-06-07 15:49:21 +02:00

86 lines
3.2 KiB
TypeScript

"use client"
import { useMemo } from "react"
import { useQuery } from "@tanstack/react-query"
import { apiClient } from "@/lib/api/client"
import { blobForPreview } from "@/lib/api/drive-download"
import { commitPreviewBlobUrl } from "@/lib/api/preview-blob-url"
import type { PreviewBlobThumb } from "@/lib/api/preview-blob-url"
import { useDrivePreviewThumb } from "@/lib/api/hooks/use-drive-preview-thumb"
import { useAuthReady } from "@/lib/api/use-auth-ready"
import type { DriveFileInfo } from "@/lib/api/types"
import type { EmailAttachment } from "@/lib/email-data"
import { guessMailAttachmentMime } from "@/lib/mail/mail-attachment-preview"
import { drivePreviewKind, driveServerThumbnail } from "@/lib/drive/drive-preview"
const MAX_THUMB_BYTES = 15 * 1024 * 1024
function mailAttachmentCanThumb(att: EmailAttachment): boolean {
if (!att.id) return false
if (att.sizeBytes !== undefined && att.sizeBytes > MAX_THUMB_BYTES) return false
const mime = guessMailAttachmentMime(att.name, att.contentType)
const kind = drivePreviewKind({ name: att.name, mime_type: mime })
if (!kind || kind === "audio" || kind === "text") return false
if (kind === "pdf") return true
return kind === "image" || kind === "video"
}
function useMailBlobAttachmentThumb(att: EmailAttachment, enabled: boolean) {
const { ready, authenticated } = useAuthReady()
const mime = guessMailAttachmentMime(att.name, att.contentType)
const kind = drivePreviewKind({ name: att.name, mime_type: mime })
return useQuery({
queryKey: ["mail", "attachment-thumb", att.id, att.name, att.sizeBytes],
enabled: ready && authenticated && enabled && mailAttachmentCanThumb(att),
queryFn: async ({ client, queryKey }): Promise<PreviewBlobThumb> => {
const previous = client.getQueryData<PreviewBlobThumb>(queryKey)
const raw = await apiClient.getBlob(`/mail/attachments/${att.id}`)
const blob = blobForPreview(raw, mime, att.name)
if (kind === "pdf") {
const { renderMailPdfThumb } = await import("@/lib/mail/mail-pdf-thumb")
const url = await renderMailPdfThumb(blob)
return commitPreviewBlobUrl(previous, { url, display: "image" })
}
return commitPreviewBlobUrl(previous, {
url: URL.createObjectURL(blob),
display: kind === "video" ? "video" : "image",
})
},
staleTime: 5 * 60_000,
gcTime: 10 * 60_000,
retry: 1,
})
}
export function useMailAttachmentThumb(att: EmailAttachment, enabled: boolean) {
const mime = guessMailAttachmentMime(att.name, att.contentType)
const driveFile = useMemo(
(): DriveFileInfo => ({
path: att.drivePath ?? "/",
name: att.name,
type: "file",
size: att.sizeBytes ?? 0,
mime_type: mime,
last_modified: "",
etag: att.id ?? att.name,
is_favorite: false,
}),
[att.drivePath, att.name, att.sizeBytes, att.id, mime]
)
const useDrive =
Boolean(att.drivePath) &&
mailAttachmentCanThumb(att) &&
(driveServerThumbnail(driveFile) || drivePreviewKind(driveFile) !== null)
const driveThumb = useDrivePreviewThumb(driveFile, enabled && useDrive)
const mailThumb = useMailBlobAttachmentThumb(att, enabled && !useDrive)
return useDrive ? driveThumb : mailThumb
}
export { mailAttachmentCanThumb }