Skip to content

Commit 070e17a

Browse files
author
Harshdev098
committed
Merge branch 'dev'
2 parents 778055b + 78d1984 commit 070e17a

50 files changed

Lines changed: 3218 additions & 1588 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package-lock.json

Lines changed: 23 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"preview": "vite preview"
1111
},
1212
"dependencies": {
13-
"@fedimint/core-web": "canary",
13+
"@fedimint/core-web": "^0.0.0-rpc-v1-2495b9818ee0aa99d0d7351f672957467dc3b711",
1414
"@noble/hashes": "^1.8.0",
1515
"@nostr-dev-kit/ndk": "^2.14.32",
1616
"@nostr-dev-kit/ndk-cache-dexie": "^2.6.33",
@@ -26,7 +26,8 @@
2626
"react-dom": "^19.1.0",
2727
"react-qr-code": "^2.0.15",
2828
"react-redux": "^9.2.0",
29-
"react-router": "^7.5.3"
29+
"react-router": "^7.5.3",
30+
"uuid": "^11.1.0"
3031
},
3132
"devDependencies": {
3233
"@eslint/js": "^9.25.0",

src/App.tsx

Lines changed: 92 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,107 @@
1-
import { Routes, Route } from 'react-router'
1+
import { Routes, Route, useNavigate } from 'react-router'
2+
import { useEffect, useState } from 'react'
3+
import { isInitialized, initialize, hasWallet, listClients, setLogLevel } from "@fedimint/core-web"
24
import './style/App.css'
35
import JoinFederation from './pages/JoinFederation'
46
import Wallet from './Wallet'
57
import { LoadingProvider } from './context/loader'
68
import 'nprogress/nprogress.css'
7-
import { HamburgerProvider } from './context/hamburger'
89
import Federations from './pages/Federations'
10+
import { WalletManagerProvider } from './context/WalletManager.tsx'
11+
import webloader from './assets/loader.webp'
12+
import logger from "./utils/logger"
13+
14+
function AppInitializer({ children }: { children: React.ReactNode }) {
15+
const navigate = useNavigate()
16+
const [isAppReady, setIsAppReady] = useState(false)
17+
18+
useEffect(() => {
19+
const initializeApp = async () => {
20+
try {
21+
// Initialize SDK if not already done
22+
if (!isInitialized()) {
23+
await initialize()
24+
logger.log("SDK initialized")
25+
}
26+
27+
if (localStorage.getItem('appDebug') === 'true') {
28+
setLogLevel('debug')
29+
}
30+
31+
const walletList = await listClients()
32+
let targetWalletId = localStorage.getItem('lastUsedWallet') || localStorage.getItem('activeWallet')
33+
34+
// If we have a target wallet ID and it exists, navigate to wallet
35+
if (targetWalletId && hasWallet(targetWalletId)) {
36+
logger.log("Found existing wallet, navigating to /wallet")
37+
navigate('/wallet')
38+
} else if (walletList.length > 0) {
39+
// If we have wallets but no specific target, use the first one
40+
localStorage.setItem('activeWallet', walletList[0].id)
41+
localStorage.setItem('lastUsedWallet', walletList[0].id)
42+
navigate('/wallet')
43+
} else {
44+
logger.log("No wallets found, staying on join page")
45+
// Only navigate if we're not already on the home page
46+
if (window.location.pathname !== '/') {
47+
navigate('/')
48+
}
49+
}
50+
51+
setIsAppReady(true)
52+
} catch (error) {
53+
logger.error("Failed to initialize app:", error)
54+
setIsAppReady(true)
55+
navigate('/')
56+
}
57+
}
58+
59+
initializeApp()
60+
}, [])
61+
62+
if (!isAppReady) {
63+
return (
64+
<div className="web-loader">
65+
<img src={webloader} alt="loading" />
66+
</div>
67+
)
68+
}
69+
70+
return <>{children}</>
71+
}
972

1073
function App() {
74+
const WalletRoutes = () => {
75+
return (
76+
<WalletManagerProvider>
77+
<Routes>
78+
<Route path="/*" element={<Wallet />} />
79+
</Routes>
80+
</WalletManagerProvider>
81+
)
82+
}
83+
84+
const FederationRoutes = () => {
85+
return (
86+
<WalletManagerProvider>
87+
<Routes>
88+
<Route path='/*' element={<Federations />} />
89+
</Routes>
90+
</WalletManagerProvider>
91+
)
92+
}
93+
1194
return (
12-
<HamburgerProvider>
13-
<LoadingProvider>
95+
<LoadingProvider>
96+
<AppInitializer>
1497
<Routes>
1598
<Route path='/' element={<JoinFederation />} />
16-
<Route path='/wallet/*' element={<Wallet />} />
17-
<Route path='/federation/:fedId' element={<Federations />} />
99+
<Route path='/wallet/*' element={<WalletRoutes />} />
100+
<Route path='/federation/:fedId' element={<FederationRoutes />} />
18101
</Routes>
19-
</LoadingProvider>
20-
</HamburgerProvider>
102+
</AppInitializer>
103+
</LoadingProvider>
21104
)
22105
}
23106

24-
export default App
107+
export default App

src/Components/AddFederation.tsx

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,49 @@
11
import { useRef, useContext } from 'react'
2-
import { useNavigate } from 'react-router'
32
import { useDispatch, useSelector } from 'react-redux'
43
import type { RootState, AppDispatch } from '../redux/store'
5-
import { setJoining, setFederationId } from '../redux/slices/ActiveFederation'
6-
import WalletContext from '../context/wallet'
4+
import { setJoining, setWalletId } from '../redux/slices/ActiveWallet'
75
import LoadingContext from '../context/loader'
86
import Alerts from './Alerts'
97
import { JoinFederation as JoinFederationService } from '../services/FederationService'
108
import { setError } from '../redux/slices/Alerts'
119
import QrScanner from 'qr-scanner'
1210
import NProgress from 'nprogress'
1311
import logger from '../utils/logger'
12+
import { useWallet } from '../context/WalletManager'
1413

1514

1615
export default function AddFederation({ setJoinForm }: { setJoinForm: React.Dispatch<React.SetStateAction<boolean>> }) {
17-
1816
const inviteCode = useRef<HTMLInputElement | null>(null)
1917
const walletName = useRef<HTMLInputElement | null>(null)
2018
const videoRef = useRef<HTMLVideoElement | null>(null)
2119
const scannerRef = useRef<QrScanner | null>(null)
22-
const navigate = useNavigate()
23-
const {wallet} = useContext(WalletContext)
2420
const { setLoading } = useContext(LoadingContext)
21+
const { setWallet,switchWallet } = useWallet()
2522
const dispatch = useDispatch<AppDispatch>()
2623
const { joining } = useSelector((state: RootState) => state.activeFederation)
27-
const {error}=useSelector((state:RootState)=>state.Alert)
24+
const { error } = useSelector((state: RootState) => state.Alert)
2825

2926
const handleJoinFederation = async (e: React.FormEvent, qrData?: string): Promise<void> => {
3027
e.preventDefault()
3128

3229
const code = inviteCode.current?.value?.trim() || qrData
3330
if (!code) return; // invitecode should not be empty
34-
if (wallet?.isOpen()) {
35-
logger.log("wallet is open")
36-
// let result = await wallet.federation.getFederationId();
37-
// localStorage.setItem('activeFederation', result)
38-
// dispatch(setFederationId(result))
39-
// navigate('/wallet')
40-
setTimeout(() => {
41-
dispatch(setError(null))
42-
}, 2000);
43-
dispatch(setError({type:'Join Federation: ',message:'Wallet is open'}))
44-
return;
45-
}
4631
dispatch(setJoining(true))
4732

4833
try {
4934
NProgress.start()
5035
setLoading(true)
51-
const result = await JoinFederationService(code, walletName.current?.value || '', wallet)
52-
// dispatch(setJoinResult(result.message))
53-
dispatch(setFederationId(result.federationID))
54-
navigate('/wallet')
36+
const result = await JoinFederationService(code, walletName.current?.value || '')
37+
if (result) {
38+
logger.log('setting new wallet ', result)
39+
setWallet(result)
40+
dispatch(setWalletId(result.id))
41+
localStorage.setItem('activeWallet', result.id)
42+
localStorage.setItem('lastUsedWallet',result.id)
43+
await switchWallet(result.id)
44+
}
5545
} catch (err) {
56-
dispatch(setError({type:'Join Federation: ',message:err instanceof Error ? err.message : String(err)}))
46+
dispatch(setError({ type: 'Join Federation: ', message: err instanceof Error ? err.message : String(err) }))
5747
} finally {
5848
dispatch(setJoining(false))
5949
NProgress.done()
@@ -82,14 +72,14 @@ export default function AddFederation({ setJoinForm }: { setJoinForm: React.Disp
8272
logger.log("Camera started successfully");
8373
}).catch((err) => {
8474
logger.log("Camera access denied:", err);
85-
dispatch(setError({type:'QR Error: ',message:'Camera access denied!'}))
75+
dispatch(setError({ type: 'QR Error: ', message: 'Camera access denied!' }))
8676
setTimeout(() => {
8777
dispatch(setError(null))
8878
}, 2000);
8979
});
9080
} catch (err) {
9181
logger.log("an error occured while scanning")
92-
dispatch(setError({type:'QR Error: ',message:"Error occured while scanning"}))
82+
dispatch(setError({ type: 'QR Error: ', message: "Error occured while scanning" }))
9383
setTimeout(() => {
9484
dispatch(setError(null))
9585
}, 2000);
@@ -109,7 +99,7 @@ export default function AddFederation({ setJoinForm }: { setJoinForm: React.Disp
10999
<button onClick={handleJoinFederation} disabled={joining}>{joining ? 'Joining...' : 'Add Federation'}</button>
110100
</div>
111101

112-
<div className="divider"><p>Or</p></div>
102+
<div className="option-divider"><p>Or</p></div>
113103

114104
<div className="addVideoBox">
115105
<video ref={videoRef} width="250" />

src/Components/Balance.tsx

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// import QrScanner from "qr-scanner"
2-
import { useContext, useEffect } from "react"
3-
import { Link } from "react-router"
4-
import WalletContext from "../context/wallet"
2+
import { useContext, useEffect, useState } from "react"
3+
import { useWallet } from "../context/WalletManager"
54
import { useDispatch, useSelector } from 'react-redux'
65
import type { RootState, AppDispatch } from '../redux/store'
76
import { setError } from "../redux/slices/Alerts"
@@ -10,22 +9,25 @@ import Alerts from "./Alerts"
109
import NProgress from 'nprogress'
1110
import LoadingContext from '../context/loader'
1211
import LighningPayment from "./LighningPayment"
12+
import EcashSetting from "../pages/EcashSetting"
13+
import logger from "../utils/logger"
1314

1415

1516
export default function Balance() {
16-
const { wallet } = useContext(WalletContext)
17+
const { wallet } = useWallet()
1718
const dispatch = useDispatch<AppDispatch>()
1819
const { balance } = useSelector((state: RootState) => state.balance)
1920
const { setLoading } = useContext(LoadingContext)
20-
const { federationId } = useSelector((state: RootState) => state.activeFederation)
21+
const { federationId,walletId } = useSelector((state: RootState) => state.activeFederation)
2122
const { currency } = useSelector((state: RootState) => state.balance)
22-
const { mode } = useSelector((state: RootState) => state.Mode)
2323
const { error } = useSelector((state: RootState) => state.Alert)
24+
const [OpenEcashNotes,setOpenEcashNotes]=useState<boolean>(false)
2425

2526

2627
useEffect(() => {
2728
const run = async () => {
2829
try {
30+
logger.log('fetching balance')
2931
NProgress.start()
3032
setLoading(true)
3133
const msats=await wallet.balance.getBalance()
@@ -39,23 +41,23 @@ export default function Balance() {
3941
}
4042
}
4143
run()
42-
}, [federationId, currency])
44+
}, [federationId, currency,walletId])
4345

4446

4547
return (
4648
<>
4749
{error && <Alerts Error={error} />}
50+
{OpenEcashNotes && <EcashSetting isOpen={OpenEcashNotes} onClose={() => setOpenEcashNotes(false)} />}
4851
<section className='BalanceSection'>
49-
<div className='BalanceSectionTag'>
50-
<button>Balance</button>
51-
</div>
5252
<div className='BalanceSectionValue'>
5353
<span>{balance} {currency.toUpperCase()}</span>
5454
</div>
55-
<div style={{ marginBottom: '20px' }}>
56-
<span><Link to={'/wallet/federation'} style={mode === true ? { color: '#6f6f6f' } : undefined}>Federation Details</Link> | <Link to={'/wallet/ecash'} style={mode === true ? { color: '#6f6f6f' } : undefined}>Ecashes</Link></span>
55+
<div className="wallet-notes">
56+
<span onClick={()=>setOpenEcashNotes(!OpenEcashNotes)}><i className="fa-solid fa-note-sticky"></i> Wallet Ecash Notes</span>
5757
</div>
58+
5859
<LighningPayment />
60+
5961
</section>
6062
</>
6163
)

0 commit comments

Comments
 (0)