d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
65 lines
2.2 KiB
TypeScript
65 lines
2.2 KiB
TypeScript
'use client'
|
|
|
|
import { createContext, useContext, useMemo } from 'react'
|
|
import type { BrandConfig, OrganizationWhitelabelSettings } from '@/lib/branding/types'
|
|
import { getBrandConfig } from '@/ee/whitelabeling/branding'
|
|
import { useWhitelabelSettings } from '@/ee/whitelabeling/hooks/whitelabel'
|
|
import { generateOrgThemeCSS, mergeOrgBrandConfig } from '@/ee/whitelabeling/org-branding-utils'
|
|
import { useOrganizations } from '@/hooks/queries/organization'
|
|
|
|
interface BrandingContextValue {
|
|
config: BrandConfig
|
|
}
|
|
|
|
const BrandingContext = createContext<BrandingContextValue>({
|
|
config: getBrandConfig(),
|
|
})
|
|
|
|
interface BrandingProviderProps {
|
|
children: React.ReactNode
|
|
/**
|
|
* Org whitelabel settings fetched server-side from the DB by the workspace layout.
|
|
* Used as the source of truth until the React Query result becomes available,
|
|
* ensuring the correct org logo appears in the initial server HTML — no flash.
|
|
*/
|
|
initialOrgSettings?: OrganizationWhitelabelSettings | null
|
|
}
|
|
|
|
/**
|
|
* Provides merged branding (instance env vars + org DB settings) to the workspace.
|
|
* Injects a `<style>` tag with CSS variable overrides when org colors are configured.
|
|
*/
|
|
export function BrandingProvider({ children, initialOrgSettings }: BrandingProviderProps) {
|
|
const { data: orgsData } = useOrganizations()
|
|
const orgId = orgsData?.activeOrganization?.id
|
|
const { data: orgSettings } = useWhitelabelSettings(orgId)
|
|
|
|
const effectiveOrgSettings =
|
|
orgSettings !== undefined ? orgSettings : (initialOrgSettings ?? null)
|
|
|
|
const brandConfig = useMemo(
|
|
() => mergeOrgBrandConfig(effectiveOrgSettings, getBrandConfig()),
|
|
[effectiveOrgSettings]
|
|
)
|
|
|
|
const themeCSS = useMemo(
|
|
() => (effectiveOrgSettings ? generateOrgThemeCSS(effectiveOrgSettings) : ''),
|
|
[effectiveOrgSettings]
|
|
)
|
|
|
|
return (
|
|
<BrandingContext.Provider value={{ config: brandConfig }}>
|
|
{themeCSS && <style>{themeCSS}</style>}
|
|
{children}
|
|
</BrandingContext.Provider>
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Returns the merged brand config (org settings overlaid on instance defaults).
|
|
* Use this inside the workspace instead of `getBrandConfig()`.
|
|
*/
|
|
export function useOrgBrandConfig(): BrandConfig {
|
|
return useContext(BrandingContext).config
|
|
}
|