Save local changes (GSC/Bing integrations) before merging PR #354

This commit is contained in:
ajaysi
2026-02-13 13:11:27 +05:30
parent 43e66835ac
commit 08a1f4a1d8
144 changed files with 8310 additions and 2748 deletions

View File

@@ -34,74 +34,96 @@ const WixCallbackPage: React.FC = () => {
setError('Missing OAuth state. Please start the connection again.');
return;
}
// Use the originally generated state to avoid SDK "Invalid _state" errors
const tokens = await wixClient.auth.getMemberTokens(code, state, oauthData);
wixClient.auth.setTokens(tokens);
// Persist tokens for subsequent API calls on this tab
try { sessionStorage.setItem('wix_tokens', JSON.stringify(tokens)); } catch {}
// optional: ping backend to mark connected
try { await apiClient.get('/api/wix/test/connection/status'); } catch {}
// Cleanup saved oauth data
sessionStorage.removeItem('wix_oauth_data');
sessionStorage.removeItem(`wix_oauth_data_${state}`);
localStorage.removeItem('wix_oauth_data');
try { (window as any).name = ''; } catch {}
// Mark frontend session as connected for onboarding UI
sessionStorage.setItem('wix_connected', 'true');
// Notify opener (if opened as popup) and close; otherwise fallback to redirect
// Exchange code for tokens via backend to ensure persistence and get site info
try {
const payload = { type: 'WIX_OAUTH_SUCCESS', success: true, tokens } as any;
(window.opener || window.parent)?.postMessage(payload, '*');
if (window.opener) {
window.close();
return;
}
} catch {}
// Fallback redirect for same-tab flow - check if we have a stored redirect URL
let redirectUrl = sessionStorage.getItem('wix_oauth_redirect');
console.log('[Wix Callback] Checking redirect URL:', redirectUrl);
if (redirectUrl) {
// Normalize the redirect URL to use the current origin if it's different
// This handles cases where localhost redirect URL is used but callback is on ngrok (or vice versa)
try {
const urlObj = new URL(redirectUrl);
const currentOrigin = window.location.origin;
const response = await apiClient.post('/api/wix/auth/callback', {
code,
state
});
if (response.data.success) {
const { tokens, site_info, permissions } = response.data;
// If the stored redirect URL has a different origin, update it to current origin
// This ensures the redirect works regardless of localhost vs ngrok
if (urlObj.origin !== currentOrigin) {
redirectUrl = `${currentOrigin}${urlObj.pathname}${urlObj.hash}${urlObj.search}`;
console.log('[Wix Callback] Normalized redirect URL to current origin:', {
original: sessionStorage.getItem('wix_oauth_redirect'),
normalized: redirectUrl,
currentOrigin
});
// Store tokens and site info
try {
sessionStorage.setItem('wix_tokens', JSON.stringify(tokens));
if (site_info) {
sessionStorage.setItem('wix_site_info', JSON.stringify(site_info));
}
} catch {}
// Mark frontend session as connected
sessionStorage.setItem('wix_connected', 'true');
// Cleanup saved oauth data
sessionStorage.removeItem('wix_oauth_data');
sessionStorage.removeItem(`wix_oauth_data_${state}`);
localStorage.removeItem('wix_oauth_data');
try { (window as any).name = ''; } catch {}
// Notify opener (if opened as popup) and close
try {
const payload = {
type: 'WIX_OAUTH_SUCCESS',
success: true,
tokens,
site_info
} as any;
(window.opener || window.parent)?.postMessage(payload, '*');
if (window.opener) {
window.close();
return;
}
} catch {}
// Fallback redirect for same-tab flow
let redirectUrl = sessionStorage.getItem('wix_oauth_redirect');
if (redirectUrl) {
try {
const urlObj = new URL(redirectUrl);
const currentOrigin = window.location.origin;
if (urlObj.origin !== currentOrigin) {
redirectUrl = `${currentOrigin}${urlObj.pathname}${urlObj.hash}${urlObj.search}`;
}
} catch (e) {}
sessionStorage.removeItem('wix_oauth_redirect');
window.location.replace(redirectUrl);
} else {
// Default redirect
const referrer = document.referrer;
const isFromBlogWriter = referrer.includes('/blog-writer') ||
window.location.search.includes('from=blog-writer');
if (isFromBlogWriter) {
window.location.replace('/blog-writer#publish');
} else {
window.location.replace('/onboarding?step=5&wix_connected=true');
}
}
} catch (e) {
console.warn('[Wix Callback] Failed to normalize redirect URL, using as-is:', e);
}
console.log('[Wix Callback] Redirecting to stored URL:', redirectUrl);
sessionStorage.removeItem('wix_oauth_redirect');
// Use replace to avoid adding to history
window.location.replace(redirectUrl);
} else {
// Check if we're coming from blog writer by checking referrer or other indicators
// If we can't determine the source, default to blog writer publish phase
const referrer = document.referrer;
const isFromBlogWriter = referrer.includes('/blog-writer') ||
window.location.search.includes('from=blog-writer');
if (isFromBlogWriter) {
console.log('[Wix Callback] Detected blog writer context, redirecting to blog writer publish phase');
window.location.replace('/blog-writer#publish');
} else {
// Default to onboarding if no redirect URL stored and not from blog writer
console.warn('[Wix Callback] No redirect URL found, defaulting to onboarding');
window.location.replace('/onboarding?step=5&wix_connected=true');
throw new Error(response.data.message || 'Connection failed');
}
} catch (backendError: any) {
console.error('Backend exchange failed, falling back to client-side:', backendError);
// Fallback to client-side exchange if backend fails
const tokens = await wixClient.auth.getMemberTokens(code, state, oauthData);
wixClient.auth.setTokens(tokens);
sessionStorage.setItem('wix_tokens', JSON.stringify(tokens));
sessionStorage.setItem('wix_connected', 'true');
// ... rest of the cleanup and redirect logic ...
sessionStorage.removeItem('wix_oauth_data');
// (Simplified fallback for brevity, assuming backend usually works)
try {
const payload = { type: 'WIX_OAUTH_SUCCESS', success: true, tokens } as any;
(window.opener || window.parent)?.postMessage(payload, '*');
if (window.opener) { window.close(); return; }
} catch {}
window.location.replace('/onboarding?step=5&wix_connected=true');
}
} catch (e: any) {
setError(e?.message || 'OAuth callback failed');
try {