diff --git a/src/frontend/lib/functions/Navigation.tsx b/src/frontend/lib/functions/Navigation.tsx index 21e9324d2089..a5ff6dec6862 100644 --- a/src/frontend/lib/functions/Navigation.tsx +++ b/src/frontend/lib/functions/Navigation.tsx @@ -1,9 +1,11 @@ -import type { NavigateFunction } from 'react-router-dom'; import { ModelInformationDict } from '../enums/ModelInformation'; import type { ModelType } from '../enums/ModelType'; import { apiUrl } from './Api'; import { cancelEvent } from './Events'; +// NavigateFunction type compatible with both React Router and TanStack Router +export type NavigateFunction = (to: string | number, options?: any) => void; + export const getBaseUrl = (): string => (window as any).INVENTREE_SETTINGS?.base_url || 'web'; diff --git a/src/frontend/lib/functions/navigation.ts b/src/frontend/lib/functions/navigation.ts new file mode 100644 index 000000000000..d52601f1aa24 --- /dev/null +++ b/src/frontend/lib/functions/navigation.ts @@ -0,0 +1,14 @@ +/** + * Navigation utilities for TanStack Router + * Provides compatibility layer between React Router v6 and TanStack Router + */ + +// Export types and functions from custom hooks +export type { NavigateFunction, NavigateOptions } from '../hooks/UseNavigate'; +export { useNavigate } from '../hooks/UseNavigate'; +export { useSearchParams } from '../hooks/UseSearchParams'; + +/** + * Type for Link 'to' prop + */ +export type To = string; diff --git a/src/frontend/lib/hooks/UseNavigate.tsx b/src/frontend/lib/hooks/UseNavigate.tsx new file mode 100644 index 000000000000..20d79f8a4070 --- /dev/null +++ b/src/frontend/lib/hooks/UseNavigate.tsx @@ -0,0 +1,40 @@ +/** + * Custom hook that provides React Router v6-like useNavigate behavior + * This makes migration from React Router to TanStack Router easier + */ + +import { useNavigate as useTanstackNavigate } from '@tanstack/react-router'; +import { useCallback } from 'react'; + +export type NavigateOptions = { + replace?: boolean; + state?: any; +}; + +export type NavigateFunction = ( + to: string | number, + options?: NavigateOptions +) => void; + +/** + * Hook that returns a navigate function compatible with React Router v6 + */ +export function useNavigate(): NavigateFunction { + const tanstackNavigate = useTanstackNavigate(); + + return useCallback( + ((to: string | number, options?: NavigateOptions) => { + if (typeof to === 'number') { + window.history.go(to); + return; + } + + tanstackNavigate({ + to: to as any, + replace: options?.replace, + state: options?.state + } as any); + }) as NavigateFunction, + [tanstackNavigate] + ); +} diff --git a/src/frontend/lib/hooks/UseSearchParams.tsx b/src/frontend/lib/hooks/UseSearchParams.tsx new file mode 100644 index 000000000000..0d53fd7f1040 --- /dev/null +++ b/src/frontend/lib/hooks/UseSearchParams.tsx @@ -0,0 +1,39 @@ +/** + * Custom hook that provides React Router v6-like useSearchParams behavior + * This makes migration from React Router to TanStack Router easier + */ + +import { useNavigate as useTanstackNavigate, useSearch } from '@tanstack/react-router'; +import { useCallback, useMemo } from 'react'; + +/** + * Hook that returns search params compatible with React Router v6 + * Returns [URLSearchParams, setSearchParams] tuple + */ +export function useSearchParams(): [URLSearchParams, (params: Record) => void] { + const search = useSearch({ strict: false }) as Record; + const navigate = useTanstackNavigate(); + + const searchParams = useMemo(() => { + const params = new URLSearchParams(); + if (search) { + Object.entries(search).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + params.set(key, String(value)); + } + }); + } + return params; + }, [search]); + + const setSearchParams = useCallback( + (params: Record) => { + navigate({ + search: params as any + } as any); + }, + [navigate] + ); + + return [searchParams, setSearchParams]; +} diff --git a/src/frontend/lib/types/Plugins.tsx b/src/frontend/lib/types/Plugins.tsx index cc10083b6e54..0f8aff1384c3 100644 --- a/src/frontend/lib/types/Plugins.tsx +++ b/src/frontend/lib/types/Plugins.tsx @@ -2,7 +2,7 @@ import type { I18n } from '@lingui/core'; import type { MantineColorScheme, MantineTheme } from '@mantine/core'; import type { QueryClient } from '@tanstack/react-query'; import type { AxiosInstance } from 'axios'; -import type { NavigateFunction } from 'react-router-dom'; +import type { NavigateFunction } from '../functions/Navigation'; import type { ModelDict } from '../enums/ModelInformation'; import type { ModelType } from '../enums/ModelType'; import type { diff --git a/src/frontend/lib/types/Tables.tsx b/src/frontend/lib/types/Tables.tsx index ba0675e28521..7e3c7485efb4 100644 --- a/src/frontend/lib/types/Tables.tsx +++ b/src/frontend/lib/types/Tables.tsx @@ -4,10 +4,13 @@ import type { DataTableRowExpansionProps } from 'mantine-datatable'; import type { ReactNode } from 'react'; -import type { NavigateFunction, SetURLSearchParams } from 'react-router-dom'; import type { ModelType } from '../enums/ModelType'; import type { FilterSetState, TableFilter } from './Filters'; import type { ApiFormFieldType } from './Forms'; +import type { NavigateFunction } from '../functions/navigation'; + +// Type for setting search params - compatible with React Router v6 and our wrapper +type SetURLSearchParams = (params: Record) => void; /* * Type definition for representing the state of a table: diff --git a/src/frontend/package.json b/src/frontend/package.json index 1e6d57d0b35d..63c99a275149 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -75,6 +75,8 @@ "@sentry/react": "^10.7.0", "@tabler/icons-react": "^3.17.0", "@tanstack/react-query": "^5.56.2", + "@tanstack/react-router": "^1.150.0", + "@tanstack/router-devtools": "^1.150.0", "@uiw/codemirror-theme-vscode": "4.25.1", "@uiw/react-codemirror": "4.25.1", "@uiw/react-split": "^5.9.3", diff --git a/src/frontend/src/components/barcodes/BarcodeScanDialog.tsx b/src/frontend/src/components/barcodes/BarcodeScanDialog.tsx index 6e2eb5064065..76b76f8c42d9 100644 --- a/src/frontend/src/components/barcodes/BarcodeScanDialog.tsx +++ b/src/frontend/src/components/barcodes/BarcodeScanDialog.tsx @@ -7,8 +7,9 @@ import { t } from '@lingui/core/macro'; import { Box, Divider, Modal } from '@mantine/core'; import { hideNotification, showNotification } from '@mantine/notifications'; import { useCallback, useState } from 'react'; -import { type NavigateFunction, useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { api } from '../../App'; +import type { NavigateFunction } from '@lib/functions/navigation'; import { extractErrorMessage } from '../../functions/api'; import { useUserState } from '../../states/UserState'; import { StylishText } from '../items/StylishText'; diff --git a/src/frontend/src/components/calendar/OrderCalendar.tsx b/src/frontend/src/components/calendar/OrderCalendar.tsx index a213358d36e9..88369007b779 100644 --- a/src/frontend/src/components/calendar/OrderCalendar.tsx +++ b/src/frontend/src/components/calendar/OrderCalendar.tsx @@ -19,7 +19,7 @@ import { } from '@tabler/icons-react'; import dayjs from 'dayjs'; import { useCallback, useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { api } from '../../App'; import useCalendar from '../../hooks/UseCalendar'; import { useUserState } from '../../states/UserState'; diff --git a/src/frontend/src/components/dashboard/widgets/QueryCountDashboardWidget.tsx b/src/frontend/src/components/dashboard/widgets/QueryCountDashboardWidget.tsx index af38a5ce8855..2e8b390586f9 100644 --- a/src/frontend/src/components/dashboard/widgets/QueryCountDashboardWidget.tsx +++ b/src/frontend/src/components/dashboard/widgets/QueryCountDashboardWidget.tsx @@ -2,7 +2,7 @@ import { ActionIcon, Anchor, Group, Loader } from '@mantine/core'; import { IconExclamationCircle } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { type ReactNode, useCallback, useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { ModelInformationDict } from '@lib/enums/ModelInformation'; import type { ModelType } from '@lib/enums/ModelType'; diff --git a/src/frontend/src/components/details/Details.tsx b/src/frontend/src/components/details/Details.tsx index b04ce1d492e1..4ef5765c3eea 100644 --- a/src/frontend/src/components/details/Details.tsx +++ b/src/frontend/src/components/details/Details.tsx @@ -15,7 +15,7 @@ import { import { useQuery } from '@tanstack/react-query'; import { getValueAtPath } from 'mantine-datatable'; import { useCallback, useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { ProgressBar } from '@lib/components/ProgressBar'; import { YesNoButton } from '@lib/components/YesNoButton'; diff --git a/src/frontend/src/components/errors/GenericErrorPage.tsx b/src/frontend/src/components/errors/GenericErrorPage.tsx index 36f1e87690eb..58685e635d17 100644 --- a/src/frontend/src/components/errors/GenericErrorPage.tsx +++ b/src/frontend/src/components/errors/GenericErrorPage.tsx @@ -11,7 +11,7 @@ import { Text } from '@mantine/core'; import { IconArrowBack, IconExclamationCircle } from '@tabler/icons-react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { LanguageContext } from '../../contexts/LanguageContext'; diff --git a/src/frontend/src/components/forms/ApiForm.tsx b/src/frontend/src/components/forms/ApiForm.tsx index 089ce4f36bf0..2e7b076360e6 100644 --- a/src/frontend/src/components/forms/ApiForm.tsx +++ b/src/frontend/src/components/forms/ApiForm.tsx @@ -20,7 +20,8 @@ import { type SubmitHandler, useForm } from 'react-hook-form'; -import { type NavigateFunction, useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; +import type { NavigateFunction } from '@lib/functions/navigation'; import { isTrue } from '@lib/functions/Conversion'; import { getDetailUrl } from '@lib/functions/Navigation'; diff --git a/src/frontend/src/components/forms/AuthenticationForm.tsx b/src/frontend/src/components/forms/AuthenticationForm.tsx index 00700ceee186..d002606b5c94 100644 --- a/src/frontend/src/components/forms/AuthenticationForm.tsx +++ b/src/frontend/src/components/forms/AuthenticationForm.tsx @@ -19,7 +19,8 @@ import { useForm } from '@mantine/form'; import { useDisclosure } from '@mantine/hooks'; import { showNotification } from '@mantine/notifications'; import { useState } from 'react'; -import { useLocation, useNavigate } from 'react-router-dom'; +import { useLocation } from '@tanstack/react-router'; +import { useNavigate } from '@lib/functions/navigation'; import { useShallow } from 'zustand/react/shallow'; import { api } from '../../App'; import { diff --git a/src/frontend/src/components/items/InfoItem.tsx b/src/frontend/src/components/items/InfoItem.tsx index 2d9132db58ea..29138aa543ba 100644 --- a/src/frontend/src/components/items/InfoItem.tsx +++ b/src/frontend/src/components/items/InfoItem.tsx @@ -1,6 +1,7 @@ import { Trans } from '@lingui/react/macro'; import { Code, Flex, Group, Text } from '@mantine/core'; -import { Link, type To } from 'react-router-dom'; +import { Link } from '@tanstack/react-router'; +import type { To } from '@lib/functions/navigation'; import { YesNoButton } from '@lib/components/YesNoButton'; import { DetailDrawerLink } from '../nav/DetailDrawer'; diff --git a/src/frontend/src/components/items/InvenTreeLogo.tsx b/src/frontend/src/components/items/InvenTreeLogo.tsx index f62300310304..99830ec50ec2 100644 --- a/src/frontend/src/components/items/InvenTreeLogo.tsx +++ b/src/frontend/src/components/items/InvenTreeLogo.tsx @@ -1,7 +1,7 @@ import { t } from '@lingui/core/macro'; import { ActionIcon } from '@mantine/core'; import { forwardRef } from 'react'; -import { NavLink } from 'react-router-dom'; +import { Link } from '@tanstack/react-router'; import InvenTreeIcon from './inventree.svg'; @@ -9,11 +9,11 @@ export const InvenTreeLogoHomeButton = forwardRef( (props, ref) => { return (
- + - +
); } diff --git a/src/frontend/src/components/items/MenuLinks.tsx b/src/frontend/src/components/items/MenuLinks.tsx index 7830ceb56344..65dcbac328c7 100644 --- a/src/frontend/src/components/items/MenuLinks.tsx +++ b/src/frontend/src/components/items/MenuLinks.tsx @@ -9,7 +9,7 @@ import { UnstyledButton } from '@mantine/core'; import { type JSX, useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { navigateToLink } from '@lib/functions/Navigation'; import type { InvenTreeIconType } from '@lib/types/Icons'; diff --git a/src/frontend/src/components/modals/QrModal.tsx b/src/frontend/src/components/modals/QrModal.tsx index 14d5ef2ee7bf..27aa57610f8a 100644 --- a/src/frontend/src/components/modals/QrModal.tsx +++ b/src/frontend/src/components/modals/QrModal.tsx @@ -1,6 +1,6 @@ import {} from '@mantine/core'; import type { ContextModalProps } from '@mantine/modals'; -import type { NavigateFunction } from 'react-router-dom'; +import type { NavigateFunction } from '@lib/functions/navigation'; import { ScanInputHandler } from '../barcodes/BarcodeScanDialog'; export function QrModal({ diff --git a/src/frontend/src/components/nav/BreadcrumbList.tsx b/src/frontend/src/components/nav/BreadcrumbList.tsx index 3dadf45171e1..0a51329f0d69 100644 --- a/src/frontend/src/components/nav/BreadcrumbList.tsx +++ b/src/frontend/src/components/nav/BreadcrumbList.tsx @@ -8,7 +8,7 @@ import { } from '@mantine/core'; import { IconMenu2 } from '@tabler/icons-react'; import { useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { identifierString } from '@lib/functions/Conversion'; import { getBaseUrl, navigateToLink } from '@lib/functions/Navigation'; diff --git a/src/frontend/src/components/nav/DetailDrawer.tsx b/src/frontend/src/components/nav/DetailDrawer.tsx index dcc7d77e6a56..3465dcf88ada 100644 --- a/src/frontend/src/components/nav/DetailDrawer.tsx +++ b/src/frontend/src/components/nav/DetailDrawer.tsx @@ -1,8 +1,8 @@ import { ActionIcon, Divider, Drawer, Group, Stack, Text } from '@mantine/core'; import { IconChevronLeft } from '@tabler/icons-react'; import { useCallback, useMemo } from 'react'; -import { Link, Route, Routes, useNavigate, useParams } from 'react-router-dom'; -import type { To } from 'react-router-dom'; +import { Link, useNavigate, useParams } from '@tanstack/react-router'; +import type { To } from '@lib/functions/navigation'; import type { UiSizeType } from '@lib/types/Core'; import { useShallow } from 'zustand/react/shallow'; @@ -33,7 +33,8 @@ function DetailDrawerComponent({ renderContent }: Readonly) { const navigate = useNavigate(); - const { id } = useParams(); + const params = useParams({ strict: false }) as any; + const id = params?.id; const content = renderContent(id); const opened = useMemo(() => !!id && !!content, [id, content]); @@ -46,7 +47,7 @@ function DetailDrawerComponent({ { - navigate('../'); + navigate({ to: '../' } as any); addDetailDrawer(false); }} position={position} @@ -60,7 +61,7 @@ function DetailDrawerComponent({ { - navigate(-1); + window.history.go(-1); addDetailDrawer(-1); }} > @@ -80,11 +81,7 @@ function DetailDrawerComponent({ } export function DetailDrawer(props: Readonly) { - return ( - - } /> - - ); + return ; } export function DetailDrawerLink({ diff --git a/src/frontend/src/components/nav/Header.tsx b/src/frontend/src/components/nav/Header.tsx index 14725a6002da..6fc9ac6bb8b2 100644 --- a/src/frontend/src/components/nav/Header.tsx +++ b/src/frontend/src/components/nav/Header.tsx @@ -16,7 +16,8 @@ import { import { IconBell, IconSearch } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { type ReactNode, useEffect, useMemo, useState } from 'react'; -import { useMatch, useNavigate } from 'react-router-dom'; +import { useLocation } from '@tanstack/react-router'; +import { useNavigate } from '@lib/functions/navigation'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { apiUrl } from '@lib/functions/Api'; @@ -207,8 +208,12 @@ export function Header() { function NavTabs() { const user = useUserState(); const navigate = useNavigate(); - const match = useMatch(':tabName/*'); - const tabValue = match?.params.tabName; + const location = useLocation(); + + // Extract the first path segment as tabName + const pathSegments = location.pathname.split('/').filter(Boolean); + const tabValue = pathSegments[0] || undefined; + const navTabs = getNavTabs(user); const userSettings = useUserSettingsState(); diff --git a/src/frontend/src/components/nav/Layout.tsx b/src/frontend/src/components/nav/Layout.tsx index 6122133c8c6b..4847645c89bb 100644 --- a/src/frontend/src/components/nav/Layout.tsx +++ b/src/frontend/src/components/nav/Layout.tsx @@ -7,7 +7,8 @@ import { } from '@mantine/spotlight'; import { IconSearch } from '@tabler/icons-react'; import { type JSX, useEffect, useMemo, useState } from 'react'; -import { Navigate, Outlet, useLocation, useNavigate } from 'react-router-dom'; +import { Outlet, Navigate, useLocation } from '@tanstack/react-router'; +import { useNavigate } from '@lib/functions/navigation'; import { identifierString } from '@lib/functions/Conversion'; import { ApiEndpoints, apiUrl } from '@lib/index'; @@ -40,10 +41,12 @@ export const ProtectedRoute = ({ children }: { children: JSX.Element }) => { ); } diff --git a/src/frontend/src/components/nav/MainMenu.tsx b/src/frontend/src/components/nav/MainMenu.tsx index eb25eadf4086..e3dc997e7f29 100644 --- a/src/frontend/src/components/nav/MainMenu.tsx +++ b/src/frontend/src/components/nav/MainMenu.tsx @@ -17,7 +17,8 @@ import { IconUserBolt, IconUserCog } from '@tabler/icons-react'; -import { Link, useNavigate } from 'react-router-dom'; +import { Link } from '@tanstack/react-router'; +import { useNavigate } from '@lib/functions/navigation'; import { useShallow } from 'zustand/react/shallow'; import { aboutInvenTree } from '../../defaults/links'; import { doLogout } from '../../functions/auth'; diff --git a/src/frontend/src/components/nav/NavigationTree.tsx b/src/frontend/src/components/nav/NavigationTree.tsx index 9a4937a24a01..9ac53ce5eb27 100644 --- a/src/frontend/src/components/nav/NavigationTree.tsx +++ b/src/frontend/src/components/nav/NavigationTree.tsx @@ -21,7 +21,7 @@ import { } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { useCallback, useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import type { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import type { ModelType } from '@lib/enums/ModelType'; diff --git a/src/frontend/src/components/nav/NotificationDrawer.tsx b/src/frontend/src/components/nav/NotificationDrawer.tsx index b8f93ea8ed12..75b7f1e87d44 100644 --- a/src/frontend/src/components/nav/NotificationDrawer.tsx +++ b/src/frontend/src/components/nav/NotificationDrawer.tsx @@ -21,7 +21,7 @@ import { } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { useCallback, useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ModelInformationDict } from '@lib/enums/ModelInformation'; diff --git a/src/frontend/src/components/nav/SearchDrawer.tsx b/src/frontend/src/components/nav/SearchDrawer.tsx index c3ecf0f5d821..20277eab6288 100644 --- a/src/frontend/src/components/nav/SearchDrawer.tsx +++ b/src/frontend/src/components/nav/SearchDrawer.tsx @@ -30,7 +30,8 @@ import { } from '@tabler/icons-react'; import { useQuery } from '@tanstack/react-query'; import { useCallback, useEffect, useMemo, useState } from 'react'; -import { type NavigateFunction, useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; +import type { NavigateFunction } from '@lib/functions/navigation'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ModelInformationDict } from '@lib/enums/ModelInformation'; diff --git a/src/frontend/src/components/nav/SettingsHeader.tsx b/src/frontend/src/components/nav/SettingsHeader.tsx index 6e6bacac8717..303bbdb416e3 100644 --- a/src/frontend/src/components/nav/SettingsHeader.tsx +++ b/src/frontend/src/components/nav/SettingsHeader.tsx @@ -1,7 +1,7 @@ import { t } from '@lingui/core/macro'; import { Group, SegmentedControl, Stack, Text } from '@mantine/core'; import type { ReactNode } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { useUserState } from '../../states/UserState'; import { StylishText } from '../items/StylishText'; diff --git a/src/frontend/src/components/panels/PanelGroup.tsx b/src/frontend/src/components/panels/PanelGroup.tsx index 60efc37165bf..9156fde6896d 100644 --- a/src/frontend/src/components/panels/PanelGroup.tsx +++ b/src/frontend/src/components/panels/PanelGroup.tsx @@ -24,12 +24,10 @@ import { } from 'react'; import { Navigate, - Route, - Routes, useLocation, - useNavigate, useParams -} from 'react-router-dom'; +} from '@tanstack/react-router'; +import { useNavigate } from '@lib/functions/navigation'; import type { ModelType } from '@lib/enums/ModelType'; import { identifierString } from '@lib/functions/Conversion'; @@ -89,7 +87,8 @@ function BasePanelGroup({ const location = useLocation(); const navigate = useNavigate(); - const { panel } = useParams(); + const params = useParams({ strict: false }) as any; + const panel = params?.panel; const [expanded, setExpanded] = useState(true); @@ -372,10 +371,14 @@ function IndexPanelComponent({ * @param collapsible - If true, the panel group can be collapsed (defaults to true) */ export function PanelGroup(props: Readonly) { - return ( - - } /> - } /> - - ); + const params = useParams({ strict: false }) as any; + const panel = params?.panel; + + // If no panel parameter, show the index component + if (!panel) { + return ; + } + + // Otherwise show the main panel group + return ; } diff --git a/src/frontend/src/components/plugins/PluginContext.tsx b/src/frontend/src/components/plugins/PluginContext.tsx index 26c62dd5dc6e..8a889cc745ff 100644 --- a/src/frontend/src/components/plugins/PluginContext.tsx +++ b/src/frontend/src/components/plugins/PluginContext.tsx @@ -1,6 +1,6 @@ import { useMantineColorScheme, useMantineTheme } from '@mantine/core'; import { useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from '@lib/functions/navigation'; import { useShallow } from 'zustand/react/shallow'; import { api, queryClient } from '../../App'; import { useLocalState } from '../../states/LocalState'; diff --git a/src/frontend/src/components/plugins/PluginDrawer.tsx b/src/frontend/src/components/plugins/PluginDrawer.tsx index ce3c7f73428c..7b05a0499682 100644 --- a/src/frontend/src/components/plugins/PluginDrawer.tsx +++ b/src/frontend/src/components/plugins/PluginDrawer.tsx @@ -2,7 +2,7 @@ import { t } from '@lingui/core/macro'; import { Accordion, Alert, Card, Stack, Text } from '@mantine/core'; import { IconExclamationCircle } from '@tabler/icons-react'; import { useMemo } from 'react'; -import { useParams } from 'react-router-dom'; +import { useParams } from '@tanstack/react-router'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { useInstance } from '../../hooks/UseInstance'; @@ -22,7 +22,7 @@ export default function PluginDrawer({ pluginKey?: string; pluginInstance: PluginInterface; }>) { - const { id } = useParams(); + const { id } = useParams({ strict: false }); const pluginPrimaryKey: string = useMemo(() => { return pluginKey || id || ''; diff --git a/src/frontend/src/components/wizards/ImportPartWizard.tsx b/src/frontend/src/components/wizards/ImportPartWizard.tsx index 68c3fa6aaeaf..21014f11b839 100644 --- a/src/frontend/src/components/wizards/ImportPartWizard.tsx +++ b/src/frontend/src/components/wizards/ImportPartWizard.tsx @@ -31,7 +31,7 @@ import { useMemo, useState } from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from '@tanstack/react-router'; import { api } from '../../App'; import { usePartFields } from '../../forms/PartForms'; import { InvenTreeIcon } from '../../functions/icons'; @@ -113,7 +113,7 @@ const SearchResult = ({ )} {searchResult.existing_part_id && ( - + Already Imported @@ -597,7 +597,7 @@ export default function ImportPartWizard({ rightSection={ importResult && ( - +