import { memo, useCallback } from "react"; import { Button, Checkbox, Classes, Tag } from "@blueprintjs/core"; import AuxiliaryDialog from "Components/AuxiliaryDialog"; import { ErrorBoundary } from "Components/Errors"; import { CitoidGuide } from "Components/Guide"; import { useTypemapSettings } from "Components/UserSettings"; import ZoteroImport from "Components/ZoteroImport"; import { CitoidAPI, useCitoids } from "@clients/citoid"; import { useMulti } from "@hooks"; import { pluralize } from "../../../utils"; import { CustomClasses } from "../../../constants"; import { AsBoolean } from "Types/helpers"; type WebImportItem = { abstract: string, creators: string, itemType: CitoidAPI.AsZotero["itemType"], publication: string, title: string, url: string }; function useGetCitoids(urls: string[], opts = {}) { return useCitoids(urls, { ...opts, select: (data) => { const { item, query } = data; return { abstract: item.abstractNote || "", creators: item.creators?.map(cre => { if ("name" in cre) { return cre.name; } else { return [cre.firstName, cre.lastName].filter(AsBoolean).join(" "); } }).join(", "), itemType: item.itemType, publication: item.publicationTitle || item.bookTitle || item.websiteTitle || "", title: item.title, url: query } as WebImportItem; }, notifyOnChangeProps: ["data", "isLoading"] }); } type WebImportItemProps = { isSelected: boolean, item: WebImportItem, onSelect: (value: string) => void }; const WebImportItem = memo(function WebImportItem(props){ const { isSelected, item, onSelect } = props; const [typemap] = useTypemapSettings(); const handleCheckUncheck = useCallback(() => { onSelect(item.url); }, [item.url, onSelect]); return (
  • {item.title} {item.creators ? ({item.creators}) : null} } onChange={handleCheckUncheck} /> {item.itemType ? {typemap[item.itemType] || item.itemType} : null}
    {item.abstract}
  • ); }); type WebImportPanelProps = { isOpen: boolean, onClose: () => void, urls: string[] }; const WebImportPanel = memo(function WebImportPanel(props){ const { isOpen, onClose, urls } = props; const [selected, { set: setSelected, toggle: onItemSelect }] = useMulti({ start: [] }); const has_selected_items = selected.length > 0; const citoidQueries = useGetCitoids(urls, { enabled: isOpen }); const noQueriesLoaded = citoidQueries.every(q => q.isLoading); const citoids = citoidQueries.filter(q => q.isSuccess).map(q => q.data).filter(AsBoolean); const handleClose = useCallback(() => { setSelected([]); onClose(); }, [onClose, setSelected]); return (
    {noQueriesLoaded ? "Parsing links..." : pluralize(citoids.length, "link", " found")}
    {!noQueriesLoaded && }
      {citoids.map(cit => )}
    setSelected([])} />
    ); }); export default WebImportPanel;