import { memo, useCallback, useMemo } from "react"; import { Button, ButtonGroup, Intent, Spinner } from "@blueprintjs/core"; import { ErrorBoundary, NoWriteableLibraries } from "Components/Errors"; import { TagsSelector } from "Components/Inputs"; import { useRequestsSettings } from "Components/UserSettings"; import CollectionsSelector from "./CollectionsSelector"; import LibrarySelector from "./LibrarySelector"; import { useCitoids } from "@clients/citoid"; import { ZoteroAPI, useCollections, useWriteableLibraries, useImportCitoids } from "@clients/zotero"; import { useMulti, useSelect } from "@hooks"; import { sortCollections } from "./helpers"; import { CustomClasses } from "../../constants"; import { AsBoolean } from "Types/helpers"; import { ZLibrary } from "Types/transforms"; import "./_index.sass"; type ImportButtonOwnProps = { importProps: { collections: string[], library: ZLibrary, tags: string[] } }; const ImportButton = memo(function ImportButton(props) { const { identifiers, importProps, isActive, resetImport } = props; const citoidQueries = useCitoids(identifiers, { enabled: isActive && identifiers.length > 0, select: (data) => data.item }); const isDataReady = citoidQueries.every(q => q.data); const citoids = citoidQueries.map(q => q.data).filter(AsBoolean); const { mutate, status } = useImportCitoids(); const triggerImport = useCallback(() => { const { collections, library, tags } = importProps; mutate({ collections, items: citoids, library, tags }, { onSuccess: () => resetImport() }); }, [citoids, importProps, mutate, resetImport]); const buttonProps = useMemo(() => { if(status == "loading"){ return { disabled: true, text: "Loading...", title: "Importing items..." }; } else if(status == "error") { return { disabled: true, intent: Intent.DANGER, rightIcon: "error" as const, text: "Error", title: "Error while importing items" }; } else { return { disabled: !isActive, intent: Intent.PRIMARY, loading: !isDataReady, rightIcon: "chevron-right" as const, text: "Send to Zotero", title: isDataReady ? "Import items to Zotero" : "Loading items data..." }; } }, [isActive, isDataReady, status]); return (
); }); type ZoteroImportProps = { identifiers: string[], isActive: boolean, resetImport: () => void }; const ZoteroImport = memo(function ZoteroImport(props) { const { identifiers, isActive, resetImport } = props; const [{ libraries }] = useRequestsSettings(); const { data: writeableLibraries, isLoading } = useWriteableLibraries(libraries); const collectionQueries = useCollections(libraries, { enabled: writeableLibraries.length > 0, notifyOnChangeProps: ["data"], select: (datastore) => datastore.data }); const collections = collectionQueries.map(q => q?.data || []).flat(1); return ( isLoading ? : writeableLibraries.length == 0 ? : ); }); export default ZoteroImport;