Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/hooks/usePath.ts
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ export const usePath = () => {
(data) => {
ObjStore.setObj(data)
ObjStore.setProvider(data.provider)
ObjStore.setWebProxy(Boolean(data.web_proxy))
if (data.is_dir) {
setPathAs(path)
handleFolder(path, index, size)
Expand Down
37 changes: 36 additions & 1 deletion src/lang/en/home.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,42 @@
"tr-install": "TrollStore",
"tr-installing": "TrollStore Installing",
"open_in_new_window": "Open in new window",
"auto_next": "Auto next"
"auto_next": "Auto next",
"lark_preview": "Lark Preview",
"lark_tools": {
"title": "Lark Tools",
"unsupported_current": "Lark export is not supported for this file.",
"unsupported_title": "Export is not supported",
"unsupported_description": "The first version supports exporting Lark Docs to PDF/DOCX, and Sheets/Bitable to XLSX.",
"loading_options": "Loading export options",
"option_failed": "Failed to load export options",
"create_export_task": "Create export task",
"download_export": "Download {{name}}",
"download_name": "Output file: {{name}}",
"download_started": "The exported file download has started.",
"download_failed": "Failed to download the exported file.",
"export_failed": "Lark export task failed.",
"export_timeout": "Export timed out. Please try again later.",
"feishu_error_detail": "Feishu error detail",
"copy_error_detail": "Copy detail",
"sub_resource": "Sheet/Table",
"sub_resource_required": "Please select a sheet or table before exporting CSV.",
"sub_resource_error": "Failed to load sheets or tables",
"no_sub_resources": "No sheet or table available",
"type": {
"doc": "Lark Docs",
"docx": "Lark Docs",
"sheet": "Lark Sheets",
"bitable": "Lark Bitable"
},
"status": {
"success_title": "Export completed",
"failed_title": "Export failed",
"processing_title": "Exporting",
"success_description": "The exported file is ready to download.",
"processing_description": "Waiting for Lark to finish the export task."
}
}
},
"layouts": {
"list": "List View",
Expand Down
13 changes: 11 additions & 2 deletions src/pages/home/file/File.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ import { objStore } from "~/store"
import { Download } from "../previews/download"
import { OpenWith } from "./open-with"
import { getPreviews } from "../previews"
import { useT } from "~/hooks"

const File = () => {
const t = useT()
const previews = createMemo(() => {
return getPreviews({ ...objStore.obj, provider: objStore.provider })
return getPreviews({
...objStore.obj,
provider: objStore.provider,
web_proxy: objStore.web_proxy,
})
})
const [cur, setCur] = createSignal(previews()[0])
return (
Expand All @@ -22,7 +28,10 @@ const File = () => {
onChange={(name) => {
setCur(previews().find((p) => p.name === name)!)
}}
options={previews().map((item) => ({ value: item.name }))}
options={previews().map((item) => ({
value: item.name,
label: item.i18nKey ? t(item.i18nKey) : item.name,
}))}
/>
<OpenWith />
</HStack>
Expand Down
52 changes: 47 additions & 5 deletions src/pages/home/previews/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,52 @@ const isPrior = (p: Prior): boolean => {

export interface Preview {
name: string
i18nKey?: string
type?: ObjType
exts?: Ext
provider?: RegExp
enabled?: (file: PreviewFile) => boolean
component: Component
prior: Prior
}

export type PreviewComponent = Pick<Preview, "name" | "component">
export type PreviewComponent = Pick<Preview, "name" | "i18nKey" | "component">
type PreviewFile = Obj & {
provider: string
download_url?: string
web_proxy?: boolean
}

const larkCloudDocExts = [
"lark-doc",
"lark-docx",
"lark-sheet",
"lark-bitable",
"lark-mindnote",
"lark-slides",
]

const isLarkCloudDoc = (name: string) =>
larkCloudDocExts.includes(ext(name).toLowerCase())

const previews: Preview[] = [
{
name: "Lark Preview",
i18nKey: "home.preview.lark_preview",
exts: "*",
provider: /^Lark$/,
enabled: (file) => !file.web_proxy || isLarkCloudDoc(file.name),
component: lazy(() => import("./lark")),
prior: true,
},
{
name: "Lark Tools",
i18nKey: "home.preview.lark_tools.title",
exts: ["lark-doc", "lark-docx", "lark-sheet", "lark-bitable"],
provider: /^Lark$/,
component: lazy(() => import("./lark_tools")),
prior: true,
},
{
name: "HTML render",
exts: ["html"],
Expand Down Expand Up @@ -160,9 +196,7 @@ const previews: Preview[] = [
},
]

export const getPreviews = (
file: Obj & { provider: string; download_url?: string },
): PreviewComponent[] => {
export const getPreviews = (file: PreviewFile): PreviewComponent[] => {
const { pathname, searchParams } = useRouter()
const typeOverride =
ObjType[searchParams["type"]?.toUpperCase() as keyof typeof ObjType]
Expand All @@ -177,12 +211,19 @@ export const getPreviews = (
if (preview.provider && !preview.provider.test(file.provider)) {
return
}
if (preview.enabled && !preview.enabled(file)) {
return
}
if (
preview.type === file.type ||
(typeOverride && preview.type === typeOverride) ||
extsContains(preview.exts, file.name)
) {
const r = { name: preview.name, component: preview.component }
const r = {
name: preview.name,
i18nKey: preview.i18nKey,
component: preview.component,
}
if (isPrior(preview.prior)) {
res.push(r)
} else {
Expand All @@ -202,6 +243,7 @@ export const getPreviews = (
if (!isShareRoute || file.download_url) {
res.push({
name: "Download",
i18nKey: "home.preview.download",
component: lazy(() => import("./download")),
})
}
Expand Down
33 changes: 33 additions & 0 deletions src/pages/home/previews/lark.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { Button, HStack, hope } from "@hope-ui/solid"
import { TbExternalLink } from "solid-icons/tb"
import { BoxWithFullScreen } from "~/components"
import { objStore } from "~/store"
import { useT } from "~/hooks"

const LarkPreview = () => {
const t = useT()
return (
<BoxWithFullScreen w="$full" h="75vh">
<HStack mb="$2" justifyContent="flex-end">
<Button
as="a"
href={objStore.raw_url}
target="_blank"
leftIcon={<TbExternalLink />}
>
{t("home.preview.open_in_new_window")}
</Button>
</HStack>
<hope.iframe
w="$full"
h="$full"
rounded="$lg"
shadow="$md"
src={objStore.raw_url}
title={t("home.preview.lark_preview")}
/>
</BoxWithFullScreen>
)
}

export default LarkPreview
Loading