-
Notifications
You must be signed in to change notification settings - Fork 41
Expand file tree
/
Copy pathproviders.tsx
More file actions
110 lines (93 loc) · 2.61 KB
/
Copy pathproviders.tsx
File metadata and controls
110 lines (93 loc) · 2.61 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"use client";
import React, {
createContext,
useContext,
useState,
useCallback,
useEffect,
} from "react";
import { connectWallet, getPublicKey, isFreighterInstalled } from "@/lib/wallet";
interface WalletContextType {
address: string | null;
isConnected: boolean;
isFreighterAvailable: boolean;
connect: () => Promise<void>;
disconnect: () => void;
}
type Theme = "light" | "dark";
interface ThemeContextType {
theme: Theme;
setTheme: (theme: Theme) => void;
toggleTheme: () => void;
}
const WalletContext = createContext<WalletContextType>({
address: null,
isConnected: false,
isFreighterAvailable: false,
connect: async () => {},
disconnect: () => {},
});
const ThemeContext = createContext<ThemeContextType>({
theme: "light",
setTheme: () => {},
toggleTheme: () => {},
});
export function useWallet() {
return useContext(WalletContext);
}
export function useTheme() {
return useContext(ThemeContext);
}
export function Providers({ children }: { children: React.ReactNode }) {
const [address, setAddress] = useState<string | null>(null);
const [isFreighterAvailable, setIsFreighterAvailable] = useState(false);
const [theme, setTheme] = useState<Theme>("light");
useEffect(() => {
const storedTheme = window.localStorage.getItem("sorosave-theme");
if (storedTheme === "light" || storedTheme === "dark") {
setTheme(storedTheme);
return;
}
const prefersDark = window.matchMedia(
"(prefers-color-scheme: dark)"
).matches;
setTheme(prefersDark ? "dark" : "light");
}, []);
useEffect(() => {
document.documentElement.classList.toggle("dark", theme === "dark");
document.documentElement.style.colorScheme = theme;
window.localStorage.setItem("sorosave-theme", theme);
}, [theme]);
useEffect(() => {
isFreighterInstalled().then(setIsFreighterAvailable);
// Try to reconnect on load
getPublicKey().then((key) => {
if (key) setAddress(key);
});
}, []);
const connect = useCallback(async () => {
const addr = await connectWallet();
if (addr) setAddress(addr);
}, []);
const disconnect = useCallback(() => {
setAddress(null);
}, []);
const toggleTheme = useCallback(() => {
setTheme((prev) => (prev === "dark" ? "light" : "dark"));
}, []);
return (
<ThemeContext.Provider value={{ theme, setTheme, toggleTheme }}>
<WalletContext.Provider
value={{
address,
isConnected: !!address,
isFreighterAvailable,
connect,
disconnect,
}}
>
{children}
</WalletContext.Provider>
</ThemeContext.Provider>
);
}