Vitron-Front/app/utils/api-config.ts
2026-04-29 01:44:16 +03:30

179 lines
4.2 KiB
TypeScript

/**
* API Configuration Utility
* Centralized configuration for API endpoints with environment-based routing
*/
export interface ApiConfig {
baseUrl: string;
socketUrl: string;
siteUrl: string;
domainUrl: string;
}
/**
* Gets the API base URL from environment variables with fallback
* Supports both client-side (Vite) and server-side (Node.js) environments
*/
export function getApiBaseUrl(): string {
// Client-side: Check for Vite injected env vars
if (typeof window !== "undefined") {
// Check for globally injected ENV (from Remix)
const windowEnv =
(window as any).ENV && (window as any).ENV.VITE_API_BASE_URL;
if (windowEnv) return windowEnv;
}
// Server-side: Check Node.js process.env
if (
typeof process !== "undefined" &&
process.env &&
process.env.VITE_API_BASE_URL
) {
return process.env.VITE_API_BASE_URL;
}
// Environment-specific fallbacks
const nodeEnv =
(typeof process !== "undefined" && process.env
? process.env.NODE_ENV
: undefined) || "development";
switch (nodeEnv) {
case "production":
return "https://api.vitrown.com";
case "development":
return "https://api.vitrown.abrino.cloud";
default:
return "https://api.vitrown.com";
}
}
/**
* Gets the internal API URL for server-side requests (SSR)
* Uses Kubernetes internal service URL to avoid hairpin NAT issues
* Falls back to external URL if INTERNAL_API_URL is not set
*/
export function getInternalApiUrl(): string {
// Only use internal URL on server-side
if (typeof window === "undefined") {
if (
typeof process !== "undefined" &&
process.env &&
process.env.INTERNAL_API_URL
) {
return process.env.INTERNAL_API_URL;
}
}
// Fallback to regular API URL
return getApiBaseUrl();
}
/**
* Gets the WebSocket URL from environment variables with fallback
*/
export function getSocketBaseUrl(): string {
if (typeof window !== "undefined") {
const windowEnv =
(window as any).ENV && (window as any).ENV.VITE_API_SOCKET_BASE_URL;
if (windowEnv) return windowEnv;
}
if (
typeof process !== "undefined" &&
process.env &&
process.env.VITE_API_SOCKET_BASE_URL
) {
return process.env.VITE_API_SOCKET_BASE_URL;
}
// Convert HTTP to WebSocket protocol
return getApiBaseUrl().replace(/^https?:\/\//, "wss://");
}
/**
* Gets the site URL from environment variables with fallback
*/
export function getSiteUrl(): string {
if (typeof window !== "undefined") {
const windowEnv = (window as any).ENV && (window as any).ENV.VITE_SITE_URL;
if (windowEnv) return windowEnv;
}
if (
typeof process !== "undefined" &&
process.env &&
process.env.VITE_SITE_URL
) {
return process.env.VITE_SITE_URL;
}
const nodeEnv =
(typeof process !== "undefined" && process.env
? process.env.NODE_ENV
: undefined) || "development";
switch (nodeEnv) {
case "production":
return "https://vitrown.com";
case "development":
return "https://vitrown.abrino.cloud";
default:
return "https://vitrown.com";
}
}
/**
* Gets the domain URL from environment variables with fallback
*/
export function getDomainUrl(): string {
if (typeof window !== "undefined") {
const windowEnv =
(window as any).ENV && (window as any).ENV.VITE_DOMAIN_URL;
if (windowEnv) return windowEnv;
}
if (
typeof process !== "undefined" &&
process.env &&
process.env.VITE_DOMAIN_URL
) {
return process.env.VITE_DOMAIN_URL;
}
// Fallback to site URL
return getSiteUrl();
}
/**
* Gets complete API configuration object
*/
export function getApiConfig(): ApiConfig {
return {
baseUrl: getApiBaseUrl(),
socketUrl: getSocketBaseUrl(),
siteUrl: getSiteUrl(),
domainUrl: getDomainUrl(),
};
}
/**
* Environment detection utilities
*/
export const isProduction = (): boolean => {
const nodeEnv =
typeof process !== "undefined" && process.env
? process.env.NODE_ENV
: undefined;
return nodeEnv === "production";
};
export const isDevelopment = (): boolean => !isProduction();
/**
* Clean URL helper - removes trailing slashes
*/
export function cleanUrl(url: string): string {
return (url && url.replace(/\/+$/, "")) || "";
}