Исправлен тип пропсов в типе FunctionalValue

This commit is contained in:
goodmice 2022-06-10 19:59:19 +05:00
parent d5e827532d
commit c07b2ef5b9
2 changed files with 20 additions and 21 deletions

View File

@ -1,35 +1,36 @@
import { notification } from 'antd' import { notification } from 'antd'
import { ArgsProps } from 'antd/lib/notification'
import { Dispatch, ReactNode, SetStateAction } from 'react' import { Dispatch, ReactNode, SetStateAction } from 'react'
import { isDev } from '@utils' import { FunctionalValue, getFunctionalValue, isDev } from '@utils'
import { getUserToken } from '@utils' import { getUserToken } from '@utils'
import { ApiError, FileInfoDto } from '@api' 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' export type NotifyType = 'error' | 'warning' | 'info'
const notifyTypes: Record<NotifyType | 'defualt', ArgsProps & { instance: (args: ArgsProps) => 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 body string или ReactNode
* @param notifyType для параметра типа. Допустимые значение 'error', 'warning', 'info' * @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 if (!body) return
const instance = notificationTypeDictionary.get(notifyType) ?? const instance = notifyTypes[notifyType] ?? notifyTypes.defualt
notificationTypeDictionary.get('open')
instance?.notifyInstance({ instance?.instance({
description: body, description: body,
message: instance.caption,
placement: 'bottomRight', placement: 'bottomRight',
duration: 10, duration: 10,
...instance,
...other ...other
}) })
} }
@ -39,7 +40,7 @@ type asyncFunction = (...args: any) => Promise<any|void>
export const invokeWebApiWrapperAsync = async ( export const invokeWebApiWrapperAsync = async (
funcAsync: asyncFunction, funcAsync: asyncFunction,
setShowLoader?: Dispatch<SetStateAction<boolean>>, setShowLoader?: Dispatch<SetStateAction<boolean>>,
errorNotifyText?: ReactNode | ((ex: unknown) => ReactNode), errorNotifyText?: FunctionalValue<ReactNode, [unknown]>,
actionName?: string, actionName?: string,
) => { ) => {
setShowLoader?.(true) setShowLoader?.(true)
@ -53,10 +54,8 @@ export const invokeWebApiWrapperAsync = async (
notify(`Недостаточно прав для выполнения действия "${actionName}"`, 'error') notify(`Недостаточно прав для выполнения действия "${actionName}"`, 'error')
else else
notify('Недостаточно прав для выполнения действия', 'error') notify('Недостаточно прав для выполнения действия', 'error')
} else if(errorNotifyText) { } else {
if (typeof errorNotifyText === 'function') notify(getFunctionalValue(errorNotifyText)(ex), 'error')
notify(errorNotifyText(ex), 'error')
else notify(errorNotifyText, 'error')
} }
} finally { } finally {
setShowLoader?.(false) setShowLoader?.(false)

View File

@ -3,9 +3,9 @@ import { useMemo } from 'react'
/** /**
* Значение типа может быть представлено непосредственно значением либо функцией его возвращаюшей * Значение типа может быть представлено непосредственно значением либо функцией его возвращаюшей
*/ */
export type FunctionalValue<T, P extends [] = []> = T | ((...props: P) => T) export type FunctionalValue<T, P extends Array<any> = []> = T | ((...props: P) => T)
export const getFunctionalValue = <T, P extends []>(value: FunctionalValue<T, P>) => value instanceof Function ? value : () => value export const getFunctionalValue = <T, P extends Array<any>>(value: FunctionalValue<T, P>) => value instanceof Function ? value : () => value
/** /**
* Облегчает работу со значениями, которые могут быть представлены функциям. * Облегчает работу со значениями, которые могут быть представлены функциям.
@ -13,7 +13,7 @@ export const getFunctionalValue = <T, P extends []>(value: FunctionalValue<T, P>
* @param value Значение или функция его возвращающая * @param value Значение или функция его возвращающая
* @returns Функция, вызов которой вернёт искомое значение * @returns Функция, вызов которой вернёт искомое значение
*/ */
export const useFunctionalValue = <T, P extends []>(value: FunctionalValue<T, P>) => { export const useFunctionalValue = <T, P extends Array<any>>(value: FunctionalValue<T, P>) => {
const fun = useMemo(() => getFunctionalValue(value), [value]) const fun = useMemo(() => getFunctionalValue(value), [value])
return fun return fun
} }