<ToggleThemeButton>

The <ToggleThemeButton> component lets users switch from light to dark mode, and persists that choice by leveraging the store.

It is enabled by default in the <AppBar> as soon as you define a dark theme via the <Admin darkTheme> prop.

Usage

You can add the <ToggleThemeButton> to a custom <AppBar toolbar>:

// in src/MyAppBar.js
import { AppBar, ToggleThemeButton } from 'react-admin';

export const MyAppBar = () => (
    <AppBar toolbar={<ToggleThemeButton />} />
);

Then, pass the custom App Bar in a custom <Layout>, and the <Layout> to your <Admin>. The <Admin> must define a darkTheme prop for the button to work:

import { Admin, Layout } from 'react-admin';

import { MyAppBar } from './MyAppBar';

const MyLayout = (props) => <Layout {...props} appBar={MyAppBar} />;

const App = () => (
    <Admin
        dataProvider={dataProvider}
        layout={MyLayout} 
        darkTheme={{ palette: { mode: 'dark' } }}
    >
        ...
    </Admin>
);

Removing The Button From The AppBar

The <ToggleThemeButton> appears by default in the <AppBar> if the <Admin darkTheme> prop is defined. If you want to remove it, you need to set a custom <AppBar toolbar> prop:

// in src/MyAppBar.js
import { AppBar, LocalesMenuButton, RefreshIconButton } from 'react-admin';

export const MyAppBar = () => (
    <AppBar toolbar={
        <>
            <LocalesMenuButton />
            {/* no ToggleThemeButton here */}
            <RefreshIconButton />
        </>
    } />
);

Creating A Dark Theme

For this button to work, you must provide a dark theme to the <Admin> component. The darkTheme should be a JSON object that follows the Material UI theme specification.

You can create such a theme from scratch:

const darkTheme = {
    palette: { mode: 'dark' },
};

Of you can override react-admin’s default dark theme:

import { defaultDarkTheme } from 'react-admin';

const darkTheme = {
    ...defaultDarkTheme,
    palette: {
        ...defaultDarkTheme.palette,
        primary: {
            main: '#90caf9',
        },
    },
};

Tip: React-admin calls Material UI’s createTheme() on the <Admin darkTheme> prop - don’t call it yourself.