UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

56 lines (52 loc) 1.74 kB
"use client"; import { Portal } from "../portal/portal.js"; import { NoticeRoot, PLACEMENT_MAP } from "./notice.js"; import { createContext, createRef, use, useId, useMemo, useRef } from "react"; import { jsx, jsxs } from "react/jsx-runtime"; //#region src/components/notice/notice-provider.tsx const NoticeContext = createContext({}); const createController = () => ({ getLimit: createRef(), updateLimit: createRef() }); const createMethods = (id, refs, defaultLimit) => ({ getId: (placement) => { return `${id}-${placement}`; }, getLimit: (placement) => { const method = refs[placement]?.current.getLimit.current; return method?.(placement) ?? defaultLimit; }, updateLimit: (state) => { const { placement } = state; const method = refs[placement]?.current.updateLimit.current; method?.(state); } }); const NoticeProvider = ({ children, containerRef, expand = false, limit = 3 }) => { const placementMap = useRef({}); const id = useId(); return /* @__PURE__ */ jsxs(NoticeContext, { value: useMemo(() => ({ ...createMethods(id, placementMap.current, limit) }), [id, limit]), children: [children, /* @__PURE__ */ jsx(Portal, { containerRef, children: useMemo(() => { return Object.keys(PLACEMENT_MAP).map((placement) => { if (!placementMap.current[placement]) placementMap.current[placement] = { current: createController() }; return /* @__PURE__ */ jsx(NoticeRoot, { ref: placementMap.current[placement], expand, limit, placement }, placement); }); }, [limit, expand]) })] }); }; const useNoticeContext = () => { return use(NoticeContext); }; //#endregion export { NoticeProvider, useNoticeContext }; //# sourceMappingURL=notice-provider.js.map