import * as React from "bloatless-react";
import { SplitModal } from "./splitModal";
import { languageNames } from "../translations";
import { PlaceholderView } from "../Components/placeholderView";
import { OptionButtonList } from "../Components/optionButtonList";
import { NavigationButton } from "../Components/navigationButton";
import { InfoTile } from "../Components/infoTile";
import SettingsViewModel, {
SettingsModalPages,
} from "../../ViewModel/Global/settingsViewModel";
import CoreViewModel from "../../ViewModel/Global/coreViewModel";
import { Languages, ThemeSettings } from "../../Model/Global/settingsModel";
export function SettingsModal(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel,
) {
const detailView = React.createProxyState(
[settingsViewModel.selectedModalPage],
() => {
switch (settingsViewModel.selectedModalPage.value) {
case undefined: {
return PlaceholderView(
coreViewModel.translations.general.noPageSelected,
);
}
case SettingsModalPages.Appearance:
return SettingsAppearancePane(
coreViewModel,
settingsViewModel,
);
case SettingsModalPages.Regional:
return SettingsRegionalPane(
coreViewModel,
settingsViewModel,
);
case SettingsModalPages.Info:
return SettingsInfoPane(coreViewModel, settingsViewModel);
}
},
);
return (
{SplitModal(
coreViewModel,
new React.State(
SettingsLeftPane(coreViewModel, settingsViewModel),
),
detailView,
true,
settingsViewModel.selectedModalPage,
)}
);
}
function SettingsLeftPane(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel,
) {
return (
{coreViewModel.translations.homePage.settingsButton}
{SettingsPaneButton(
coreViewModel,
settingsViewModel,
SettingsModalPages.Appearance,
coreViewModel.translations.settings.pages.appearance,
)}
{SettingsPaneButton(
coreViewModel,
settingsViewModel,
SettingsModalPages.Regional,
coreViewModel.translations.settings.pages.regional,
)}
{SettingsPaneButton(
coreViewModel,
settingsViewModel,
SettingsModalPages.Info,
coreViewModel.translations.settings.pages.info,
)}
);
}
function SettingsPaneButton(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel,
page: SettingsModalPages,
label: string,
) {
return NavigationButton(
coreViewModel,
label,
settingsViewModel.selectedModalPage,
page,
true,
);
}
function SettingsInfoPane(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel,
) {
return (
{coreViewModel.translations.homePage.appName}
{InfoTile(
"build",
coreViewModel.translations.settings.version,
settingsViewModel.coreViewModel.BUILD,
)}
);
}
function SettingsRegionalPane(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel,
) {
return (
{coreViewModel.translations.settings.pages.regional}
{coreViewModel.translations.settings.language}
{OptionButtonList(
new React.ListState<[string, string]>(
Object.values(Languages).map((x) => [languageNames[x], x]),
),
settingsViewModel.language,
)}
{coreViewModel.translations.settings.firstDayOfWeekLabel}
{OptionButtonList(
new React.ListState<[string, string]>(
coreViewModel.translations.regional.weekdays.full.map(
(x, i) => [x, i.toString()],
),
),
settingsViewModel.firstDayOfWeek,
)}
);
}
function SettingsAppearancePane(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel,
) {
return (
{coreViewModel.translations.settings.pages.appearance}
{OptionButtonList(
new React.ListState<[string, ThemeSettings]>([
[
coreViewModel.translations.settings.themes.dark,
ThemeSettings.Dark,
],
[
coreViewModel.translations.settings.themes.light,
ThemeSettings.Light,
],
[
coreViewModel.translations.settings.themes.system,
ThemeSettings.System,
],
]),
settingsViewModel.theme,
)}
);
}