import CloseIcon from "@mui/icons-material/Close"; import SettingsOutlinedIcon from "@mui/icons-material/SettingsOutlined"; import { Box, Checkbox, FormControl, FormControlLabel, FormLabel, Grid, IconButton, Modal, Paper, Stack, ToggleButton, ToggleButtonGroup, Typography, } from "@mui/material"; import clsx from "clsx"; import { useContext } from "react"; import { RuleDataUtils } from "@dndbeyond/character-rules-engine/es"; import { SourceCategoryDescription } from "~/constants"; import { useFeatureFlags } from "~/contexts/FeatureFlag"; import { generateCharacterPreferences } from "~/helpers/generateCharacterPreferences"; import PreferenceUpdateLocation from "~/tools/js/Shared/constants/PreferenceUpdateLocation"; import { CheckboxInfo, FormCheckBoxesField, } from "../../Shared/components/common/FormCheckBoxesField"; import AbilitySummary from "../AbilitySummary"; import PrivacyTypeRadio from "../PrivacyTypeRadio"; import { UserPreferenceContext } from "../UserPreference"; import styles from "./styles.module.css"; interface CharacterSettingsModalProps { open: boolean; updateLocation: PreferenceUpdateLocation; handleClose: () => void; } const CharacterSettingsModal = ({ open, updateLocation, handleClose, }: CharacterSettingsModalProps) => { const { privacyType, isDarkModeEnabled, abilityScoreDisplayType, updatePreferences, ruleData, defaultEnabledSourceCategories, isHomebrewEnabled, } = useContext(UserPreferenceContext); const { featureFlags } = useFeatureFlags(); const preferences = generateCharacterPreferences(featureFlags); const getTheme = (darkMode: boolean) => ({ name: "DDB Red", backgroundColor: darkMode ? "#10161ADB" : "#FEFEFE", isDefault: true, themeColor: "#C53131", themeColorId: null, isDarkMode: darkMode || false, }); const rollContext = { entityId: "52962664", entityType: "character", name: "Stor Hornraven", avatarUrl: "https://stg.dndbeyond.com/avatars/18589/680/1581111423-52962664.jpeg?width=150&height=150&fit=crop&quality=95&auto=webp", }; const handleSourceCategoryChange = ( sourceId: number, isActive: boolean ): void => { const newSourceCategories = { ...defaultEnabledSourceCategories, [sourceId]: isActive, }; updatePreferences({ privacyType, isDarkModeEnabled, abilityScoreDisplayType, updateLocation, defaultEnabledSourceCategories: newSourceCategories, isHomebrewEnabled, }); }; let sourceToggles: Array = []; let partneredSourceCheckboxes: Array = []; let allPartneredSources: Array = []; if (ruleData) { const activeSourceCategories = Object.keys(defaultEnabledSourceCategories) .filter((key) => defaultEnabledSourceCategories[key]) .map(Number); RuleDataUtils.getSourceCategories(ruleData).forEach((sourceCategory) => { if (!sourceCategory.isToggleable) { return null; } const checkbox: CheckboxInfo = { label: `${sourceCategory.name}`, initiallyEnabled: activeSourceCategories.includes(sourceCategory.id), onChange: handleSourceCategoryChange.bind(this, sourceCategory.id), sortOrder: sourceCategory.sortOrder, description: sourceCategory.description ?? "", }; if (sourceCategory.isPartneredContent) { delete checkbox.description; partneredSourceCheckboxes.push(checkbox); allPartneredSources.push(sourceCategory.id); } else { sourceToggles.push(checkbox); } }); //Add Homebrew to sources for display sourceToggles.push({ label: "Homebrew", initiallyEnabled: isHomebrewEnabled, description: SourceCategoryDescription.homebrew, onChange: (isActive: boolean) => { updatePreferences({ privacyType, isDarkModeEnabled, abilityScoreDisplayType, updateLocation, defaultEnabledSourceCategories, isHomebrewEnabled: isActive, }); }, sortOrder: 0, }); } return ( <> updatePreferences({ isDarkModeEnabled, abilityScoreDisplayType, updateLocation, privacyType: parseInt(e.target.value), defaultEnabledSourceCategories, isHomebrewEnabled, }) } />

Display

updatePreferences({ privacyType, abilityScoreDisplayType, updateLocation, isDarkModeEnabled: e.target.checked, defaultEnabledSourceCategories, isHomebrewEnabled, }) } style={{ paddingTop: 0 }} /> } label={ <>

Underdark Mode

Activate dark mode for Character Sheets. } sx={{ display: "flex", alignItems: "flex-start" }} />

Ability Scores / Modifiers

Reverse the display of Ability Scores and Modifiers.{" "}
{ if (value !== null) updatePreferences({ privacyType, isDarkModeEnabled, updateLocation, abilityScoreDisplayType: value, defaultEnabledSourceCategories, isHomebrewEnabled, }); }} aria-label="Platform" > Modifiers Top Scores Top

Preview

e.getBaseScore()} rollContext={rollContext} />
); }; export default CharacterSettingsModal;