2022-04-21 14:08:16 +08:00
|
|
|
import { useState, useMemo, createContext } from 'react';
|
2022-05-17 14:01:36 +08:00
|
|
|
import { isMobile } from 'react-device-detect';
|
2022-04-21 14:08:16 +08:00
|
|
|
|
2022-05-19 14:21:14 +08:00
|
|
|
import { SignInExperienceSettings, Platform, Theme } from '@/types';
|
2022-04-21 14:08:16 +08:00
|
|
|
|
2022-05-24 11:38:20 +08:00
|
|
|
export type Context = {
|
2022-05-19 14:21:14 +08:00
|
|
|
theme: Theme;
|
2022-04-21 14:08:16 +08:00
|
|
|
toast: string;
|
|
|
|
loading: boolean;
|
2022-05-17 14:01:36 +08:00
|
|
|
platform: Platform;
|
2022-04-21 14:08:16 +08:00
|
|
|
termsAgreement: boolean;
|
|
|
|
experienceSettings: SignInExperienceSettings | undefined;
|
2022-06-27 13:22:17 +08:00
|
|
|
setTheme: React.Dispatch<React.SetStateAction<Theme>>;
|
|
|
|
setToast: React.Dispatch<React.SetStateAction<string>>;
|
|
|
|
setLoading: React.Dispatch<React.SetStateAction<boolean>>;
|
|
|
|
setPlatform: React.Dispatch<React.SetStateAction<Platform>>;
|
|
|
|
setTermsAgreement: React.Dispatch<React.SetStateAction<boolean>>;
|
|
|
|
setExperienceSettings: React.Dispatch<React.SetStateAction<SignInExperienceSettings | undefined>>;
|
2022-04-21 14:08:16 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
const noop = () => {
|
|
|
|
throw new Error('Context provider not found');
|
|
|
|
};
|
|
|
|
|
|
|
|
export const PageContext = createContext<Context>({
|
|
|
|
toast: '',
|
2022-05-19 14:21:14 +08:00
|
|
|
theme: 'light',
|
2022-04-21 14:08:16 +08:00
|
|
|
loading: false,
|
2022-05-17 14:01:36 +08:00
|
|
|
platform: isMobile ? 'mobile' : 'web',
|
2022-04-21 14:08:16 +08:00
|
|
|
termsAgreement: false,
|
|
|
|
experienceSettings: undefined,
|
2022-05-19 14:21:14 +08:00
|
|
|
setTheme: noop,
|
2022-04-21 14:08:16 +08:00
|
|
|
setToast: noop,
|
|
|
|
setLoading: noop,
|
2022-05-17 14:01:36 +08:00
|
|
|
setPlatform: noop,
|
2022-04-21 14:08:16 +08:00
|
|
|
setTermsAgreement: noop,
|
|
|
|
setExperienceSettings: noop,
|
|
|
|
});
|
|
|
|
|
|
|
|
const usePageContext = () => {
|
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
const [toast, setToast] = useState('');
|
2022-05-19 14:21:14 +08:00
|
|
|
const [theme, setTheme] = useState<Theme>('light');
|
2022-05-17 14:01:36 +08:00
|
|
|
const [platform, setPlatform] = useState<Platform>(isMobile ? 'mobile' : 'web');
|
2022-04-21 14:08:16 +08:00
|
|
|
const [experienceSettings, setExperienceSettings] = useState<SignInExperienceSettings>();
|
|
|
|
const [termsAgreement, setTermsAgreement] = useState(false);
|
|
|
|
|
|
|
|
const context = useMemo(
|
|
|
|
() => ({
|
2022-05-19 14:21:14 +08:00
|
|
|
theme,
|
2022-04-21 14:08:16 +08:00
|
|
|
toast,
|
|
|
|
loading,
|
2022-05-17 14:01:36 +08:00
|
|
|
platform,
|
2022-04-21 14:08:16 +08:00
|
|
|
termsAgreement,
|
|
|
|
experienceSettings,
|
2022-05-19 14:21:14 +08:00
|
|
|
setTheme,
|
2022-04-21 14:08:16 +08:00
|
|
|
setLoading,
|
|
|
|
setToast,
|
2022-05-17 14:01:36 +08:00
|
|
|
setPlatform,
|
2022-04-21 14:08:16 +08:00
|
|
|
setTermsAgreement,
|
|
|
|
setExperienceSettings,
|
|
|
|
}),
|
2022-05-20 09:59:40 +08:00
|
|
|
[experienceSettings, loading, platform, termsAgreement, theme, toast]
|
2022-04-21 14:08:16 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
return {
|
|
|
|
context,
|
|
|
|
Provider: PageContext.Provider,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
export default usePageContext;
|