import { ExclamationCircleFilled } from '@ant-design/icons'; import { App } from 'antd'; import isEqual from 'lodash/isEqual'; import { useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; export const useSetModalState = () => { const [visible, setVisible] = useState(false); const showModal = () => { setVisible(true); }; const hideModal = () => { setVisible(false); }; const switchVisible = () => { setVisible(!visible); }; return { visible, showModal, hideModal, switchVisible }; }; export const useDeepCompareEffect = ( effect: React.EffectCallback, deps: React.DependencyList, ) => { const ref = useRef(); let callback: ReturnType = () => {}; if (!isEqual(deps, ref.current)) { callback = effect(); ref.current = deps; } useEffect(() => { return () => { if (callback) { callback(); } }; }, []); }; export interface UseDynamicSVGImportOptions { onCompleted?: ( name: string, SvgIcon: React.FC> | undefined, ) => void; onError?: (err: Error) => void; } export function useDynamicSVGImport( name: string, options: UseDynamicSVGImportOptions = {}, ) { const ImportedIconRef = useRef>>(); const [loading, setLoading] = useState(false); const [error, setError] = useState(); const { onCompleted, onError } = options; useEffect(() => { setLoading(true); const importIcon = async (): Promise => { try { ImportedIconRef.current = (await import(name)).ReactComponent; onCompleted?.(name, ImportedIconRef.current); } catch (err: any) { onError?.(err); setError(err); } finally { setLoading(false); } }; importIcon(); }, [name, onCompleted, onError]); return { error, loading, SvgIcon: ImportedIconRef.current }; } interface IProps { onOk?: (...args: any[]) => any; onCancel?: (...args: any[]) => any; } export const useShowDeleteConfirm = () => { const { modal } = App.useApp(); const { t } = useTranslation(); const showDeleteConfirm = useCallback( ({ onOk, onCancel }: IProps): Promise => { return new Promise((resolve, reject) => { modal.confirm({ title: t('common.deleteModalTitle'), icon: , // content: 'Some descriptions', okText: t('common.ok'), okType: 'danger', cancelText: t('common.cancel'), async onOk() { try { const ret = await onOk?.(); resolve(ret); console.info(ret); } catch (error) { reject(error); } }, onCancel() { onCancel?.(); }, }); }); }, [t, modal], ); return showDeleteConfirm; }; export const useTranslate = (keyPrefix: string) => { return useTranslation('translation', { keyPrefix }); }; export const useCommonTranslation = () => { return useTranslation('translation', { keyPrefix: 'common' }); };