UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

1 lines 3.25 kB
{"version":3,"file":"context.mjs","names":[],"sources":["../../src/Accordion/context.tsx"],"sourcesContent":["import type { Key, ReactNode } from 'react';\nimport { createContext, memo, use, useMemo } from 'react';\n\ninterface AccordionItemStateValue {\n isOpen: boolean;\n isOpenKey: (key: Key) => boolean;\n itemKey: Key;\n onToggle: () => void;\n onToggleKey: (key: Key) => void;\n onToggleNestedKey: (key: Key) => void;\n}\n\ninterface AccordionConfigValue {\n disableAnimation?: boolean;\n hideIndicator?: boolean;\n indicatorPlacement?: 'end' | 'start';\n keepContentMounted?: boolean;\n motionProps?: any;\n showDivider?: boolean;\n variant?: 'filled' | 'outlined' | 'borderless';\n}\n\n/**\n * Per-item context: each AccordionItem gets its own provider, so a toggle\n * only invalidates the value seen by that single item. Sibling items keep\n * the same context value identity and skip re-render.\n */\nexport const AccordionItemStateContext = createContext<AccordionItemStateValue | null>(null);\n\n/**\n * Static config shared by all items. Identity changes only when the user\n * changes config props on <Accordion>, which is rare.\n */\nexport const AccordionConfigContext = createContext<AccordionConfigValue | null>(null);\n\nexport const useAccordionItemState = () => use(AccordionItemStateContext);\nexport const useAccordionConfig = () => use(AccordionConfigContext);\n\ninterface AccordionItemStateProviderProps {\n children: ReactNode;\n // Used only to refresh the memoized context for wrapper children when\n // controlled expanded keys change; direct children use `isOpen`.\n expandedKeys?: Key[];\n isOpen: boolean;\n isOpenKey: (key: Key) => boolean;\n itemKey: Key;\n onToggleKey: (key: Key) => void;\n onToggleKeys: (keys: Key[], preferredKey: Key) => void;\n preferProviderKeyForNestedItems: boolean;\n}\n\nexport const AccordionItemStateProvider = memo<AccordionItemStateProviderProps>(\n ({\n children,\n expandedKeys,\n isOpenKey,\n isOpen,\n itemKey,\n onToggleKey,\n onToggleKeys,\n preferProviderKeyForNestedItems,\n }) => {\n const value = useMemo(\n () => ({\n isOpenKey,\n isOpen,\n itemKey,\n onToggle: () => onToggleKey(itemKey),\n onToggleKey,\n onToggleNestedKey: (key: Key) =>\n onToggleKeys([itemKey, key], preferProviderKeyForNestedItems ? itemKey : key),\n }),\n [\n expandedKeys,\n isOpenKey,\n isOpen,\n itemKey,\n onToggleKey,\n onToggleKeys,\n preferProviderKeyForNestedItems,\n ],\n );\n return <AccordionItemStateContext value={value}>{children}</AccordionItemStateContext>;\n },\n);\n\nAccordionItemStateProvider.displayName = 'AccordionItemStateProvider';\n"],"mappings":";;;;;;;;AA2BA,MAAa,4BAA4B,cAA8C,KAAK;;;;;AAM5F,MAAa,yBAAyB,cAA2C,KAAK;AAEtF,MAAa,8BAA8B,IAAI,0BAA0B;AACzE,MAAa,2BAA2B,IAAI,uBAAuB;AAenE,MAAa,6BAA6B,MACvC,EACC,UACA,cACA,WACA,QACA,SACA,aACA,cACA,sCACI;AAqBJ,QAAO,oBAAC,2BAAD;EAA2B,OApBpB,eACL;GACL;GACA;GACA;GACA,gBAAgB,YAAY,QAAQ;GACpC;GACA,oBAAoB,QAClB,aAAa,CAAC,SAAS,IAAI,EAAE,kCAAkC,UAAU,IAAI;GAChF,GACD;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAE2C;EAAG;EAAqC,CAAA;EAEzF;AAED,2BAA2B,cAAc"}