Project

General

Profile

Feature #10306 » tenant.ts

Thirupathirao Uppu, 08/10/2026 11:35 AM

 
/**
* 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;
(4-4/5)