diff --git a/.changeset/tiny-groups-share.md b/.changeset/tiny-groups-share.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/tiny-groups-share.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/server/public/admin-account-detail.html b/server/public/admin-account-detail.html index d37d867e91..67611c866d 100644 --- a/server/public/admin-account-detail.html +++ b/server/public/admin-account-detail.html @@ -2338,7 +2338,7 @@

({})); @@ -2402,7 +2402,7 @@

Edit Agreement

const response = await fetch('/api/admin/agreements'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load agreements'); diff --git a/server/public/admin-domain-discovery.html b/server/public/admin-domain-discovery.html index beba880490..b7d1d3f686 100644 --- a/server/public/admin-domain-discovery.html +++ b/server/public/admin-domain-discovery.html @@ -507,7 +507,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -548,7 +548,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Bulk enrichment failed'); @@ -627,7 +627,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); diff --git a/server/public/admin-email.html b/server/public/admin-email.html index 912ec9cb60..cc92292404 100644 --- a/server/public/admin-email.html +++ b/server/public/admin-email.html @@ -430,7 +430,7 @@

Recent Email Sends

const response = await fetch('/api/admin/email/stats'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load stats'); diff --git a/server/public/admin-feeds.html b/server/public/admin-feeds.html index 0ccfd7e690..21cb704ecf 100644 --- a/server/public/admin-feeds.html +++ b/server/public/admin-feeds.html @@ -678,7 +678,7 @@

Delete Feed

const response = await fetch('/api/admin/feeds'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load feeds'); diff --git a/server/public/admin-meetings.html b/server/public/admin-meetings.html index 00e93c303b..c61c6f57e4 100644 --- a/server/public/admin-meetings.html +++ b/server/public/admin-meetings.html @@ -426,7 +426,7 @@

Meeting Details

const response = await fetch('/api/admin/working-groups'); if (!response.ok) { if (response.status === 401) { - window.AdminNav?.redirectToLogin(); + window.AdminSidebar?.redirectToLogin(); return; } throw new Error('Failed to load working groups'); diff --git a/server/public/admin-members.html b/server/public/admin-members.html index da41e33aec..e5a3e3f7bd 100644 --- a/server/public/admin-members.html +++ b/server/public/admin-members.html @@ -462,7 +462,7 @@

This action cannot be undone

console.log('[admin-members] Response status:', response.status); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load members'); @@ -709,7 +709,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const errorData = await response.json().catch(() => ({ message: response.statusText })); @@ -749,7 +749,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to sync member data'); @@ -818,7 +818,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load payment history'); @@ -944,7 +944,7 @@

This action cannot be undone

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } diff --git a/server/public/admin-notification-channels.html b/server/public/admin-notification-channels.html index ad6e3d4d7f..a912d25b74 100644 --- a/server/public/admin-notification-channels.html +++ b/server/public/admin-notification-channels.html @@ -418,7 +418,7 @@

Delete Channel

const response = await fetch('/api/admin/notification-channels'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load channels'); diff --git a/server/public/admin-org-detail.html b/server/public/admin-org-detail.html index 0676d408ae..f3e33ebac7 100644 --- a/server/public/admin-org-detail.html +++ b/server/public/admin-org-detail.html @@ -1489,7 +1489,7 @@

Set Discount

if (!orgResponse.ok) { if (orgResponse.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } if (orgResponse.status === 404) { @@ -1505,11 +1505,6 @@

Set Discount

domainsData = domainsResponse.ok ? await domainsResponse.json() : { domains: [], workos_domains: [] }; teamMembers = teamResponse.ok ? await teamResponse.json() : []; - // Get current user ID from AdminNav if available - if (window.AdminNav && window.AdminNav.user) { - currentUserId = window.AdminNav.user.id; - } - renderOrganization(); renderOwnerSelector(); populateOwnerDropdowns(); @@ -1799,7 +1794,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const data = await response.json(); @@ -2231,7 +2226,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save changes'); @@ -2301,7 +2296,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save activity'); @@ -2355,7 +2350,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save follow-up'); @@ -2383,7 +2378,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to complete step'); @@ -2531,7 +2526,7 @@

Set Discount

if (response && !response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to update owner'); @@ -2570,7 +2565,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to update watch status'); @@ -2730,7 +2725,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to add domain')); @@ -2760,7 +2755,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to set primary domain')); @@ -2790,7 +2785,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to remove domain')); @@ -2822,7 +2817,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to verify domain')); @@ -2954,7 +2949,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to save interest level'); @@ -3186,7 +3181,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error(await getErrorMessage(response, 'Failed to link domain')); @@ -4260,7 +4255,7 @@

