"use client"; import React, { useEffect, useRef, useState } from "react"; import { useAuth } from "@/hooks/useAuth"; import { useRouter } from "next/navigation"; import { apiFetch, API_BASE, resolveToApiOrigin } from "@/lib/api"; import { useSiteSettings } from "@/contexts/SiteSettingsContext"; import { useDismissingState } from "@/hooks/useDismissingState"; type TabId = "organisation" | "branding" | "notifications" | "email" | "legal"; const TABS: { id: TabId; label: string }[] = [ { id: "organisation", label: "Organisation" }, { id: "branding", label: "Branding" }, { id: "notifications", label: "Notifications" }, { id: "email", label: "Email" }, { id: "legal", label: "Legal" }, ]; const inputCls = "w-full border rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-400"; function Field({ label, hint, required, children, }: { label: string; hint?: string; required?: boolean; children: React.ReactNode; }) { return (
{hint}
}Configure your organisation, branding, email, and legal pages.
Outgoing email for tickets, payment confirmations, and account notifications. Leave blank to use server environment variables. The password is stored encrypted.
{smtpTestResult.raw}
These values populate the Terms of Use and Privacy Policy pages automatically.
Information Officer (POPIA)