import { Alert, AlertIcon, Button, Heading, VStack } from "@hope-ui/solid" import { createMemo, createSignal, For, Show } from "solid-js" import { MaybeLoading } from "~/components" import { useFetch, useRouter, useT } from "~/hooks" import { handleResp, joinBase, notify, r } from "~/utils" import { Addition, DriverConfig, DriverItem, PResp, Storage, Type, } from "~/types" import { createStore, produce } from "solid-js/store" import { Item } from "./Item" import { ResponsiveGrid } from "../common/ResponsiveGrid" interface DriverInfo { common: DriverItem[] additional: DriverItem[] config: DriverConfig } function GetDefaultValue(type: Type, value?: string) { switch (type) { case Type.Bool: if (value) { return value === "true" } return false case Type.Number: if (value) { return parseInt(value) } return 0 default: if (value) { return value } return "" } } type Drivers = Record const AddOrEdit = () => { const t = useT() const { params, back, to } = useRouter() const { id } = params const [driversLoading, loadDrivers] = useFetch( (): PResp => r.get("/admin/driver/list"), true, ) const [drivers, setDrivers] = createSignal({}) const initAdd = async () => { const resp = await loadDrivers() handleResp(resp, setDrivers) } const [storageLoading, loadStorage] = useFetch( (): PResp => r.get(`/admin/storage/get?id=${id}`), true, ) const [driverLoading, loadDriver] = useFetch( (): PResp => r.get(`/admin/driver/info?driver=${storage.driver}`), true, ) const initEdit = async () => { const storageResp = await loadStorage() handleResp(storageResp, async (storageData) => { setStorage(storageData) setAddition(JSON.parse(storageData.addition)) const driverResp = await loadDriver() handleResp(driverResp, (driverData) => setDrivers({ [storage.driver]: driverData }), ) }) } if (id) { initEdit() } else { initAdd() } const [storage, setStorage] = createStore({} as Storage) const [addition, setAddition] = createStore({}) const [okLoading, ok] = useFetch((): PResp<{ id: number }> => { setStorage("addition", JSON.stringify(addition)) return r.post(`/admin/storage/${id ? "update" : "create"}`, storage) }) const alert = createMemo(() => { const raw = drivers()[storage.driver]?.config.alert?.trim() if (!raw) return const [maybeStatus, ...messageParts] = raw.split("|") const status = ["info", "success", "warning", "danger"].includes( maybeStatus, ) ? maybeStatus : "info" const fallbackText = messageParts.length > 0 ? messageParts.join("|").trim() : raw return { status, fallbackText, } }) return ( {t(`global.${id ? "edit" : "add"}`)} { for (const item of drivers()[value].common) { setStorage( item.name as keyof Storage, GetDefaultValue(item.type, item.default) as any, ) } // clear addition first setAddition( produce((addition) => { for (const key in addition) { delete addition[key] } }), ) for (const item of drivers()[value].additional) { setAddition( item.name, GetDefaultValue(item.type, item.default) as any, ) } setStorage("driver", value) }} /> {t( `drivers.config.${storage.driver}.alert`, undefined, alert()!.fallbackText, )} {(item) => ( { setStorage(item.name as keyof Storage, val) }} /> )} {(item) => ( { setAddition(item.name, val) }} /> )} ) } export default AddOrEdit