-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathdevMode.tsx
More file actions
88 lines (72 loc) · 2.56 KB
/
devMode.tsx
File metadata and controls
88 lines (72 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Based on https://github.com/facebook/docusaurus/blob/main/packages/docusaurus-theme-common/src/contexts/colorMode.tsx
import React, { useState, useEffect, useContext, useMemo, type ReactNode } from "react";
import { createStorageSlot, ReactContextError } from "@docusaurus/theme-common";
import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment";
import { useLocation } from "@docusaurus/router";
type ContextValue = {
readonly devMode: DevMode;
readonly setDevMode: (devMode: DevMode) => void;
};
const Context = React.createContext<ContextValue | undefined>(undefined);
const DevModeStorageKey = "bitwarden-dev";
const DevModeStorage = createStorageSlot(DevModeStorageKey);
export const DevModes = {
community: "community",
bitwarden: "bitwarden",
} as const;
export type DevMode = (typeof DevModes)[keyof typeof DevModes];
const coerceToDevMode = (devMode?: string | null): DevMode =>
devMode === DevModes.bitwarden ? DevModes.bitwarden : DevModes.community;
const storeDevMode = (newDevMode: DevMode) => {
DevModeStorage.set(coerceToDevMode(newDevMode));
};
const getInitialDevMode = (): DevMode =>
ExecutionEnvironment.canUseDOM
? coerceToDevMode(DevModeStorage.get())
: coerceToDevMode("community");
function useContextValue(): ContextValue {
const [devMode, setDevModeState] = useState(getInitialDevMode());
const setDevMode = (newDevMode: DevMode) => {
setDevModeState(newDevMode);
storeDevMode(newDevMode);
};
const { search } = useLocation();
const searchParams = new URLSearchParams(search);
const param = searchParams.get("bitwarden");
useEffect(() => {
if (param != null) {
setDevMode("bitwarden");
}
}, [param]);
useEffect(() => {
const onChange = (e: StorageEvent) => {
if (e.key !== DevModeStorageKey) {
return;
}
const storedDevMode = DevModeStorage.get();
if (storedDevMode !== null) {
setDevMode(coerceToDevMode(storedDevMode));
}
};
window.addEventListener("storage", onChange);
return () => window.removeEventListener("storage", onChange);
}, [setDevMode]);
return useMemo(
() => ({
devMode,
setDevMode,
}),
[devMode, setDevMode],
);
}
export function DevModeProvider({ children }: { children: ReactNode }): React.JSX.Element {
const value = useContextValue();
return <Context.Provider value={value}>{children}</Context.Provider>;
}
export function useDevMode(): ContextValue {
const context = useContext(Context);
if (context == null) {
throw new ReactContextError("DevModeProvider");
}
return context;
}