// Copyright (c) 2020-2021 Drew Lemmy
// This file is part of KristWeb 2 under GPL-3.0.
// Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt
import React from "react";
import { Menu } from "antd";
import { useTFns } from "@utils/i18n";
import { SettingName } from "@utils/settings";
import { SettingBoolean } from "./SettingBoolean";
import { SettingInteger } from "./SettingInteger";
export interface SettingDesc<T> {
component: React.ComponentType<{
setting: SettingName<T>;
title?: string;
titleKey?: string;
description?: string;
descriptionKey?: string;
}>;
setting: SettingName<T>;
}
interface Props {
subKey: string;
icon?: React.ReactNode;
settings: SettingDesc<any>[];
}
export const booleanSetting = (setting: SettingName<boolean>): SettingDesc<boolean> =>
({ component: SettingBoolean, setting });
export const integerSetting = (setting: SettingName<number>): SettingDesc<number> =>
({ component: SettingInteger, setting });
export function SettingsGroup({
subKey,
icon,
settings,
...props
}: Props): JSX.Element {
const { tStr, tKey, i18n } = useTFns("settings.");
return <Menu.SubMenu
key={"sub-" + subKey}
icon={icon}
title={tStr("subMenu" + subKey)}
{...props}
>
{/* Render each setting */}
{settings.map(s => (
<Menu.Item key={`${subKey}/${s.setting}`}>
{React.createElement(s.component, {
setting: s.setting,
titleKey: tKey(s.setting),
descriptionKey: i18n.exists(tKey(s.setting + "Description"))
? tKey(s.setting + "Description")
: undefined
})}
</Menu.Item>
))}
</Menu.SubMenu>;
}