import React, { useState } from 'react'; import { trpc } from '../../../api/trpc'; import { useAllowEdit } from './useAllowEdit'; import { MonitorStatusPageEditForm, MonitorStatusPageEditFormValues, } from './EditForm'; import clsx from 'clsx'; import { useRequest } from '../../../hooks/useRequest'; import { ColorSchemeSwitcher } from '../../ColorSchemeSwitcher'; import { StatusPageServices } from './Services'; import { useTranslation } from '@i18next-toolkit/react'; import { Link, useNavigate } from '@tanstack/react-router'; import { Helmet } from 'react-helmet'; import { Button } from '@/components/ui/button'; interface MonitorStatusPageProps { slug: string; showBackBtn?: boolean; } export const MonitorStatusPage: React.FC = React.memo( (props) => { const { t } = useTranslation(); const { slug, showBackBtn = true } = props; const { data: info } = trpc.monitor.getPageInfo.useQuery({ slug, }); const editPageMutation = trpc.monitor.editPage.useMutation(); const trpcUtils = trpc.useUtils(); const navigate = useNavigate(); const allowEdit = useAllowEdit(info?.workspaceId); const [editMode, setEditMode] = useState(() => { return new URLSearchParams(window.location.search).has('edit'); }); const monitorList = info?.monitorList ?? []; const [{ loading }, handleSave] = useRequest( async (values: MonitorStatusPageEditFormValues) => { if (!info) { return; } const newPageInfo = await editPageMutation.mutateAsync({ id: info.id, workspaceId: info.workspaceId, ...values, }); trpcUtils.monitor.getPageInfo.setData( { slug, }, newPageInfo ); setEditMode(false); if (info.slug !== newPageInfo.slug) { // if slug is changed, should to navigate to new url navigate({ to: '/status/$slug', params: { slug: newPageInfo.slug, }, replace: true, }); } } ); return (
{info?.title} {info?.description && ` | ${info?.description}`} {editMode && (
setEditMode(false)} />
)}
{info?.title}
{allowEdit && !editMode && (
{showBackBtn && ( )}
)}
{t('Services')}
{info && ( )}
); } ); MonitorStatusPage.displayName = 'MonitorStatusPage';