Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ function App() {
setMenubarIconStyle,
resetTimerDisplayMode,
setResetTimerDisplayMode,
setTimeFormatMode,
setGlobalShortcut,
setStartOnLogin,
} = useAppPreferencesStore(
Expand All @@ -70,6 +71,7 @@ function App() {
setMenubarIconStyle: state.setMenubarIconStyle,
resetTimerDisplayMode: state.resetTimerDisplayMode,
setResetTimerDisplayMode: state.setResetTimerDisplayMode,
setTimeFormatMode: state.setTimeFormatMode,
setGlobalShortcut: state.setGlobalShortcut,
setStartOnLogin: state.setStartOnLogin,
}))
Expand Down Expand Up @@ -118,6 +120,7 @@ function App() {
setDisplayMode,
setMenubarIconStyle,
setResetTimerDisplayMode,
setTimeFormatMode,
setGlobalShortcut,
setStartOnLogin,
setLoadingForPlugins,
Expand All @@ -132,12 +135,14 @@ function App() {
handleDisplayModeChange,
handleResetTimerDisplayModeChange,
handleResetTimerDisplayModeToggle,
handleTimeFormatModeChange,
handleMenubarIconStyleChange,
} = useSettingsDisplayActions({
setThemeMode,
setDisplayMode,
resetTimerDisplayMode,
setResetTimerDisplayMode,
setTimeFormatMode,
setMenubarIconStyle,
scheduleTrayIconUpdate,
})
Expand Down Expand Up @@ -246,6 +251,7 @@ function App() {
onDisplayModeChange: handleDisplayModeChange,
onResetTimerDisplayModeChange: handleResetTimerDisplayModeChange,
onResetTimerDisplayModeToggle: handleResetTimerDisplayModeToggle,
onTimeFormatModeChange: handleTimeFormatModeChange,
onMenubarIconStyleChange: handleMenubarIconStyleChange,
traySettingsPreview,
onGlobalShortcutChange: handleGlobalShortcutChange,
Expand Down
9 changes: 9 additions & 0 deletions src/components/app/app-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import type {
MenubarIconStyle,
ResetTimerDisplayMode,
ThemeMode,
TimeFormatMode,
} from "@/lib/settings"

type AppContentDerivedProps = {
Expand All @@ -31,6 +32,7 @@ export type AppContentActionProps = {
onDisplayModeChange: (mode: DisplayMode) => void
onResetTimerDisplayModeChange: (mode: ResetTimerDisplayMode) => void
onResetTimerDisplayModeToggle: () => void
onTimeFormatModeChange: (mode: TimeFormatMode) => void
onMenubarIconStyleChange: (value: MenubarIconStyle) => void
traySettingsPreview: TraySettingsPreview
onGlobalShortcutChange: (value: GlobalShortcut) => void
Expand All @@ -51,6 +53,7 @@ export function AppContent({
onDisplayModeChange,
onResetTimerDisplayModeChange,
onResetTimerDisplayModeToggle,
onTimeFormatModeChange,
onMenubarIconStyleChange,
traySettingsPreview,
onGlobalShortcutChange,
Expand All @@ -65,6 +68,7 @@ export function AppContent({
const {
displayMode,
resetTimerDisplayMode,
timeFormatMode,
menubarIconStyle,
autoUpdateInterval,
globalShortcut,
Expand All @@ -74,6 +78,7 @@ export function AppContent({
useShallow((state) => ({
displayMode: state.displayMode,
resetTimerDisplayMode: state.resetTimerDisplayMode,
timeFormatMode: state.timeFormatMode,
menubarIconStyle: state.menubarIconStyle,
autoUpdateInterval: state.autoUpdateInterval,
globalShortcut: state.globalShortcut,
Expand All @@ -89,6 +94,7 @@ export function AppContent({
onRetryPlugin={onRetryPlugin}
displayMode={displayMode}
resetTimerDisplayMode={resetTimerDisplayMode}
timeFormatMode={timeFormatMode}
onResetTimerDisplayModeToggle={onResetTimerDisplayModeToggle}
/>
)
Expand All @@ -108,6 +114,8 @@ export function AppContent({
onDisplayModeChange={onDisplayModeChange}
resetTimerDisplayMode={resetTimerDisplayMode}
onResetTimerDisplayModeChange={onResetTimerDisplayModeChange}
timeFormatMode={timeFormatMode}
onTimeFormatModeChange={onTimeFormatModeChange}
menubarIconStyle={menubarIconStyle}
onMenubarIconStyleChange={onMenubarIconStyleChange}
traySettingsPreview={traySettingsPreview}
Expand All @@ -129,6 +137,7 @@ export function AppContent({
onRetry={handleRetry}
displayMode={displayMode}
resetTimerDisplayMode={resetTimerDisplayMode}
timeFormatMode={timeFormatMode}
onResetTimerDisplayModeToggle={onResetTimerDisplayModeToggle}
/>
)
Expand Down
11 changes: 9 additions & 2 deletions src/components/provider-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip
import { SkeletonLines } from "@/components/skeleton-lines"
import { PluginError } from "@/components/plugin-error"
import { useNowTicker } from "@/hooks/use-now-ticker"
import { REFRESH_COOLDOWN_MS, type DisplayMode, type ResetTimerDisplayMode } from "@/lib/settings"
import { REFRESH_COOLDOWN_MS, type DisplayMode, type ResetTimerDisplayMode, type TimeFormatMode } from "@/lib/settings"
import type { ManifestLine, MetricLine, PluginLink } from "@/lib/plugin-types"
import { groupLinesByType } from "@/lib/group-lines-by-type"
import { clamp01, formatCountNumber, formatFixedPrecisionNumber } from "@/lib/utils"
Expand All @@ -32,6 +32,7 @@ interface ProviderCardProps {
scopeFilter?: "overview" | "all"
displayMode: DisplayMode
resetTimerDisplayMode?: ResetTimerDisplayMode
timeFormatMode?: TimeFormatMode
onResetTimerDisplayModeToggle?: () => void
}

Expand Down Expand Up @@ -106,6 +107,7 @@ export function ProviderCard({
scopeFilter = "all",
displayMode,
resetTimerDisplayMode = "relative",
timeFormatMode = "auto",
onResetTimerDisplayModeToggle,
}: ProviderCardProps) {
const cooldownRemainingMs = useMemo(() => {
Expand Down Expand Up @@ -311,6 +313,7 @@ export function ProviderCard({
line={line}
displayMode={displayMode}
resetTimerDisplayMode={resetTimerDisplayMode}
timeFormatMode={timeFormatMode}
onResetTimerDisplayModeToggle={onResetTimerDisplayModeToggle}
now={now}
refreshing={isRefreshingWithData}
Expand All @@ -325,6 +328,7 @@ export function ProviderCard({
line={line}
displayMode={displayMode}
resetTimerDisplayMode={resetTimerDisplayMode}
timeFormatMode={timeFormatMode}
onResetTimerDisplayModeToggle={onResetTimerDisplayModeToggle}
now={now}
refreshing={isRefreshingWithData}
Expand All @@ -346,13 +350,15 @@ function MetricLineRenderer({
line,
displayMode,
resetTimerDisplayMode,
timeFormatMode,
onResetTimerDisplayModeToggle,
now,
refreshing,
}: {
line: MetricLine
displayMode: DisplayMode
resetTimerDisplayMode: ResetTimerDisplayMode
timeFormatMode: TimeFormatMode
onResetTimerDisplayModeToggle?: () => void
now: number
refreshing?: boolean
Expand Down Expand Up @@ -423,14 +429,15 @@ function MetricLineRenderer({

const resetLabel = line.resetsAt
? resetTimerDisplayMode === "absolute"
? formatResetAbsoluteLabel(now, line.resetsAt)
? formatResetAbsoluteLabel(now, line.resetsAt, timeFormatMode)
: formatResetRelativeLabel(now, line.resetsAt)
: null
const resetTooltipText = line.resetsAt
? formatResetTooltipText({
nowMs: now,
resetsAtIso: line.resetsAt,
visibleMode: resetTimerDisplayMode,
timeFormat: timeFormatMode,
})
: null

Expand Down
7 changes: 7 additions & 0 deletions src/hooks/app/use-settings-bootstrap.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const {
loadResetTimerDisplayModeMock,
loadStartOnLoginMock,
loadThemeModeMock,
loadTimeFormatModeMock,
migrateLegacyTraySettingsMock,
normalizePluginSettingsMock,
savePluginSettingsMock,
Expand All @@ -36,6 +37,7 @@ const {
loadResetTimerDisplayModeMock: vi.fn(),
loadStartOnLoginMock: vi.fn(),
loadThemeModeMock: vi.fn(),
loadTimeFormatModeMock: vi.fn(),
migrateLegacyTraySettingsMock: vi.fn(),
normalizePluginSettingsMock: vi.fn(),
savePluginSettingsMock: vi.fn(),
Expand All @@ -61,6 +63,7 @@ vi.mock("@/lib/settings", () => ({
DEFAULT_RESET_TIMER_DISPLAY_MODE: "relative",
DEFAULT_START_ON_LOGIN: false,
DEFAULT_THEME_MODE: "system",
DEFAULT_TIME_FORMAT_MODE: "auto",
getEnabledPluginIds: getEnabledPluginIdsMock,
loadAutoUpdateInterval: loadAutoUpdateIntervalMock,
loadDisplayMode: loadDisplayModeMock,
Expand All @@ -70,6 +73,7 @@ vi.mock("@/lib/settings", () => ({
loadResetTimerDisplayMode: loadResetTimerDisplayModeMock,
loadStartOnLogin: loadStartOnLoginMock,
loadThemeMode: loadThemeModeMock,
loadTimeFormatMode: loadTimeFormatModeMock,
migrateLegacyTraySettings: migrateLegacyTraySettingsMock,
normalizePluginSettings: normalizePluginSettingsMock,
savePluginSettings: savePluginSettingsMock,
Expand All @@ -85,6 +89,7 @@ function createArgs() {
setThemeMode: vi.fn(),
setDisplayMode: vi.fn(),
setResetTimerDisplayMode: vi.fn(),
setTimeFormatMode: vi.fn(),
setGlobalShortcut: vi.fn(),
setStartOnLogin: vi.fn(),
setMenubarIconStyle: vi.fn(),
Expand All @@ -111,6 +116,7 @@ describe("useSettingsBootstrap", () => {
loadResetTimerDisplayModeMock.mockReset()
loadStartOnLoginMock.mockReset()
loadThemeModeMock.mockReset()
loadTimeFormatModeMock.mockReset()
migrateLegacyTraySettingsMock.mockReset()
normalizePluginSettingsMock.mockReset()
savePluginSettingsMock.mockReset()
Expand All @@ -134,6 +140,7 @@ describe("useSettingsBootstrap", () => {
loadThemeModeMock.mockResolvedValue("dark")
loadDisplayModeMock.mockResolvedValue("used")
loadResetTimerDisplayModeMock.mockResolvedValue("relative")
loadTimeFormatModeMock.mockResolvedValue("auto")
loadGlobalShortcutMock.mockResolvedValue("CommandOrControl+Shift+O")
loadMenubarIconStyleMock.mockResolvedValue("provider")
loadStartOnLoginMock.mockResolvedValue(true)
Expand Down
14 changes: 14 additions & 0 deletions src/hooks/app/use-settings-bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
DEFAULT_RESET_TIMER_DISPLAY_MODE,
DEFAULT_START_ON_LOGIN,
DEFAULT_THEME_MODE,
DEFAULT_TIME_FORMAT_MODE,
getEnabledPluginIds,
loadAutoUpdateInterval,
loadDisplayMode,
Expand All @@ -25,6 +26,7 @@ import {
loadResetTimerDisplayMode,
loadStartOnLogin,
loadThemeMode,
loadTimeFormatMode,
normalizePluginSettings,
savePluginSettings,
type AutoUpdateIntervalMinutes,
Expand All @@ -34,6 +36,7 @@ import {
type PluginSettings,
type ResetTimerDisplayMode,
type ThemeMode,
type TimeFormatMode,
} from "@/lib/settings"

type UseSettingsBootstrapArgs = {
Expand All @@ -43,6 +46,7 @@ type UseSettingsBootstrapArgs = {
setThemeMode: (value: ThemeMode) => void
setDisplayMode: (value: DisplayMode) => void
setResetTimerDisplayMode: (value: ResetTimerDisplayMode) => void
setTimeFormatMode: (value: TimeFormatMode) => void
setGlobalShortcut: (value: GlobalShortcut) => void
setStartOnLogin: (value: boolean) => void
setMenubarIconStyle: (value: MenubarIconStyle) => void
Expand All @@ -58,6 +62,7 @@ export function useSettingsBootstrap({
setThemeMode,
setDisplayMode,
setResetTimerDisplayMode,
setTimeFormatMode,
setGlobalShortcut,
setStartOnLogin,
setMenubarIconStyle,
Expand Down Expand Up @@ -121,6 +126,13 @@ export function useSettingsBootstrap({
console.error("Failed to load reset timer display mode:", error)
}

let storedTimeFormatMode = DEFAULT_TIME_FORMAT_MODE
try {
storedTimeFormatMode = await loadTimeFormatMode()
} catch (error) {
console.error("Failed to load time format mode:", error)
}

let storedGlobalShortcut = DEFAULT_GLOBAL_SHORTCUT
try {
storedGlobalShortcut = await loadGlobalShortcut()
Expand Down Expand Up @@ -159,6 +171,7 @@ export function useSettingsBootstrap({
setThemeMode(storedThemeMode)
setDisplayMode(storedDisplayMode)
setResetTimerDisplayMode(storedResetTimerDisplayMode)
setTimeFormatMode(storedTimeFormatMode)
setGlobalShortcut(storedGlobalShortcut)
setStartOnLogin(storedStartOnLogin)
setMenubarIconStyle(storedMenubarIconStyle)
Expand Down Expand Up @@ -198,6 +211,7 @@ export function useSettingsBootstrap({
setResetTimerDisplayMode,
setStartOnLogin,
setThemeMode,
setTimeFormatMode,
startBatch,
])

Expand Down
Loading
Loading