← Усі задачіReact · Middle

Тема через Context

Напишіть ThemeProvider і хук useTheme. Провайдер зберігає тему - "light" (за замовчуванням) або "dark" - і дає її всім компонентам усередині. useTheme() повертає { theme, toggleTheme }, де toggleTheme перемикає тему.

Усі компоненти під одним провайдером бачать ту саму тему. Виклик useTheme поза провайдером має кидати помилку, у тексті якої є ThemeProvider.

Тести (3)

  1. function Probe() {
      const { theme, toggleTheme } = useTheme();
      return <button onClick={toggleTheme}>{theme}</button>;
    }
    render(<ThemeProvider><Probe /></ThemeProvider>);
    expect(screen.getByRole('button').textContent).toBe('light');
    fireEvent.click(screen.getByRole('button'));
    expect(screen.getByRole('button').textContent).toBe('dark');
    fireEvent.click(screen.getByRole('button'));
    expect(screen.getByRole('button').textContent).toBe('light');
  2. function Probe() {
      const { theme, toggleTheme } = useTheme();
      return <button onClick={toggleTheme}>{theme}</button>;
    }
    render(<ThemeProvider><Probe /><Probe /></ThemeProvider>);
    fireEvent.click(screen.getAllByRole('button')[0]);
    expect(screen.getAllByRole('button').map((b) => b.textContent)).toEqual(['dark', 'dark']);
  3. expect(() => renderHook(() => useTheme())).toThrow('ThemeProvider');