Open History to see the last commit
1import type { EnvironmentId } from "@t3tools/contracts";
2import type { TimestampFormat } from "@t3tools/contracts/settings";
3import {
4 pickSnoozePreset as pickSharedSnoozePreset,
5 resolveSnoozePresets as resolveSharedSnoozePresets,
6 snoozeWakeLabel,
7 type SnoozePreset,
8} from "@t3tools/client-runtime/state/thread-settled";
9
10import { appAtomRegistry } from "../rpc/atomRegistry";
11import { serverEnvironment } from "../state/server";
12import { formatShortTimestamp } from "../timestampFormat";
13import { toastManager } from "./ui/toast";
14
15export { snoozeWakeLabel, type SnoozePreset };
16
17/** The snooze menu for a thread, from its environment's presets, read when the menu opens. */
18export function resolveSnoozePresets(
19 now: Date,
20 timestampFormat: TimestampFormat,
21 environmentId: EnvironmentId,
22): ReadonlyArray<SnoozePreset> {
23 return resolveSharedSnoozePresets(now, snoozeOptions(timestampFormat, environmentId));
24}
25
26/** A shown menu choice as picked; see the shared `pickSnoozePreset`. */
27export function pickSnoozePreset(
28 shown: ReadonlyArray<SnoozePreset>,
29 id: string,
30 timestampFormat: TimestampFormat,
31 environmentId: EnvironmentId,
32): SnoozePreset | undefined {
33 const picked = pickSharedSnoozePreset({
34 shown,
35 id,
36 now: new Date(),
37 ...snoozeOptions(timestampFormat, environmentId),
38 });
39 if (!picked) {
40 toastManager.add({
41 type: "warning",
42 title: "Could not snooze thread",
43 description: "That snooze time has passed. Choose another time.",
44 });
45 }
46 return picked;
47}
48
49function snoozeOptions(timestampFormat: TimestampFormat, environmentId: EnvironmentId) {
50 const presets = appAtomRegistry.get(
51 serverEnvironment.settingsValueAtom(environmentId),
52 )?.snoozePresets;
53 return {
54 ...(presets ? { presets } : {}),
55 formatTime: (date: Date) => formatShortTimestamp(date.toISOString(), timestampFormat),
56 };
57}