@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 5.01 kB
Source Map (JSON)
{"version":3,"file":"use-snacks.cjs","names":["useSystem","options","snack: Snack"],"sources":["../../../../src/components/snacks/use-snacks.tsx"],"sourcesContent":["\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport type { SnacksConfig } from \"../../core\"\nimport type { Alert } from \"../alert\"\nimport type { SnackCloseButtonProps, SnackContentProps } from \"./snacks\"\nimport { useCallback, useMemo, useState } from \"react\"\nimport { useSystem } from \"../../core\"\n\nexport interface Snack\n extends Omit<UseSnacksOptions, \"direction\" | \"limit\" | \"startIndex\"> {\n id: string\n onClose: () => void\n onCloseComplete?: () => void\n}\n\nlet counter = 0\n\ninterface SnackMethodsOptions extends Partial<Omit<Snack, \"onClose\">> {}\n\nexport interface UseSnacksOptions\n extends Omit<Alert.RootProps, \"direction\" | \"title\">,\n Pick<Alert.LoadingProps, \"loadingScheme\">,\n SnacksConfig {\n /**\n * The description of the snack.\n */\n description?: ReactNode\n /**\n * The title of the snack.\n */\n title?: ReactNode\n /**\n * If `true`, the snack will have an icon.\n *\n * @default true\n */\n withIcon?: boolean\n /**\n * Props for the snack close button.\n */\n closeButtonProps?: SnackCloseButtonProps\n /**\n * Props for the snack content component.\n */\n contentProps?: SnackContentProps\n /**\n * Props for the alert description component.\n */\n descriptionProps?: Alert.DescriptionProps\n /**\n * Props for the alert icon component.\n */\n iconProps?: Alert.IconProps\n /**\n * Props for the alert loading component.\n */\n loadingProps?: Alert.LoadingProps\n /**\n * Props for the alert title component.\n */\n titleProps?: Alert.TitleProps\n}\n\n/**\n * `useSnacks` is a custom hook for controlling notifications used in forms and the like.\n *\n * @see https://yamada-ui.com/docs/hooks/use-snacks\n */\nexport const useSnacks = (options: UseSnacksOptions = {}) => {\n const [items, setItems] = useState<Snack[]>([])\n const { config } = useSystem()\n\n const systemOptions = useMemo(() => config.snacks ?? {}, [config])\n const defaultOptions = useMemo(\n () => ({ ...systemOptions, ...options }),\n [options, systemOptions],\n )\n const { direction, limit = 3, startIndex } = defaultOptions\n\n const getOptions = useCallback(\n (options: SnackMethodsOptions) => ({ ...defaultOptions, ...options }),\n [defaultOptions],\n )\n\n const snack = useMemo(() => {\n const methods = (options: SnackMethodsOptions = {}) => {\n options = getOptions(options)\n counter += 1\n\n const { id = counter.toString(), ...rest } = options\n const onClose = () =>\n setItems((prev) => prev.filter((prevOptions) => prevOptions.id !== id))\n\n const snack: Snack = { id, onClose, ...rest }\n\n setItems((prev) => [\n ...prev.splice(-1 * ((limit ?? Infinity) - 1)),\n snack,\n ])\n\n return id\n }\n\n methods.update = (\n id: number | string,\n options: Omit<SnackMethodsOptions, \"id\">,\n ) => {\n options = getOptions(options)\n\n setItems((prev) =>\n prev.map((prevOptions) =>\n prevOptions.id === id ? { ...prevOptions, ...options } : prevOptions,\n ),\n )\n }\n\n methods.closeAll = () => {\n setItems([])\n }\n\n methods.close = (id: number | string) => {\n setItems((prev) => prev.filter((prevOptions) => prevOptions.id !== id))\n }\n\n methods.isActive = (id: number | string) =>\n !!items.find((prevOptions) => prevOptions.id === id)\n\n return methods\n }, [items, limit, getOptions])\n\n const snacks = useMemo(\n () => ({ direction, items, startIndex }),\n [direction, startIndex, items],\n )\n\n return { snack, snacks }\n}\n\nexport type UseSnacksReturn = ReturnType<typeof useSnacks>\n"],"mappings":";;;;;;;;;AAgBA,IAAI,UAAU;;;;;;AAqDd,MAAa,aAAa,UAA4B,EAAE,KAAK;CAC3D,MAAM,CAAC,OAAO,gCAA8B,EAAE,CAAC;CAC/C,MAAM,EAAE,WAAWA,mCAAW;CAE9B,MAAM,yCAA8B,OAAO,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC;CAClE,MAAM,2CACG;EAAE,GAAG;EAAe,GAAG;EAAS,GACvC,CAAC,SAAS,cAAc,CACzB;CACD,MAAM,EAAE,WAAW,QAAQ,GAAG,eAAe;CAE7C,MAAM,qCACH,eAAkC;EAAE,GAAG;EAAgB,GAAGC;EAAS,GACpE,CAAC,eAAe,CACjB;AAqDD,QAAO;EAAE,gCAnDmB;GAC1B,MAAM,WAAW,YAA+B,EAAE,KAAK;AACrD,gBAAU,WAAWA,UAAQ;AAC7B,eAAW;IAEX,MAAM,EAAE,KAAK,QAAQ,UAAU,CAAE,GAAG,SAASA;IAC7C,MAAM,gBACJ,UAAU,SAAS,KAAK,QAAQ,gBAAgB,YAAY,OAAO,GAAG,CAAC;IAEzE,MAAMC,QAAe;KAAE;KAAI;KAAS,GAAG;KAAM;AAE7C,cAAU,SAAS,CACjB,GAAG,KAAK,OAAO,OAAO,SAAS,YAAY,GAAG,EAC9C,MACD,CAAC;AAEF,WAAO;;AAGT,WAAQ,UACN,IACA,cACG;AACH,gBAAU,WAAWD,UAAQ;AAE7B,cAAU,SACR,KAAK,KAAK,gBACR,YAAY,OAAO,KAAK;KAAE,GAAG;KAAa,GAAGA;KAAS,GAAG,YAC1D,CACF;;AAGH,WAAQ,iBAAiB;AACvB,aAAS,EAAE,CAAC;;AAGd,WAAQ,SAAS,OAAwB;AACvC,cAAU,SAAS,KAAK,QAAQ,gBAAgB,YAAY,OAAO,GAAG,CAAC;;AAGzE,WAAQ,YAAY,OAClB,CAAC,CAAC,MAAM,MAAM,gBAAgB,YAAY,OAAO,GAAG;AAEtD,UAAO;KACN;GAAC;GAAO;GAAO;GAAW,CAAC;EAOd,kCAJP;GAAE;GAAW;GAAO;GAAY,GACvC;GAAC;GAAW;GAAY;GAAM,CAC/B;EAEuB"}