import { useContext } from 'react' import { useStore as useZustandStore, } from 'zustand' import { createStore } from 'zustand/vanilla' import NoteEditorContext from './context' type Shape = { linkAnchorElement: HTMLElement | null setLinkAnchorElement: (open?: boolean) => void linkOperatorShow: boolean setLinkOperatorShow: (linkOperatorShow: boolean) => void selectedIsBold: boolean setSelectedIsBold: (selectedIsBold: boolean) => void selectedIsItalic: boolean setSelectedIsItalic: (selectedIsItalic: boolean) => void selectedIsStrikeThrough: boolean setSelectedIsStrikeThrough: (selectedIsStrikeThrough: boolean) => void selectedLinkUrl: string setSelectedLinkUrl: (selectedLinkUrl: string) => void selectedIsLink: boolean setSelectedIsLink: (selectedIsLink: boolean) => void selectedIsBullet: boolean setSelectedIsBullet: (selectedIsBullet: boolean) => void } export const createNoteEditorStore = () => { return createStore(set => ({ linkAnchorElement: null, setLinkAnchorElement: (open) => { if (open) { setTimeout(() => { const nativeSelection = window.getSelection() if (nativeSelection?.focusNode) { const parent = nativeSelection.focusNode.parentElement set(() => ({ linkAnchorElement: parent })) } }) } else { set(() => ({ linkAnchorElement: null })) } }, linkOperatorShow: false, setLinkOperatorShow: linkOperatorShow => set(() => ({ linkOperatorShow })), selectedIsBold: false, setSelectedIsBold: selectedIsBold => set(() => ({ selectedIsBold })), selectedIsItalic: false, setSelectedIsItalic: selectedIsItalic => set(() => ({ selectedIsItalic })), selectedIsStrikeThrough: false, setSelectedIsStrikeThrough: selectedIsStrikeThrough => set(() => ({ selectedIsStrikeThrough })), selectedLinkUrl: '', setSelectedLinkUrl: selectedLinkUrl => set(() => ({ selectedLinkUrl })), selectedIsLink: false, setSelectedIsLink: selectedIsLink => set(() => ({ selectedIsLink })), selectedIsBullet: false, setSelectedIsBullet: selectedIsBullet => set(() => ({ selectedIsBullet })), })) } export function useStore(selector: (state: Shape) => T): T { const store = useContext(NoteEditorContext) if (!store) throw new Error('Missing NoteEditorContext.Provider in the tree') return useZustandStore(store, selector) } export const useNoteEditorStore = () => { return useContext(NoteEditorContext)! }