|
/**
|
|
* Runtime white-label accessor.
|
|
*
|
|
* Prefer values from react-native-config (.env) when present (native builds),
|
|
* then fall back to the generated tenant JSON so Metro/Jest always have a
|
|
* complete typed config even before a native rebuild.
|
|
*/
|
|
|
|
import Config from 'react-native-config';
|
|
import generatedTenant from './tenant.generated';
|
|
import type { TenantConfig, TenantFeatures } from './tenant.types';
|
|
|
|
function pickString(
|
|
envValue: string | undefined,
|
|
fallback: string,
|
|
): string {
|
|
if (typeof envValue === 'string' && envValue.trim().length > 0) {
|
|
// react-native-config / dotenv may keep surrounding quotes for #hex values
|
|
return envValue.trim().replace(/^['"]|['"]$/g, '');
|
|
}
|
|
return fallback;
|
|
}
|
|
|
|
function pickNumber(envValue: string | undefined, fallback: number): number {
|
|
if (typeof envValue === 'string' && envValue.trim().length > 0) {
|
|
const n = Number(envValue);
|
|
if (Number.isFinite(n) && n > 0) {
|
|
return n;
|
|
}
|
|
}
|
|
return fallback;
|
|
}
|
|
|
|
const base: TenantConfig = generatedTenant.config;
|
|
|
|
/**
|
|
* Merged tenant config used by the entire app.
|
|
* Safe to import from any module — never throws on missing native Config keys.
|
|
*/
|
|
export const tenant: TenantConfig = {
|
|
...base,
|
|
tenantId: pickString(Config.APP_TENANT, base.tenantId),
|
|
appName: pickString(Config.APP_NAME, base.appName),
|
|
displayName: pickString(Config.APP_DISPLAY_NAME, base.displayName),
|
|
slug: pickString(Config.APP_SLUG, base.slug),
|
|
companyLegalName: pickString(Config.COMPANY_LEGAL_NAME, base.companyLegalName),
|
|
supportEmail: pickString(Config.SUPPORT_EMAIL, base.supportEmail),
|
|
bundleId: {
|
|
ios: pickString(Config.IOS_BUNDLE_ID, base.bundleId.ios),
|
|
android: pickString(Config.ANDROID_APP_ID, base.bundleId.android),
|
|
},
|
|
api: {
|
|
baseUrl: pickString(Config.API_BASE_URL, base.api.baseUrl),
|
|
socketUrl: pickString(Config.SOCKET_URL, base.api.socketUrl),
|
|
timeoutMs: pickNumber(Config.API_TIMEOUT_MS, base.api.timeoutMs),
|
|
},
|
|
brand: {
|
|
...base.brand,
|
|
primary: pickString(Config.PRIMARY_COLOR, base.brand.primary),
|
|
secondary: pickString(Config.SECONDARY_COLOR, base.brand.secondary),
|
|
},
|
|
};
|
|
|
|
export const tenantId: string = tenant.tenantId;
|
|
export const features: TenantFeatures = tenant.features;
|
|
|
|
/** Active company slug used in OTP / login API bodies */
|
|
export const companySlug: string = tenant.slug;
|
|
|
|
/** Brand logo copied by `npm run tenant:switch` */
|
|
export const brandLogo = require('../assets/brand/logo.png');
|
|
|
|
export function isFeatureEnabled(feature: keyof TenantFeatures): boolean {
|
|
return Boolean(tenant.features[feature]);
|
|
}
|
|
|
|
export default tenant;
|