@@ -30,7 +30,11 @@ import {
3030import { Select , SelectItem , SelectPopup , SelectTrigger , SelectValue } from "../ui/select" ;
3131import { SettingResetButton , SettingsRow } from "./settingsLayout" ;
3232import { searchableSetting } from "./settingsSearch" ;
33- import { useScopedSettings , useUpdateScopedSettings } from "./useScopedSettings" ;
33+ import {
34+ useScopedSettings ,
35+ useScopedSettingsMixed ,
36+ useUpdateScopedSettings ,
37+ } from "./useScopedSettings" ;
3438
3539const UNIT_MINUTES = { minutes : 1 , hours : 60 , days : 24 * 60 } as const ;
3640type DurationUnit = keyof typeof UNIT_MINUTES ;
@@ -116,7 +120,10 @@ export function SnoozePresetsRow() {
116120 // Row keys survive removals, so a row's in-progress field state stays with that row.
117121 const [ keys , setKeys ] = useState < ReadonlyArray < number > > ( ( ) => saved . map ( ( _ , index ) => index ) ) ;
118122 const [ nextKey , setNextKey ] = useState ( saved . length ) ;
119- const [ savedSource , setSavedSource ] = useState ( saved ) ;
123+ // Null forces the next render to adopt the saved value, as after a failed write.
124+ const [ savedSource , setSavedSource ] = useState < ReadonlyArray < SnoozePresetSetting > | null > ( saved ) ;
125+ // Environments disagree, so equal-looking edits and Reset must still write to all of them.
126+ const mixed = useScopedSettingsMixed ( [ "snoozePresets" ] ) ;
120127 const [ written , setWritten ] = useState < ReadonlyArray < ReadonlyArray < SnoozePresetSetting > > > ( [ ] ) ;
121128 const freshKeys = ( count : number ) => {
122129 setNextKey ( nextKey + count ) ;
@@ -137,11 +144,19 @@ export function SnoozePresetsRow() {
137144 snoozePresets : ReadonlyArray < SnoozePresetSetting > ,
138145 nextKeys : ReadonlyArray < number > = keys ,
139146 ) => {
140- if ( Equal . equals ( snoozePresets , presets ) ) return ;
147+ if ( ! mixed && Equal . equals ( snoozePresets , presets ) ) return ;
141148 setPresets ( snoozePresets ) ;
142149 setKeys ( nextKeys ) ;
143150 setWritten ( ( previous ) => [ ...previous , snoozePresets ] ) ;
144- updateSettings ( { snoozePresets } ) ;
151+ updateSettings (
152+ { snoozePresets } ,
153+ {
154+ onFailed : ( ) => {
155+ setWritten ( [ ] ) ;
156+ setSavedSource ( null ) ;
157+ } ,
158+ } ,
159+ ) ;
145160 } ;
146161 const replaceAt = ( index : number , next : SnoozePresetSetting ) =>
147162 save ( presets . map ( ( preset , candidate ) => ( candidate === index ? next : preset ) ) ) ;
@@ -153,7 +168,7 @@ export function SnoozePresetsRow() {
153168 { ...searchableSetting ( "snooze-options" ) }
154169 description = "Choices in every snooze menu, listed soonest first. Weekdays mean the next one after today."
155170 resetAction = {
156- Equal . equals ( presets , DEFAULT_SNOOZE_PRESETS ) ? null : (
171+ ! mixed && Equal . equals ( presets , DEFAULT_SNOOZE_PRESETS ) ? null : (
157172 < SettingResetButton
158173 label = "snooze options"
159174 onClick = { ( ) => save ( DEFAULT_SNOOZE_PRESETS , freshKeys ( DEFAULT_SNOOZE_PRESETS . length ) ) }
0 commit comments