mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-01-16 08:08:18 +00:00
Some checks failed
🤖 Android APK Build (Phone + TV) / 🏗️ Build Android APK (phone) (push) Has been cancelled
🤖 Android APK Build (Phone + TV) / 🏗️ Build Android APK (tv) (push) Has been cancelled
🤖 iOS IPA Build (Phone + TV) / 🏗️ Build iOS IPA (phone) (push) Has been cancelled
🔒 Lockfile Consistency Check / 🔍 Check bun.lock and package.json consistency (push) Has been cancelled
🛡️ CodeQL Analysis / 🔎 Analyze with CodeQL (actions) (push) Has been cancelled
🛡️ CodeQL Analysis / 🔎 Analyze with CodeQL (javascript-typescript) (push) Has been cancelled
🏷️🔀Merge Conflict Labeler / 🏷️ Labeling Merge Conflicts (push) Has been cancelled
🚦 Security & Quality Gate / 🚑 Expo Doctor Check (push) Has been cancelled
🚦 Security & Quality Gate / 📝 Validate PR Title (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Vulnerable Dependencies (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (check) (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (format) (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (lint) (push) Has been cancelled
🚦 Security & Quality Gate / 🔍 Lint & Test (typecheck) (push) Has been cancelled
🕒 Handle Stale Issues / 🗑️ Cleanup Stale Issues (push) Has been cancelled
59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import NetInfo from "@react-native-community/netinfo";
|
|
import { useAtom } from "jotai";
|
|
import { useCallback, useEffect, useState } from "react";
|
|
import { apiAtom } from "@/providers/JellyfinProvider";
|
|
|
|
async function checkApiReachable(basePath?: string): Promise<boolean> {
|
|
if (!basePath) return false;
|
|
try {
|
|
const response = await fetch(basePath, { method: "HEAD" });
|
|
return response.ok;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function useNetworkStatus() {
|
|
const [isConnected, setIsConnected] = useState(false);
|
|
const [serverConnected, setServerConnected] = useState<boolean | null>(null);
|
|
const [loading, setLoading] = useState(false);
|
|
const [api] = useAtom(apiAtom);
|
|
|
|
const validateConnection = useCallback(async () => {
|
|
if (!api?.basePath) return false;
|
|
const reachable = await checkApiReachable(api.basePath);
|
|
setServerConnected(reachable);
|
|
return reachable;
|
|
}, [api?.basePath]);
|
|
|
|
const retryCheck = useCallback(async () => {
|
|
setLoading(true);
|
|
await validateConnection();
|
|
setLoading(false);
|
|
}, [validateConnection]);
|
|
|
|
useEffect(() => {
|
|
const unsubscribe = NetInfo.addEventListener(async (state) => {
|
|
setIsConnected(!!state.isConnected);
|
|
if (state.isConnected) {
|
|
await validateConnection();
|
|
} else {
|
|
setServerConnected(false);
|
|
}
|
|
});
|
|
|
|
// Initial check: wait for NetInfo first
|
|
NetInfo.fetch().then((state) => {
|
|
if (state.isConnected) {
|
|
validateConnection();
|
|
} else {
|
|
setServerConnected(false);
|
|
}
|
|
});
|
|
|
|
return () => unsubscribe();
|
|
}, [validateConnection]);
|
|
|
|
return { isConnected, serverConnected, loading, retryCheck };
|
|
}
|