import { api } from './api' // ============================================================================ // OAuth URL Builders // ============================================================================ /** * Build GitHub OAuth URL */ export function buildGitHubOAuthUrl(clientId: string, state: string): string { return `https://github.com/login/oauth/authorize?client_id=${clientId}&state=${state}&scope=user:email` } /** * Build Discord OAuth URL */ export function buildDiscordOAuthUrl(clientId: string, state: string): string { const url = new URL('https://discord.com/oauth2/authorize') url.searchParams.set('client_id', clientId) url.searchParams.set( 'redirect_uri', `${window.location.origin}/oauth/discord` ) url.searchParams.set('response_type', 'code') url.searchParams.set('scope', 'identify+openid') url.searchParams.set('state', state) return url.toString() } /** * Build OIDC OAuth URL */ export function buildOIDCOAuthUrl( authUrl: string, clientId: string, state: string ): string { const url = new URL(authUrl) url.searchParams.set('client_id', clientId) url.searchParams.set('redirect_uri', `${window.location.origin}/oauth/oidc`) url.searchParams.set('response_type', 'code') url.searchParams.set('scope', 'openid profile email') url.searchParams.set('state', state) return url.toString() } /** * Build LinuxDO OAuth URL */ export function buildLinuxDOOAuthUrl(clientId: string, state: string): string { return `https://connect.linux.do/oauth2/authorize?response_type=code&client_id=${clientId}&state=${state}` } // ============================================================================ // OAuth Helper Functions // ============================================================================ /** * Get OAuth state token * Includes affiliate code from localStorage if available */ export async function getOAuthState(): Promise { try { let path = '/api/oauth/state' const affCode = localStorage.getItem('aff') if (affCode && affCode.length > 0) { path += `?aff=${affCode}` } const res = await api.get(path) if (res.data.success) { return res.data.data } return null } catch (error) { // eslint-disable-next-line no-console console.error('Failed to get OAuth state:', error) return null } } /** * Handle GitHub OAuth binding/login */ export async function handleGitHubOAuth(clientId: string): Promise { const state = await getOAuthState() if (!state) return const url = buildGitHubOAuthUrl(clientId, state) window.open(url, '_blank') } /** * Handle Discord OAuth binding/login */ export async function handleDiscordOAuth(clientId: string): Promise { const state = await getOAuthState() if (!state) return const url = buildDiscordOAuthUrl(clientId, state) window.open(url, '_blank') } /** * Handle OIDC OAuth binding/login */ export async function handleOIDCOAuth( authUrl: string, clientId: string ): Promise { const state = await getOAuthState() if (!state) return const url = buildOIDCOAuthUrl(authUrl, clientId, state) window.open(url, '_blank') } /** * Handle LinuxDO OAuth binding/login */ export async function handleLinuxDOOAuth(clientId: string): Promise { const state = await getOAuthState() if (!state) return const url = buildLinuxDOOAuthUrl(clientId, state) window.open(url, '_blank') }