fix: resolve CORS issues in 39dbc46 by moving verification to build-time

- Replace runtime Flathub API calls with static JSON generation
- Add prebuild and predev scripts to specificially fetch verification data
- Refactor useVerification hook to be synchronous
- Fixes Flathub API CORS errors in production
This commit is contained in:
N1C4T
2026-01-25 21:13:03 +04:00
parent 39dbc468cc
commit 87267b06ab
6 changed files with 470 additions and 215 deletions

View File

@@ -1,78 +1,49 @@
'use client';
import { useState, useEffect, useCallback, useRef } from 'react';
import { useCallback } from 'react';
import type { DistroId } from '@/lib/data';
import {
fetchFlathubVerifiedApps,
isFlathubVerified,
isSnapVerified,
} from '@/lib/verification';
export interface UseVerificationResult {
// Kept for compatibility, always false now
isLoading: boolean;
hasError: boolean;
isVerified: (distro: DistroId, packageName: string) => boolean;
getVerificationSource: (distro: DistroId, packageName: string) => 'flathub' | 'snap' | null;
}
// Fetches Flathub data on mount, Snap uses static list (instant)
// Now purely synchronous using build-time generated data
export function useVerification(): UseVerificationResult {
const [isLoading, setIsLoading] = useState(true);
const [hasError, setHasError] = useState(false);
const [flathubReady, setFlathubReady] = useState(false);
const fetchedRef = useRef(false);
useEffect(() => {
if (fetchedRef.current) return;
fetchedRef.current = true;
let isMounted = true;
fetchFlathubVerifiedApps()
.then(() => {
if (isMounted) setFlathubReady(true);
})
.catch((error) => {
if (isMounted) {
console.error('Failed to fetch Flathub verification:', error);
setHasError(true);
}
})
.finally(() => {
if (isMounted) setIsLoading(false);
});
return () => {
isMounted = false;
};
}, []);
// Check if package is verified for the distro
const isVerified = useCallback((distro: DistroId, packageName: string): boolean => {
if (distro === 'flatpak' && flathubReady) {
if (distro === 'flatpak') {
return isFlathubVerified(packageName);
}
if (distro === 'snap') {
return isSnapVerified(packageName);
}
return false;
}, [flathubReady]);
}, []);
// Get verification source for badge styling
const getVerificationSource = useCallback((distro: DistroId, packageName: string): 'flathub' | 'snap' | null => {
if (distro === 'flatpak' && flathubReady && isFlathubVerified(packageName)) {
if (distro === 'flatpak' && isFlathubVerified(packageName)) {
return 'flathub';
}
if (distro === 'snap' && isSnapVerified(packageName)) {
return 'snap';
}
return null;
}, [flathubReady]);
}, []);
return {
isLoading,
hasError,
isLoading: false,
hasError: false,
isVerified,
getVerificationSource,
};
}