Set Discount

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } if (response.status === 503) { diff --git a/server/public/admin-products.html b/server/public/admin-products.html index 71a2ce3ee5..a50a0ed04b 100644 --- a/server/public/admin-products.html +++ b/server/public/admin-products.html @@ -557,7 +557,7 @@

Archive Product

const response = await fetch('/api/admin/products'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load products'); @@ -915,7 +915,7 @@

Archive Product

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const result = await response.json(); @@ -960,7 +960,7 @@

Archive Product

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to archive product'); diff --git a/server/public/admin-prospects.html b/server/public/admin-prospects.html index 94aa32d19d..fb6762c8a1 100644 --- a/server/public/admin-prospects.html +++ b/server/public/admin-prospects.html @@ -1390,7 +1390,7 @@

Bulk Import Prospects

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load prospects'); @@ -1772,7 +1772,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -1814,7 +1814,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Bulk enrichment failed'); @@ -1852,7 +1852,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -1944,7 +1944,7 @@

No unmapped domains found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -2161,7 +2161,7 @@

Search for Companies

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); @@ -2262,7 +2262,7 @@

No Results Found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } if (response.status === 409) { @@ -3283,7 +3283,7 @@

No accounts found

if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } const error = await response.json(); diff --git a/server/public/admin-sidebar.js b/server/public/admin-sidebar.js index 9f650fe630..8035b13066 100644 --- a/server/public/admin-sidebar.js +++ b/server/public/admin-sidebar.js @@ -386,6 +386,17 @@ window.location.href = `/auth/login?return_to=${returnUrl}`; } + // Shared fetch wrapper that handles 401 redirects automatically + async function adminFetch(url, options = {}) { + const response = await fetch(url, options); + if (response.status === 401) { + redirectToLogin(); + // Return a never-resolving promise to prevent further processing + return new Promise(() => {}); + } + return response; + } + // Auto-initialize only on admin pages function shouldInitialize() { return window.location.pathname.startsWith('/admin'); @@ -405,6 +416,7 @@ init, toggleSidebar, closeSidebar, - redirectToLogin + redirectToLogin, + fetch: adminFetch }; })(); diff --git a/server/public/admin-users.html b/server/public/admin-users.html index ba1b46f2da..1831b93363 100644 --- a/server/public/admin-users.html +++ b/server/public/admin-users.html @@ -996,7 +996,7 @@

Different Approach

if (!groupsResponse.ok) { if (groupsResponse.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load working groups'); diff --git a/server/public/admin-working-groups.html b/server/public/admin-working-groups.html index c94490c3e3..900fd38023 100644 --- a/server/public/admin-working-groups.html +++ b/server/public/admin-working-groups.html @@ -633,7 +633,7 @@

Delete Committee

const response = await fetch('/api/admin/working-groups'); if (!response.ok) { if (response.status === 401) { - window.AdminNav.redirectToLogin(); + window.AdminSidebar.redirectToLogin(); return; } throw new Error('Failed to load working groups'); diff --git a/server/public/admin.html b/server/public/admin.html index e430365383..ed7b21e245 100644 --- a/server/public/admin.html +++ b/server/public/admin.html @@ -789,12 +789,8 @@

Dashboard

async function loadStats() { try { - const response = await fetch('/api/admin/stats'); + const response = await AdminSidebar.fetch('/api/admin/stats'); if (!response.ok) { - if (response.status === 401) { - window.AdminNav.redirectToLogin(); - return; - } throw new Error('Failed to load stats'); }