feat: 服务状态增加刷新按钮

并优化Loading态样式,增加过渡动画
pull/49/head
moonrailgun 3 years ago
parent 344b109aac
commit 32e7dbedf9

@ -15,12 +15,34 @@ export function buildCachedRequest<R, F extends (...args: any) => Promise<R>>(
name: string,
fn: F,
options?: FetchQueryOptions
): F {
return ((...args: any) => {
): F & {
/**
* name
*/
refetch: () => Promise<void>;
/**
* name
*/
clearCache: () => void;
} {
const req = ((...args: any) => {
return queryClient.fetchQuery(
[name, JSON.stringify(args)],
() => fn(...args),
options
);
}) as any;
const refetch = () => {
return queryClient.refetchQueries([name]);
};
const clearCache = () => {
queryClient.removeQueries([name]);
};
req.refetch = refetch;
req.clearCache = clearCache;
return req;
}

@ -1,13 +1,24 @@
import { useEffect } from 'react';
import { fetchAvailableServices } from '../../model/common';
import { useAsync } from '../useAsync';
import { useAsyncFn } from '../useAsyncFn';
import { useMemoizedFn } from '../useMemoizedFn';
/**
* hooks
*/
export function useAvailableServices() {
const { loading, value: availableServices } = useAsync(() =>
const [{ loading, value: availableServices }, fetch] = useAsyncFn(() =>
fetchAvailableServices()
);
return { loading, availableServices };
useEffect(() => {
fetch();
}, []);
const refetch = useMemoizedFn(async () => {
fetchAvailableServices.clearCache();
fetch();
});
return { loading, availableServices, refetch };
}

@ -209,6 +209,7 @@
"kb55c8dba": "Invite Member",
"kb5a17e73": "Leave group",
"kb6f1c83f": "What do you want to call you?",
"kb76d94e0": "Refresh",
"kb7a57f24": "Plugin Registry Service",
"kb8185132": "Or",
"kb96b79c5": "Allow management of invitation links",

@ -209,6 +209,7 @@
"kb55c8dba": "邀请成员",
"kb5a17e73": "退出群组",
"kb6f1c83f": "想要让大家如何称呼你",
"kb76d94e0": "刷新",
"kb7a57f24": "插件中心服务",
"kb8185132": "或",
"kb96b79c5": "允许管理邀请链接",

@ -12,11 +12,17 @@ export const Loading: React.FC<LoadingProps> = React.memo((props) => {
return (
<div className={clsx('relative', className)} style={style}>
{spinning && (
<div className="absolute inset-0 z-10 bg-white bg-opacity-20 flex justify-center items-center">
<LoadingSpinner />
</div>
)}
<div
className={clsx(
'absolute inset-0 z-10 bg-white bg-opacity-20 flex justify-center items-center transition-opacity duration-100',
{
'opacity-0 pointer-events-none': !spinning,
'opacity-100': spinning,
}
)}
>
<LoadingSpinner />
</div>
{props.children}
</div>

@ -1,8 +1,9 @@
import { LoadingSpinner } from '@/components/LoadingSpinner';
import { pluginInspectServices } from '@/plugin/common';
import { Icon } from '@/components/Icon';
import { Icon } from 'tailchat-design';
import React, { useMemo } from 'react';
import { t, useAvailableServices } from 'tailchat-shared';
import { Button } from 'antd';
import { Loading } from '@/components/Loading';
/**
*
@ -71,28 +72,34 @@ export const SettingsStatus: React.FC = React.memo(() => {
[]
); // 需要检查服务状态的列表
const { loading, availableServices } = useAvailableServices();
if (loading) {
return <LoadingSpinner />;
}
const { loading, availableServices, refetch } = useAvailableServices();
return (
<div>
{inspectServices.map((service) => (
<div key={service.name} className="flex items-center">
<span className="mr-1">{service.label}:</span>
{availableServices?.includes(service.name) ? (
<span title={t('当前服务可用')}>
<Icon icon="emojione:white-heavy-check-mark" />
</span>
) : (
<span title={t('服务异常')}>
<Icon icon="emojione:cross-mark-button" />
</span>
)}
</div>
))}
<Button
className="mb-2"
type="primary"
loading={loading}
onClick={refetch}
>
{t('刷新')}
</Button>
<Loading spinning={loading}>
{inspectServices.map((service) => (
<div key={service.name} className="flex items-center">
<span className="mr-1">{service.label}:</span>
{availableServices?.includes(service.name) ? (
<span title={t('当前服务可用')}>
<Icon icon="emojione:white-heavy-check-mark" />
</span>
) : (
<span title={t('服务异常')}>
<Icon icon="emojione:cross-mark-button" />
</span>
)}
</div>
))}
</Loading>
</div>
);
});

Loading…
Cancel
Save