import { Widget } from '@/hooks/Mapper/components/mapInterface/components'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import { LayoutEventBlocker, LoadingWrapper, SystemView, TooltipPosition, WdCheckbox, WdImgButton, } from '@/hooks/Mapper/components/ui-kit'; import { useLoadSystemStatic } from '@/hooks/Mapper/mapRootProvider/hooks/useLoadSystemStatic.ts'; import { forwardRef, MouseEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import classes from './RoutesWidget.module.scss'; import { RoutesList } from './RoutesList'; import clsx from 'clsx'; import { Route } from '@/hooks/Mapper/types/routes.ts'; import { PrimeIcons } from 'primereact/api'; import { RoutesSettingsDialog } from './RoutesSettingsDialog'; import { RoutesProvider, useRouteProvider } from './RoutesProvider.tsx'; import { ContextMenuSystemInfo, useContextMenuSystemInfoHandlers } from '@/hooks/Mapper/components/contexts'; import useMaxWidth from '@/hooks/Mapper/hooks/useMaxWidth.ts'; import { WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper'; import { AddSystemDialog, SearchOnSubmitCallback, } from '@/hooks/Mapper/components/mapInterface/components/AddSystemDialog'; import { RoutesImperativeHandle, RoutesWidgetProps, } from '@/hooks/Mapper/components/mapInterface/widgets/RoutesWidget/types.ts'; const sortByDist = (a: Route, b: Route) => { const distA = a.has_connection ? a.systems?.length || 0 : Infinity; const distB = b.has_connection ? b.systems?.length || 0 : Infinity; return distA - distB; }; export const RoutesWidgetContent = () => { const { data: { selectedSystems, systems, isSubscriptionActive }, } = useMapRootState(); const { hubs = [], routesList, isRestricted, loading } = useRouteProvider(); const [systemId] = selectedSystems; const { systems: systemStatics, loadSystems } = useLoadSystemStatic({ systems: hubs ?? [] }); const { open, ...systemCtxProps } = useContextMenuSystemInfoHandlers(); const preparedRoutes: Route[] = useMemo(() => { return ( routesList?.routes .sort(sortByDist) // .filter(x => x.destination.toString() !== systemId) .map(route => ({ ...route, mapped_systems: route.systems?.map(solar_system_id => routesList?.systems_static_data.find( system_static_data => system_static_data.solar_system_id === solar_system_id, ), ) ?? [], })) ?? [] ); }, [routesList?.routes, routesList?.systems_static_data, systemId]); const refData = useRef({ open, loadSystems, preparedRoutes }); refData.current = { open, loadSystems, preparedRoutes }; useEffect(() => { (async () => await refData.current.loadSystems(hubs))(); }, [hubs]); const handleClick = useCallback((e: MouseEvent, systemId: string) => { const route = refData.current.preparedRoutes.find(x => x.destination.toString() === systemId); refData.current.open(e, systemId, route?.mapped_systems ?? []); }, []); const handleContextMenu = useCallback( async (e: MouseEvent, systemId: string) => { await refData.current.loadSystems([systemId]); handleClick(e, systemId); }, [handleClick], ); if (isRestricted && !isSubscriptionActive) { return (
User Routes available with 'Active' map subscription only (contact map administrators)
); } if (!systemId) { return (
System is not selected
); } if (hubs.length === 0) { return
Routes not set
; } return ( <>
{preparedRoutes.map(route => { // TODO do not delete this console log // eslint-disable-next-line no-console // console.log('JOipP', `Check sys [${route.destination}]:`, sys); return ( <>
handleClick(e, route.destination.toString())} tooltip={{ content: 'Click here to open system menu', position: TooltipPosition.top, offset: 10, }} />
{route.has_connection ? route.systems?.length ?? 2 : ''}
); })}
); }; type RoutesWidgetCompProps = { title: ReactNode | string; }; export const RoutesWidgetComp = ({ title }: RoutesWidgetCompProps) => { const [routeSettingsVisible, setRouteSettingsVisible] = useState(false); const { data, update, addHubCommand } = useRouteProvider(); const isSecure = data.path_type === 'secure'; const handleSecureChange = useCallback(() => { update({ ...data, path_type: data.path_type === 'secure' ? 'shortest' : 'secure', }); }, [data, update]); const ref = useRef(null); const compact = useMaxWidth(ref, 170); const [openAddSystem, setOpenAddSystem] = useState(false); const onAddSystem = useCallback(() => setOpenAddSystem(true), []); const handleSubmitAddSystem: SearchOnSubmitCallback = useCallback( async item => addHubCommand(item.value.toString()), [addHubCommand], ); return ( {title} setRouteSettingsVisible(true)} tooltip={{ position: TooltipPosition.top, content: 'Click here to open Routes settings', }} /> } > setOpenAddSystem(false)} onSubmit={handleSubmitAddSystem} /> ); }; export const RoutesWidget = forwardRef( ({ title, ...props }, ref) => { return ( ); }, ); RoutesWidget.displayName = 'RoutesWidget';