Initial commit
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import FingerprintJS from '@fingerprintjs/fingerprintjs';
|
||||
|
||||
const FINGERPRINT_KEY = 'gamercomp_device_fp';
|
||||
|
||||
// Cache fingerprint in memory and localStorage
|
||||
let cachedFingerprint = null;
|
||||
|
||||
export function useFingerprint() {
|
||||
const [fingerprint, setFingerprint] = useState(() => {
|
||||
// Try to get from memory cache first
|
||||
if (cachedFingerprint) return cachedFingerprint;
|
||||
// Then from localStorage
|
||||
const stored = localStorage.getItem(FINGERPRINT_KEY);
|
||||
if (stored) {
|
||||
cachedFingerprint = stored;
|
||||
return stored;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
const [loading, setLoading] = useState(!fingerprint);
|
||||
|
||||
useEffect(() => {
|
||||
if (fingerprint) {
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
let cancelled = false;
|
||||
|
||||
async function generateFingerprint() {
|
||||
try {
|
||||
const fp = await FingerprintJS.load();
|
||||
const result = await fp.get();
|
||||
const visitorId = result.visitorId;
|
||||
|
||||
if (!cancelled) {
|
||||
cachedFingerprint = visitorId;
|
||||
localStorage.setItem(FINGERPRINT_KEY, visitorId);
|
||||
setFingerprint(visitorId);
|
||||
setLoading(false);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to generate fingerprint:', err);
|
||||
if (!cancelled) {
|
||||
// Generate a fallback random ID
|
||||
const fallback = 'fb_' + Math.random().toString(36).substring(2) + Date.now().toString(36);
|
||||
cachedFingerprint = fallback;
|
||||
localStorage.setItem(FINGERPRINT_KEY, fallback);
|
||||
setFingerprint(fallback);
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
generateFingerprint();
|
||||
|
||||
return () => {
|
||||
cancelled = true;
|
||||
};
|
||||
}, [fingerprint]);
|
||||
|
||||
return { fingerprint, loading };
|
||||
}
|
||||
|
||||
// Sync getter for API client
|
||||
export function getFingerprint() {
|
||||
if (cachedFingerprint) return cachedFingerprint;
|
||||
const stored = localStorage.getItem(FINGERPRINT_KEY);
|
||||
if (stored) {
|
||||
cachedFingerprint = stored;
|
||||
return stored;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export default useFingerprint;
|
||||
Reference in New Issue
Block a user