roulette / js /oauth.js
ratandeep's picture
Deploy Build Small Roulette — static space serendipity engine for the org
653b61d
Raw
History Blame Contribute Delete
1.97 kB
import { CONFIG } from "./config.js";
// Lazily load @huggingface/hub (resolved via the importmap in index.html).
// Dynamic import means a CDN hiccup degrades liking only — never the whole app.
let _hub = null;
async function hub() {
if (!_hub) _hub = await import("@huggingface/hub");
return _hub;
}
function load(key) {
try { return JSON.parse(localStorage.getItem(key) || "null"); } catch { return null; }
}
function save(key, v) {
try { localStorage.setItem(key, JSON.stringify(v)); } catch { /* ignore */ }
}
/** Returns the active OAuthResult or null (handles the redirect-back leg on load). */
export async function initOAuth() {
let oauth = null;
try {
const { oauthHandleRedirectIfPresent } = await hub();
oauth = await oauthHandleRedirectIfPresent();
} catch {
oauth = null;
}
oauth = oauth || load(CONFIG.oauthKey);
if (oauth) {
const exp = new Date(oauth.accessTokenExpiresAt).getTime();
if (Number.isFinite(exp) && exp < Date.now()) oauth = null; // expired
}
if (oauth) save(CONFIG.oauthKey, oauth);
return oauth;
}
export async function signIn() {
try {
const { oauthLoginUrl } = await hub();
const opts = CONFIG.oauthScopes ? { scopes: CONFIG.oauthScopes } : {};
window.location.href = await oauthLoginUrl(opts);
} catch {
/* OAuth lib unavailable — stay signed out; likes go local */
}
}
export function signOut() {
try { localStorage.removeItem(CONFIG.oauthKey); } catch { /* ignore */ }
}
/**
* Attempts a real HF like/unlike. Returns "hf" on success, "local" on any failure/offline.
* Caller persists the local fallback + UI.
*/
export async function likeOnHf(id, on, token) {
if (!token) return "local";
try {
const res = await fetch(`${CONFIG.apiBase}/api/spaces/${id}/like`, {
method: on ? "POST" : "DELETE",
headers: { Authorization: `Bearer ${token}` },
});
return res.ok ? "hf" : "local";
} catch {
return "local";
}
}