Skip to content
Open
Show file tree
Hide file tree
Changes from all 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