@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 3.98 kB
Source Map (JSON)
{"version":3,"file":"notice-provider.cjs","names":["NoticeProvider: FC<NoticeProviderProps>","Portal","PLACEMENT_MAP","NoticeRoot"],"sources":["../../../../src/components/notice/notice-provider.tsx"],"sourcesContent":["\"use client\"\n\nimport type { FC, RefObject } from \"react\"\nimport type {\n HTMLStyledProps,\n NoticeConfig,\n NoticePlacement,\n ThemeProps,\n} from \"../../core\"\nimport type { NoticeStyle } from \"./notice.style\"\nimport { createContext, createRef, use, useId, useMemo, useRef } from \"react\"\nimport { Portal } from \"../portal\"\nimport { NoticeRoot, PLACEMENT_MAP } from \"./notice\"\n\nexport interface NoticeProviderProps\n extends HTMLStyledProps,\n NoticeConfig,\n ThemeProps<NoticeStyle> {\n /**\n * Container ref for the portal.\n */\n containerRef?: RefObject<HTMLElement>\n}\n\ninterface NoticeState {\n limit: number\n placement: NoticePlacement\n}\n\nexport interface NoticeMethods {\n getId: (placement: NoticePlacement) => string\n getLimit: (placement: NoticePlacement) => number\n updateLimit: (state: NoticeState) => void\n}\n\ninterface NoticeContext extends NoticeMethods {}\n\nconst NoticeContext = createContext({} as NoticeContext)\n\nexport type Controller = ReturnType<typeof createController>\n\nconst createController = () => ({\n getLimit: createRef<NoticeMethods[\"getLimit\"]>(),\n updateLimit: createRef<NoticeMethods[\"updateLimit\"]>(),\n})\n\nconst createMethods = (\n id: string,\n refs: {\n [K in NoticePlacement]?: RefObject<Controller>\n },\n defaultLimit: number,\n): NoticeMethods => ({\n getId: (placement) => {\n return `${id}-${placement}`\n },\n getLimit: (placement) => {\n const method = refs[placement]?.current.getLimit.current\n\n return method?.(placement) ?? defaultLimit\n },\n updateLimit: (state) => {\n const { placement } = state\n const method = refs[placement]?.current.updateLimit.current\n\n method?.(state)\n },\n})\n\nexport const NoticeProvider: FC<NoticeProviderProps> = ({\n children,\n containerRef,\n expand = false,\n limit = 3,\n}) => {\n const placementMap = useRef<{\n [K in NoticePlacement]?: RefObject<Controller>\n }>({})\n const id = useId()\n\n const value = useMemo(\n () => ({ ...createMethods(id, placementMap.current, limit) }),\n [id, limit],\n )\n\n const components = useMemo(() => {\n return (Object.keys(PLACEMENT_MAP) as NoticePlacement[]).map(\n (placement) => {\n if (!placementMap.current[placement])\n placementMap.current[placement] = { current: createController() }\n\n return (\n <NoticeRoot\n key={placement}\n ref={placementMap.current[placement]}\n expand={expand}\n limit={limit}\n placement={placement}\n />\n )\n },\n )\n }, [limit, expand])\n\n return (\n <NoticeContext value={value}>\n {children}\n <Portal containerRef={containerRef}>{components}</Portal>\n </NoticeContext>\n )\n}\n\nexport const useNoticeContext = (): NoticeContext => {\n const context = use(NoticeContext)\n\n return context\n}\n"],"mappings":";;;;;;;;;;;;AAqCA,MAAM,yCAA8B,EAAE,CAAkB;AAIxD,MAAM,0BAA0B;CAC9B,gCAAgD;CAChD,mCAAsD;CACvD;AAED,MAAM,iBACJ,IACA,MAGA,kBACmB;CACnB,QAAQ,cAAc;AACpB,SAAO,GAAG,GAAG,GAAG;;CAElB,WAAW,cAAc;EACvB,MAAM,SAAS,KAAK,YAAY,QAAQ,SAAS;AAEjD,SAAO,SAAS,UAAU,IAAI;;CAEhC,cAAc,UAAU;EACtB,MAAM,EAAE,cAAc;EACtB,MAAM,SAAS,KAAK,YAAY,QAAQ,YAAY;AAEpD,WAAS,MAAM;;CAElB;AAED,MAAaA,kBAA2C,EACtD,UACA,cACA,SAAS,OACT,QAAQ,QACJ;CACJ,MAAM,iCAEH,EAAE,CAAC;CACN,MAAM,uBAAY;AA0BlB,QACE,4CAAC;EAAc,iCAxBR,EAAE,GAAG,cAAc,IAAI,aAAa,SAAS,MAAM,EAAE,GAC5D,CAAC,IAAI,MAAM,CACZ;aAuBI,UACD,2CAACC;GAAqB;sCAtBO;AAC/B,WAAQ,OAAO,KAAKC,6BAAc,CAAuB,KACtD,cAAc;AACb,SAAI,CAAC,aAAa,QAAQ,WACxB,cAAa,QAAQ,aAAa,EAAE,SAAS,kBAAkB,EAAE;AAEnE,YACE,2CAACC;MAEC,KAAK,aAAa,QAAQ;MAClB;MACD;MACI;QAJN,UAKL;MAGP;MACA,CAAC,OAAO,OAAO,CAAC;IAK0C;GAC3C;;AAIpB,MAAa,yBAAwC;AAGnD,uBAFoB,cAAc"}