diff --git a/src/apps/experimental/routes/routes.tsx b/src/apps/experimental/routes/routes.tsx index beff0629ac..a35fc3d0ec 100644 --- a/src/apps/experimental/routes/routes.tsx +++ b/src/apps/experimental/routes/routes.tsx @@ -11,6 +11,7 @@ import { ASYNC_USER_ROUTES } from './asyncRoutes'; import { LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes'; import VideoPage from './video'; import loadable from '@loadable/component'; +import BangRedirect from 'components/router/BangRedirect'; const AppLayout = loadable(() => import('../AppLayout')); @@ -40,6 +41,11 @@ export const EXPERIMENTAL_APP_ROUTES: RouteObject[] = [ ] }, + { + path: '!/*', + Component: BangRedirect + }, + /* Redirects for old paths */ ...REDIRECTS.map(toRedirectRoute) ]; diff --git a/src/apps/stable/routes/routes.tsx b/src/apps/stable/routes/routes.tsx index 300092c9fe..f8f720a5b0 100644 --- a/src/apps/stable/routes/routes.tsx +++ b/src/apps/stable/routes/routes.tsx @@ -11,6 +11,7 @@ import AppLayout from '../AppLayout'; import { REDIRECTS } from './_redirects'; import { ASYNC_USER_ROUTES } from './asyncRoutes'; import { LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes'; +import BangRedirect from 'components/router/BangRedirect'; export const STABLE_APP_ROUTES: RouteObject[] = [ { @@ -32,6 +33,11 @@ export const STABLE_APP_ROUTES: RouteObject[] = [ ] }, + { + path: '!/*', + Component: BangRedirect + }, + /* Redirects for old paths */ ...REDIRECTS.map(toRedirectRoute) ]; diff --git a/src/components/router/BangRedirect.tsx b/src/components/router/BangRedirect.tsx new file mode 100644 index 0000000000..1ee18e9dcb --- /dev/null +++ b/src/components/router/BangRedirect.tsx @@ -0,0 +1,34 @@ +import React, { useMemo } from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; + +const BangRedirect = () => { + const location = useLocation(); + + const to = useMemo(() => { + const _to = { + search: location.search, + hash: location.hash + }; + + if (location.pathname.startsWith('/!/')) { + return { ..._to, pathname: location.pathname.substring(2) }; + } else if (location.pathname.startsWith('/!')) { + return { ..._to, pathname: location.pathname.replace(/^\/!/, '/') }; + } else if (location.pathname.startsWith('!')) { + return { ..._to, pathname: location.pathname.substring(1) }; + } + }, [ location ]); + + if (!to) return null; + + console.warn('[BangRedirect] You are using a deprecated URL format. This will stop working in a future Jellyfin update.'); + + return ( + + ); +}; + +export default BangRedirect;