living-together/source/Context/Setting.tsx
2022-02-24 15:21:32 +08:00

65 lines
1.4 KiB
TypeScript

import { createContext, Component, FunctionComponent } from "react";
import { Emitter } from "@Model/Emitter";
/**
* 主题模式
*/
enum Themes {
light = 1,
dark = 2
}
type Language = "ZH_CN" | "EN_US";
class Setting extends Emitter<
Setting & {change: keyof Setting}
> {
/**
* 主题
*/
public themes: Themes = Themes.dark;
/**
* 语言
*/
public language: Language = "EN_US";
/**
* 设置参数
*/
public setProps<P extends keyof Setting>(key: P, value: Setting[P]) {
this[key] = value as any;
this.emit("change", key);
this.emit(key as any, value as any);
}
}
interface IMixinSettingProps {
setting?: Setting;
}
const SettingContext = createContext<Setting>(new Setting());
SettingContext.displayName = "Setting";
const SettingProvider = SettingContext.Provider;
const SettingConsumer = SettingContext.Consumer;
type RenderComponent = (new (...p: any) => Component<any, any, any>) | FunctionComponent<any>;
/**
* 修饰器
*/
function useSetting<R extends RenderComponent>(components: R): R {
return ((props: any) => {
const C = components;
return <SettingConsumer>
{(setting: Setting) => <C {...props} setting={setting}></C>}
</SettingConsumer>
}) as any;
}
export {
Themes, Setting, SettingContext, useSetting, Language,
IMixinSettingProps, SettingProvider, SettingConsumer
};