Исправлен тип пропсов в типе 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 { 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<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 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<any|void>
export const invokeWebApiWrapperAsync = async (
funcAsync: asyncFunction,
setShowLoader?: Dispatch<SetStateAction<boolean>>,
errorNotifyText?: ReactNode | ((ex: unknown) => ReactNode),
errorNotifyText?: FunctionalValue<ReactNode, [unknown]>,
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)

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 Значение или функция его возвращающая
* @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])
return fun
}