Portal/rsconcept/frontend/src/pages/OssPage/OssPage.tsx

76 lines
2.3 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
'use client';
2025-01-26 22:24:34 +03:00
import axios from 'axios';
2025-01-30 19:22:49 +03:00
import { useEffect } from 'react';
2025-01-26 22:24:34 +03:00
import { ErrorBoundary } from 'react-error-boundary';
2024-11-25 19:52:57 +03:00
import { useParams } from 'react-router';
2025-01-30 19:22:49 +03:00
import { z } from 'zod';
2024-06-07 20:17:03 +03:00
2025-01-26 22:24:34 +03:00
import { useBlockNavigation, useConceptNavigation } from '@/app/Navigation/NavigationContext';
import { urls } from '@/app/urls';
2025-01-29 23:18:08 +03:00
import { ErrorData } from '@/components/info/InfoError';
2025-01-26 22:24:34 +03:00
import TextURL from '@/components/ui/TextURL';
2025-01-30 19:22:49 +03:00
import useQueryStrings from '@/hooks/useQueryStrings';
2025-01-26 22:24:34 +03:00
import { useModificationStore } from '@/stores/modification';
2024-06-07 20:17:03 +03:00
2025-01-30 19:22:49 +03:00
import { OssEditState, OssTabID } from './OssEditContext';
2024-06-07 20:17:03 +03:00
import OssTabs from './OssTabs';
2025-01-30 19:22:49 +03:00
const paramsSchema = z.object({
2025-01-30 20:06:00 +03:00
id: z.coerce.number(),
2025-01-30 19:22:49 +03:00
tab: z.preprocess(v => (v ? Number(v) : undefined), z.nativeEnum(OssTabID).default(OssTabID.CARD))
});
2025-01-29 23:18:08 +03:00
export function OssPage() {
2025-01-26 22:24:34 +03:00
const router = useConceptNavigation();
2024-06-07 20:17:03 +03:00
const params = useParams();
2025-01-30 19:22:49 +03:00
const query = useQueryStrings();
const urlData = paramsSchema.parse({
id: params.id,
tab: query.get('tab')
});
2025-01-26 22:24:34 +03:00
2025-01-30 19:22:49 +03:00
const { isModified, setIsModified } = useModificationStore();
2025-01-26 22:24:34 +03:00
useBlockNavigation(isModified);
2025-01-30 19:22:49 +03:00
useEffect(() => setIsModified(false), [setIsModified]);
if (!urlData.id) {
2025-01-26 22:24:34 +03:00
router.replace(urls.page404);
return null;
}
2024-06-07 20:17:03 +03:00
return (
2025-01-26 22:24:34 +03:00
<ErrorBoundary FallbackComponent={ProcessError}>
2025-01-30 19:22:49 +03:00
<OssEditState itemID={urlData.id}>
<OssTabs activeTab={urlData.tab} />
2025-01-26 22:24:34 +03:00
</OssEditState>
</ErrorBoundary>
2024-06-07 20:17:03 +03:00
);
}
2025-01-26 22:24:34 +03:00
// ====== Internals =========
function ProcessError({ error }: { error: ErrorData }): React.ReactElement {
if (axios.isAxiosError(error) && error.response) {
if (error.response.status === 404) {
return (
<div className='flex flex-col items-center p-2 mx-auto'>
<p>{`Операционная схема с указанным идентификатором отсутствует`}</p>
<div className='flex justify-center'>
<TextURL text='Библиотека' href='/library' />
</div>
</div>
);
} else if (error.response.status === 403) {
return (
<div className='flex flex-col items-center p-2 mx-auto'>
<p>Владелец ограничил доступ к данной схеме</p>
<TextURL text='Библиотека' href='/library' />
</div>
);
}
}
2025-01-29 23:18:08 +03:00
throw error as Error;
2025-01-26 22:24:34 +03:00
}