import { LOCAL_STORAGE_KEYS } from 'common' import { makeRandomString } from './helpers' const GITHUB_INTEGRATION_APP_NAME = process.env.NEXT_PUBLIC_GITHUB_INTEGRATION_APP_NAME || (process.env.NEXT_PUBLIC_IS_NIMBUS !== undefined ? 'supabase-snap' : process.env.NEXT_PUBLIC_ENVIRONMENT === 'prod' ? `supabase` : process.env.NEXT_PUBLIC_ENVIRONMENT === 'staging' ? `supabase-staging` : `supabase-local-testing`) const GITHUB_INTEGRATION_CLIENT_ID = process.env.NEXT_PUBLIC_GITHUB_INTEGRATION_CLIENT_ID || (process.env.NEXT_PUBLIC_IS_NIMBUS !== undefined ? 'Iv23li2pAiqDGgaSrP8q' : process.env.NEXT_PUBLIC_ENVIRONMENT === 'prod' ? `Iv1.b91a6d8eaa272168` : process.env.NEXT_PUBLIC_ENVIRONMENT === 'staging' ? `Iv1.2681ab9a0360d8ad` : `Iv1.5022a3b44d150fbf`) const GITHUB_INTEGRATION_AUTHORIZATION_URL = `https://github.com/login/oauth/authorize?client_id=${GITHUB_INTEGRATION_CLIENT_ID}` export const GITHUB_INTEGRATION_INSTALLATION_URL = `https://github.com/apps/${GITHUB_INTEGRATION_APP_NAME}/installations/new` export const GITHUB_INTEGRATION_REVOKE_AUTHORIZATION_URL = `https://github.com/settings/connections/applications/${GITHUB_INTEGRATION_CLIENT_ID}` export function openInstallGitHubIntegrationWindow( type: 'install' | 'authorize', closeCallback?: () => void ) { const w = 600 const h = 800 const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height let windowUrl: string | undefined if (type === 'install') { windowUrl = GITHUB_INTEGRATION_INSTALLATION_URL } else { const state = makeRandomString(32) localStorage.setItem(LOCAL_STORAGE_KEYS.GITHUB_AUTHORIZATION_STATE, state) windowUrl = `${GITHUB_INTEGRATION_AUTHORIZATION_URL}&state=${state}&prompt=select_account` } const systemZoom = width / window.screen.availWidth const left = (width - w) / 2 / systemZoom + dualScreenLeft const top = (height - h) / 2 / systemZoom + dualScreenTop const newWindow = window.open( windowUrl, 'GitHub', `scrollbars=yes,resizable=no,status=no,location=no,toolbar=no,menubar=no, width=${w / systemZoom}, height=${h / systemZoom}, top=${top}, left=${left} ` ) if (newWindow) { if (closeCallback) { // Poll to check if window is closed const checkClosed = setInterval(() => { if (newWindow.closed) { clearInterval(checkClosed) closeCallback() } }, 500) // Check every 500ms // Add a timeout to prevent infinite polling setTimeout(() => { clearInterval(checkClosed) }, 300000) // 5 minutes timeout } newWindow.focus() } } export const getGitHubProfileImgUrl = (username: string) => { return `https://github.com/${username}.png?size=96` }