@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
JavaScript
"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