Skip to content

Commit 23daaec

Browse files
authored
feat: network switching
1 parent d06fd8a commit 23daaec

File tree

15 files changed

+202
-20
lines changed

15 files changed

+202
-20
lines changed

src/App.routes.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { InnerTransactionPage } from './features/transactions/pages/inner-transa
1111
import { AccountPage, accountPageTitle } from './features/accounts/pages/account-page'
1212
import { AssetPage, assetPageTitle } from './features/assets/pages/asset-page'
1313
import { ApplicationPage, applicationPageTitle } from './features/applications/pages/application-page'
14+
import { SettingsPage } from './features/settings/pages/settings-page'
1415

1516
export const routes = evalTemplates([
1617
{
@@ -88,6 +89,10 @@ export const routes = evalTemplates([
8889
template: Urls.AppStudio,
8990
element: <div>App Studio</div>,
9091
},
92+
{
93+
template: Urls.Settings,
94+
element: <SettingsPage />,
95+
},
9196
],
9297
},
9398
])

src/App.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ import { RouterProvider, createBrowserRouter } from 'react-router-dom'
44
import { ThemeProvider } from './features/theme/context/theme-provider'
55
import { LayoutProvider } from './features/layout/context/layout-provider'
66
import { TooltipProvider } from './features/common/components/tooltip'
7+
import { SettingsProvider } from './features/settings/components/settings-provider'
78

89
const router = createBrowserRouter(routes)
910

