import { OverlayLoadingMethods } from '@/core/interfaces'; import { ComponentProps, ComponentType, JSXElementConstructor, PropsWithChildren, createRef, memo, } from 'react'; import isEqual from 'react-fast-compare'; //#region buildProvidersTree // eslint-disable-next-line @typescript-eslint/no-explicit-any type Providers = readonly JSXElementConstructor[]; type ProviderWithProps = { [K in keyof A]: ComponentProps extends never ? readonly [A[K]] : readonly [A[K]] | readonly [A[K], Omit, 'children'>]; } & Pick; export function buildProvidersTree(providerWithProps: ProviderWithProps) { return ({ children }: PropsWithChildren) => providerWithProps.reduceRight( (inner, [Provider, props = {}]) => {inner}, children, ); } //#endregion export const overlayLoadingRef = createRef(); export const overlayLoading = { show: () => overlayLoadingRef.current?.show(true), hide: () => overlayLoadingRef.current?.show(false), }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const compareMemo = >(Component: T) => memo(Component, isEqual);