'use client'; import axios from 'axios'; import clsx from 'clsx'; import { useCallback, useLayoutEffect, useMemo, useState } from 'react'; import { TabList, TabPanel, Tabs } from 'react-tabs'; import { toast } from 'react-toastify'; import { urls } from '@/app/urls'; import InfoError, { ErrorData } from '@/components/info/InfoError'; import Loader from '@/components/ui/Loader'; import TabLabel from '@/components/ui/TabLabel'; import TextURL from '@/components/ui/TextURL'; import AnimateFade from '@/components/wrap/AnimateFade'; import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { useLibrary } from '@/context/LibraryContext'; import { useBlockNavigation, useConceptNavigation } from '@/context/NavigationContext'; import { useOSS } from '@/context/OssContext'; import useQueryStrings from '@/hooks/useQueryStrings'; import { OperationID } from '@/models/oss'; import { information, prompts } from '@/utils/labels'; import EditorRSForm from './EditorOssCard'; import EditorTermGraph from './EditorOssGraph'; import MenuOssTabs from './MenuOssTabs'; import { OssEditState } from './OssEditContext'; export enum OssTabID { CARD = 0, GRAPH = 1 } function OssTabs() { const router = useConceptNavigation(); const query = useQueryStrings(); const activeTab = (Number(query.get('tab')) ?? OssTabID.GRAPH) as OssTabID; const { calculateHeight } = useConceptOptions(); const { schema, loading, errorLoading } = useOSS(); const { destroyItem } = useLibrary(); const [isModified, setIsModified] = useState(false); const [selected, setSelected] = useState([]); useBlockNavigation(isModified); useLayoutEffect(() => { if (schema) { const oldTitle = document.title; document.title = schema.title; return () => { document.title = oldTitle; }; } }, [schema, schema?.title]); const navigateTab = useCallback( (tab: OssTabID) => { if (!schema) { return; } const url = urls.oss_props({ id: schema.id, tab: tab }); router.push(url); }, [router, schema] ); function onSelectTab(index: number, last: number, event: Event) { if (last === index) { return; } if (event.type == 'keydown') { const kbEvent = event as KeyboardEvent; if (kbEvent.altKey) { if (kbEvent.code === 'ArrowLeft') { router.back(); return; } else if (kbEvent.code === 'ArrowRight') { router.forward(); return; } } } navigateTab(index); } const onDestroySchema = useCallback(() => { if (!schema || !window.confirm(prompts.deleteLibraryItem)) { return; } destroyItem(schema.id, () => { toast.success(information.itemDestroyed); router.push(urls.library); }); }, [schema, destroyItem, router]); const panelHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]); const cardPanel = useMemo( () => ( ), [isModified, onDestroySchema] ); const graphPanel = useMemo( () => ( ), [isModified] ); return ( {loading ? : null} {errorLoading ? : null} {schema && !loading ? ( ${schema.title ?? ''}`} /> {cardPanel} {graphPanel} ) : null} ); } export default OssTabs; // ====== Internals ========= function ProcessError({ error }: { error: ErrorData }): React.ReactElement { if (axios.isAxiosError(error) && error.response) { if (error.response.status === 404) { return (

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

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

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

); } } return ; }