Skip to main content

Settings Utilities

This page documents the server-side settings helper functions in lib/utils/settings.ts. These utilities provide type-safe access to feature flags, UI configuration, monetization settings, location features, and homepage customization through the centralized config manager.

Overview

The settings utilities act as an abstraction layer between application code and the configuration manager. Each function:

  • Reads a specific nested configuration value via configManager.getNestedValue()
  • Provides a sensible default when the value is not set
  • Returns a strongly typed result

All functions are server-side only and should be called from Server Components, API routes, or server actions.

Architecture

configManager.getNestedValue("settings.categories_enabled")
|
v
getCategoriesEnabled() --> boolean (default: true)

The configManager reads settings from the Git-based CMS content repository. The settings utilities wrap these reads with defaults and type annotations.

Feature Flags

These functions control which major features are visible in the application.

Content Features

import { configManager } from "@/lib/config-manager";

export function getCategoriesEnabled(): boolean {
const categoriesEnabled = configManager.getNestedValue(
"settings.categories_enabled"
);
return categoriesEnabled ?? true;
}

export function getTagsEnabled(): boolean {
const tagsEnabled = configManager.getNestedValue(
"settings.tags_enabled"
);
return tagsEnabled ?? true;
}

export function getCompaniesEnabled(): boolean {
const companiesEnabled = configManager.getNestedValue(
"settings.companies_enabled"
);
return companiesEnabled ?? true;
}

export function getSurveysEnabled(): boolean {
const surveysEnabled = configManager.getNestedValue(
"settings.surveys_enabled"
);
return surveysEnabled ?? true;
}
FunctionConfig PathDefaultPurpose
getCategoriesEnabled()settings.categories_enabledtrueShow/hide category navigation and filtering
getTagsEnabled()settings.tags_enabledtrueShow/hide tag-based filtering
getCompaniesEnabled()settings.companies_enabledtrueShow/hide company pages
getSurveysEnabled()settings.surveys_enabledtrueShow/hide the survey system

Header Settings

These functions control the visibility of UI elements in the site header.

export function getHeaderSubmitEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.submit_enabled"
);
return enabled ?? true;
}

export function getHeaderPricingEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.pricing_enabled"
);
return enabled ?? true;
}

export function getHeaderLayoutEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.layout_enabled"
);
return enabled ?? true;
}

export function getHeaderLanguageEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.language_enabled"
);
return enabled ?? true;
}

export function getHeaderThemeEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.theme_enabled"
);
return enabled ?? true;
}

export function getHeaderMoreEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.more_enabled"
);
return enabled ?? true;
}

export function getHeaderSettingsEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.header.settings_enabled"
);
return enabled ?? true;
}
FunctionConfig PathDefaultControls
getHeaderSubmitEnabled()settings.header.submit_enabledtrue"Submit" button
getHeaderPricingEnabled()settings.header.pricing_enabledtruePricing menu link
getHeaderLayoutEnabled()settings.header.layout_enabledtrueLayout switcher toggle
getHeaderLanguageEnabled()settings.header.language_enabledtrueLanguage selector dropdown
getHeaderThemeEnabled()settings.header.theme_enabledtrueDark/light theme toggle
getHeaderMoreEnabled()settings.header.more_enabledtrue"More" overflow menu
getHeaderSettingsEnabled()settings.header.settings_enabledtrueSettings gear button

Header Defaults

These functions return the default values for user-facing preferences.

export function getHeaderLayoutDefault(): string {
const layoutDefault = configManager.getNestedValue(
"settings.header.layout_default"
);
return layoutDefault ?? "home1";
}

export function getHeaderPaginationDefault(): string {
const paginationDefault = configManager.getNestedValue(
"settings.header.pagination_default"
);
return paginationDefault ?? "standard";
}

export function getHeaderThemeDefault(): string {
const themeDefault = configManager.getNestedValue(
"settings.header.theme_default"
);
return themeDefault ?? "light";
}
FunctionConfig PathDefaultValues
getHeaderLayoutDefault()settings.header.layout_default"home1""home1" or "home2"
getHeaderPaginationDefault()settings.header.pagination_default"standard""standard" or "infinite"
getHeaderThemeDefault()settings.header.theme_default"light""light" or "dark"

Homepage Hero Customization

These functions allow overriding the hero section text. When they return undefined, the component falls back to i18n translation strings.

export function getHeroBadgeText(): string | undefined {
return (
configManager.getNestedValue(
"settings.homepage.hero_badge_text"
) || undefined
);
}

