diff --git a/src/components/forms/Toggle.tsx b/src/components/forms/Toggle.tsx index 168639d6f8..65c2c1ce4f 100644 --- a/src/components/forms/Toggle.tsx +++ b/src/components/forms/Toggle.tsx @@ -49,12 +49,12 @@ const GroupContext = React.createContext<{ setFieldValue: () => {}, }) -export type GroupProps = React.PropsWithChildren<{ +export type GroupProps = React.PropsWithChildren<{ type?: 'radio' | 'checkbox' - values: string[] + values: T[] maxSelections?: number disabled?: boolean - onChange: (value: string[]) => void + onChange: (value: T[]) => void label: string }> @@ -73,7 +73,7 @@ export function useItemContext() { return React.useContext(ItemContext) } -export function Group({ +export function Group({ children, values: providedValues, onChange, @@ -81,13 +81,13 @@ export function Group({ type = 'checkbox', maxSelections, label, -}: GroupProps) { +}: GroupProps) { const groupRole = type === 'radio' ? 'radiogroup' : undefined const values = type === 'radio' ? providedValues.slice(0, 1) : providedValues const [maxReached, setMaxReached] = React.useState(false) const setFieldValue = React.useCallback< - (props: {name: string; value: boolean}) => void + (props: {name: ValuesType; value: boolean}) => void >( ({name, value}) => { if (type === 'checkbox') { diff --git a/src/components/moderation/ModerationLabelPref.tsx b/src/components/moderation/ModerationLabelPref.tsx index 13a0dff212..a1ecc1a753 100644 --- a/src/components/moderation/ModerationLabelPref.tsx +++ b/src/components/moderation/ModerationLabelPref.tsx @@ -19,10 +19,11 @@ import {useTheme, atoms as a} from '#/alf' import {Text} from '#/components/Typography' import {InlineLink} from '#/components/Link' import * as Dialog from '#/components/Dialog' -import {Button, ButtonText, ButtonIcon} from '#/components/Button' +import {Button} from '#/components/Button' import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '../icons/CircleInfo' -import {Check_Stroke2_Corner0_Rounded as Check} from '../icons/Check' import {SettingsGear2_Stroke2_Corner0_Rounded as Gear} from '../icons/Gear' +import * as Toggle from '#/components/forms/Toggle' +import {Divider} from '#/components/Divider' export function ModerationLabelPref({ labelValueDefinition, @@ -51,6 +52,7 @@ export function ModerationLabelPref({ savedPref ?? labelValueDefinition.defaultSetting ?? 'warn' + const [selected, setSelected] = React.useState([pref]) const settingDesc = useLabelBehaviorDescription(labelValueDefinition, pref) const hideLabel = useLabelLongBehaviorDescription( @@ -81,8 +83,31 @@ export function ModerationLabelPref({ adultOnly && !preferences?.moderationPrefs.adultContentEnabled const cantConfigure = isGlobalLabel || adultDisabled - const onSelectPref = (newPref: LabelPreference) => - mutate({label: identifier, visibility: newPref, labelerDid}) + const onSettingChange = React.useCallback( + (newPrefs: LabelPreference[]) => { + setSelected(newPrefs) + mutate({label: identifier, visibility: newPrefs[0], labelerDid}) + }, + [mutate, labelerDid, identifier], + ) + + const settings = [ + { + pref: 'hide', + label: hideLabel, + }, + canWarn && { + pref: 'warn', + label: warnLabel, + }, + { + pref: 'ignore', + label: ignoreLabel, + }, + ].filter(Boolean) as { + pref: LabelPreference + label: string + }[] return ( <> @@ -180,60 +205,42 @@ export function ModerationLabelPref({ )} {!cantConfigure && ( - <> - + + type="radio" + values={selected} + onChange={onSettingChange} + label={_( + msg`Configure filtering settings for ${labelStrings.name}`, + )}> + + {settings.map((s, i) => ( + <> + {i !== 0 && } - {canWarn && ( - - )} - - - + + + + {s.label} + + + + ))} + + )}