diff --git a/src/components/factory.ts b/src/components/factory.ts index 99d5e88..399aba2 100755 --- a/src/components/factory.ts +++ b/src/components/factory.ts @@ -1,35 +1,36 @@ import { notification } from 'antd' +import { ArgsProps } from 'antd/lib/notification' import { Dispatch, ReactNode, SetStateAction } from 'react' -import { isDev } from '@utils' +import { FunctionalValue, getFunctionalValue, isDev } from '@utils' import { getUserToken } from '@utils' import { ApiError, FileInfoDto } from '@api' -const notificationTypeDictionary = new Map([ - ['error' , { notifyInstance: notification.error , caption: 'Ошибка' }], - ['warning', { notifyInstance: notification.warning, caption: 'Предупреждение' }], - ['info' , { notifyInstance: notification.info , caption: 'Инфо' }], - ['open' , { notifyInstance: notification.info , caption: '' }], -]) - export type NotifyType = 'error' | 'warning' | 'info' +const notifyTypes: Record void }> = { + error: { instance: notification.error, message: 'Ошибка' }, + warning: { instance: notification.warning, message: 'Предупреждение' }, + info: { instance: notification.info, message: 'Инфо' }, + defualt: { instance: notification.info, message: '' }, +} + /** * Вызов оповещений всплывающим окошком. * @param body string или ReactNode * @param notifyType для параметра типа. Допустимые значение 'error', 'warning', 'info' + * @param other прочие возможные аргументы уведомления */ -export const notify = (body: ReactNode, notifyType: NotifyType = 'info', other?: any) => { +export const notify = (body?: ReactNode, notifyType: NotifyType = 'info', other?: ArgsProps) => { if (!body) return - const instance = notificationTypeDictionary.get(notifyType) ?? - notificationTypeDictionary.get('open') + const instance = notifyTypes[notifyType] ?? notifyTypes.defualt - instance?.notifyInstance({ + instance?.instance({ description: body, - message: instance.caption, placement: 'bottomRight', duration: 10, + ...instance, ...other }) } @@ -39,7 +40,7 @@ type asyncFunction = (...args: any) => Promise export const invokeWebApiWrapperAsync = async ( funcAsync: asyncFunction, setShowLoader?: Dispatch>, - errorNotifyText?: ReactNode | ((ex: unknown) => ReactNode), + errorNotifyText?: FunctionalValue, actionName?: string, ) => { setShowLoader?.(true) @@ -53,10 +54,8 @@ export const invokeWebApiWrapperAsync = async ( notify(`Недостаточно прав для выполнения действия "${actionName}"`, 'error') else notify('Недостаточно прав для выполнения действия', 'error') - } else if(errorNotifyText) { - if (typeof errorNotifyText === 'function') - notify(errorNotifyText(ex), 'error') - else notify(errorNotifyText, 'error') + } else { + notify(getFunctionalValue(errorNotifyText)(ex), 'error') } } finally { setShowLoader?.(false) diff --git a/src/utils/hooks/functionalValue.ts b/src/utils/hooks/functionalValue.ts index 8d8ef1f..8726e35 100644 --- a/src/utils/hooks/functionalValue.ts +++ b/src/utils/hooks/functionalValue.ts @@ -3,9 +3,9 @@ import { useMemo } from 'react' /** * Значение типа может быть представлено непосредственно значением либо функцией его возвращаюшей */ -export type FunctionalValue = T | ((...props: P) => T) +export type FunctionalValue = []> = T | ((...props: P) => T) -export const getFunctionalValue = (value: FunctionalValue) => value instanceof Function ? value : () => value +export const getFunctionalValue = >(value: FunctionalValue) => value instanceof Function ? value : () => value /** * Облегчает работу со значениями, которые могут быть представлены функциям. @@ -13,7 +13,7 @@ export const getFunctionalValue = (value: FunctionalValue * @param value Значение или функция его возвращающая * @returns Функция, вызов которой вернёт искомое значение */ -export const useFunctionalValue = (value: FunctionalValue) => { +export const useFunctionalValue = >(value: FunctionalValue) => { const fun = useMemo(() => getFunctionalValue(value), [value]) return fun }