forked from Vero-protocol/vero-guardian-dashboard
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNetworkContext.tsx
More file actions
129 lines (113 loc) · 3.34 KB
/
Copy pathNetworkContext.tsx
File metadata and controls
129 lines (113 loc) · 3.34 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
'use client';
import {
createContext,
useCallback,
useContext,
useEffect,
useMemo,
useState,
type ReactNode,
} from 'react';
import {
defaultNetworkConfig,
validateUrl,
type NetworkConfig,
} from '@/services/rpc';
const STORAGE_KEY = 'vero_network_config';
interface NetworkContextType {
networkConfig: NetworkConfig;
isCustomConfig: boolean;
setHorizonUrl: (url: string) => void;
setSorobanRpcUrl: (url: string) => void;
setNetworkPassphrase: (passphrase: string) => void;
resetToDefaults: () => void;
}
const NetworkContext = createContext<NetworkContextType | undefined>(undefined);
export function NetworkProvider({ children }: { children: ReactNode }) {
const [networkConfig, setNetworkConfig] =
useState<NetworkConfig>(defaultNetworkConfig);
// Load saved config on mount
useEffect(() => {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored) {
const parsed = JSON.parse(stored) as Partial<NetworkConfig>;
setNetworkConfig({
horizonUrl:
parsed.horizonUrl && validateUrl(parsed.horizonUrl)
? parsed.horizonUrl
: defaultNetworkConfig.horizonUrl,
sorobanRpcUrl:
parsed.sorobanRpcUrl && validateUrl(parsed.sorobanRpcUrl)
? parsed.sorobanRpcUrl
: defaultNetworkConfig.sorobanRpcUrl,
networkPassphrase:
parsed.networkPassphrase || defaultNetworkConfig.networkPassphrase,
});
}
} catch {
// Ignore invalid stored config
}
}, []);
// Save config to local storage when it changes
useEffect(() => {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(networkConfig));
} catch {
// Ignore storage failures, matching the load path above.
}
}, [networkConfig]);
const isCustomConfig = useMemo(
() =>
networkConfig.horizonUrl !== defaultNetworkConfig.horizonUrl ||
networkConfig.sorobanRpcUrl !== defaultNetworkConfig.sorobanRpcUrl ||
networkConfig.networkPassphrase !== defaultNetworkConfig.networkPassphrase,
[networkConfig]
);
const setHorizonUrl = useCallback((url: string) => {
if (validateUrl(url)) {
setNetworkConfig((prev) => ({ ...prev, horizonUrl: url }));
}
}, []);
const setSorobanRpcUrl = useCallback((url: string) => {
if (validateUrl(url)) {
setNetworkConfig((prev) => ({ ...prev, sorobanRpcUrl: url }));
}
}, []);
const setNetworkPassphrase = useCallback((passphrase: string) => {
setNetworkConfig((prev) => ({ ...prev, networkPassphrase: passphrase }));
}, []);
const resetToDefaults = useCallback(() => {
setNetworkConfig(defaultNetworkConfig);
}, []);
const value = useMemo<NetworkContextType>(
() => ({
networkConfig,
isCustomConfig,
setHorizonUrl,
setSorobanRpcUrl,
setNetworkPassphrase,
resetToDefaults,
}),
[
networkConfig,
isCustomConfig,
setHorizonUrl,
setSorobanRpcUrl,
setNetworkPassphrase,
resetToDefaults,
]
);
return (
<NetworkContext.Provider value={value}>
{children}
</NetworkContext.Provider>
);
}
export function useNetwork(): NetworkContextType {
const context = useContext(NetworkContext);
if (!context) {
throw new Error('useNetwork must be used within a NetworkProvider');
}
return context;
}