diff --git a/src/backend/ioc.ts b/src/backend/ioc.ts index bd3dfabd..6ed2c918 100644 --- a/src/backend/ioc.ts +++ b/src/backend/ioc.ts @@ -75,7 +75,8 @@ const createRoot = (options?: RootOptions) => { sources: () => new ScrobbleSources(items.sourceEmitter, localUrl, items.configDir), notifiers: () => new Notifiers(items.notifierEmitter, items.clientEmitter, items.sourceEmitter), localUrl, - hasDefinedBaseUrl: baseUrl !== undefined + hasDefinedBaseUrl: baseUrl !== undefined, + isSubPath: u.pathname !== '/' && u.pathname.length > 0 } }); } diff --git a/src/backend/server/index.ts b/src/backend/server/index.ts index 8fc8f664..29d24fbb 100644 --- a/src/backend/server/index.ts +++ b/src/backend/server/index.ts @@ -71,6 +71,9 @@ export const initServer = async (parentLogger: Logger, initialOutput: LogInfo[] } } + if(process.env.USE_HASH_ROUTER === undefined) { + process.env.USE_HASH_ROUTER = root.get('isSubPath'); + } ViteExpress.config({mode: isProd ? 'production' : 'development'}); try { ViteExpress.listen(app, port, () => { diff --git a/src/client/App.tsx b/src/client/App.tsx index 45301efd..f9166ef2 100644 --- a/src/client/App.tsx +++ b/src/client/App.tsx @@ -1,8 +1,7 @@ import React from 'react'; -import logo from './logo.svg'; -import * as ReactDOM from "react-dom/client"; import { createBrowserRouter, + createHashRouter, RouteObject, RouterProvider, useLocation, } from "react-router-dom"; import {connect, ConnectedProps, Provider} from 'react-redux' @@ -25,7 +24,7 @@ function NoMatch() { ); } -const router = createBrowserRouter([ +const routes: RouteObject[] = [ { path: "/", element: , @@ -46,7 +45,14 @@ const router = createBrowserRouter([ path: "*", element: } -]); +]; + +const genRouter = () => { + const useHashRouter = __USE_HASH_ROUTER__ === 'true'; + return useHashRouter ? createHashRouter(routes) : createBrowserRouter(routes); +} + +const router = genRouter(); const mapDispatchToProps = (dispatch) => { return { diff --git a/src/client/deadLetter/deadLetterDucks.ts b/src/client/deadLetter/deadLetterDucks.ts index af30c3b1..7a26101c 100644 --- a/src/client/deadLetter/deadLetterDucks.ts +++ b/src/client/deadLetter/deadLetterDucks.ts @@ -6,7 +6,7 @@ import {ApiEventPayload, clientUpdate} from "../status/ducks"; type DeadResponse = DeadLetterScrobble[]; export const deadApi = createApi({ reducerPath: 'deadApi', - baseQuery: fetchBaseQuery({baseUrl: '/api/'}), + baseQuery: fetchBaseQuery({baseUrl: './api/'}), tagTypes: ['DeadLetters'], endpoints: (builder) => ({ getDead: builder.query({ diff --git a/src/client/logs/logsApi.ts b/src/client/logs/logsApi.ts index 7a33e375..7efeaa94 100644 --- a/src/client/logs/logsApi.ts +++ b/src/client/logs/logsApi.ts @@ -3,7 +3,7 @@ import {LogInfoJson, LogOutputConfig} from "../../core/Atomic"; export const logsApi = createApi({ reducerPath: 'logsApi', - baseQuery: fetchBaseQuery({ baseUrl: '/api/' }), + baseQuery: fetchBaseQuery({ baseUrl: './api/' }), endpoints: (builder) => ({ getLogs: builder.query<{ data: LogInfoJson[], settings: LogOutputConfig }, undefined>({ query: () => `logs`, diff --git a/src/client/recent/recentDucks.ts b/src/client/recent/recentDucks.ts index 7b6c7135..9589dc0c 100644 --- a/src/client/recent/recentDucks.ts +++ b/src/client/recent/recentDucks.ts @@ -4,7 +4,7 @@ import {JsonPlayObject} from "../../core/Atomic"; type RecentResponse = (JsonPlayObject & { index: number })[]; export const recentApi = createApi({ reducerPath: 'recentApi', - baseQuery: fetchBaseQuery({ baseUrl: '/api/' }), + baseQuery: fetchBaseQuery({ baseUrl: './api/' }), endpoints: (builder) => ({ getRecent: builder.query({ query: (params) => `recent?name=${params.name}&type=${params.type}`, diff --git a/src/client/scrobbled/scrobbledDucks.ts b/src/client/scrobbled/scrobbledDucks.ts index 22213ba9..8eee3692 100644 --- a/src/client/scrobbled/scrobbledDucks.ts +++ b/src/client/scrobbled/scrobbledDucks.ts @@ -4,7 +4,7 @@ import {JsonPlayObject} from "../../core/Atomic"; type ScrobbledResponse = (JsonPlayObject & { index: number })[]; export const scrobbledApi = createApi({ reducerPath: 'scrobbledApi', - baseQuery: fetchBaseQuery({ baseUrl: '/api/' }), + baseQuery: fetchBaseQuery({ baseUrl: './api/' }), endpoints: (builder) => ({ getRecent: builder.query({ query: (params) => `scrobbled?name=${params.name}&type=${params.type}`, diff --git a/src/client/status/statusApi.ts b/src/client/status/statusApi.ts index e6f0323c..b15e5851 100644 --- a/src/client/status/statusApi.ts +++ b/src/client/status/statusApi.ts @@ -3,7 +3,7 @@ import {ClientStatusData, SourceStatusData} from "../../core/Atomic"; export const statusApi = createApi({ reducerPath: 'statusApi', - baseQuery: fetchBaseQuery({ baseUrl: '/api/' }), + baseQuery: fetchBaseQuery({ baseUrl: './api/' }), endpoints: (builder) => ({ getStatus: builder.query<{ sources: SourceStatusData[], clients: ClientStatusData[] }, undefined>({ query: () => `status`, diff --git a/src/client/vite-env.d.ts b/src/client/vite-env.d.ts index e38806ac..aabd82ed 100644 --- a/src/client/vite-env.d.ts +++ b/src/client/vite-env.d.ts @@ -1,2 +1,3 @@ /// declare const __APP_VERSION__: string +declare const __USE_HASH_ROUTER__: bool diff --git a/vite.config.ts b/vite.config.ts index db5ae0af..2f9147dc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,12 +3,14 @@ import react from '@vitejs/plugin-react'; export default defineConfig(() => { return { + base: (process.env.BASE_URL ?? '/'), plugins: [react()], build: { sourcemap: true }, define: { - "__APP_VERSION__": JSON.stringify((process.env.APP_VERSION ?? 'Unknown').toString()) + "__APP_VERSION__": JSON.stringify((process.env.APP_VERSION ?? 'Unknown').toString()), + "__USE_HASH_ROUTER__": JSON.stringify((process.env.USE_HASH_ROUTER ?? false)) } }; });