tianji/src/client/routes/telemetry.tsx

116 lines
3.4 KiB
TypeScript
Raw Normal View History

2024-03-25 21:53:43 +08:00
import { trpc } from '@/api/trpc';
import { CommonHeader } from '@/components/CommonHeader';
import { CommonList } from '@/components/CommonList';
import { CommonWrapper } from '@/components/CommonWrapper';
import { Button } from '@/components/ui/button';
import { useDataReady } from '@/hooks/useDataReady';
import { useEvent } from '@/hooks/useEvent';
import { LayoutV2 } from '@/pages/LayoutV2';
import { useCurrentWorkspaceId } from '@/store/user';
import { routeAuthBeforeLoad } from '@/utils/route';
import { Trans, useTranslation } from '@i18next-toolkit/react';
import {
createFileRoute,
useNavigate,
useRouterState,
} from '@tanstack/react-router';
import { LuPlus } from 'react-icons/lu';
export const Route = createFileRoute('/telemetry')({
beforeLoad: routeAuthBeforeLoad,
component: TelemetryComponent,
});
function TelemetryComponent() {
const workspaceId = useCurrentWorkspaceId();
const { t } = useTranslation();
const { data = [] } = trpc.telemetry.all.useQuery({
workspaceId,
});
const navigate = useNavigate();
const pathname = useRouterState({
select: (state) => state.location.pathname,
});
const items = data.map((item) => ({
id: item.id,
title: item.name,
href: `/telemetry/${item.id}`,
}));
useDataReady(
() => data.length > 0,
() => {
if (pathname === Route.fullPath) {
navigate({
to: '/telemetry/$telemetryId',
params: {
telemetryId: data[0].id,
},
});
}
}
);
const handleClickAdd = useEvent(() => {
navigate({
to: '/telemetry/add',
});
});
return (
<LayoutV2
list={
<CommonWrapper
header={
<CommonHeader
title={t('Telemetry')}
2024-04-02 00:07:38 +08:00
tip={
2024-03-25 21:53:43 +08:00
<div className="space-y-2">
<p>
<Trans>
Telemetry is a technology that reports access data even on
pages that are not under your control. As long as the
other website allows the insertion of third-party images
(e.g., forums, blogs, and various rich-text editors), then
the data can be collected and used to analyze the images
when they are loaded by the user.
</Trans>
</p>
<p>
<Trans>
Generally, we will use a one-pixel blank image so that it
will not affect the user's normal use.
</Trans>
</p>
<p>
<Trans>
At the same time, we can also use it in some client-side
application scenarios, such as collecting the frequency of
cli usage, such as collecting the installation of
selfhosted apps, and so on.
</Trans>
</p>
</div>
}
actions={
<Button
variant="outline"
Icon={LuPlus}
onClick={handleClickAdd}
>
{t('Add')}
</Button>
}
/>
}
>
<CommonList hasSearch={true} items={items} />
</CommonWrapper>
}
/>
);
}