import { ref } from 'vue' import { useI18n } from 'vue-i18n' import { useAppStore } from '@/stores/app' import { adminAPI } from '@/api/admin' import type { AntigravityTokenInfo } from '@/api/admin/antigravity' export function useAntigravityOAuth() { const appStore = useAppStore() const { t } = useI18n() const authUrl = ref('') const sessionId = ref('') const state = ref('') const loading = ref(false) const error = ref('') const resetState = () => { authUrl.value = '' sessionId.value = '' state.value = '' loading.value = false error.value = '' } const generateAuthUrl = async (proxyId: number | null | undefined): Promise => { loading.value = true authUrl.value = '' sessionId.value = '' state.value = '' error.value = '' try { const payload: Record = {} if (proxyId) payload.proxy_id = proxyId const response = await adminAPI.antigravity.generateAuthUrl(payload as any) authUrl.value = response.auth_url sessionId.value = response.session_id state.value = response.state return true } catch (err: any) { error.value = err.response?.data?.detail || t('admin.accounts.oauth.antigravity.failedToGenerateUrl') appStore.showError(error.value) return false } finally { loading.value = false } } const exchangeAuthCode = async (params: { code: string sessionId: string state: string proxyId?: number | null }): Promise => { const code = params.code?.trim() if (!code || !params.sessionId || !params.state) { error.value = t('admin.accounts.oauth.antigravity.missingExchangeParams') return null } loading.value = true error.value = '' try { const payload: Record = { session_id: params.sessionId, state: params.state, code } if (params.proxyId) payload.proxy_id = params.proxyId const tokenInfo = await adminAPI.antigravity.exchangeCode(payload as any) return tokenInfo as AntigravityTokenInfo } catch (err: any) { error.value = err.response?.data?.detail || t('admin.accounts.oauth.antigravity.failedToExchangeCode') appStore.showError(error.value) return null } finally { loading.value = false } } const buildCredentials = (tokenInfo: AntigravityTokenInfo): Record => { let expiresAt: string | undefined if (typeof tokenInfo.expires_at === 'number' && Number.isFinite(tokenInfo.expires_at)) { expiresAt = Math.floor(tokenInfo.expires_at).toString() } else if (typeof tokenInfo.expires_at === 'string' && tokenInfo.expires_at.trim()) { expiresAt = tokenInfo.expires_at.trim() } return { access_token: tokenInfo.access_token, refresh_token: tokenInfo.refresh_token, token_type: tokenInfo.token_type, expires_at: expiresAt, project_id: tokenInfo.project_id, email: tokenInfo.email } } return { authUrl, sessionId, state, loading, error, resetState, generateAuthUrl, exchangeAuthCode, buildCredentials } }