diff --git a/packages/kits/src/components/ThemeSwitch/ThemeSwitch.test.tsx b/packages/kits/src/components/ThemeSwitch/ThemeSwitch.test.tsx index 21522d5..f99bed4 100644 --- a/packages/kits/src/components/ThemeSwitch/ThemeSwitch.test.tsx +++ b/packages/kits/src/components/ThemeSwitch/ThemeSwitch.test.tsx @@ -1,7 +1,8 @@ +import { LogProvider } from '@ermnvldmr/ui'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { ThemeSwitch } from './ThemeSwitch'; @@ -38,4 +39,24 @@ describe('ThemeSwitch', () => { expect(systemButton).toBeInTheDocument(); }); + + it('dispatches telemetry events to LogProvider', async () => { + const user = userEvent.setup(); + const loggerMock = vi.fn(); + + render( + + + + ); + + const switchControl = screen.getByRole('switch'); + const systemButton = screen.getByRole('button'); + + await user.click(switchControl); + expect(loggerMock).toHaveBeenCalledWith('theme-toggle', { preference: 'dark' }); + + await user.click(systemButton); + expect(loggerMock).toHaveBeenCalledWith('theme-toggle', { preference: 'system' }); + }); }); diff --git a/packages/kits/src/components/ThemeSwitch/ThemeSwitch.tsx b/packages/kits/src/components/ThemeSwitch/ThemeSwitch.tsx index 6f9b9d2..9246fee 100644 --- a/packages/kits/src/components/ThemeSwitch/ThemeSwitch.tsx +++ b/packages/kits/src/components/ThemeSwitch/ThemeSwitch.tsx @@ -1,4 +1,4 @@ -import { Button, HStack, Switch, useTheme } from '@ermnvldmr/ui'; +import { Button, HStack, Switch, useLogger, useTheme } from '@ermnvldmr/ui'; import React from 'react'; /** @@ -27,28 +27,42 @@ export function ThemeSwitch({ systemIcon, }: ThemeSwitchProps = {}): React.JSX.Element { const { preference, setPreference, resolvedTheme } = useTheme(); + const log = useLogger(); const isDark = resolvedTheme === 'dark'; + const handleToggle = (isSelected: boolean): void => { + const nextTheme = isSelected ? 'dark' : 'light'; + setPreference(nextTheme); + log('theme-toggle', { preference: nextTheme }); + }; + + const handleSystem = (): void => { + setPreference('system'); + log('theme-toggle', { preference: 'system' }); + }; + return ( {lightIcon} setPreference(isSelected ? 'dark' : 'light')} + onChange={handleToggle} /> {darkIcon}