@@ -205,7 +205,12 @@ import {
205205} from "./Sidebar.drag" ;
206206import { SidebarPointerSensor } from "./Sidebar.pointer" ;
207207import { createSidebarListMotion } from "./Sidebar.motion" ;
208- import { resolveSnoozePresets , snoozeWakeLabel , type SnoozePreset } from "./Sidebar.snooze" ;
208+ import {
209+ pickSnoozePreset ,
210+ resolveSnoozePresets ,
211+ snoozeWakeLabel ,
212+ type SnoozePreset ,
213+ } from "./Sidebar.snooze" ;
209214import { ProjectFavicon } from "./ProjectFavicon" ;
210215import { deriveProviderEntriesByEnvironment } from "../providerInstances" ;
211216import { useStableCallback } from "../hooks/useStableCallback" ;
@@ -2135,8 +2140,14 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve
21352140 const unpinMenuItem = buildBulkUnpinContextMenuItem ( {
21362141 pinnedCount : pinnedSelectedThreads . length ,
21372142 } ) ;
2143+ // Presets sync across environments, so the first selected thread's stand for all.
21382144 // oxlint-disable-next-line react/purity -- runs in an event handler (oxc#27309)
2139- const snoozePresets = resolveSnoozePresets ( new Date ( ) , timestampFormat ) ;
2145+ const menuOpenedAt = new Date ( ) ;
2146+ const snoozePresets = resolveSnoozePresets (
2147+ menuOpenedAt ,
2148+ timestampFormat ,
2149+ selectedThreads [ 0 ] ! . environmentId ,
2150+ ) ;
21402151 const clicked = await settlePromise ( ( ) =>
21412152 api . contextMenu . show (
21422153 [
@@ -2163,7 +2174,7 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve
21632174 {
21642175 id : "snooze:custom" ,
21652176 label : "Custom…" ,
2166- separatorBefore : true ,
2177+ separatorBefore : snoozePresets . length > 0 ,
21672178 disabled : ! canOperateThreads ( selectedThreads ) ,
21682179 } ,
21692180 ] ,
@@ -2211,7 +2222,12 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve
22112222 const preset =
22122223 clicked . value === "snooze:custom"
22132224 ? await requestCustomSnooze ( )
2214- : snoozePresets . find ( ( candidate ) => `snooze:${ candidate . id } ` === clicked . value ) ;
2225+ : pickSnoozePreset (
2226+ snoozePresets ,
2227+ clicked . value . slice ( "snooze:" . length ) ,
2228+ timestampFormat ,
2229+ selectedThreads [ 0 ] ! . environmentId ,
2230+ ) ;
22152231 if ( preset ) {
22162232 const coSnoozingKeys = new Set ( threadKeys ) ;
22172233 clearSelection ( ) ;
@@ -2428,7 +2444,11 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve
24282444 const isSettled = settledThreadKeysRef . current . has ( threadKey ) ;
24292445 const isSnoozed = snoozedThreadKeysRef . current . has ( threadKey ) ;
24302446 const isPinned = thread . pinnedAt != null ;
2431- const snoozePresets = resolveSnoozePresets ( new Date ( ) , timestampFormat ) ;
2447+ const snoozePresets = resolveSnoozePresets (
2448+ new Date ( ) ,
2449+ timestampFormat ,
2450+ thread . environmentId ,
2451+ ) ;
24322452 const threadProjectGroup =
24332453 projectGroupsRef . current . find ( ( project ) =>
24342454 project . memberProjectRefs . some (
@@ -2479,7 +2499,12 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve
24792499 const preset =
24802500 clicked . value === "snooze:custom"
24812501 ? await requestCustomSnooze ( )
2482- : snoozePresets . find ( ( candidate ) => `snooze:${ candidate . id } ` === clicked . value ) ;
2502+ : pickSnoozePreset (
2503+ snoozePresets ,
2504+ clicked . value . slice ( "snooze:" . length ) ,
2505+ timestampFormat ,
2506+ thread . environmentId ,
2507+ ) ;
24832508 if ( preset ) attemptSnooze ( threadRef , preset ) ;
24842509 return ;
24852510 }
0 commit comments