diff --git a/src/modules/filemanager/components/FileBrowser/FileItem/FileItem.tsx b/src/modules/filemanager/components/FileBrowser/FileItem/FileItem.tsx index be27ae0..b740504 100644 --- a/src/modules/filemanager/components/FileBrowser/FileItem/FileItem.tsx +++ b/src/modules/filemanager/components/FileBrowser/FileItem/FileItem.tsx @@ -121,6 +121,10 @@ export function FileItem({ isMountedRef.current = true const getStamps = async () => { + if (!beeApi) { + return + } + const stamps = await getUsableStamps(beeApi) const driveStamp = stamps.find(s => drives.some(d => d.batchId.toString() === s.batchID.toString() && d.id === fileInfo.driveId), diff --git a/src/modules/filemanager/components/InitialModal/InitialModal.tsx b/src/modules/filemanager/components/InitialModal/InitialModal.tsx index aeb1d7c..f95ab89 100644 --- a/src/modules/filemanager/components/InitialModal/InitialModal.tsx +++ b/src/modules/filemanager/components/InitialModal/InitialModal.tsx @@ -172,6 +172,10 @@ export function InitialModal({ useEffect(() => { const getStamps = async () => { + if (!beeApi) { + return + } + const stamps = await getUsableStamps(beeApi) safeSetState(isMountedRef, setUsableStamps)([...stamps]) diff --git a/src/modules/filemanager/components/NotificationBar/NotificationBar.tsx b/src/modules/filemanager/components/NotificationBar/NotificationBar.tsx index 0fc2c66..5caba9d 100644 --- a/src/modules/filemanager/components/NotificationBar/NotificationBar.tsx +++ b/src/modules/filemanager/components/NotificationBar/NotificationBar.tsx @@ -38,6 +38,10 @@ export function NotificationBar({ setErrorMessage }: NotificationBarProps): Reac let isMounted = true const getStamps = async () => { + if (!beeApi) { + return + } + const allStamps = await getUsableStamps(beeApi) const expiringStamps: PostageBatch[] = [] const expiringDrives: DriveInfo[] = [] diff --git a/src/modules/filemanager/components/Sidebar/Sidebar.tsx b/src/modules/filemanager/components/Sidebar/Sidebar.tsx index e0e423b..eeae854 100644 --- a/src/modules/filemanager/components/Sidebar/Sidebar.tsx +++ b/src/modules/filemanager/components/Sidebar/Sidebar.tsx @@ -59,6 +59,10 @@ export function Sidebar({ setErrorMessage, loading }: SidebarProps): ReactElemen let isMounted = true const getStamps = async () => { + if (!beeApi) { + return + } + const stamps = await getUsableStamps(beeApi) if (isMounted) { diff --git a/src/modules/filemanager/hooks/useBulkActions.ts b/src/modules/filemanager/hooks/useBulkActions.ts index 9eefcb3..1f2e8bb 100644 --- a/src/modules/filemanager/hooks/useBulkActions.ts +++ b/src/modules/filemanager/hooks/useBulkActions.ts @@ -55,6 +55,10 @@ export function useBulkActions({ listToRender, trackDownload, setErrorMessage }: isMountedRef.current = true const getStamps = async () => { + if (!beeApi) { + return + } + const stamps = await getUsableStamps(beeApi) const stampList = stamps.filter(s => drives.some(d => d.batchId.toString() === s.batchID.toString())) diff --git a/src/modules/filemanager/utils/bee.ts b/src/modules/filemanager/utils/bee.ts index 8abfdba..d521e8a 100644 --- a/src/modules/filemanager/utils/bee.ts +++ b/src/modules/filemanager/utils/bee.ts @@ -11,11 +11,7 @@ import React from 'react' import { getHumanReadableFileSize } from '../../../utils/file' import { ActionTag } from '../constants/transfers' -export const getUsableStamps = async (bee: Bee | null): Promise => { - if (!bee) { - return [] - } - +export const getUsableStamps = async (bee: Bee): Promise => { try { return (await bee.getPostageBatches()) .filter(s => s.usable) diff --git a/src/providers/FileManager.tsx b/src/providers/FileManager.tsx index 858bc94..9448a9b 100644 --- a/src/providers/FileManager.tsx +++ b/src/providers/FileManager.tsx @@ -86,8 +86,9 @@ const findDrives = ( export function Provider({ children }: Props) { const initInProgressRef = useRef(false) + const beeInstanceRef = useRef(null) - const { apiUrl, beeApi } = useContext(SettingsContext) + const { apiUrl } = useContext(SettingsContext) const [fm, setFm] = useState(null) const [shallReset, setShallReset] = useState(false) @@ -128,69 +129,70 @@ export function Provider({ children }: Props) { setFiles([...manager.fileInfoList]) }, []) - const syncDrives = useCallback( - async (manager: FileManagerBase, di?: DriveInfo, remove?: boolean): Promise => { - const usableStamps = await getUsableStamps(beeApi) + const syncDrives = useCallback(async (manager: FileManagerBase, di?: DriveInfo, remove?: boolean): Promise => { + if (!beeInstanceRef.current) { + return + } - if (di) { - const isNotExpired = usableStamps.some(s => s.batchID.toString() === di.batchId.toString()) + const usableStamps = await getUsableStamps(beeInstanceRef.current) - if (isNotExpired) { - if (remove) { - setDrives(prev => prev.filter(d => d.id.toString() !== di.id.toString())) - - return - } - - if (di.isAdmin) { - setAdminDrive(di) - - return - } - - setDrives(prev => { - const existingIndex = prev.findIndex(d => d.id.toString() === di.id.toString()) - - if (existingIndex >= 0) { - const updated = [...prev] - updated[existingIndex] = di - - return updated - } - - return [...prev, di] - }) - - return - } + if (di) { + const isNotExpired = usableStamps.some(s => s.batchID.toString() === di.batchId.toString()) + if (isNotExpired) { if (remove) { - setExpiredDrives(prev => prev.filter(d => d.id.toString() !== di.id.toString())) + setDrives(prev => prev.filter(d => d.id.toString() !== di.id.toString())) return } - if (!di.isAdmin) { - setExpiredDrives(prev => { - const exists = prev.some(d => d.id.toString() === di.id.toString()) - - return exists ? prev : [...prev, di] - }) + if (di.isAdmin) { + setAdminDrive(di) return } - // TODO: handle admin drive expiration! + setDrives(prev => { + const existingIndex = prev.findIndex(d => d.id.toString() === di.id.toString()) + + if (existingIndex >= 0) { + const updated = [...prev] + updated[existingIndex] = di + + return updated + } + + return [...prev, di] + }) + return } - const { adminDrive: tmpAdminDrive, userDrives, expiredDrives } = findDrives(manager.driveList, usableStamps) - setAdminDrive(tmpAdminDrive) - setDrives(userDrives) - setExpiredDrives(expiredDrives) - }, - [beeApi], - ) + if (remove) { + setExpiredDrives(prev => prev.filter(d => d.id.toString() !== di.id.toString())) + + return + } + + if (!di.isAdmin) { + setExpiredDrives(prev => { + const exists = prev.some(d => d.id.toString() === di.id.toString()) + + return exists ? prev : [...prev, di] + }) + + return + } + + // TODO: handle admin drive expiration! + return + } + + const { adminDrive: tmpAdminDrive, userDrives, expiredDrives } = findDrives(manager.driveList, usableStamps) + setAdminDrive(tmpAdminDrive) + setDrives(userDrives) + setExpiredDrives(expiredDrives) + }, []) const syncDrivesPublic = useCallback(async () => { if (fm) { @@ -198,23 +200,24 @@ export function Provider({ children }: Props) { } }, [fm, syncDrives]) - const refreshStamp = useCallback( - async (batchId: string): Promise => { - const usableStamps = await getUsableStamps(beeApi) - const refreshedStamp = usableStamps.find(s => s.batchID.toString() === batchId) + const refreshStamp = useCallback(async (batchId: string): Promise => { + if (!beeInstanceRef.current) { + return + } - setCurrentStamp(prev => { - if (prev && prev.batchID.toString() === batchId && refreshedStamp) { - return refreshedStamp - } + const usableStamps = await getUsableStamps(beeInstanceRef.current) + const refreshedStamp = usableStamps.find(s => s.batchID.toString() === batchId) - return prev - }) + setCurrentStamp(prev => { + if (prev && prev.batchID.toString() === batchId && refreshedStamp) { + return refreshedStamp + } - return refreshedStamp - }, - [beeApi], - ) + return prev + }) + + return refreshedStamp + }, []) const init = useCallback(async (): Promise => { const pk = getSignerPk() @@ -231,8 +234,11 @@ export function Provider({ children }: Props) { setCurrentDrive(undefined) setCurrentStamp(undefined) - const bee = new Bee(apiUrl, { signer: pk }) - const manager = new FileManagerBase(bee) + if (!beeInstanceRef.current) { + beeInstanceRef.current = new Bee(apiUrl, { signer: pk }) + } + + const manager = new FileManagerBase(beeInstanceRef.current) const handleInitialized = (success: boolean) => { setInitializationError(!success) @@ -316,28 +322,28 @@ export function Provider({ children }: Props) { const manager = await init() - if (prevDriveId && manager) { + if (prevDriveId && manager && beeInstanceRef.current) { const refreshedDrive = manager.driveList.find(d => d.id.toString() === prevDriveId) setCurrentDrive(refreshedDrive) - const uStamps: PostageBatch[] = await getUsableStamps(beeApi) + const uStamps: PostageBatch[] = await getUsableStamps(beeInstanceRef.current) const isValidCurrentStamp = uStamps.find(s => s.batchID.toString() === prevStamp?.batchID.toString()) setCurrentStamp(isValidCurrentStamp) } - }, [currentDrive?.id, currentStamp, init, beeApi]) + }, [currentDrive?.id, currentStamp, init]) useEffect(() => { - const pk = getSignerPk() - - if (!pk || fm || initInProgressRef.current) return + if (!apiUrl || initInProgressRef.current) { + return + } const initFromLocalState = async () => { await init() } initFromLocalState() - }, [fm, init]) + }, [apiUrl, init]) useEffect(() => { if (fm && drives.length === 0 && !adminDrive) {