MediaUploadServiceProvider.tsx raw
1 import storage, { dispatchSettingsChanged } from '@/services/local-storage.service'
2 import mediaUpload from '@/services/media-upload.service'
3 import { TMediaUploadServiceConfig } from '@/types'
4 import { createContext, useContext, useEffect, useState } from 'react'
5 import { useNostr } from './NostrProvider'
6
7 type TMediaUploadServiceContext = {
8 serviceConfig: TMediaUploadServiceConfig
9 updateServiceConfig: (service: TMediaUploadServiceConfig) => void
10 }
11
12 const MediaUploadServiceContext = createContext<TMediaUploadServiceContext | undefined>(undefined)
13
14 export const useMediaUploadService = () => {
15 const context = useContext(MediaUploadServiceContext)
16 if (!context) {
17 throw new Error('useMediaUploadService must be used within MediaUploadServiceProvider')
18 }
19 return context
20 }
21
22 export function MediaUploadServiceProvider({ children }: { children: React.ReactNode }) {
23 const { pubkey, isInitialized, startLogin } = useNostr()
24 // Initialize with pubkey-specific config if pubkey is available
25 const [serviceConfig, setServiceConfig] = useState(() =>
26 storage.getMediaUploadServiceConfig(pubkey ?? undefined)
27 )
28
29 // Re-load config when pubkey changes or when NostrProvider finishes initialization
30 useEffect(() => {
31 const config = storage.getMediaUploadServiceConfig(pubkey ?? undefined)
32 setServiceConfig(config)
33 mediaUpload.setServiceConfig(config)
34 }, [pubkey, isInitialized])
35
36 const updateServiceConfig = (newService: TMediaUploadServiceConfig) => {
37 if (!pubkey) {
38 startLogin()
39 return
40 }
41 setServiceConfig(newService)
42 storage.setMediaUploadServiceConfig(pubkey, newService)
43 mediaUpload.setServiceConfig(newService)
44 dispatchSettingsChanged()
45 }
46
47 return (
48 <MediaUploadServiceContext.Provider value={{ serviceConfig, updateServiceConfig }}>
49 {children}
50 </MediaUploadServiceContext.Provider>
51 )
52 }
53