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))
}
};
});