mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-23 01:01:27 +00:00
132 lines
5.0 KiB
TypeScript
132 lines
5.0 KiB
TypeScript
// components/RelayInitializer.tsx
|
|
import React, { useEffect } from 'react';
|
|
import { View } from 'react-native';
|
|
import { useRelayStore } from '@/lib/stores/relayStore';
|
|
import { useNDKStore } from '@/lib/stores/ndk';
|
|
import { useConnectivity } from '@/lib/db/services/ConnectivityService';
|
|
import { ConnectivityService } from '@/lib/db/services/ConnectivityService';
|
|
import { profileImageCache } from '@/lib/db/services/ProfileImageCache';
|
|
import { getSocialFeedCache } from '@/lib/db/services/SocialFeedCache';
|
|
import { getContactCacheService } from '@/lib/db/services/ContactCacheService';
|
|
import { useDatabase } from '@/components/DatabaseProvider';
|
|
|
|
/**
|
|
* A component to initialize and load relay data when the app starts
|
|
* This should be placed high in the component tree, ideally in _layout.tsx
|
|
*/
|
|
export default function RelayInitializer() {
|
|
const { loadRelays } = useRelayStore();
|
|
const { ndk } = useNDKStore();
|
|
const { isOnline } = useConnectivity();
|
|
|
|
const db = useDatabase();
|
|
|
|
// Initialize ProfileImageCache and SocialFeedCache with NDK instance
|
|
useEffect(() => {
|
|
if (ndk) {
|
|
console.log('[RelayInitializer] Setting NDK instance in ProfileImageCache');
|
|
profileImageCache.setNDK(ndk);
|
|
|
|
// Initialize caches with NDK instance
|
|
if (db) {
|
|
// Initialize ContactCacheService
|
|
try {
|
|
getContactCacheService(db);
|
|
console.log('[RelayInitializer] ContactCacheService initialized');
|
|
} catch (error) {
|
|
console.error('[RelayInitializer] Error initializing ContactCacheService:', error);
|
|
}
|
|
// Maximum number of retry attempts
|
|
const MAX_RETRIES = 3;
|
|
|
|
const initSocialFeedCache = (attempt = 1) => {
|
|
try {
|
|
console.log(`[RelayInitializer] Attempting to initialize SocialFeedCache (attempt ${attempt}/${MAX_RETRIES})`);
|
|
const socialFeedCache = getSocialFeedCache(db);
|
|
socialFeedCache.setNDK(ndk);
|
|
console.log('[RelayInitializer] SocialFeedCache initialized with NDK successfully');
|
|
return true;
|
|
} catch (error) {
|
|
console.error('[RelayInitializer] Error initializing SocialFeedCache:', error);
|
|
|
|
// Log more detailed error information
|
|
if (error instanceof Error) {
|
|
console.error(`[RelayInitializer] Error details: ${error.message}`);
|
|
if (error.stack) {
|
|
console.error(`[RelayInitializer] Stack trace: ${error.stack}`);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
};
|
|
|
|
// Try to initialize immediately
|
|
const success = initSocialFeedCache();
|
|
|
|
// If failed, set up progressive retries
|
|
if (!success) {
|
|
let retryAttempt = 1;
|
|
const retryTimers: NodeJS.Timeout[] = [];
|
|
|
|
// Set up multiple retries with increasing delays
|
|
const retryDelays = [2000, 5000, 10000]; // 2s, 5s, 10s
|
|
|
|
for (let i = 0; i < Math.min(MAX_RETRIES - 1, retryDelays.length); i++) {
|
|
const currentAttempt = retryAttempt + 1;
|
|
const delay = retryDelays[i];
|
|
|
|
console.log(`[RelayInitializer] Will retry SocialFeedCache initialization in ${delay/1000} seconds (attempt ${currentAttempt}/${MAX_RETRIES})`);
|
|
|
|
const timer = setTimeout(() => {
|
|
console.log(`[RelayInitializer] Retrying SocialFeedCache initialization (attempt ${currentAttempt}/${MAX_RETRIES})`);
|
|
if (initSocialFeedCache(currentAttempt)) {
|
|
// Clear any remaining timers if successful
|
|
retryTimers.forEach(t => clearTimeout(t));
|
|
}
|
|
}, delay);
|
|
|
|
retryTimers.push(timer);
|
|
retryAttempt++;
|
|
}
|
|
|
|
// Return cleanup function to clear all timers
|
|
return () => retryTimers.forEach(timer => clearTimeout(timer));
|
|
}
|
|
}
|
|
}
|
|
}, [ndk, db]);
|
|
|
|
// Load relays when NDK is initialized and network is available
|
|
useEffect(() => {
|
|
if (ndk && isOnline) {
|
|
console.log('[RelayInitializer] NDK available and online, loading relays...');
|
|
loadRelays().catch(error =>
|
|
console.error('[RelayInitializer] Error loading relays:', error)
|
|
);
|
|
} else if (ndk) {
|
|
console.log('[RelayInitializer] NDK available but offline, skipping relay loading');
|
|
}
|
|
}, [ndk, isOnline]);
|
|
|
|
// Register for connectivity restoration events
|
|
useEffect(() => {
|
|
if (!ndk) return;
|
|
|
|
// Add sync listener to retry when connectivity is restored
|
|
const removeListener = ConnectivityService.getInstance().addSyncListener(() => {
|
|
if (ndk) {
|
|
console.log('[RelayInitializer] Network connectivity restored, attempting to load relays');
|
|
loadRelays().catch(error =>
|
|
console.error('[RelayInitializer] Error loading relays on reconnect:', error)
|
|
);
|
|
}
|
|
});
|
|
|
|
return removeListener;
|
|
}, [ndk, loadRelays]);
|
|
|
|
// This component doesn't render anything
|
|
return null;
|
|
}
|