Compare commits

..
Author SHA1 Message Date
Brandon Thomas d4ea026b44 dynamically select API host for development / production 2026-04-16 18:25:01 -04:00
2 changed files with 11 additions and 27 deletions
+1 -10
View File
@@ -3,7 +3,7 @@ import { BrowserRouter } from "react-router-dom";
import * as ReactDOM from "react-dom/client";
import { GoogleOAuthProvider } from "@react-oauth/google";
import App from "./app/app";
import { StorytellerApiHostStore, UsersApi } from "@storyteller/api";
import { UsersApi } from "@storyteller/api";
const GOOGLE_CLIENT_ID = import.meta.env.VITE_GOOGLE_CLIENT_ID;
@@ -11,15 +11,6 @@ const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement,
);
// In development, route API through the Vite dev server origin to avoid CORS
if (import.meta.env.DEV) {
try {
StorytellerApiHostStore.getInstance().setDevelopment();
} catch (e) {
console.warn("Failed to set dev API host override", e);
}
}
// Cache the referrer immediately — it can change or disappear on navigation.
// Only set once so subsequent in-site navigations don't overwrite the original.
if (!(window as any).cached_referrer) {
@@ -2,7 +2,6 @@
const DEFAULT_API_HOST_PRODUCTION = "https://api.storyteller.ai";
const DEFAULT_API_HOST_DEVELOPMENT = "http://localhost:12345";
// NB(bt,2025-09-25): 'nx' is creating multiple copies of the library with name
// mangling, so the singleton pattern fails to resolve to a single instance.
(window as any).STORYTELLER_API_HOST_STORE = undefined;
@@ -34,7 +33,8 @@ export class StorytellerApiHostStore {
if ((window as any).STORYTELLER_API_HOST_STORE !== undefined) {
return (window as any).STORYTELLER_API_HOST_STORE;
}
const instance = new StorytellerApiHostStore(DEFAULT_API_HOST_PRODUCTION);
const defaultValue = StorytellerApiHostStore.getDefaultApiSchemeAndHost();
const instance = new StorytellerApiHostStore(defaultValue);
(window as any).STORYTELLER_API_HOST_STORE = instance;
return instance;
}
@@ -45,21 +45,6 @@ export class StorytellerApiHostStore {
return this.apiSchemeAndHost;
}
/**
* This mutates the singleton instance to target development.
*/
public setDevelopment() {
console.warn("StorytellerApiHostStore.setDevelopment() - all calls will target development");
this.apiSchemeAndHost = DEFAULT_API_HOST_DEVELOPMENT;
}
/**
* This mutates the singleton instance to target production.
*/
public setProduction() {
this.apiSchemeAndHost = DEFAULT_API_HOST_PRODUCTION;
}
/**
* Externally update the API host.
* This is used to sync with Tauri for enabling easier development.
@@ -83,4 +68,12 @@ export class StorytellerApiHostStore {
private constructor(apiSchemeAndHost: string) {
this.apiSchemeAndHost = apiSchemeAndHost;
}
private static getDefaultApiSchemeAndHost(): string {
// NB: hostname can be empty string
if (window.location.hostname === "localhost") {
return DEFAULT_API_HOST_DEVELOPMENT;
}
return DEFAULT_API_HOST_PRODUCTION;
}
}