@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
78 lines (74 loc) • 2.22 kB
JavaScript
"use client";
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
const require_system_provider = require('../../core/system/system-provider.cjs');
let react = require("react");
react = require_rolldown_runtime.__toESM(react);
//#region src/components/snacks/use-snacks.tsx
let counter = 0;
/**
* `useSnacks` is a custom hook for controlling notifications used in forms and the like.
*
* @see https://yamada-ui.com/docs/hooks/use-snacks
*/
const useSnacks = (options = {}) => {
const [items, setItems] = (0, react.useState)([]);
const { config } = require_system_provider.useSystem();
const systemOptions = (0, react.useMemo)(() => config.snacks ?? {}, [config]);
const defaultOptions = (0, react.useMemo)(() => ({
...systemOptions,
...options
}), [options, systemOptions]);
const { direction, limit = 3, startIndex } = defaultOptions;
const getOptions = (0, react.useCallback)((options$1) => ({
...defaultOptions,
...options$1
}), [defaultOptions]);
return {
snack: (0, react.useMemo)(() => {
const methods = (options$1 = {}) => {
options$1 = getOptions(options$1);
counter += 1;
const { id = counter.toString(),...rest } = options$1;
const onClose = () => setItems((prev) => prev.filter((prevOptions) => prevOptions.id !== id));
const snack = {
id,
onClose,
...rest
};
setItems((prev) => [...prev.splice(-1 * ((limit ?? Infinity) - 1)), snack]);
return id;
};
methods.update = (id, options$1) => {
options$1 = getOptions(options$1);
setItems((prev) => prev.map((prevOptions) => prevOptions.id === id ? {
...prevOptions,
...options$1
} : prevOptions));
};
methods.closeAll = () => {
setItems([]);
};
methods.close = (id) => {
setItems((prev) => prev.filter((prevOptions) => prevOptions.id !== id));
};
methods.isActive = (id) => !!items.find((prevOptions) => prevOptions.id === id);
return methods;
}, [
items,
limit,
getOptions
]),
snacks: (0, react.useMemo)(() => ({
direction,
items,
startIndex
}), [
direction,
startIndex,
items
])
};
};
//#endregion
exports.useSnacks = useSnacks;
//# sourceMappingURL=use-snacks.cjs.map