import { Checkbox, Tooltip } from "@mui/joy"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import useLoading from "../hooks/useLoading"; import { useEditorStore, useResourceStore } from "../store/module"; 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 getResourceUrl = useCallback((resource: Resource) => { return `${window.location.origin}/o/r/${resource.id}/${resource.filename}`; }, []); 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")}

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

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

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