File size: 3,295 Bytes
e441caf 058cd84 e441caf 058cd84 2eeb8b1 058cd84 2eeb8b1 058cd84 2eeb8b1 058cd84 2eeb8b1 7ccbbf8 2eeb8b1 7ccbbf8 058cd84 8e222fd e441caf 2262506 e441caf 2262506 e441caf 2262506 e441caf badd5fe e441caf badd5fe e441caf badd5fe 88e5a61 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
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 = useCallback(() => {
setVisible(true);
}, []);
const hideModal = useCallback(() => {
setVisible(false);
}, []);
const switchVisible = useCallback(() => {
setVisible(!visible);
}, [visible]);
return { visible, showModal, hideModal, switchVisible };
};
export const useDeepCompareEffect = (
effect: React.EffectCallback,
deps: React.DependencyList,
) => {
const ref = useRef<React.DependencyList>();
let callback: ReturnType<React.EffectCallback> = () => {};
if (!isEqual(deps, ref.current)) {
callback = effect();
ref.current = deps;
}
useEffect(() => {
return () => {
if (callback) {
callback();
}
};
}, []);
};
export interface UseDynamicSVGImportOptions {
onCompleted?: (
name: string,
SvgIcon: React.FC<React.SVGProps<SVGSVGElement>> | undefined,
) => void;
onError?: (err: Error) => void;
}
export function useDynamicSVGImport(
name: string,
options: UseDynamicSVGImportOptions = {},
) {
const ImportedIconRef = useRef<React.FC<React.SVGProps<SVGSVGElement>>>();
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error>();
const { onCompleted, onError } = options;
useEffect(() => {
setLoading(true);
const importIcon = async (): Promise<void> => {
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 {
title?: string;
onOk?: (...args: any[]) => any;
onCancel?: (...args: any[]) => any;
}
export const useShowDeleteConfirm = () => {
const { modal } = App.useApp();
const { t } = useTranslation();
const showDeleteConfirm = useCallback(
({ title, onOk, onCancel }: IProps): Promise<number> => {
return new Promise((resolve, reject) => {
modal.confirm({
title: title ?? t('common.deleteModalTitle'),
icon: <ExclamationCircleFilled />,
// 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' });
};
|