22581b2f创建于 2025年12月16日历史提交
/*
 * -------------------------------------------------------------------------
 * This file is part of the MindStudio project.
 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 */
import type { Theme } from '@emotion/react';
import { makeAutoObservable } from 'mobx';
import { ThemeItem } from '../theme';

interface ThemeType {
    light: Theme;
    dark: Theme;
}

export default class ThemeStore {
    currentTheme: ThemeItem = 'dark';
    theme: ThemeType;
    constructor(theme = { light: {}, dark: {} }) {
        makeAutoObservable(this);
        let lsTheme = localStorage.getItem('theme') ?? 'dark';
        try {
            lsTheme = JSON.parse(lsTheme);
        } catch (e) {
            lsTheme = 'dark';
        }
        this.currentTheme = ['light', 'dark'].includes(lsTheme) ? lsTheme as ThemeItem : 'dark';
        this.theme = theme as ThemeType;
    }

    getCurrentTheme(): ThemeItem {
        return this.currentTheme;
    }

    setCurrentTheme(currentTheme: ThemeItem): void {
        this.currentTheme = currentTheme;
        document.body.className = currentTheme === 'dark' ? 'theme_dark' : 'theme_light';
    }

    getTheme(): ThemeType {
        return this.theme;
    }

    getThemeType(): Theme {
        return this.theme[this.currentTheme];
    }

    get themeObject(): Theme {
        return this.theme[this.currentTheme];
    }
}