You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

89 lines
2.6 KiB

import lightningService from '@/services/lightning.service'
import storage from '@/services/local-storage.service'
import { onConnected, onDisconnected } from '@getalby/bitcoin-connect-react'
import { GetInfoResponse, WebLNProvider } from '@webbtc/webln-types'
import { createContext, useContext, useEffect, useState } from 'react'
type TZapContext = {
isWalletConnected: boolean
provider: WebLNProvider | null
walletInfo: GetInfoResponse | null
defaultZapSats: number
updateDefaultSats: (sats: number) => void
defaultZapComment: string
updateDefaultComment: (comment: string) => void
quickZap: boolean
updateQuickZap: (quickZap: boolean) => void
}
const ZapContext = createContext<TZapContext | undefined>(undefined)
export const useZap = () => {
const context = useContext(ZapContext)
if (!context) {
throw new Error('useZap must be used within a ZapProvider')
}
return context
}
export function ZapProvider({ children }: { children: React.ReactNode }) {
const [defaultZapSats, setDefaultZapSats] = useState<number>(storage.getDefaultZapSats())
const [defaultZapComment, setDefaultZapComment] = useState<string>(storage.getDefaultZapComment())
const [quickZap, setQuickZap] = useState<boolean>(storage.getQuickZap())
const [isWalletConnected, setIsWalletConnected] = useState(false)
const [provider, setProvider] = useState<WebLNProvider | null>(null)
const [walletInfo, setWalletInfo] = useState<GetInfoResponse | null>(null)
useEffect(() => {
const unSubOnConnected = onConnected((provider) => {
setIsWalletConnected(true)
setWalletInfo(null)
setProvider(provider)
lightningService.provider = provider
provider.getInfo().then(setWalletInfo)
})
const unSubOnDisconnected = onDisconnected(() => {
setIsWalletConnected(false)
setProvider(null)
lightningService.provider = null
})
return () => {
unSubOnConnected()
unSubOnDisconnected()
}
}, [])
const updateDefaultSats = (sats: number) => {
storage.setDefaultZapSats(sats)
setDefaultZapSats(sats)
}
const updateDefaultComment = (comment: string) => {
storage.setDefaultZapComment(comment)
setDefaultZapComment(comment)
}
const updateQuickZap = (quickZap: boolean) => {
storage.setQuickZap(quickZap)
setQuickZap(quickZap)
}
return (
<ZapContext.Provider
value={{
isWalletConnected,
provider,
walletInfo,
defaultZapSats,
updateDefaultSats,
defaultZapComment,
updateDefaultComment,
quickZap,
updateQuickZap
}}
>
{children}
</ZapContext.Provider>
)
}