import { ChangeEventHandler, useCallback, useEffect, useMemo, useRef } from "react"; import { Button, Classes, Dialog, InputGroup, MenuDivider, MenuItem, Tag, UL } from "@blueprintjs/core"; import { MutationStatus } from "@tanstack/react-query"; import { useModifyTags } from "@clients/zotero"; import { useBool, useText } from "@hooks"; import { ZLibrary, ZTagSuggestion } from "Types/transforms"; type CustomInputProps = { handleChange: ChangeEventHandler, status: MutationStatus, value: string }; function CustomInput({ handleChange, status, value }: CustomInputProps){ const inputField = useRef(null); useEffect(() => { inputField?.current?.focus(); }, []); return ; } type MergeAsCustomProps = { disabled: boolean, library: ZLibrary, tags: string[] }; function MergeAsCustom({ disabled, library, tags }: MergeAsCustomProps){ const [isDialogOpen, { on: openDialog, off: closeDialog }] = useBool(false); const [value, onValueChange] = useText(""); const { mutate, status } = useModifyTags(); const triggerMerge = useCallback(() => { mutate({ into: value, library, tags }, { onSuccess: () => closeDialog() }); }, [closeDialog, library, mutate, tags, value]); return ( <>
The following tags will be merged :
    {tags.map(el =>
  • {el}
  • )}
); } type MergeAsOptionsProps = { library: ZLibrary, options: ZTagSuggestion["use"] }; function MergeAsOptions({ library, options }: MergeAsOptionsProps) { const { roam = [], zotero = [] } = options; const tagList = useMemo(() => [...roam, ...zotero], [roam, zotero]); const { mutate, status } = useModifyTags(); const disableOptions = useMemo(() => ["error", "success", "loading"].includes(status), [status]); const triggerMerge = useCallback((value) => { mutate({ into: value, library, tags: tagList }); }, [library, mutate, tagList]); return ( <> {roam.map(el => ( In Roam} multiline={true} onClick={() => triggerMerge(el)} text={el} />))} {zotero.map(el => ( triggerMerge(el)} text={el} />))} ); } export default MergeAsOptions;