import Tippy from "@tippyjs/react"; import { useEffect, useState } from "react"; import { LinkButton } from "renderer/components/shared/link-button.component"; import { BsmBasicSpinner } from "renderer/components/shared/bsm-basic-spinner/bsm-basic-spinner.component"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { useService } from "renderer/hooks/use-service.hook"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { useTranslation } from "renderer/hooks/use-translation.hook"; import { BSVersionManagerService } from "renderer/services/bs-version-manager.service"; import { ConfigurationService } from "renderer/services/configuration.service"; import { IpcService } from "renderer/services/ipc.service"; import { ModalComponent } from "renderer/services/modale.service"; import { FolderLinkState, VersionFolderLinkerService, VersionLinkerActionType } from "renderer/services/version-folder-linker.service"; import { lastValueFrom } from "rxjs"; import { BSVersion } from "shared/bs-version.interface"; export const ShareFoldersModal: ModalComponent = ({ options: {data} }) => { const SHARED_FOLDERS_KEY = "default-shared-folders"; const config = useService(ConfigurationService); const ipc = useService(IpcService); const linker = useService(VersionFolderLinkerService); const versionManager = useService(BSVersionManagerService); const t = useTranslation(); const [folders, setFolders] = useState(Array.from(new Set([...config.get(SHARED_FOLDERS_KEY)]).values())); useEffect(() => { linker .getLinkedFolders(data, { relative: true }) .toPromise() .then(linkedFolders => { setFolders(prev => Array.from(new Set([...prev, ...linkedFolders]).values())); }); }, []); useEffect(() => { if (!folders?.length) { config.delete(SHARED_FOLDERS_KEY); return; } config.set(SHARED_FOLDERS_KEY, folders); }, [folders]); const addFolder = async () => { const versionPath = await lastValueFrom(versionManager.getVersionPath(data)); const folder = await lastValueFrom(ipc.sendV2("choose-folder", versionPath)); if (!folder || folder.canceled || !folder.filePaths?.length) { return; } const relativeFolder = await lastValueFrom(ipc.sendV2("full-version-path-to-relative", { version: data, fullPath: folder.filePaths[0] })); if (folders.includes(relativeFolder)) { return; } setFolders(pre => [...pre, relativeFolder]); }; const removeFolder = (index: number) => { setFolders(prev => prev.filter((_, i) => i !== index)); }; const linkAll = () => { folders.forEach(relativeFolder => linker.linkVersionFolder({ version: data, relativeFolder, type: VersionLinkerActionType.Link })); }; return (

{t("modals.shared-folders.title")}

{t("modals.shared-folders.description")}

    {folders.map((folder, index) => ( { removeFolder(index); }} /> ))}
); }; // -------- FOLDER ITEM -------- type FolderProps = { version: BSVersion; relativeFolder: string; onDelete?: () => void; }; const FolderItem = ({ version, relativeFolder, onDelete }: FolderProps) => { const linker = useService(VersionFolderLinkerService); const t = useTranslation(); const color = useThemeColor("first-color"); const state = useObservable(() => linker.$folderLinkedState(version, relativeFolder), FolderLinkState.Unlinked, [version, relativeFolder]); const name = relativeFolder.split(window.electron.path.sep).at(-1); const onClickLink = () => { if (state === FolderLinkState.Linked) { return linker.unlinkVersionFolder({ version, relativeFolder, type: VersionLinkerActionType.Unlink, }); } return linker.linkVersionFolder({ version, relativeFolder, type: VersionLinkerActionType.Link, }); }; const cancelLink = () => { linker.cancelAction(version, relativeFolder); }; return (
  • {name}
    {(() => { if (state === FolderLinkState.Processing) { return ; } if (state === FolderLinkState.Pending) { return ( { e.preventDefault(); cancelLink(); }} /> ); } return ( { e.preventDefault(); onDelete?.(); }} /> ); })()}
  • ); };