UNPKG

@yamada-ui/react

Version:

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

1 lines 9.64 kB
{"version":3,"file":"loading-provider.cjs","names":["LoadingProvider: FC<LoadingProviderProps>","Screen","Page","Background","Controller: FC<ControllerProps>","loadingCount","props: LoadingSharedProps","AnimatePresence","Portal","RemoveScroll"],"sources":["../../../../src/components/loading/loading-provider.tsx"],"sourcesContent":["\"use client\"\n\nimport type { FC, PropsWithChildren, ReactNode, RefObject } from \"react\"\nimport type { LoadingConfig, LoadingScheme, ThemeConfig } from \"../../core\"\nimport { AnimatePresence } from \"motion/react\"\nimport { createContext, createRef, use, useMemo, useRef, useState } from \"react\"\nimport { RemoveScroll } from \"react-remove-scroll\"\nimport { assignRef, isNumber, useUpdateEffect } from \"../../utils\"\nimport { Portal } from \"../portal\"\nimport { Background } from \"./background\"\nimport { Page } from \"./page\"\nimport { Screen } from \"./screen\"\n\ninterface LoadingMethods {\n /**\n * Function to finish loading.\n */\n finish: () => void\n /**\n * Function to forcefully update the loading state.\n *\n * Please be careful, as it will forcefully overwrite the state of the loading component.\n */\n force: (state: Partial<LoadingState>) => void\n /**\n * Function to start loading.\n *\n * If you specify a `message` etc. as an argument, the loading will change accordingly.\n */\n start: (options?: LoadingOptions) => void\n /**\n * Function to update loading.\n *\n * If you specify a `message` etc. as an argument, the loading will change accordingly.\n */\n update: (options: LoadingOptions) => void\n}\n\nexport interface LoadingOptions {\n duration?: null | number\n loadingScheme?: LoadingScheme\n message?: ReactNode\n}\n\ninterface LoadingState {\n duration: null | number\n loadingCount: number\n loadingScheme: LoadingScheme\n message: ReactNode | undefined\n}\n\ninterface LoadingContext {\n /**\n * The background loading methods.\n */\n background: LoadingMethods\n /**\n * The page loading methods.\n */\n page: LoadingMethods\n /**\n * The screen loading methods.\n */\n screen: LoadingMethods\n}\n\nconst LoadingContext = createContext({} as LoadingContext)\n\nconst createController = () => ({\n finish: createRef<LoadingMethods[\"finish\"]>(),\n force: createRef<LoadingMethods[\"force\"]>(),\n start: createRef<LoadingMethods[\"start\"]>(),\n update: createRef<LoadingMethods[\"update\"]>(),\n})\n\ntype Controller = ReturnType<typeof createController>\n\nconst createMethods = (refs: RefObject<Controller>): LoadingMethods => ({\n finish: () => refs.current.finish.current?.(),\n force: (state) => refs.current.force.current?.(state),\n start: (props) => refs.current.start.current?.(props),\n update: (props) => refs.current.update.current?.(props),\n})\n\nconst incrementCount = (prev: number) => prev + 1\nconst decrementCount = (prev: number) => (prev === 0 ? prev : prev - 1)\n\nexport interface LoadingProviderProps\n extends PropsWithChildren<ThemeConfig[\"loading\"]> {}\n\nexport const LoadingProvider: FC<LoadingProviderProps> = ({\n background: backgroundConfig,\n children,\n page: pageConfig,\n screen: screenConfig,\n}) => {\n const screen = useRef(createController())\n const page = useRef(createController())\n const background = useRef(createController())\n\n const value = useMemo(\n () => ({\n background: createMethods(background),\n page: createMethods(page),\n screen: createMethods(screen),\n }),\n [],\n )\n\n return (\n <LoadingContext value={value}>\n {children}\n\n <Controller ref={screen} {...screenConfig} component={Screen} />\n\n <Controller ref={page} {...pageConfig} component={Page} />\n\n <Controller\n ref={background}\n {...backgroundConfig}\n blockScrollOnMount={backgroundConfig?.blockScrollOnMount ?? false}\n component={Background}\n />\n </LoadingContext>\n )\n}\n\nexport interface LoadingSharedProps {\n duration: null | number\n loadingScheme: LoadingScheme\n message: ReactNode | undefined\n onFinish: () => void\n initial?: boolean | string\n}\n\ninterface ControllerProps extends LoadingConfig {\n ref: RefObject<Controller>\n component: FC<LoadingSharedProps>\n}\n\nconst Controller: FC<ControllerProps> = ({\n ref,\n allowPinchZoom = false,\n blockScrollOnMount = true,\n component: Component,\n duration: durationProp = null,\n loadingCount: loadingCountProp = 0,\n loadingScheme: loadingSchemeProp = \"oval\",\n}) => {\n const loading = useRef<boolean>(false)\n const [{ duration, loadingCount, loadingScheme, message }, setState] =\n useState<LoadingState>({\n duration: durationProp,\n loadingCount: loadingCountProp,\n loadingScheme: loadingSchemeProp,\n message: undefined,\n })\n\n const { finish, force, start, update } = useMemo<LoadingMethods>(\n () => ({\n finish: () => {\n loading.current = false\n\n setState(({ loadingCount }) => ({\n duration: durationProp,\n loadingCount: decrementCount(loadingCount),\n loadingScheme: loadingSchemeProp,\n message: undefined,\n }))\n },\n\n force: ({\n duration = durationProp,\n loadingCount = 0,\n loadingScheme = loadingSchemeProp,\n message,\n }) => {\n loading.current = !!loadingCount\n\n setState({\n duration,\n loadingCount,\n loadingScheme,\n message,\n })\n },\n\n start: ({\n duration = durationProp,\n loadingScheme = loadingSchemeProp,\n message,\n } = {}) => {\n loading.current = true\n\n setState(({ loadingCount }) => ({\n duration,\n loadingCount: incrementCount(loadingCount),\n loadingScheme,\n message,\n }))\n },\n\n update: (next) => setState((prev) => ({ ...prev, ...next })),\n }),\n [durationProp, loadingSchemeProp],\n )\n\n assignRef(ref.current.start, start)\n assignRef(ref.current.finish, finish)\n assignRef(ref.current.update, update)\n assignRef(ref.current.force, force)\n\n const props: LoadingSharedProps = {\n duration,\n initial: loadingCountProp > 0 ? false : \"initial\",\n loadingScheme,\n message,\n onFinish: finish,\n }\n\n useUpdateEffect(() => {\n if (loadingCountProp > 0 || isNumber(durationProp))\n setState({\n duration: durationProp,\n loadingCount: loadingCountProp,\n loadingScheme: loadingSchemeProp,\n message: undefined,\n })\n }, [loadingCountProp, durationProp, loadingSchemeProp])\n\n return (\n <AnimatePresence initial={false}>\n {loadingCount ? (\n <Portal>\n <RemoveScroll\n allowPinchZoom={allowPinchZoom}\n enabled={blockScrollOnMount}\n forwardProps\n >\n <Component {...props} />\n </RemoveScroll>\n </Portal>\n ) : null}\n </AnimatePresence>\n )\n}\n\n/**\n * `useLoading` is a custom hook for controlling the loading of the application.\n *\n * @see https://yamada-ui.com/docs/hooks/use-loading\n */\nexport const useLoading = (): LoadingContext => {\n const { background, page, screen } = use(LoadingContext)\n\n const context = useMemo(\n () => ({ background, page, screen }),\n [background, page, screen],\n )\n\n return context\n}\n"],"mappings":"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"}