'use client'; import { useEffect } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; import { useParams } from 'react-router'; import { z } from 'zod'; import { urls, useBlockNavigation, useConceptNavigation } from '@/app'; import { ConstituentaTooltip } from '@/features/rsform/components'; import { isAxiosError } from '@/backend/api-transport'; import { TextURL } from '@/components/control1'; import { type ErrorData } from '@/components/info-error'; import { useQueryStrings } from '@/hooks/use-query-strings'; import { useModificationStore } from '@/stores/modification'; import { OperationTooltip } from '../../components/operation-tooltip'; import { OssEditState, OssTabID } from './oss-edit-context'; import { OssTabs } from './oss-tabs'; const paramsSchema = z.strictObject({ id: z.coerce.number(), tab: z.preprocess(v => (v ? Number(v) : undefined), z.nativeEnum(OssTabID).default(OssTabID.GRAPH)) }); export function OssPage() { const router = useConceptNavigation(); const params = useParams(); const query = useQueryStrings(); const urlData = paramsSchema.parse({ id: params.id, tab: query.get('tab') }); const { isModified, setIsModified } = useModificationStore(); useBlockNavigation(isModified); useEffect(() => setIsModified(false), [setIsModified]); if (!urlData.id) { router.replace({ path: urls.page404, force: true }); return null; } return ( ); } // ====== Internals ========= function ProcessError({ error }: { error: ErrorData }): React.ReactElement { if (isAxiosError(error) && error.response) { if (error.response.status === 404) { return (

{`Операционная схема с указанным идентификатором отсутствует`}

); } else if (error.response.status === 403) { return (

Владелец ограничил доступ к данной схеме

); } } throw error as Error; }