import type { AtomToken, Loadable, ReadableToken, ReadonlyPureSelectorToken, RegularAtomToken, } from "atom.io" import { actUponStore, arbitrary, disposeFromStore, findInStore, getFromStore, } from "atom.io/internal" import type { FamilyNode, WritableTokenIndex } from "atom.io/introspection" import { primitiveRefinery } from "atom.io/introspection" import { useI, useO } from "atom.io/react" import { type FC, useContext } from "react" import { button } from "./Button.tsx" import { DEFAULT_JSON_EDITOR_COMPONENTS } from "./json-editor/index.ts" import { StoreEditor } from "./StateEditor.tsx" import { DevtoolsContext } from "./store.ts" /* eslint-disable no-console */ export const StateIndexLeafNode: FC<{ node: ReadableToken isOpenState: RegularAtomToken typeState: ReadonlyPureSelectorToken> dispose?: (() => void) | undefined }> = ({ node, isOpenState, typeState, dispose }) => { const { openCloseAllTX, store } = useContext(DevtoolsContext) const setIsOpen = useI(isOpenState) const isOpen = useO(isOpenState) const state = useO(node) const stateTypeLoadable = useO(typeState) const stateType = stateTypeLoadable instanceof Promise ? `Promise` : stateTypeLoadable const isPrimitive = Boolean(primitiveRefinery.refine(state)) const path = node.family ? [node.family.key, node.family.subKey] : [node.key] let stringified: string try { stringified = JSON.stringify(state) } catch (_) { stringified = `?` } return ( <>
{ console.log(node, getFromStore(store, node)) }} onKeyUp={() => { console.log(node, getFromStore(store, node)) }} > { actUponStore(store, openCloseAllTX, arbitrary())(path, isOpen) return false }} setIsOpen={setIsOpen} disabled={isPrimitive} />

{node.family?.subKey ?? node.key}

({stateType})
{isPrimitive ? ( ) : (
{stringified}
)} {dispose ? ( { dispose?.() }} testid={`${node.key}-dispose`} > ) : null}
{isOpen && !isPrimitive ? (
) : null} ) } export const StateIndexTreeNode: FC<{ node: FamilyNode> isOpenState: RegularAtomToken }> = ({ node, isOpenState }) => { const setIsOpen = useI(isOpenState) const isOpen = useO(isOpenState) const { typeSelectors, viewIsOpenAtoms, openCloseAllTX, store } = useContext(DevtoolsContext) for (const [key, childNode] of node.familyMembers) { findInStore(store, viewIsOpenAtoms, [key]) findInStore(store, typeSelectors, childNode.key) } return ( <>
{ actUponStore( store, openCloseAllTX, arbitrary(), )([node.key], isOpen) return false }} setIsOpen={setIsOpen} />

{node.key}

(family)
{isOpen ? [...node.familyMembers.entries()].map(([key, childNode]) => ( { disposeFromStore(store, childNode) }} /> )) : null} ) } export const StateIndexNode: FC<{ node: | FamilyNode> | ReadableToken isOpenState: RegularAtomToken typeState: ReadonlyPureSelectorToken> dispose?: () => void }> = ({ node, isOpenState, typeState, dispose }) => { return (
{`type` in node ? ( ) : ( )}
) } export const StateIndex: FC<{ tokenIndex: AtomToken>> }> = ({ tokenIndex }) => { const tokenIds = useO(tokenIndex) const { typeSelectors, viewIsOpenAtoms, store } = useContext(DevtoolsContext) const statesName = tokenIndex.key.includes(`Atom`) ? `atoms` : `selectors` return (
{tokenIds.size === 0 ? (

(no {statesName})

) : ( [...tokenIds.entries()].map(([key, node]) => { return ( ) }) )}
) }