Skip to content
Merged
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
29 changes: 0 additions & 29 deletions src/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
const state = vi.hoisted(() => ({
invokeMock: vi.fn(),
isTauriMock: vi.fn(() => false),
trackMock: vi.fn(),
setSizeMock: vi.fn(),
currentMonitorMock: vi.fn(),
startBatchMock: vi.fn(),
Expand Down Expand Up @@ -112,10 +111,6 @@ vi.mock("@tauri-apps/api/core", () => ({
isTauri: state.isTauriMock,
}))

vi.mock("@/lib/analytics", () => ({
track: state.trackMock,
}))

vi.mock("@tauri-apps/api/event", () => ({
listen: eventState.listenMock,
}))
Expand Down Expand Up @@ -257,7 +252,6 @@ describe("App", () => {
state.invokeMock.mockReset()
state.isTauriMock.mockReset()
state.isTauriMock.mockReturnValue(false)
state.trackMock.mockReset()
state.setSizeMock.mockReset()
state.currentMonitorMock.mockReset()
state.startBatchMock.mockReset()
Expand Down Expand Up @@ -417,17 +411,6 @@ describe("App", () => {
expect(migrateOrder).toBeLessThan(loadOrder)
})

it("does not track page_viewed on startup or navigation", async () => {
render(<App />)
await waitFor(() => expect(state.startBatchMock).toHaveBeenCalled())

const settingsButtons = await screen.findAllByRole("button", { name: "Settings" })
await userEvent.click(settingsButtons[0])

expect(state.trackMock).not.toHaveBeenCalledWith("page_viewed", expect.anything())
expect(state.trackMock).not.toHaveBeenCalledWith("page_viewed", undefined)
})

it("skips saving settings when already normalized", async () => {
state.loadPluginSettingsMock.mockResolvedValueOnce({ order: ["a", "b"], disabled: [] })
render(<App />)
Expand Down Expand Up @@ -961,15 +944,12 @@ describe("App", () => {
lines: [{ type: "text", label: "Now", value: "OK" }],
})
state.startBatchMock.mockClear()
state.trackMock.mockClear()

const reloadAction = await triggerPluginContextAction("Beta", "b", "reload")
const reloadConfig = menuState.iconMenuItemConfigs.find((item) => item.id === "ctx-reload-b")
expect(reloadConfig?.enabled).toBe(true)
reloadAction()

await waitFor(() => expect(state.startBatchMock).toHaveBeenCalledWith(["b"]))
expect(state.trackMock).toHaveBeenCalledWith("provider_refreshed", { provider_id: "b" })
})

it("respects manual refresh cooldown for sidebar context menu reload", async () => {
Expand All @@ -990,8 +970,6 @@ describe("App", () => {
})
await waitFor(() => expect(screen.getAllByRole("button", { name: "Retry" })).toHaveLength(2))
state.startBatchMock.mockClear()
state.trackMock.mockClear()

const reloadAction = await triggerPluginContextAction("Beta", "b", "reload")
const firstReloadConfig = menuState.iconMenuItemConfigs.find((item) => item.id === "ctx-reload-b")
expect(firstReloadConfig?.enabled).toBe(true)
Expand All @@ -1007,14 +985,12 @@ describe("App", () => {
await waitFor(() => expect(screen.getAllByRole("button", { name: "Retry" })).toHaveLength(1))

state.startBatchMock.mockClear()
state.trackMock.mockClear()
const cooldownReloadAction = await triggerPluginContextAction("Beta", "b", "reload")
const cooldownReloadConfig = menuState.iconMenuItemConfigs.find((item) => item.id === "ctx-reload-b")
expect(cooldownReloadConfig?.enabled).toBe(false)
cooldownReloadAction()

expect(state.startBatchMock).not.toHaveBeenCalled()
expect(state.trackMock).not.toHaveBeenCalled()
})

it("closes sidebar context menu resources after popup", async () => {
Expand Down Expand Up @@ -1050,7 +1026,6 @@ describe("App", () => {
render(<App />)
await waitFor(() => expect(state.startBatchMock).toHaveBeenCalled())
state.startBatchMock.mockClear()
state.trackMock.mockClear()
state.savePluginSettingsMock.mockClear()

const removeAction = await triggerPluginContextAction("Beta", "b", "remove")
Expand All @@ -1059,15 +1034,13 @@ describe("App", () => {
await waitFor(() =>
expect(state.savePluginSettingsMock).toHaveBeenCalledWith({ order: ["a", "b"], disabled: ["b"] })
)
expect(state.trackMock).toHaveBeenCalledWith("provider_toggled", { provider_id: "b", enabled: "false" })
expect(state.startBatchMock).not.toHaveBeenCalled()
})

it("ignores removing an already disabled plugin from context menu", async () => {
state.loadPluginSettingsMock.mockResolvedValueOnce({ order: ["a", "b"], disabled: [] })
render(<App />)
await waitFor(() => expect(state.startBatchMock).toHaveBeenCalled())
state.trackMock.mockClear()
state.savePluginSettingsMock.mockClear()

const removeAction = await triggerPluginContextAction("Beta", "b", "remove")
Expand All @@ -1078,12 +1051,10 @@ describe("App", () => {
await waitFor(() =>
expect(screen.queryByRole("button", { name: "Beta" })).not.toBeInTheDocument()
)
state.trackMock.mockClear()
state.savePluginSettingsMock.mockClear()

removeAction()
expect(state.savePluginSettingsMock).not.toHaveBeenCalled()
expect(state.trackMock).not.toHaveBeenCalled()
})

it("returns to home when removing the active plugin from context menu", async () => {
Expand Down
2 changes: 0 additions & 2 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { useSettingsPluginList } from "@/hooks/app/use-settings-plugin-list"
import { useSettingsSystemActions } from "@/hooks/app/use-settings-system-actions"
import { useSettingsTheme } from "@/hooks/app/use-settings-theme"
import { useTrayIcon } from "@/hooks/app/use-tray-icon"
import { track } from "@/lib/analytics"
import { REFRESH_COOLDOWN_MS, savePluginSettings } from "@/lib/settings"
import { type PluginContextAction } from "@/components/side-nav"
import { useAppPluginStore } from "@/stores/app-plugin-store"
Expand Down Expand Up @@ -197,7 +196,6 @@ function App() {
const alreadyDisabled = currentSettings.disabled.includes(pluginId)
if (alreadyDisabled) return

track("provider_toggled", { provider_id: pluginId, enabled: "false" })
const nextSettings = {
...currentSettings,
disabled: [...currentSettings.disabled, pluginId],
Expand Down
11 changes: 2 additions & 9 deletions src/hooks/app/use-probe-refresh-actions.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import { act, renderHook, waitFor } from "@testing-library/react"
import { beforeEach, describe, expect, it, vi } from "vitest"

const { getEnabledPluginIdsMock, trackMock } = vi.hoisted(() => ({
trackMock: vi.fn(),
const { getEnabledPluginIdsMock } = vi.hoisted(() => ({
getEnabledPluginIdsMock: vi.fn(),
}))

vi.mock("@/lib/analytics", () => ({
track: trackMock,
}))

vi.mock("@/lib/settings", () => ({
REFRESH_COOLDOWN_MS: 300_000,
getEnabledPluginIds: getEnabledPluginIdsMock,
Expand All @@ -19,14 +14,13 @@ import { useProbeRefreshActions } from "@/hooks/app/use-probe-refresh-actions"

describe("useProbeRefreshActions", () => {
beforeEach(() => {
trackMock.mockReset()
getEnabledPluginIdsMock.mockReset()
getEnabledPluginIdsMock.mockImplementation((settings: { order: string[]; disabled: string[] }) =>
settings.order.filter((id) => !settings.disabled.includes(id))
)
})

it("retries one plugin and tracks manual refresh", () => {
it("retries one plugin via manual refresh", () => {
const manualRefreshIdsRef = { current: new Set<string>() }
const startBatch = vi.fn().mockResolvedValue(undefined)
const setLoadingForPlugins = vi.fn()
Expand All @@ -47,7 +41,6 @@ describe("useProbeRefreshActions", () => {
result.current.handleRetryPlugin("codex")
})

expect(trackMock).toHaveBeenCalledWith("provider_refreshed", { provider_id: "codex" })
expect(setLoadingForPlugins).toHaveBeenCalledWith(["codex"])
expect(startBatch).toHaveBeenCalledWith(["codex"])
expect(manualRefreshIdsRef.current.has("codex")).toBe(true)
Expand Down
2 changes: 0 additions & 2 deletions src/hooks/app/use-probe-refresh-actions.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { useCallback } from "react"
import type { MutableRefObject } from "react"
import { track } from "@/lib/analytics"
import { REFRESH_COOLDOWN_MS, getEnabledPluginIds, type PluginSettings } from "@/lib/settings"
import type { PluginState } from "@/hooks/app/types"

Expand Down Expand Up @@ -49,7 +48,6 @@ export function useProbeRefreshActions({
const lastManualRefreshAt = currentState?.lastManualRefreshAt
if (lastManualRefreshAt && Date.now() - lastManualRefreshAt < REFRESH_COOLDOWN_MS) return

track("provider_refreshed", { provider_id: id })
resetAutoUpdateSchedule()
startManualRefresh([id], "Failed to retry plugin:")
},
Expand Down
19 changes: 1 addition & 18 deletions src/hooks/app/use-settings-display-actions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,15 @@ import { act, renderHook, waitFor } from "@testing-library/react"
import { beforeEach, describe, expect, it, vi } from "vitest"

const {
trackMock,
saveDisplayModeMock,
saveResetTimerDisplayModeMock,
saveThemeModeMock,
} = vi.hoisted(() => ({
trackMock: vi.fn(),
saveThemeModeMock: vi.fn(),
saveDisplayModeMock: vi.fn(),
saveResetTimerDisplayModeMock: vi.fn(),
}))

vi.mock("@/lib/analytics", () => ({
track: trackMock,
}))

vi.mock("@/lib/settings", () => ({
saveThemeMode: saveThemeModeMock,
saveDisplayMode: saveDisplayModeMock,
Expand All @@ -27,7 +21,6 @@ import { useSettingsDisplayActions } from "@/hooks/app/use-settings-display-acti

describe("useSettingsDisplayActions", () => {
beforeEach(() => {
trackMock.mockReset()
saveThemeModeMock.mockReset()
saveDisplayModeMock.mockReset()
saveResetTimerDisplayModeMock.mockReset()
Expand All @@ -36,7 +29,7 @@ describe("useSettingsDisplayActions", () => {
saveResetTimerDisplayModeMock.mockResolvedValue(undefined)
})

it("tracks and applies display-related setting changes", () => {
it("applies display-related setting changes", () => {
const setThemeMode = vi.fn()
const setDisplayMode = vi.fn()
const setResetTimerDisplayMode = vi.fn()
Expand All @@ -58,16 +51,6 @@ describe("useSettingsDisplayActions", () => {
result.current.handleResetTimerDisplayModeChange("absolute")
})

expect(trackMock).toHaveBeenCalledWith("setting_changed", { setting: "theme", value: "dark" })
expect(trackMock).toHaveBeenCalledWith("setting_changed", {
setting: "display_mode",
value: "used",
})
expect(trackMock).toHaveBeenCalledWith("setting_changed", {
setting: "reset_timer_display_mode",
value: "absolute",
})

expect(setThemeMode).toHaveBeenCalledWith("dark")
expect(setDisplayMode).toHaveBeenCalledWith("used")
expect(setResetTimerDisplayMode).toHaveBeenCalledWith("absolute")
Expand Down
5 changes: 0 additions & 5 deletions src/hooks/app/use-settings-display-actions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useCallback } from "react"
import { track } from "@/lib/analytics"
import {
saveDisplayMode,
saveMenubarIconStyle,
Expand Down Expand Up @@ -31,15 +30,13 @@ export function useSettingsDisplayActions({
scheduleTrayIconUpdate,
}: UseSettingsDisplayActionsArgs) {
const handleThemeModeChange = useCallback((mode: ThemeMode) => {
track("setting_changed", { setting: "theme", value: mode })
setThemeMode(mode)
void saveThemeMode(mode).catch((error) => {
console.error("Failed to save theme mode:", error)
})
}, [setThemeMode])

const handleDisplayModeChange = useCallback((mode: DisplayMode) => {
track("setting_changed", { setting: "display_mode", value: mode })
setDisplayMode(mode)
scheduleTrayIconUpdate("settings", 0)
void saveDisplayMode(mode).catch((error) => {
Expand All @@ -48,7 +45,6 @@ export function useSettingsDisplayActions({
}, [scheduleTrayIconUpdate, setDisplayMode])

const handleResetTimerDisplayModeChange = useCallback((mode: ResetTimerDisplayMode) => {
track("setting_changed", { setting: "reset_timer_display_mode", value: mode })
setResetTimerDisplayMode(mode)
void saveResetTimerDisplayMode(mode).catch((error) => {
console.error("Failed to save reset timer display mode:", error)
Expand All @@ -61,7 +57,6 @@ export function useSettingsDisplayActions({
}, [handleResetTimerDisplayModeChange, resetTimerDisplayMode])

const handleMenubarIconStyleChange = useCallback((style: MenubarIconStyle) => {
track("setting_changed", { setting: "menubar_icon_style", value: style })
setMenubarIconStyle(style)
scheduleTrayIconUpdate("settings", 0)
void saveMenubarIconStyle(style).catch((error) => {
Expand Down
12 changes: 1 addition & 11 deletions src/hooks/app/use-settings-plugin-actions.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import { act, renderHook, waitFor } from "@testing-library/react"
import { beforeEach, describe, expect, it, vi } from "vitest"

const { savePluginSettingsMock, trackMock } = vi.hoisted(() => ({
trackMock: vi.fn(),
const { savePluginSettingsMock } = vi.hoisted(() => ({
savePluginSettingsMock: vi.fn(),
}))

vi.mock("@/lib/analytics", () => ({
track: trackMock,
}))

vi.mock("@/lib/settings", () => ({
savePluginSettings: savePluginSettingsMock,
}))
Expand All @@ -18,7 +13,6 @@ import { useSettingsPluginActions } from "@/hooks/app/use-settings-plugin-action

describe("useSettingsPluginActions", () => {
beforeEach(() => {
trackMock.mockReset()
savePluginSettingsMock.mockReset()
savePluginSettingsMock.mockResolvedValue(undefined)
})
Expand All @@ -42,7 +36,6 @@ describe("useSettingsPluginActions", () => {
result.current.handleReorder(["b", "a"])
})

expect(trackMock).toHaveBeenCalledWith("providers_reordered", { count: 2 })
expect(setPluginSettings).toHaveBeenCalledWith({ order: ["b", "a"], disabled: [] })
expect(savePluginSettingsMock).toHaveBeenCalledWith({ order: ["b", "a"], disabled: [] })
expect(scheduleTrayIconUpdate).toHaveBeenCalledWith("settings", 2000)
Expand Down Expand Up @@ -192,15 +185,13 @@ describe("useSettingsPluginActions", () => {
act(() => {
result.current.handleToggle("b")
})
expect(trackMock).toHaveBeenCalledWith("provider_toggled", { provider_id: "b", enabled: "true" })
expect(setLoadingForPlugins).toHaveBeenCalledWith(["b"])
expect(startBatch).toHaveBeenCalledWith(["b"])
expect(setPluginSettings).toHaveBeenNthCalledWith(1, { order: ["a", "b"], disabled: [] })

act(() => {
result.current.handleToggle("a")
})
expect(trackMock).toHaveBeenCalledWith("provider_toggled", { provider_id: "a", enabled: "false" })
expect(setPluginSettings).toHaveBeenNthCalledWith(2, { order: ["a", "b"], disabled: ["b", "a"] })
})

Expand All @@ -225,7 +216,6 @@ describe("useSettingsPluginActions", () => {

expect(setPluginSettings).not.toHaveBeenCalled()
expect(savePluginSettingsMock).not.toHaveBeenCalled()
expect(trackMock).not.toHaveBeenCalled()
})

it("logs errors when enabling probe start fails", async () => {
Expand Down
3 changes: 0 additions & 3 deletions src/hooks/app/use-settings-plugin-actions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useCallback } from "react"
import { track } from "@/lib/analytics"
import { savePluginSettings, type PluginSettings } from "@/lib/settings"

const TRAY_SETTINGS_DEBOUNCE_MS = 2000
Expand All @@ -25,7 +24,6 @@ export function useSettingsPluginActions({
}: UseSettingsPluginActionsArgs) {
const handleReorder = useCallback((orderedIds: string[]) => {
if (!pluginSettings) return
track("providers_reordered", { count: orderedIds.length })
// orderedIds may be a subset (e.g. nav-only, excluding disabled plugins).
// Re-insert any missing IDs from the previous order at their original
// relative positions so disabled plugins are not dropped.
Expand Down Expand Up @@ -59,7 +57,6 @@ export function useSettingsPluginActions({
const handleToggle = useCallback((id: string) => {
if (!pluginSettings) return
const wasDisabled = pluginSettings.disabled.includes(id)
track("provider_toggled", { provider_id: id, enabled: wasDisabled ? "true" : "false" })
const disabled = new Set(pluginSettings.disabled)

if (wasDisabled) {
Expand Down
Loading
Loading