export function getHeroTitle(): string | undefined {
return (
configManager.getNestedValue(
"settings.homepage.hero_title"
) || undefined
);
}

export function getHeroTitleGradient(): string | undefined {
return (
configManager.getNestedValue(
"settings.homepage.hero_title_gradient"
) || undefined
);
}

export function getHeroDescription(): string | undefined {
return (
configManager.getNestedValue(
"settings.homepage.hero_description"
) || undefined
);
}

Usage in a Server Component:

import { getHeroTitle, getHeroTitleGradient } from "@/lib/utils/settings";

export default function HeroSection() {
const customTitle = getHeroTitle();
const gradientText = getHeroTitleGradient();

return (
<h1>
{customTitle || t("hero.title")}
{gradientText && (
<span className="gradient">{gradientText}</span>
)}
</h1>
);
}
export function getFooterSubscribeEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.footer.subscribe_enabled"
);
return enabled ?? true;
}

export function getFooterVersionEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.footer.version_enabled"
);
return enabled ?? true;
}

export function getFooterThemeSelectorEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.footer.theme_selector_enabled"
);
return enabled ?? true;
}
FunctionDefaultPurpose
getFooterSubscribeEnabled()trueNewsletter subscription form in footer
getFooterVersionEnabled()trueVersion number display
getFooterThemeSelectorEnabled()trueTheme toggle in footer

These functions manage the monetization configuration for sponsored ad placements.

export function getSponsorAdsEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.monetization.sponsor_ads.enabled"
);
return enabled ?? true;
}

export function getSponsorAdWeeklyPrice(): number {
const price = configManager.getNestedValue(
"settings.monetization.sponsor_ads.weekly_price"
);
return price ?? 100;
}

export function getSponsorAdMonthlyPrice(): number {
const price = configManager.getNestedValue(
"settings.monetization.sponsor_ads.monthly_price"
);
return price ?? 300;
}

export function getSponsorAdCurrency(): string {
const currency = configManager.getNestedValue(
"settings.monetization.sponsor_ads.currency"
);
return currency ?? "USD";
}

A convenience function returns all pricing configuration at once:

export function getSponsorAdPricingConfig(): {
enabled: boolean;
weeklyPrice: number;
monthlyPrice: number;
currency: string;
} {
return {
enabled: getSponsorAdsEnabled(),
weeklyPrice: getSponsorAdWeeklyPrice(),
monthlyPrice: getSponsorAdMonthlyPrice(),
currency: getSponsorAdCurrency(),
};
}

Location Settings

These functions control the geolocation and map features.

export function getLocationEnabled(): boolean {
const enabled = configManager.getNestedValue(
"settings.location.enabled"
);
return enabled ?? false; // Disabled by default
}

export function getLocationProvider(): "mapbox" | "google" {
const provider = configManager.getNestedValue(
"settings.location.provider"
);
return provider ?? "mapbox";
}

export function getLocationMapStyle(): "streets" | "satellite" {
const style = configManager.getNestedValue(
"settings.location.map_style"
);
return style ?? "streets";
}

The getLocationSettings() function returns all location configuration:

export function getLocationSettings(): {
enabled: boolean;
provider: "mapbox" | "google";
map_style: "streets" | "satellite";
distance_filter_enabled: boolean;
distance_sort_enabled: boolean;
default_radius_km: number;
show_exact_address: boolean;
require_location_on_submit: boolean;
} {
return {
enabled: getLocationEnabled(),
provider: getLocationProvider(),
map_style: getLocationMapStyle(),
distance_filter_enabled: getDistanceFilterEnabled(),
distance_sort_enabled: getDistanceSortEnabled(),
default_radius_km: getDefaultRadiusKm(),
show_exact_address: getShowExactAddress(),
require_location_on_submit: getRequireLocationOnSubmit(),
};
}
SettingDefaultDescription
enabledfalseMaster toggle for location features
provider"mapbox"Map tile provider
map_style"streets"Map visual style
distance_filter_enabledtrue"Near Me" filter button
distance_sort_enabledtrueSort results by distance
default_radius_km50Default search radius in kilometers
show_exact_addressfalseShow full address vs city only
require_location_on_submitfalseMake location required on item submission

Default Value Strategy

All settings utilities follow the same pattern:

  1. Read the value from the config manager
  2. Apply the nullish coalescing operator (??) with a default
  3. Return the typed result

The defaults are chosen for backward compatibility -- if a setting is not configured, the feature behaves as it did before the setting existed. Most features default to true (enabled), except location features which default to false (disabled) since they require additional API keys.