import { Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Button, FormControl, FormLabel, Input, FormHelperText, VStack, notificationService, HStack, Box, Text, Divider, Tooltip, Heading, } from "@hope-ui/solid" import { createSignal, createEffect, For } from "solid-js" import { useT } from "~/hooks" import { createLabel, updateLabel, getFilesByLabel } from "~/utils/api" import { bus, handleResp } from "~/utils" import { StoreObj, Obj } from "~/types" const LABEL_COLORS = ["#ff776e", "#feb34a", "#62e56f", "#4e9cff", "#d17bff"] export interface AddLabelDialogProps { isOpen: boolean onClose: () => void onSubmit: (name: string, description: string, bg_color: string) => void editingLabel?: { id: number name: string description: string bg_color: string } | null } const AddLabelDialog = (props: AddLabelDialogProps) => { const t = useT() const [name, setName] = createSignal("") const [description, setDescription] = createSignal("") const [loading, setLoading] = createSignal(false) const [selectedColor, setSelectedColor] = createSignal(LABEL_COLORS[0]) const [relatedFiles, setRelatedFiles] = createSignal<(StoreObj & Obj)[]>([]) createEffect(() => { if (props.editingLabel) { setName(props.editingLabel.name) setDescription(props.editingLabel.description || "") setSelectedColor(props.editingLabel.bg_color) // 获取关联文件 getFilesByLabel(props.editingLabel.id).then((resp) => { handleResp(resp, (data) => { setRelatedFiles(data || []) }) }) } else { setName("") setDescription("") setSelectedColor(LABEL_COLORS[0]) setRelatedFiles([]) } }) const handleSubmit = async () => { if (!name()) { notificationService.show({ title: t("home.tag.name"), description: t("home.tag.name_required"), status: "warning", }) return } try { setLoading(true) if (props.editingLabel) { await updateLabel( props.editingLabel.id, name(), description(), selectedColor(), ) } else { await createLabel(name(), description(), selectedColor()) } props.onSubmit(name(), description(), selectedColor()) setName("") setDescription("") props.onClose() bus.emit("refresh_labels") notificationService.show({ title: t("home.tag.name"), description: props.editingLabel ? t("home.tag.update_success") : t("home.tag.create_success"), status: "success", }) } catch (err: any) { notificationService.show({ title: t("home.tag.name"), description: err.message || (props.editingLabel ? t("home.tag.update_failed") : t("home.tag.create_failed")), status: "danger", }) } finally { setLoading(false) } } return ( {props.editingLabel ? t("home.tag.edit") : t("home.tag.add")} {t("home.tag.name")} setName(e.currentTarget.value)} /> {name().length}/10 {t("home.tag.description")} setDescription(e.currentTarget.value)} /> {t("home.tag.color")} {LABEL_COLORS.map((color) => ( setSelectedColor(color)} /> ))} {/* {t("home.tag.related_files")} */} {t("home.tag.related_files")} {(file) => ( {file.name} {file.path} )} ) } export default AddLabelDialog