import { Button, Checkbox } from "@mui/joy"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import useLoading from "../hooks/useLoading"; import { useEditorStore, useResourceStore } from "../store/module"; import { getResourceUrl } from "../utils/resource"; import Icon from "./Icon"; import toastHelper from "./Toast"; import { generateDialog } from "./Dialog"; import showPreviewImageDialog from "./PreviewImageDialog"; import "../less/resources-selector-dialog.less"; type Props = DialogProps; interface State { checkedArray: boolean[]; } const ResourcesSelectorDialog: React.FC = (props: Props) => { const { destroy } = props; const { t } = useTranslation(); const loadingState = useLoading(); const editorStore = useEditorStore(); const resourceStore = useResourceStore(); const resources = resourceStore.state.resources; const [state, setState] = useState({ checkedArray: [], }); useEffect(() => { resourceStore .fetchResourceList() .catch((error) => { console.error(error); toastHelper.error(error.response.data.message); }) .finally(() => { loadingState.setFinish(); }); }, []); useEffect(() => { const checkedResourceIdArray = editorStore.state.resourceList.map((resource) => resource.id); setState({ checkedArray: resources.map((resource) => { return checkedResourceIdArray.includes(resource.id); }), }); }, [resources]); const handlePreviewBtnClick = (resource: Resource) => { const resourceUrl = getResourceUrl(resource); if (resource.type.startsWith("image")) { showPreviewImageDialog( resources.filter((r) => r.type.startsWith("image")).map((r) => getResourceUrl(r)), resources.findIndex((r) => r.id === resource.id) ); } else { window.open(resourceUrl); } }; const handleCheckboxChange = (index: number) => { const newCheckedArr = state.checkedArray; newCheckedArr[index] = !newCheckedArr[index]; setState({ checkedArray: newCheckedArr, }); }; const handleConfirmBtnClick = () => { const resourceList = resources.filter((_, index) => { return state.checkedArray[index]; }); editorStore.setResourceList(resourceList); destroy(); }; return ( <>

{t("sidebar.resources")}

{loadingState.isLoading ? (

{t("resources.fetching-data")}

) : (
{t("resources.name")} Type
{resources.length === 0 ? (

{t("resources.no-resources")}

) : ( resources.map((resource, index) => (
handlePreviewBtnClick(resource)}> {resource.filename} {resource.type}
handleCheckboxChange(index)} />
)) )}
)}
{t("message.count-selected-resources")}: {state.checkedArray.filter((checked) => checked).length}
); }; export default function showResourcesSelectorDialog() { generateDialog( { className: "resources-selector-dialog", dialogName: "resources-selector-dialog", }, ResourcesSelectorDialog, {} ); }