import { Badge, Button, createDisclosure, Heading, HStack, Icon, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Text, Textarea, useColorModeValue, VStack, } from "@hope-ui/solid" import { createSignal, onCleanup, Show } from "solid-js" import { useFetch, useT } from "~/hooks" import { Group, PEmptyResp, PResp } from "~/types" import { buildIndex, updateIndex, formatDate, handleResp, handleRespWithNotifySuccess, r, } from "~/utils" import CommonSettings from "../settings/Common" import { LineMdConfirmCircleTwotone, LineMdLoadingTwotoneLoop } from "./icons" type Progress = { obj_count: number is_done: boolean last_done_time: string error: string } const Indexes = () => { const t = useT() const [progress, setProgress] = createSignal() const [progressLoading, getProgressReq] = useFetch( (): PResp => r.get("/admin/index/progress"), ) const refreshProgress = async () => { const resp = await getProgressReq() handleResp(resp, (data) => { setProgress(data) }) } const intervalId = setInterval(refreshProgress, 5000) const clear = () => clearInterval(intervalId) onCleanup(clear) refreshProgress() const [rebuildLoading, rebuildReq] = useFetch(buildIndex) const rebuild = async () => { const resp = await rebuildReq() handleRespWithNotifySuccess(resp) refreshProgress() } const [clearIndexLoading, clearIndexReq] = useFetch( (): PEmptyResp => r.post("/admin/index/clear"), ) const clearIndex = async () => { const resp = await clearIndexReq() handleRespWithNotifySuccess(resp) refreshProgress() } const [stopBuildLoading, stopBuildReq] = useFetch( (): PEmptyResp => r.post("/admin/index/stop"), ) const stopBuild = async () => { const resp = await stopBuildReq() handleRespWithNotifySuccess(resp) refreshProgress() } let updatePathsRef: HTMLTextAreaElement let updateMaxDepthRef: HTMLInputElement const [updateLoading, updateReq] = useFetch(updateIndex) const update = async () => { let updatePaths: string[] = [] if (updatePathsRef.value) { updatePaths = updatePathsRef.value.split("\n") } let updateMaxDepth = 20 if (updateMaxDepthRef.value) { updateMaxDepth = parseInt(updateMaxDepthRef.value) } const resp = await updateReq(updatePaths, updateMaxDepth) handleRespWithNotifySuccess(resp) refreshProgress() } const { isOpen, onOpen, onClose } = createDisclosure() return ( {t("manage.sidemenu.settings")} {t("indexes.current")} {t("indexes.obj_count")}: {progress()?.obj_count} {t("indexes.last_done_time")}: {progress()!.last_done_time ? formatDate(progress()!.last_done_time) : t("indexes.unknown")} {t("indexes.error")}: {progress()!.error} {t(`indexes.update`)} {t("indexes.paths_to_update")} {t("indexes.max_depth")} ) } export default Indexes