/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { RotateCcw, Save } from 'lucide-react' import { createContext, useContext, type ComponentProps, type ReactNode, type RefObject, } from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import { Button } from '@/components/ui/button' type SettingsPageContextValue = { actionsContainer: HTMLDivElement | null titleStatusContainer: HTMLSpanElement | null suppressSectionHeader: boolean } const SettingsPageContext = createContext({ actionsContainer: null, titleStatusContainer: null, suppressSectionHeader: false, }) type SettingsPageProviderProps = { actionsContainer: HTMLDivElement | null titleStatusContainer?: HTMLSpanElement | null children: ReactNode suppressSectionHeader?: boolean } export function SettingsPageProvider(props: SettingsPageProviderProps) { return ( {props.children} ) } export function useSuppressSettingsSectionHeader() { return useContext(SettingsPageContext).suppressSectionHeader } type SettingsPageTitleStatusPortalProps = { children: ReactNode } export function SettingsPageTitleStatusPortal( props: SettingsPageTitleStatusPortalProps ) { const { titleStatusContainer } = useContext(SettingsPageContext) if (!titleStatusContainer) return null return createPortal(props.children, titleStatusContainer) } type SettingsPageActionsPortalProps = { children: ReactNode } export function SettingsPageActionsPortal( props: SettingsPageActionsPortalProps ) { const { actionsContainer } = useContext(SettingsPageContext) if (!actionsContainer) return null return createPortal(
{props.children}
, actionsContainer ) } type SettingsPageFormActionsProps = { onSave: () => void onReset?: () => void isSaving?: boolean isSaveDisabled?: boolean isResetDisabled?: boolean saveLabel?: string savingLabel?: string resetLabel?: string resetVariant?: ComponentProps['variant'] saveButtonRef?: RefObject } export function SettingsPageFormActions(props: SettingsPageFormActionsProps) { const { t } = useTranslation() const saveLabel = props.isSaving ? (props.savingLabel ?? 'Saving...') : (props.saveLabel ?? 'Save Changes') return ( {props.onReset && ( )} ) }