import { Box, HStack, useColorModeValue, Icon, Tooltip } from "@hope-ui/solid"
import {
createMemo,
For,
Show,
createSignal,
onMount,
onCleanup,
lazy,
Suspense,
} from "solid-js"
import {
checkboxOpen,
haveSelected,
objStore,
selectAll,
State,
oneChecked,
selectedObjs,
me,
} from "~/store"
import { CopyLink } from "./CopyLink"
import { CenterIcon } from "./Icon"
import { bus, hoverColor } from "~/utils"
import { Download } from "./Download"
import { Motion, Presence } from "@motionone/solid"
import { useLabels } from "~/store/label"
import {
createLabelFileBinding,
createLabelFileBindingBatch,
} from "~/utils/api"
import { usePath, useT } from "~/hooks"
import { AiOutlineTag } from "solid-icons/ai"
import { UserMethods } from "~/types"
// 懒加载对话框组件
const AddLabelDialog = lazy(() => import("~/components/AddLabelDialog"))
const EditLabelDialog = lazy(() => import("~/components/EditLabelDialog"))
export const Center = () => {
const show = createMemo(
() =>
[State.Folder, State.FetchingMore].includes(objStore.state) &&
checkboxOpen() &&
haveSelected(),
)
const t = useT()
const canShowS3Actions = createMemo(() => {
if (!UserMethods.is_admin(me())) return false
const selected = selectedObjs()
if (!selected.length) return false
return selected.every((obj) => !obj.is_dir && !!obj.storage_class)
})
// 标签相关
const { labels, refetch } = useLabels()
const [isAddLabelOpen, setIsAddLabelOpen] = createSignal(false)
const [isEditLabelOpen, setIsEditLabelOpen] = createSignal(false)
const { refresh } = usePath()
onMount(() => {
const refreshHandler = () => {
refetch()
}
bus.on("refresh_labels", refreshHandler)
onCleanup(() => {
bus.off("refresh_labels", refreshHandler)
})
})
const handleAddLabel = async (
name: string,
description: string,
bg_color: string,
) => {
try {
const selected = selectedObjs()
if (!selected.length) return
// 获取最新的标签列表
const labelData = await refetch()
if (labelData?.data?.content) {
// 找到刚刚创建的标签
const newLabel = labelData.data.content.find(
(label: any) =>
label.name === name &&
label.description === description &&
label.bg_color === bg_color,
)
if (newLabel) {
const files = selected.filter((obj) => !obj.is_dir)
if (files.length > 0) {
const result = await createLabelFileBindingBatch(
newLabel.id.toString(),
files,
)
}
// 强制刷新当前目录
await refresh(false, true)
}
}
} catch (err) {
console.error("Failed to bind label to files:", err)
}
}
const handleEditLabel = async (selectedLabels: string[]) => {
try {
const selected = selectedObjs()
if (!selected.length) return
// 为所有选中的文件更新标签
for (const obj of selected) {
if (!obj.is_dir) {
// 这里需要调用更新标签的 API
// 暂时先触发刷新
}
}
// 强制刷新当前目录
await refresh(false, true)
} catch (err) {
console.error("Failed to update labels for files:", err)
}
}
const handleTagClick = () => {
const labelData = labels()
if (labelData?.data?.content?.length) {
setIsEditLabelOpen(true)
} else {
setIsAddLabelOpen(true)
}
}
return (
<>
{(name) => {
return (
{
bus.emit("tool", name)
}}
/>
)
}}
{
bus.emit("tool", "s3_archive")
}}
/>
{
bus.emit("tool", "s3_restore")
}}
/>
{/* 标签功能 */}
!obj.is_dir)
}
>
{
selectAll(false)
}}
/>
{/* 标签对话框 */}
}>
setIsAddLabelOpen(false)}
onSubmit={handleAddLabel}
/>
setIsEditLabelOpen(false)}
onSubmit={handleEditLabel}
labels={labels()?.data?.content || []}
obj={selectedObjs()[0]}
isBatch={selectedObjs().length > 1}
selectedObjs={selectedObjs()}
/>
>
)
}