UNPKG

@lobehub/ui

Version:

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

1 lines 3.26 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,IAAI;;;;;AAM3F,MAAa,yBAAyB,cAA2C,IAAI;AAErF,MAAa,8BAA8B,IAAI,yBAAyB;AACxE,MAAa,2BAA2B,IAAI,sBAAsB;AAelE,MAAa,6BAA6B,MACvC,EACC,UACA,cACA,WACA,QACA,SACA,aACA,cACA,sCACI;CACJ,MAAM,QAAQ,eACL;EACL;EACA;EACA;EACA,gBAAgB,YAAY,OAAO;EACnC;EACA,oBAAoB,QAClB,aAAa,CAAC,SAAS,GAAG,GAAG,kCAAkC,UAAU,GAAG;CAChF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CACA,OAAO,oBAAC,2BAAD;EAAkC;EAAQ;CAAoC,CAAA;AACvF,CACF;AAEA,2BAA2B,cAAc"}