@arcblock/did-connect-core 4.1.53 → 4.1.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"login-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/login-dialog.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyBnE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,sFAAsF;IACtF,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,WAAW;IAQV,OAAO,CAAC,MAAM;IAAiB,OAAO,CAAC,IAAI;IAAe,OAAO,CAAC,OAAO;IAPrF,OAAO,CAAC,IAAI,CAAC,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAc;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAmB;IACzC,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,SAAS,CAA2C;gBACxC,MAAM,EAAE,aAAa,EAAU,IAAI,EAAE,WAAW,EAAU,OAAO,GAAE,kBAAuB;IAC9G,KAAK,IAAI,IAAI;IAqFb,OAAO,CAAC,SAAS;IAuBjB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIvC,OAAO,CAAC,UAAU;IAIlB,OAAO,IAAI,IAAI;CAQhB"}
1
+ {"version":3,"file":"login-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/login-dialog.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyBnE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,sFAAsF;IACtF,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,WAAW;IAQV,OAAO,CAAC,MAAM;IAAiB,OAAO,CAAC,IAAI;IAAe,OAAO,CAAC,OAAO;IAPrF,OAAO,CAAC,IAAI,CAAC,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAc;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAmB;IACzC,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,SAAS,CAA2C;gBACxC,MAAM,EAAE,aAAa,EAAU,IAAI,EAAE,WAAW,EAAU,OAAO,GAAE,kBAAuB;IAC9G,KAAK,IAAI,IAAI;IAwFb,OAAO,CAAC,SAAS;IAuBjB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIvC,OAAO,CAAC,UAAU;IAIlB,OAAO,IAAI,IAAI;CAQhB"}
@@ -42,6 +42,10 @@ export class LoginDialog {
42
42
  mount() {
43
43
  if (this.dialog)
44
44
  return;
45
+ // The page language is authoritative for an in-context dialog.
46
+ const hostLocale = document.documentElement.lang;
47
+ if (hostLocale)
48
+ this.options.locale = hostLocale;
45
49
  let focused = document.activeElement;
46
50
  while (focused?.shadowRoot?.activeElement)
47
51
  focused = focused.shadowRoot.activeElement;
@@ -1 +1 @@
1
- {"version":3,"file":"login-dialog.js","sourceRoot":"","sources":["../../src/ui/login-dialog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login-dialog.js","sourceRoot":"","sources":["../../src/ui/login-dialog.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,8 @@ export interface LoginPageOptions {
32
32
  oauthProviders?: OAuthProvider[];
33
33
  /** Locale for UI text (default: 'en') */
34
34
  locale?: string;
35
+ /** Defaults to hidden in a dialog, visible on the standalone page. */
36
+ showLocaleSelector?: boolean;
35
37
  /** Callback when the user switches locale. */
36
38
  onLocaleChange?: (locale: string) => void;
37
39
  /**
@@ -160,6 +162,8 @@ export declare class LoginPage {
160
162
  private detachLocaleMenu;
161
163
  /** Switch the card content between views. */
162
164
  private switchView;
165
+ /** Keep recognition next to the action, without a second page subtitle. */
166
+ private markLastUsed;
163
167
  private renderMethodsView;
164
168
  /** Full QR view — replaces card content */
165
169
  private renderQRView;
@@ -1 +1 @@
1
- {"version":3,"file":"login-page.d.ts","sourceRoot":"","sources":["../../src/ui/login-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login-page.d.ts","sourceRoot":"","sources":["../../src/ui/login-page.ts"],"names":[],"mappings":"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"}
@@ -268,6 +268,8 @@ export class LoginPage {
268
268
  }
269
269
  /** Locale sits on the card's top-right row, level with Back / Cancel. */
270
270
  renderCardTools(card) {
271
+ if (!(this.options.showLocaleSelector ?? this.options.mode !== 'dialog'))
272
+ return;
271
273
  const tools = document.createElement('div');
272
274
  tools.className = 'card-tools';
273
275
  this.renderLocaleSwitcher(tools);
@@ -325,6 +327,8 @@ export class LoginPage {
325
327
  trigger.addEventListener('click', (event) => {
326
328
  event.stopPropagation();
327
329
  setOpen(menu.hidden);
330
+ if (!menu.hidden)
331
+ menu.querySelector('[aria-checked="true"]')?.focus();
328
332
  });
329
333
  for (const item of locales) {
330
334
  const checked = item.code === current.code;
@@ -334,12 +338,13 @@ export class LoginPage {
334
338
  btn.setAttribute('role', 'menuitemradio');
335
339
  btn.setAttribute('aria-checked', checked ? 'true' : 'false');
336
340
  btn.dataset.locale = item.code;
341
+ btn.tabIndex = -1;
337
342
  btn.title = item.label;
338
- if (checked) {
343
+ {
339
344
  const mark = document.createElement('span');
340
345
  mark.className = 'locale-check';
341
346
  mark.setAttribute('aria-hidden', 'true');
342
- mark.textContent = '✓';
347
+ mark.textContent = checked ? '✓' : '';
343
348
  btn.appendChild(mark);
344
349
  }
345
350
  const label = document.createElement('span');
@@ -351,6 +356,25 @@ export class LoginPage {
351
356
  });
352
357
  menu.appendChild(btn);
353
358
  }
359
+ wrapper.addEventListener('keydown', (event) => {
360
+ const items = [...menu.querySelectorAll('.locale-btn')];
361
+ const active = this.shadow?.activeElement ?? document.activeElement;
362
+ const index = items.indexOf(active);
363
+ if (event.key === 'Escape') {
364
+ event.preventDefault();
365
+ event.stopPropagation();
366
+ setOpen(false);
367
+ trigger.focus();
368
+ }
369
+ else if (event.key === 'Tab')
370
+ setOpen(false);
371
+ else if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {
372
+ event.preventDefault();
373
+ setOpen(true);
374
+ const next = event.key === 'Home' ? 0 : event.key === 'End' ? items.length - 1 : index < 0 ? (event.key === 'ArrowUp' ? items.length - 1 : 0) : (index + (event.key === 'ArrowUp' ? -1 : 1) + items.length) % items.length;
375
+ items[next]?.focus();
376
+ }
377
+ });
354
378
  const onOutsideClick = (event) => {
355
379
  const path = event.composedPath();
356
380
  if (path.includes(wrapper))
@@ -406,6 +430,21 @@ export class LoginPage {
406
430
  break;
407
431
  }
408
432
  }
433
+ /** Keep recognition next to the action, without a second page subtitle. */
434
+ markLastUsed(button, method, locale) {
435
+ if (!this.options.preferenceKey)
436
+ return;
437
+ try {
438
+ if (localStorage.getItem(`did-login-method:${this.options.preferenceKey}`) !== method)
439
+ return;
440
+ const hint = document.createElement('span');
441
+ hint.className = 'last-used';
442
+ hint.textContent = t('lastUsed', locale);
443
+ button.classList.add('has-last-used');
444
+ button.appendChild(hint);
445
+ }
446
+ catch { /* Storage may be unavailable in private mode. */ }
447
+ }
409
448
  renderMethodsView(card, locale, methods) {
410
449
  // ── Escape hatch ("Cancel") — top-left, mirrors the locale switcher
411
450
  // (top-right). Standard placement for a standalone auth card. ──
@@ -413,21 +452,6 @@ export class LoginPage {
413
452
  this.renderHomeLink(card, locale);
414
453
  // ── Brand header ──
415
454
  this.renderBrandHeader(card, locale);
416
- if (this.options.preferenceKey) {
417
- try {
418
- const last = localStorage.getItem(`did-login-method:${this.options.preferenceKey}`);
419
- const labels = { passkey: 'Passkey', oauth: 'OAuth', email: t('emailButton', locale), 'did-connect': 'DID Wallet' };
420
- const provider = last?.startsWith('oauth:') ? this.options.oauthProviders?.find(p => p.enabled && `oauth:${p.id}` === last) : undefined;
421
- const label = provider?.name ?? (last ? labels[last] : undefined);
422
- if (last && label && (methods.includes(last) || (provider && methods.includes('oauth')))) {
423
- const hint = document.createElement('p');
424
- hint.className = 'subtitle';
425
- hint.textContent = t('lastUsed', locale, { method: label });
426
- card.appendChild(hint);
427
- }
428
- }
429
- catch { /* private mode */ }
430
- }
431
455
  // Passkey unsupported warning
432
456
  const requestedPasskey = this.options.methods.includes('passkey');
433
457
  if (requestedPasskey && !methods.includes('passkey')) {
@@ -721,11 +745,12 @@ export class LoginPage {
721
745
  }
722
746
  });
723
747
  }
724
- renderBackButton(parent, locale) {
748
+ renderBackButton(parent, locale, onBack = () => this.switchView('methods')) {
725
749
  const btn = document.createElement('button');
750
+ btn.type = 'button';
726
751
  btn.className = 'back-btn';
727
752
  btn.innerHTML = `${ICON_BACK_ARROW} ${escapeHtml(t('back', locale))}`;
728
- btn.addEventListener('click', () => this.switchView('methods'));
753
+ btn.addEventListener('click', onBack);
729
754
  parent.appendChild(btn);
730
755
  }
731
756
  /**
@@ -943,11 +968,8 @@ export class LoginPage {
943
968
  createBtn.id = 'passkey-btn';
944
969
  createBtn.innerHTML = `${ICON_PASSKEY} ${escapeHtml(t('passkeyCreate', locale))}`;
945
970
  section.appendChild(createBtn);
946
- const backLink = document.createElement('button');
947
- backLink.type = 'button';
948
- backLink.className = 'passkey-alt';
949
- backLink.textContent = t('passkeyBackToSignIn', locale);
950
- section.appendChild(backLink);
971
+ parent.querySelector('.back-btn')?.remove();
972
+ this.renderBackButton(parent, locale, () => renderSignInState());
951
973
  const doCreate = async () => {
952
974
  if (createBtn.disabled)
953
975
  return; // Enter-key auto-repeat on the name input
@@ -976,7 +998,6 @@ export class LoginPage {
976
998
  createBtn.addEventListener('click', doCreate);
977
999
  nameInput.addEventListener('keydown', (e) => { if (e.key === 'Enter')
978
1000
  doCreate(); });
979
- backLink.addEventListener('click', () => renderSignInState());
980
1001
  createBtn.focus();
981
1002
  };
982
1003
  // ── State 0: sign-in (default) ──
@@ -1015,6 +1036,7 @@ export class LoginPage {
1015
1036
  };
1016
1037
  const renderSignInState = () => {
1017
1038
  this.cardEl?.classList.remove('passkey-creating');
1039
+ parent.querySelector('.back-btn')?.remove();
1018
1040
  this.abort?.abort();
1019
1041
  this.generation++;
1020
1042
  const heading = this.cardEl?.querySelector('h1');
@@ -1026,6 +1048,7 @@ export class LoginPage {
1026
1048
  signInBtn.className = this.cardEl?.classList.contains('social-first') ? 'btn btn-secondary' : 'btn';
1027
1049
  signInBtn.id = 'passkey-btn';
1028
1050
  signInBtn.innerHTML = `${ICON_PASSKEY} ${escapeHtml(t('passkeySignIn', locale))}`;
1051
+ this.markLastUsed(signInBtn, 'passkey', locale);
1029
1052
  section.appendChild(signInBtn);
1030
1053
  signInBtn.addEventListener('click', () => doSignIn());
1031
1054
  const createLink = document.createElement('button');
@@ -1049,172 +1072,235 @@ export class LoginPage {
1049
1072
  startOAuthPopup(providerId, btn) {
1050
1073
  this.oauthCleanup?.();
1051
1074
  const epoch = this.generation;
1075
+ const locale = this.options.locale;
1052
1076
  const servicePrefix = this.config.servicePrefix ?? '/.well-known/service';
1053
- // Federation: popup opens Master's OAuth login URL (cross-domain callback)
1054
1077
  const oauthBase = this.options.masterOAuthOrigin
1055
- ? `${this.options.masterOAuthOrigin}${servicePrefix}`
1056
- : servicePrefix;
1078
+ ? `${this.options.masterOAuthOrigin}${servicePrefix}` : servicePrefix;
1057
1079
  const oauthOrigin = new URL(oauthBase, window.location.href).origin;
1058
- const loginUrl = `${oauthBase}/api/oauth/${encodeURIComponent(providerId)}/login?returnUrl=${encodeURIComponent(window.location.href)}`;
1059
- // Open centered popup — compact size, enough for provider auth pages
1060
- const width = 500;
1061
- const height = 620;
1062
- const left = window.screenX + (window.innerWidth - width) / 2;
1063
- const top = window.screenY + (window.innerHeight - height) / 2;
1064
- const popup = window.open(loginUrl, 'oauth-login:popup', `left=${left},top=${top},width=${width},height=${height},resizable,scrollbars=yes,status=1,popup`);
1065
- if (!popup) {
1066
- this.options.onBeforeRedirect?.();
1067
- window.location.href = loginUrl;
1068
- return;
1080
+ let returnUrl = window.location.href;
1081
+ if (this.options.mode !== 'dialog' && window.location.pathname === `${servicePrefix}/login`) {
1082
+ const requested = new URLSearchParams(window.location.search).get('return_to');
1083
+ try {
1084
+ const target = new URL(requested || '/', window.location.origin);
1085
+ returnUrl = target.origin === window.location.origin && !/^\/[/\\]/.test(target.pathname) ? target.href : `${window.location.origin}/`;
1086
+ }
1087
+ catch {
1088
+ returnUrl = `${window.location.origin}/`;
1089
+ }
1069
1090
  }
1070
- // Save original button content and enter loading state
1091
+ const loginUrl = `${oauthBase}/api/oauth/${encodeURIComponent(providerId)}/login?returnUrl=${encodeURIComponent(returnUrl)}`;
1092
+ const provider = this.options.oauthProviders?.find(p => p.id === providerId)?.name ?? providerId;
1071
1093
  const originalHTML = btn.innerHTML;
1072
- btn.textContent = t('oauthWaiting', this.options.locale, { provider: this.options.oauthProviders?.find(p => p.id === providerId)?.name ?? providerId });
1073
- btn.disabled = true;
1074
- btn.classList.add('oauth-btn-loading');
1094
+ let popup = null;
1095
+ let settled = false;
1096
+ let exchanging = false;
1097
+ let probing = false;
1098
+ let pollTimer;
1099
+ let sessionTimer;
1100
+ let abandonTimer;
1101
+ const current = () => !settled && this.mounted && epoch === this.generation;
1102
+ const locked = [];
1103
+ const lockMethods = () => {
1104
+ for (const button of this.cardEl?.querySelectorAll('.method-btn, .passkey-create-entry, #passkey-btn, .locale-trigger, .locale-btn') ?? []) {
1105
+ locked.push({ button, disabled: button.disabled });
1106
+ button.disabled = true;
1107
+ }
1108
+ };
1075
1109
  const recovery = document.createElement('div');
1076
1110
  recovery.className = 'oauth-recovery';
1077
1111
  recovery.setAttribute('role', 'status');
1078
1112
  const hint = document.createElement('p');
1079
- hint.textContent = t('oauthIncomplete', this.options.locale);
1113
+ const actions = document.createElement('div');
1114
+ actions.className = 'oauth-recovery-actions';
1115
+ const reopen = document.createElement('button');
1116
+ reopen.type = 'button';
1117
+ reopen.className = 'oauth-retry';
1118
+ reopen.textContent = t('oauthReopen', locale);
1119
+ reopen.hidden = true;
1120
+ reopen.onclick = () => { this.select('oauth'); this.activeProvider = providerId; this.startOAuthPopup(providerId, btn); };
1080
1121
  const fullPage = document.createElement('a');
1081
1122
  fullPage.href = loginUrl;
1082
- fullPage.textContent = t('oauthFullPage', this.options.locale);
1083
- fullPage.addEventListener('click', () => { this.options.onBeforeRedirect?.(); this.oauthCleanup?.(); });
1084
- recovery.append(hint, fullPage);
1085
- recovery.hidden = true;
1123
+ fullPage.textContent = t('oauthFullPage', locale);
1124
+ fullPage.addEventListener('click', event => {
1125
+ const reconcile = recovery.dataset.state === 'oauthUnconfirmed';
1126
+ if (exchanging && !settled) {
1127
+ event.preventDefault();
1128
+ return;
1129
+ }
1130
+ if (reconcile)
1131
+ event.preventDefault();
1132
+ this.options.onBeforeRedirect?.();
1133
+ this.oauthCleanup?.();
1134
+ if (reconcile)
1135
+ window.location.reload();
1136
+ });
1137
+ const cancel = document.createElement('button');
1138
+ cancel.type = 'button';
1139
+ cancel.className = 'oauth-cancel';
1140
+ cancel.textContent = t('cancel', locale);
1141
+ actions.append(reopen, fullPage, cancel);
1142
+ recovery.append(hint, actions);
1086
1143
  btn.parentElement?.after(recovery);
1087
- const restore = () => {
1088
- recovery.hidden = false;
1089
- this.emit('incomplete');
1144
+ const restoreButton = () => {
1090
1145
  btn.innerHTML = originalHTML;
1091
1146
  btn.disabled = false;
1092
1147
  btn.classList.remove('oauth-btn-loading');
1093
1148
  };
1094
- let settled = false;
1095
- let sessionPollTimer;
1149
+ const closePopup = () => { try {
1150
+ popup?.close();
1151
+ }
1152
+ catch { /* COOP can sever the window reference. */ } };
1153
+ const cleanup = () => {
1154
+ settled = true;
1155
+ clearInterval(pollTimer);
1156
+ clearInterval(sessionTimer);
1157
+ clearTimeout(abandonTimer);
1158
+ window.removeEventListener('message', onMessage);
1159
+ for (const item of locked.splice(0))
1160
+ item.button.disabled = item.disabled;
1161
+ restoreButton();
1162
+ };
1163
+ const showRecovery = (key) => {
1164
+ hint.textContent = t(key, locale, { provider });
1165
+ recovery.dataset.state = key;
1166
+ actions.hidden = false;
1167
+ reopen.hidden = false;
1168
+ cancel.hidden = true;
1169
+ restoreButton();
1170
+ };
1171
+ const fail = (key) => {
1172
+ if (!current())
1173
+ return;
1174
+ cleanup();
1175
+ closePopup();
1176
+ showRecovery(key);
1177
+ this.emit('incomplete');
1178
+ };
1096
1179
  const succeed = () => {
1097
- if (settled || !this.mounted || epoch !== this.generation)
1180
+ if (!current())
1098
1181
  return;
1099
- settled = true;
1100
1182
  cleanup();
1101
- btn.textContent = t('success', this.options.locale);
1183
+ closePopup();
1184
+ recovery.remove();
1185
+ btn.textContent = t('success', locale);
1186
+ btn.disabled = true;
1102
1187
  this.handleSuccess();
1103
1188
  };
1189
+ cancel.onclick = () => { if (exchanging)
1190
+ return; fail('oauthCancelled'); btn.focus(); };
1104
1191
  const onMessage = async (event) => {
1105
- if (event.origin !== oauthOrigin || event.source !== popup)
1106
- return;
1107
- if (!event.data || event.data.type !== 'authorization_response')
1192
+ if (event.origin !== oauthOrigin || event.source !== popup || !popup)
1108
1193
  return;
1109
- if (settled || !this.mounted || epoch !== this.generation)
1194
+ if (!event.data || event.data.type !== 'authorization_response' || !current() || exchanging)
1110
1195
  return;
1111
- // Stop the closed-poll only. Do NOT drop this listener from popup.closed —
1112
- // GitHub/Twitter COOP reports closed while the provider page is still up,
1113
- // and the callback also window.close()s itself after postMessage.
1114
- if (pollTimer !== undefined) {
1115
- clearInterval(pollTimer);
1116
- pollTimer = undefined;
1117
- }
1118
- try {
1119
- popup.close();
1120
- }
1121
- catch {
1122
- /* ignore */
1123
- }
1196
+ clearInterval(pollTimer);
1197
+ clearInterval(sessionTimer);
1124
1198
  if (event.data.error) {
1125
- restore();
1126
- cleanup();
1199
+ fail(event.data.error === 'access_denied' ? 'oauthDenied' : event.data.error === 'cancelled' ? 'oauthCancelled' : 'oauthFailed');
1127
1200
  return;
1128
1201
  }
1129
1202
  const { code, state } = event.data.response ?? event.data;
1130
- if (!code) {
1131
- restore();
1132
- cleanup();
1203
+ if (typeof code !== 'string' || !code || typeof state !== 'string' || !state) {
1204
+ fail('oauthFailed');
1133
1205
  return;
1134
1206
  }
1135
- btn.textContent = t('verifying', this.options.locale);
1207
+ exchanging = true;
1208
+ lockMethods();
1209
+ actions.hidden = true;
1210
+ closePopup();
1211
+ hint.textContent = t('verifying', locale);
1212
+ btn.textContent = t('verifying', locale);
1136
1213
  btn.disabled = true;
1137
1214
  try {
1138
1215
  const oauthBody = { provider: providerId, code, state };
1139
1216
  if (this.options.invitationId)
1140
1217
  oauthBody.invitationId = this.options.invitationId;
1141
- await this.http.post(`${servicePrefix}/api/oauth/login`, oauthBody);
1218
+ await this.http.post(`${servicePrefix}/api/oauth/login`, oauthBody, { signal: this.abort?.signal });
1142
1219
  succeed();
1143
1220
  }
1144
- catch (oauthErr) {
1145
- if (settled || !this.mounted || epoch !== this.generation)
1221
+ catch (err) {
1222
+ if (!current())
1146
1223
  return;
1147
- const errMsg = oauthErr instanceof Error ? oauthErr.message : '';
1148
- const errCode = oauthErr instanceof Error && 'code' in oauthErr ? oauthErr.code : '';
1149
- if (errCode === 'FORBIDDEN' || errMsg === 'registration_closed' || errCode === 'registration_closed') {
1150
- settled = true;
1224
+ const code = err instanceof Error && 'code' in err ? String(err.code) : '';
1225
+ const message = err instanceof Error ? err.message : '';
1226
+ if (code === 'FORBIDDEN' || code === 'registration_closed' || message === 'registration_closed') {
1151
1227
  cleanup();
1152
- this.showFullError(friendlyError(oauthErr, this.options.locale));
1153
- }
1154
- else {
1155
- restore();
1228
+ recovery.remove();
1229
+ this.showFullError(friendlyError(err, locale));
1156
1230
  }
1231
+ else
1232
+ fail('oauthFailed');
1157
1233
  }
1158
1234
  };
1159
- // popup.closed is not "user cancelled". Provider COOP and the callback's
1160
- // own window.close() both flip it. Dropping the message listener here is
1161
- // what made GitHub login fail: authorize succeeds, parent already gave up.
1162
- let pollTimer = setInterval(() => {
1235
+ this.oauthCleanup = () => { cleanup(); recovery.remove(); closePopup(); };
1236
+ window.addEventListener('message', onMessage);
1237
+ try {
1238
+ popup = window.open(loginUrl, 'oauth-login:popup', `left=${window.screenX + (window.innerWidth - 500) / 2},top=${window.screenY + (window.innerHeight - 620) / 2},width=500,height=620,resizable,scrollbars=yes,status=1,popup`);
1239
+ }
1240
+ catch { /* Treat a browser refusal like a blocked popup. */ }
1241
+ if (!popup) {
1242
+ fail('oauthBlocked');
1243
+ return;
1244
+ }
1245
+ hint.textContent = t('oauthWaiting', locale, { provider });
1246
+ btn.textContent = t('oauthWaiting', locale, { provider });
1247
+ btn.disabled = true;
1248
+ btn.classList.add('oauth-btn-loading');
1249
+ // COOP can report closed before the callback arrives. Keep the listener,
1250
+ // but show recovery immediately and never overlap server session probes.
1251
+ const checkSession = async () => {
1252
+ if (!current() || exchanging || probing)
1253
+ return;
1254
+ probing = true;
1255
+ try {
1256
+ const session = await this.http.get(`${servicePrefix}/api/did/session`);
1257
+ if (current() && !exchanging && session?.authenticated === true)
1258
+ succeed();
1259
+ }
1260
+ catch { /* A later probe or callback may still complete this attempt. */ }
1261
+ finally {
1262
+ probing = false;
1263
+ }
1264
+ };
1265
+ pollTimer = setInterval(() => {
1163
1266
  let closed = false;
1164
1267
  try {
1165
- closed = popup.closed;
1268
+ closed = !!popup?.closed;
1166
1269
  }
1167
1270
  catch {
1168
1271
  return;
1169
1272
  }
1170
- if (!closed)
1273
+ if (!closed || !current())
1171
1274
  return;
1172
- if (pollTimer !== undefined) {
1173
- clearInterval(pollTimer);
1174
- pollTimer = undefined;
1175
- }
1176
- restore();
1177
- const checkSession = () => {
1178
- void this.http
1179
- .get(`${servicePrefix}/api/did/session`)
1180
- .then((session) => {
1181
- if (session?.authenticated)
1182
- succeed();
1183
- })
1184
- .catch(() => {
1185
- /* keep waiting for postMessage or the next session probe */
1186
- });
1187
- };
1188
- checkSession();
1189
- sessionPollTimer = setInterval(checkSession, 500);
1275
+ clearInterval(pollTimer);
1276
+ showRecovery('oauthIncomplete');
1277
+ // Remain explicitly cancellable while a COOP callback may still arrive.
1278
+ cancel.hidden = false;
1279
+ void checkSession();
1280
+ sessionTimer = setInterval(() => { void checkSession(); }, 2000);
1190
1281
  }, 500);
1191
- const abandonTimer = setTimeout(() => {
1192
- if (settled)
1282
+ abandonTimer = setTimeout(() => {
1283
+ if (!current())
1193
1284
  return;
1285
+ if (!exchanging) {
1286
+ fail('oauthTimedOut');
1287
+ return;
1288
+ }
1289
+ // A request may have reached the server even if its response never arrived.
1290
+ // Do not promise cancellation or start a second exchange in that ambiguity.
1291
+ this.abort?.abort();
1194
1292
  cleanup();
1195
- restore();
1293
+ closePopup();
1294
+ lockMethods();
1295
+ hint.textContent = t('oauthUnconfirmed', locale);
1296
+ recovery.dataset.state = 'oauthUnconfirmed';
1297
+ actions.hidden = false;
1298
+ reopen.hidden = true;
1299
+ cancel.hidden = true;
1300
+ fullPage.href = window.location.href;
1301
+ fullPage.textContent = t('oauthCheckSession', locale);
1302
+ this.emit('incomplete');
1196
1303
  }, 5 * 60 * 1000);
1197
- const cleanup = () => {
1198
- settled = true;
1199
- btn.innerHTML = originalHTML;
1200
- btn.disabled = false;
1201
- btn.classList.remove('oauth-btn-loading');
1202
- if (pollTimer !== undefined) {
1203
- clearInterval(pollTimer);
1204
- pollTimer = undefined;
1205
- }
1206
- if (sessionPollTimer !== undefined) {
1207
- clearInterval(sessionPollTimer);
1208
- sessionPollTimer = undefined;
1209
- }
1210
- clearTimeout(abandonTimer);
1211
- window.removeEventListener('message', onMessage);
1212
- };
1213
- this.oauthCleanup = () => { cleanup(); recovery.remove(); try {
1214
- popup.close();
1215
- }
1216
- catch { /* COOP */ } };
1217
- window.addEventListener('message', onMessage);
1218
1304
  }
1219
1305
  // (removed dead code: renderEmailButton — email now renders through renderSecondaryGrid)
1220
1306
  /**
@@ -1240,6 +1326,7 @@ export class LoginPage {
1240
1326
  btn.dataset.provider = provider.id;
1241
1327
  const icon = getOAuthIcon(provider.id);
1242
1328
  btn.innerHTML = `${icon} ${escapeHtml(t('continueWith', locale, { provider: provider.name }))}`;
1329
+ this.markLastUsed(btn, `oauth:${provider.id}`, locale);
1243
1330
  grid.appendChild(btn);
1244
1331
  btn.addEventListener('click', () => {
1245
1332
  this.select('oauth');
@@ -1254,6 +1341,7 @@ export class LoginPage {
1254
1341
  btn.className = 'method-btn';
1255
1342
  btn.id = 'email-btn';
1256
1343
  btn.innerHTML = `${ICON_EMAIL} ${escapeHtml(t('emailButton', locale))}`;
1344
+ this.markLastUsed(btn, 'email', locale);
1257
1345
  grid.appendChild(btn);
1258
1346
  btn.addEventListener('click', () => {
1259
1347
  this.select('email');
@@ -1268,6 +1356,7 @@ export class LoginPage {
1268
1356
  // Use short label when sharing grid with other methods
1269
1357
  const walletLabel = grid.children.length > 0 ? t('didWalletButtonShort', locale) : t('didWalletButton', locale);
1270
1358
  btn.innerHTML = `${ICON_DID_WALLET} ${escapeHtml(walletLabel)}`;
1359
+ this.markLastUsed(btn, 'did-connect', locale);
1271
1360
  grid.appendChild(btn);
1272
1361
  btn.addEventListener('click', () => {
1273
1362
  this.select('did-connect');