1011
function App() {
1112
return (
1213
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
1314
<TooltipProvider>
14-
<LayoutProvider>
15-
<RouterProvider router={router} />
16-
</LayoutProvider>
15+
<SettingsProvider>
16+
<LayoutProvider>
17+
<RouterProvider router={router} />
18+
</LayoutProvider>
19+
</SettingsProvider>
1720
</TooltipProvider>
1821
</ThemeProvider>
1922
)

src/assets/icons/cog.svg

Lines changed: 11 additions & 0 deletions
Loading
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { SVGProps } from 'react'
2+
const SvgCog = (props: SVGProps<SVGSVGElement>) => (
3+
<svg
4+
height="1em"
5+
width="1em"
6+
xmlns="http://www.w3.org/2000/svg"
7+
viewBox="0 0 512 512"
8+
xmlnsXlink="http://www.w3.org/1999/xlink"
9+
enableBackground="new 0 0 512 512"
10+
{...props}
11+
>
12+
<g>
13+
<line fill="currentColor" y1={501} x1={303.1} y2={501} x2={302.1} />
14+
<g>
15+
<path
16+
fill="currentColor"
17+
d="m501,300.8v-91.7h-45.3c-5.3-22.4-14.3-43.3-26.4-62.1l32.9-32.7-64.9-64.6-33.4,33.3c-18.8-11.5-39.6-19.9-61.8-24.8v-47.2h-92.1v48.3c-22,5.4-42.6,14.4-61.1,26.4l-34.2-34-64.9,64.6 35.3,35.2c-2.8,4.6-5.3,9.2-7.7,14-7.5,14.3-13.2,30-17.1,45.7h-49.3v91.7h50.3c1.5,6 3.3,11.9 5.3,17.8 0.1,0.4 0.3,0.8 0.4,1.2 0,0.1 0.1,0.2 0.1,0.4 4.9,14.2 11.3,27.7 19.1,40.2l-35.5,35.3 64.9,64.6 35.1-34.9c18.3,11.5 38.6,20.2 60.2,25.4v48.1h91.1v-47.1c22.7-5 44-13.7 63.1-25.6l32.2,32 64.9-64.6-32.1-31.9c12-19.1 20.9-40.3 26-62.9h44.9zm-94.8,64l29.9,29.8-36.6,36.5-29.5-29.4c-24.7,18.9-54.4,31.7-86.7,36v42.4h-51.3v-42.7c-31.5-4.6-60.4-17.2-84.6-35.7l-31.6,31.5-36.6-36.5 32.4-31.3c-17.9-24-30-52.4-34.4-83.4h-45.3v-51.1h44l1.5-3.6c4.7-29.7 16.5-57.1 33.6-80.3l-32-31.9 36.6-36.5 31,31.9c24-18.5 52.8-31.2 84.1-36v-42.7h51.3v42.3c32,4.1 61.3,16.4 86,34.8l30.3-30.1 35.6,36.5-29.6,29.5c18.2,23.8 30.7,52.2 35.5,83.1h45.4v51.1h-44.7c-3.9,31.8-16.1,61.1-34.3,85.8z"
18+
/>
19+
<path
20+
fill="currentColor"
21+
d="m257,143.4c-61.8,0-113.1,50-113.1,112.6s51.4,112.6 113.1,112.6 113.1-51.1 113.1-112.6-51.3-112.6-113.1-112.6zm0,204.3c-51.3,0-92.1-40.7-92.1-91.7 0-51.1 41.9-91.7 92.1-91.7s92.1,40.7 92.1,91.7c0.1,51.1-41.8,91.7-92.1,91.7z"
22+
/>
23+
</g>
24+
</g>
25+
</svg>
26+
)
27+
export default SvgCog

src/features/common/data/index.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { Config, getAlgoClient, getAlgoIndexerClient } from '@algorandfoundation/algokit-utils'
2+
import { NetworkConfig, localnetConfig } from '../../settings/data/network'
23
export * from './atom-with-debounce'
34

45
Config.configure({
56
logger: Config.getLogger(true),
67
})
78

8-
export const indexer = getAlgoIndexerClient({
9-
server: 'https://mainnet-idx.algonode.cloud/',
10-
port: 443,
11-
})
9+
export let indexer = getAlgoIndexerClient(localnetConfig.indexer)
1210

13-
export const algod = getAlgoClient({
14-
server: 'https://mainnet-api.algonode.cloud/',
15-
port: 443,
16-
})
11+
export let algod = getAlgoClient(localnetConfig.algod)
12+
13+
export const setNetwork = (networkConfig: NetworkConfig) => {
14+
indexer = getAlgoIndexerClient(networkConfig.indexer)
15+
algod = getAlgoClient(networkConfig.algod)
16+
}

src/features/layout/components/header.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
import { cn } from '@/features/common/utils'
22
import { ThemeToggle } from '@/features/theme/components/theme-toggle'
3-
import { NetworkSelect } from './network-select'
43
import { ConnectWallet } from './connect-wallet'
54
import { Search } from '@/features/search/components/search'
5+
import { useNetworkConfig } from '@/features/settings/data'
66

77
type Props = {
88
className?: string
99
}
1010

1111
export function Header({ className }: Props) {
12+
const networkConfig = useNetworkConfig()
13+
1214
return (
1315
<div className={cn('bg-card flex h-20 flex-row justify-between px-5 pt-4 gap-5', className)}>
1416
<div className={cn('flex flex-row items-baseline justify-start mt-1')}>
1517
<Search />
1618
</div>
17-
<div className={cn('flex flex-row items-start justify-end gap-2')}>
18-
<NetworkSelect />
19+
<div className={cn('flex flex-row items-center justify-end gap-2')}>
20+
<label>Network: {networkConfig.name}</label>
1921
<ConnectWallet />
2022
<ThemeToggle />
2123
</div>

src/features/layout/components/left-side-bar-menu.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import SvgChevronLeft from '@/features/common/components/icons/chevron-left'
1010
import { useCallback } from 'react'
1111
import { useLayout } from '../hooks/use-layout'
1212
import SvgChevronRight from '@/features/common/components/icons/chevron-right'
13+
import SvgCog from '@/features/common/components/icons/cog'
1314

1415
type Props = {
1516
className?: string
@@ -20,6 +21,7 @@ export function LeftSideBarMenu({ className }: Props) {
2021
{ urlTemplate: Urls.Index, icon: <SvgHome />, text: 'Home' },
2122
{ urlTemplate: Urls.Explore, icon: <SvgWallet />, text: 'Explore' },
2223
{ urlTemplate: Urls.AppStudio, icon: <SvgCodeBlock />, text: 'App Studio' },
24+
{ urlTemplate: Urls.Settings, icon: <SvgCog />, text: 'Settings' },
2325
]
2426
const { isLeftSideBarExpanded, setIsLeftSideBarExpanded } = useLayout()
2527

src/features/layout/components/network-select.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
1+
import { selectedNetworkAtom, networksConfigs } from '@/features/settings/data'
12
import { Label } from '@/features/common/components/label'
2-
import { Select, SelectContent, SelectItem, SelectTrigger } from '@/features/common/components/select'
3+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/features/common/components/select'
34
import { cn } from '@/features/common/utils'
5+
import { useAtom } from 'jotai'
6+
import { settingsStore } from '@/features/settings/data'
47

58
export function NetworkSelect() {
9+
const [selectedNetwork, setSelectedNetwork] = useAtom(selectedNetworkAtom, { store: settingsStore })
10+
611
return (
712
<div className={cn('flex w-48 flex-col')}>
813
<Label htmlFor="network" className={cn('text-xs ml-0.5')}>
914
Network
1015
</Label>
11-
<Select>
16+
<Select onValueChange={(value) => setSelectedNetwork(value)} value={selectedNetwork}>
1217
<SelectTrigger id="network" className={cn('h-7')}>
13-
Network
18+
<SelectValue placeholder="Select network" />
1419
</SelectTrigger>
1520
<SelectContent className={cn('bg-card text-card-foreground')}>
16-
<SelectItem value="localnet">Localnet</SelectItem>
17-
<SelectItem value="testnet">Testnet</SelectItem>
18-
<SelectItem value="main">Mainnet</SelectItem>
21+
{networksConfigs.map((item) => (
22+
<SelectItem key={item.id} value={item.id}>
23+
{item.name}
24+
</SelectItem>
25+
))}
1926
</SelectContent>
2027
</Select>
2128
</div>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Provider, createStore } from 'jotai'
2+
import { useNetworkConfig } from '../data/network'
3+
import { useEffect } from 'react'
4+
import { setNetwork } from '../../common/data'
5+
6+
type Props = {
7+
children: React.ReactNode
8+
}
9+
10+
export let dataStore = createStore()
11+
12+
export function SettingsProvider({ children }: Props) {
13+
const networkConfig = useNetworkConfig()
14+
15+
useEffect(() => {
16+
setNetwork(networkConfig)
17+
dataStore = createStore()
18+
}, [networkConfig])
19+
20+
return (
21+
<Provider key={networkConfig.id} store={dataStore}>
22+
{children}
23+
</Provider>
24+
)
25+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { NetworkSelect } from '@/features/layout/components/network-select'
2+
3+
export function Settings() {
4+
return <NetworkSelect />
5+
}

0 commit comments

Comments
 (0)