@unisim/sdk 0.141.6 → 0.141.8

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.
Files changed (42) hide show
  1. package/README.md +95 -3
  2. package/android/src/main/AndroidManifest.xml +24 -0
  3. package/android/src/main/java/uk/co/unisim/sdk/OAuthCallbackActivity.java +72 -0
  4. package/android/src/main/java/uk/co/unisim/sdk/UnisimSuiteAuthPlugin.java +129 -0
  5. package/dist/DeleteAccountDialog.d.ts +12 -0
  6. package/dist/DeleteAccountDialog.d.ts.map +1 -0
  7. package/dist/DeleteAccountDialog.js +185 -0
  8. package/dist/DeleteAccountDialog.js.map +1 -0
  9. package/dist/SignInDialog.d.ts.map +1 -1
  10. package/dist/SignInDialog.js +49 -3
  11. package/dist/SignInDialog.js.map +1 -1
  12. package/dist/UniversalAppsNavBar.d.ts +8 -1
  13. package/dist/UniversalAppsNavBar.d.ts.map +1 -1
  14. package/dist/UniversalAppsNavBar.js +2 -2
  15. package/dist/UniversalAppsNavBar.js.map +1 -1
  16. package/dist/UserProfile.d.ts +22 -1
  17. package/dist/UserProfile.d.ts.map +1 -1
  18. package/dist/UserProfile.js +26 -4
  19. package/dist/UserProfile.js.map +1 -1
  20. package/dist/deleteAccount.d.ts +32 -0
  21. package/dist/deleteAccount.d.ts.map +1 -0
  22. package/dist/deleteAccount.js +61 -0
  23. package/dist/deleteAccount.js.map +1 -0
  24. package/dist/deleteAccountCopy.d.ts +22 -0
  25. package/dist/deleteAccountCopy.d.ts.map +1 -0
  26. package/dist/deleteAccountCopy.js +217 -0
  27. package/dist/deleteAccountCopy.js.map +1 -0
  28. package/dist/index.d.ts +8 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/nativeOAuth.d.ts +208 -0
  33. package/dist/nativeOAuth.d.ts.map +1 -0
  34. package/dist/nativeOAuth.js +372 -0
  35. package/dist/nativeOAuth.js.map +1 -0
  36. package/dist/oauth.d.ts +6 -0
  37. package/dist/oauth.d.ts.map +1 -1
  38. package/dist/oauth.js +9 -1
  39. package/dist/oauth.js.map +1 -1
  40. package/ios/Sources/UnisimSuiteAuthPlugin/SuiteOAuth.swift +257 -0
  41. package/ios/Sources/UnisimSuiteAuthPlugin/UnisimSuiteAuthPlugin.swift +14 -1
  42. package/package.json +3 -1
package/README.md CHANGED
@@ -72,9 +72,10 @@ function Header() {
72
72
  Apple has no such parameter). A password is a quiet second route on the code
73
73
  tab: it signs an existing account in and never creates one, and there is no
74
74
  password reset — the code is the way back in. The provider tab appears **only
75
- for providers the Supabase project has switched on**, and **never in a native
76
- (Capacitor) shell**; without it there is no tab bar at all. See the header of
77
- `SignInDialog.tsx`.
75
+ for providers the Supabase project has switched on**; without it there is no
76
+ tab bar at all. In a native (Capacitor) shell the buttons use the system
77
+ browser / Apple's own sheet instead of the web round trip — see [Provider
78
+ sign-in in the phone apps](#provider-sign-in-in-the-phone-apps-apple--google--microsoft).
78
79
  - `sendSignInCode(supabase, { email })` / `verifySignInCode(supabase, { email,
79
80
  code, flow })` — the code tab's logic, for other sign-in screens (the hub's).
80
81
  A trial session gets an email-change code, verified as `email_change`, so the
@@ -85,6 +86,10 @@ function Header() {
85
86
  with `linkIdentity`, never replaced.
86
87
  - `fetchEnabledOAuthProviders(supabaseUrl, anonKey)` — which providers are on,
87
88
  from `/auth/v1/settings`; `[]` on any doubt.
89
+ - `startNativeOAuthSignIn(supabase, provider, { supabaseUrl, anonKey, loginHint })`
90
+ — the same thing inside a Capacitor app; resolves `signed-in` / `cancelled` /
91
+ `error` when the round trip is over. `nativeOAuthSupport()` /
92
+ `nativeProvidersToOffer()` decide whether to offer it.
88
93
  - `<OAuthButtons providers={…} />` — the buttons. Without `providers` it shows
89
94
  Google and Microsoft only, because the hub's labels predate Apple.
90
95
 
@@ -115,6 +120,18 @@ function Header() {
115
120
  `<UserProfile />` when its account header is clicked; pass
116
121
  `showLimits={false}` to the navbar's profile if a product shows entitlements
117
122
  its own way.
123
+ - **Delete my account** (since 0.141.7) — a row under Sign out in that same
124
+ account panel, opening `<DeleteAccountDialog />`: it warns that the Universal
125
+ ID goes in **every** UNI·SIM product, needs `delete-all` typed, calls the
126
+ platform's `delete-account` function and signs out locally. App Review
127
+ 5.1.1(v) and Google Play both require in-app deletion for an app whose
128
+ sign-in creates accounts, so it is **on by default inside a native
129
+ (Capacitor) shell and off in a browser**; `showDeleteAccount` on
130
+ `<UserProfile />` / `<UniversalAppsNavBar />` overrides it either way. ⚠️ An
131
+ app that draws its own delete row passes `false` (Universal PDF does, or a
132
+ phone shows two). `deleteMyAccount()`, `DeleteAccountDialog` and
133
+ `deleteAccountCopy()` are exported for an app that wants them elsewhere.
134
+ `npm run test:delete-account` (39 checks).
118
135
 
119
136
  ### Org admin
120
137
  - `useOrgMembers()` / `useOrgSeats()` / `useAuditLog()`
@@ -345,6 +362,81 @@ app actually got — a build that quietly landed on `native-local` still signs i
345
362
  it just does not carry to the other apps, and nothing about the behaviour makes
346
363
  that visible.
347
364
 
365
+ ## Provider sign-in in the phone apps (Apple / Google / Microsoft)
366
+
367
+ `<SignInDialog />` offers the Apple / Google / Microsoft tab inside a Capacitor
368
+ app too (since 0.141.8). The web round trip cannot work there — it returns to
369
+ `capacitor://localhost`, which is on no redirect allowlist; Google refuses
370
+ sign-in inside an embedded web view (`403 disallowed_useragent`); and
371
+ navigating the app's only web view away unloads the app — so a native shell
372
+ does it the way native apps must:
373
+
374
+ | | iOS | Android |
375
+ | --- | --- | --- |
376
+ | Apple | the OS's **Sign in with Apple sheet** → Supabase `id_token` grant | the system browser, like the others |
377
+ | Google / Microsoft | **`ASWebAuthenticationSession`** → Supabase `/authorize` | a **Custom Tab** → Supabase `/authorize` |
378
+ | Comes back to | the session's own completion handler | `OAuthCallbackActivity`, merged in from the SDK's manifest |
379
+ | Callback address | `<bundle id>://auth-callback` | `<applicationId>://auth-callback` |
380
+ | Per-app config | the `com.apple.developer.applesignin` entitlement | none |
381
+
382
+ Source: `src/nativeOAuth.ts`, `ios/Sources/UnisimSuiteAuthPlugin/SuiteOAuth.swift`,
383
+ `android/src/main/java/uk/co/unisim/sdk/OAuthCallbackActivity.java`. The three
384
+ native methods (`oauthSupport`, `oauthStart`, `appleSignIn`) live on the
385
+ existing `UnisimSuiteAuth` plugin, for the same reason the app-opening methods
386
+ do: a new plugin class is absent from every app until each one re-syncs.
387
+
388
+ What it guarantees, each pinned by `npm run test:native-oauth`:
389
+
390
+ - **The session is suite-wide.** It is installed with `supabase.auth.setSession`,
391
+ which writes through the shared suite store above — one sign-in on the phone
392
+ signs in every suite app, exactly like the email code.
393
+ - **A trial session is linked, never replaced** — the browser leg goes through
394
+ `/user/identities/authorize` with the trial's bearer token, the Apple leg
395
+ through the `id_token` grant with `link_identity`, and a failed link is
396
+ returned, never retried as a sign-in. `identity_already_exists` and
397
+ `manual_linking_disabled` arrive with the web flow's codes, so the dialog's
398
+ collision panel works unchanged. (The native "leave my trial behind" path
399
+ does not sign out first: the new session replaces the trial only when it
400
+ lands, so cancelling keeps the trial.)
401
+ - **PKCE, and only a code is accepted back.** S256 where WebCrypto exists,
402
+ `plain` otherwise (supabase-js's own fallback). Tokens in a fragment, or a
403
+ callback on any address but this app's own, are refused — on Android any app
404
+ can fire a deep link at us, and a code is worthless without the verifier.
405
+ - **Nothing appears until it can work.** The tab needs the provider switched
406
+ on in Supabase *and* the plugin's native half (an app synced against an older
407
+ SDK shows no tab). **On iPhone it also needs Apple switched on**: App Review
408
+ 4.8 will not take Google or Microsoft in an iPhone app without Sign in with
409
+ Apple beside them, so with Apple off the app offers the email code alone.
410
+
411
+ ### Turning it on for an app
412
+
413
+ 1. Depend on `@unisim/sdk` ≥ 0.141.8 and `npm run cap:sync`. Android needs
414
+ nothing more.
415
+ 2. iOS: `node ../universal-platform/scripts/add-sign-in-with-apple.mjs <path-to-app-repo>`
416
+ (after `add-suite-keychain.mjs`, which creates the entitlements file), then
417
+ rebuild. The App ID needs the **Sign in with Apple** capability as well.
418
+ 3. The project — console settings, recorded nowhere in code:
419
+ - every `<bundle id>://auth-callback` on the Supabase **redirect allowlist**;
420
+ - every iOS bundle id in the **Apple provider's Client IDs** (beside the web
421
+ Services ID) — the sheet's token is issued to the bundle id;
422
+ - **Allow manual linking** on (trials link);
423
+ - the providers themselves switched on.
424
+
425
+ ⚠️ **Every one of those fails far from its cause:**
426
+
427
+ | Missing | Looks like |
428
+ | --- | --- |
429
+ | the callback on the allowlist | GoTrue silently sends the browser to the Site URL; the sheet sits on the website and never comes back |
430
+ | the bundle id in Apple's Client IDs | the Apple sheet succeeds, then Supabase refuses the token's audience |
431
+ | the entitlement | the Apple sheet fails at once with ASAuthorizationError 1000 — the same code as a device with no Apple ID |
432
+ | the App ID capability | a device build fails to provision; a simulator build is fine, so it proves nothing |
433
+ | manual linking | every trial visitor gets "can't link" |
434
+ | a re-sync against this SDK | no provider tab at all |
435
+
436
+ Known limit: on Android, if the system kills the app while the browser is up,
437
+ the callback arrives with nobody holding the PKCE verifier; the app comes back
438
+ to the front and the person signs in again.
439
+
348
440
  ## Opening a suite app instead of its website
349
441
 
350
442
  On a phone, a switcher row for a product you have installed opens **the app**,
@@ -51,6 +51,16 @@
51
51
  3. The PROVIDER, whose authority is built from ${applicationId} so each app
52
52
  ends up with its own. They cannot share one authority — two apps claiming
53
53
  the same one cannot be installed side by side.
54
+
55
+ 4. The OAUTH CALLBACK ACTIVITY, which receives
56
+ `<applicationId>://auth-callback?code=…` at the end of an Apple / Google /
57
+ Microsoft sign-in (src/nativeOAuth.ts). Its scheme is ${applicationId},
58
+ expanded per app by manifest merging, so no app carries an intent filter
59
+ of its own for it — and every one of those addresses must be on the
60
+ Supabase redirect allowlist, or GoTrue silently sends the browser to the
61
+ Site URL instead and the app never hears back. A separate activity, not
62
+ MainActivity, so the callback never reaches Capacitor's `appUrlOpen`
63
+ (Universal PDF opens every VIEW intent there as a document).
54
64
  -->
55
65
  <manifest xmlns:android="http://schemas.android.com/apk/res/android">
56
66
 
@@ -95,6 +105,20 @@
95
105
  android:exported="true"
96
106
  android:grantUriPermissions="false"
97
107
  android:permission="uk.co.unisim.suite.permission.SUITE_AUTH" />
108
+
109
+ <activity
110
+ android:name="uk.co.unisim.sdk.OAuthCallbackActivity"
111
+ android:exported="true"
112
+ android:excludeFromRecents="true"
113
+ android:noHistory="true"
114
+ android:theme="@android:style/Theme.Translucent.NoTitleBar">
115
+ <intent-filter>
116
+ <action android:name="android.intent.action.VIEW" />
117
+ <category android:name="android.intent.category.DEFAULT" />
118
+ <category android:name="android.intent.category.BROWSABLE" />
119
+ <data android:scheme="${applicationId}" android:host="auth-callback" />
120
+ </intent-filter>
121
+ </activity>
98
122
  </application>
99
123
 
100
124
  </manifest>
@@ -0,0 +1,72 @@
1
+ package uk.co.unisim.sdk;
2
+
3
+ import android.app.Activity;
4
+ import android.content.Context;
5
+ import android.content.Intent;
6
+ import android.net.Uri;
7
+ import android.os.Bundle;
8
+
9
+ /**
10
+ * Receives {@code <applicationId>://auth-callback?code=…} — the deep link
11
+ * Supabase sends the browser to at the end of an Apple / Google / Microsoft
12
+ * sign-in started by {@link UnisimSuiteAuthPlugin#oauthStart} — hands the URL
13
+ * to the waiting plugin call, and puts the app back in front.
14
+ *
15
+ * <p>Declared in the SDK's own {@code AndroidManifest.xml} with the scheme
16
+ * {@code ${applicationId}}, which manifest merging expands per app, so no app
17
+ * needs an intent filter of its own. It is deliberately NOT the app's
18
+ * MainActivity: routing the callback through the launcher activity would hand
19
+ * it to Capacitor's {@code appUrlOpen}, and Universal PDF (for one) already
20
+ * treats every VIEW intent there as a document to open.
21
+ *
22
+ * <p>⚠️ <b>Why it starts the app's activity with CLEAR_TOP rather than just
23
+ * finishing.</b> The Custom Tab runs INSIDE the app's task, and this activity
24
+ * lands on top of it. Finishing alone would reveal the Custom Tab again,
25
+ * still showing the provider's last page. Relaunching the activity that
26
+ * opened the tab with {@code FLAG_ACTIVITY_CLEAR_TOP} pops both the tab and
27
+ * this activity off the stack in one move — the same trick AppAuth uses.
28
+ *
29
+ * <p>A callback nobody is waiting for (the process died while the browser was
30
+ * up, or the person had already come back and cancelled) is dropped: the
31
+ * PKCE verifier that would redeem its code lived in the JavaScript that is
32
+ * gone, so there is nothing it could be exchanged with. The app still comes
33
+ * to the front, and the person simply tries again.
34
+ */
35
+ public class OAuthCallbackActivity extends Activity {
36
+
37
+ /** The host of every app's callback URL — mirrors NATIVE_OAUTH_CALLBACK_HOST in nativeOAuth.ts. */
38
+ public static final String HOST = "auth-callback";
39
+
40
+ /** The activity that opened the browser, to bring back. Set by the plugin. */
41
+ static volatile Class<? extends Activity> returnTo;
42
+
43
+ /** {@code <applicationId>://auth-callback} — the address on the Supabase allowlist. */
44
+ static String callbackUrl(Context context) {
45
+ return context.getPackageName() + "://" + HOST;
46
+ }
47
+
48
+ @Override
49
+ protected void onCreate(Bundle savedInstanceState) {
50
+ super.onCreate(savedInstanceState);
51
+
52
+ Intent intent = getIntent();
53
+ Uri data = intent != null ? intent.getData() : null;
54
+ if (data != null
55
+ && HOST.equalsIgnoreCase(data.getHost())
56
+ && getPackageName().equalsIgnoreCase(data.getScheme())) {
57
+ UnisimSuiteAuthPlugin.deliverOAuthRedirect(data.toString());
58
+ }
59
+
60
+ Intent back = null;
61
+ Class<? extends Activity> target = returnTo;
62
+ if (target != null) {
63
+ back = new Intent(this, target);
64
+ back.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
65
+ } else {
66
+ back = getPackageManager().getLaunchIntentForPackage(getPackageName());
67
+ if (back != null) back.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
68
+ }
69
+ if (back != null) startActivity(back);
70
+ finish();
71
+ }
72
+ }
@@ -1,7 +1,11 @@
1
1
  package uk.co.unisim.sdk;
2
2
 
3
+ import android.app.Activity;
4
+ import android.content.ActivityNotFoundException;
3
5
  import android.content.Intent;
4
6
  import android.content.pm.PackageManager;
7
+ import android.net.Uri;
8
+ import android.os.Bundle;
5
9
 
6
10
  import com.getcapacitor.JSArray;
7
11
  import com.getcapacitor.JSObject;
@@ -13,6 +17,7 @@ import com.getcapacitor.annotation.CapacitorPlugin;
13
17
  import org.json.JSONArray;
14
18
  import org.json.JSONObject;
15
19
 
20
+ import java.lang.ref.WeakReference;
16
21
  import java.util.ArrayList;
17
22
  import java.util.List;
18
23
 
@@ -211,4 +216,128 @@ public class UnisimSuiteAuthPlugin extends Plugin {
211
216
  call.reject("Could not open " + pkg + ": " + e.getMessage(), e);
212
217
  }
213
218
  }
219
+
220
+ // ─────────────────────────────────────────────────────────────────────────
221
+ // Apple / Google / Microsoft sign-in — the Android half of nativeOAuth.ts
222
+ //
223
+ // All three providers go through the system browser here (Android has no
224
+ // Sign in with Apple sheet). The page opens in a Custom Tab where the
225
+ // browser supports one and as an ordinary browser page otherwise; either
226
+ // way it is the browser's own engine and cookies, not our WebView, which is
227
+ // what Google insists on. Supabase finishes by sending the browser to
228
+ // `<applicationId>://auth-callback?code=…`, which OAuthCallbackActivity
229
+ // (declared in this module's manifest) receives and hands back here.
230
+ //
231
+ // ⚠️ The Custom Tab is requested by hand — ACTION_VIEW plus the
232
+ // `EXTRA_SESSION` extra, which is the whole of the Custom Tabs protocol —
233
+ // rather than through androidx.browser, so this module carries no new
234
+ // dependency into fourteen apps' Gradle builds.
235
+ //
236
+ // ⚠️ "The person came back without finishing" has no callback of its own.
237
+ // It is inferred the way AppAuth infers it: the app was paused by the
238
+ // browser and is now resuming with the call still open. A real callback
239
+ // always settles the call BEFORE the activity resumes (the callback
240
+ // activity delivers in onCreate, then relaunches us), so the two cannot
241
+ // be confused.
242
+ // ─────────────────────────────────────────────────────────────────────────
243
+
244
+ private static final String EXTRA_CUSTOM_TABS_SESSION = "android.support.customtabs.extra.SESSION";
245
+
246
+ /** The plugin instance with a sign-in in flight, for OAuthCallbackActivity. */
247
+ private static WeakReference<UnisimSuiteAuthPlugin> oauthOwner = new WeakReference<>(null);
248
+
249
+ private PluginCall pendingOAuth;
250
+ private boolean oauthLeftApp;
251
+
252
+ @PluginMethod
253
+ public void oauthSupport(PluginCall call) {
254
+ JSObject result = new JSObject();
255
+ result.put("platform", "android");
256
+ result.put("callbackUrl", OAuthCallbackActivity.callbackUrl(getContext()));
257
+ result.put("appleNative", false);
258
+ call.resolve(result);
259
+ }
260
+
261
+ @PluginMethod
262
+ public void oauthStart(PluginCall call) {
263
+ String url = call.getString("url");
264
+ if (url == null || !url.startsWith("https://")) {
265
+ call.reject("url must be an https:// address");
266
+ return;
267
+ }
268
+ Activity activity = getActivity();
269
+ if (activity == null) {
270
+ call.reject("No activity to open the sign-in page from");
271
+ return;
272
+ }
273
+
274
+ // One at a time: an earlier attempt still open is settled as cancelled.
275
+ settleOAuth(null);
276
+
277
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
278
+ intent.addCategory(Intent.CATEGORY_BROWSABLE);
279
+ Bundle extras = new Bundle();
280
+ extras.putBinder(EXTRA_CUSTOM_TABS_SESSION, null);
281
+ intent.putExtras(extras);
282
+
283
+ synchronized (UnisimSuiteAuthPlugin.class) {
284
+ pendingOAuth = call;
285
+ oauthLeftApp = false;
286
+ oauthOwner = new WeakReference<>(this);
287
+ OAuthCallbackActivity.returnTo = activity.getClass();
288
+ }
289
+
290
+ try {
291
+ activity.startActivity(intent);
292
+ } catch (ActivityNotFoundException e) {
293
+ synchronized (UnisimSuiteAuthPlugin.class) {
294
+ pendingOAuth = null;
295
+ }
296
+ call.reject("No browser is installed to sign in with", e);
297
+ }
298
+ }
299
+
300
+ /** Called by OAuthCallbackActivity with the full callback URL. */
301
+ static void deliverOAuthRedirect(String url) {
302
+ UnisimSuiteAuthPlugin owner;
303
+ synchronized (UnisimSuiteAuthPlugin.class) {
304
+ owner = oauthOwner.get();
305
+ }
306
+ if (owner != null) owner.settleOAuth(url);
307
+ }
308
+
309
+ /** Resolve the open call with the callback URL, or as cancelled when null. */
310
+ private void settleOAuth(String url) {
311
+ PluginCall call;
312
+ synchronized (UnisimSuiteAuthPlugin.class) {
313
+ call = pendingOAuth;
314
+ pendingOAuth = null;
315
+ }
316
+ if (call == null) return;
317
+ JSObject result = new JSObject();
318
+ if (url != null) {
319
+ result.put("url", url);
320
+ } else {
321
+ result.put("cancelled", true);
322
+ }
323
+ call.resolve(result);
324
+ }
325
+
326
+ @Override
327
+ protected void handleOnPause() {
328
+ super.handleOnPause();
329
+ synchronized (UnisimSuiteAuthPlugin.class) {
330
+ if (pendingOAuth != null) oauthLeftApp = true;
331
+ }
332
+ }
333
+
334
+ @Override
335
+ protected void handleOnResume() {
336
+ super.handleOnResume();
337
+ boolean abandoned;
338
+ synchronized (UnisimSuiteAuthPlugin.class) {
339
+ abandoned = pendingOAuth != null && oauthLeftApp;
340
+ }
341
+ if (abandoned) settleOAuth(null);
342
+ }
214
343
  }
@@ -0,0 +1,12 @@
1
+ import { type MenuTheme } from './menuTheme.js';
2
+ export interface DeleteAccountDialogProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ /** The account being deleted, shown in the warning so nobody deletes the wrong one. */
6
+ email?: string;
7
+ theme?: MenuTheme;
8
+ /** Called once the account is gone and this device is signed out. */
9
+ onDeleted?: () => void;
10
+ }
11
+ export declare function DeleteAccountDialog(props: DeleteAccountDialogProps): import("react/jsx-runtime").JSX.Element | null;
12
+ //# sourceMappingURL=DeleteAccountDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteAccountDialog.d.ts","sourceRoot":"","sources":["../src/DeleteAccountDialog.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AA6BrD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,kDAQlE"}
@@ -0,0 +1,185 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { NAV_OVERLAY_Z_INDEX } from './DropdownSurface.js';
6
+ import { MENU } from './menuTheme.js';
7
+ import { useLanguage, useUniversal } from './provider.js';
8
+ import { deleteAccountCopy } from './deleteAccountCopy.js';
9
+ import { DELETE_ACCOUNT_PHRASE, deleteMyAccount, isDeleteAccountConfirmed, } from './deleteAccount.js';
10
+ export function DeleteAccountDialog(props) {
11
+ // The body mounts only while open, so every opening starts with an empty box
12
+ // and a dead button — no clearing effect, and no frame where the last
13
+ // opening's typed phrase is still there with the button already live.
14
+ // It is also what keeps `useUniversal()` from being called by a host that
15
+ // renders <UserProfile /> outside a provider and never opens this.
16
+ if (!props.open || typeof document === 'undefined')
17
+ return null;
18
+ return _jsx(DeleteAccountBody, { ...props });
19
+ }
20
+ function DeleteAccountBody({ onClose, email, theme = 'light', onDeleted }) {
21
+ const { language } = useLanguage();
22
+ const { supabase } = useUniversal();
23
+ const copy = deleteAccountCopy(language);
24
+ const p = MENU[theme];
25
+ const [typed, setTyped] = useState('');
26
+ const [busy, setBusy] = useState(false);
27
+ const [error, setError] = useState(null);
28
+ const [done, setDone] = useState(false);
29
+ // Escape is Cancel. Not while the request is in flight: the account may
30
+ // already be half gone, and the answer is worth waiting for. Capture phase,
31
+ // so the menu underneath doesn't read the same key as "close me" too.
32
+ useEffect(() => {
33
+ function onKey(e) {
34
+ if (e.key !== 'Escape' || busy)
35
+ return;
36
+ e.stopPropagation();
37
+ e.preventDefault();
38
+ onClose();
39
+ }
40
+ document.addEventListener('keydown', onKey, true);
41
+ return () => document.removeEventListener('keydown', onKey, true);
42
+ }, [busy, onClose]);
43
+ const confirmed = isDeleteAccountConfirmed(typed);
44
+ async function run() {
45
+ if (!confirmed || busy)
46
+ return;
47
+ setBusy(true);
48
+ setError(null);
49
+ const result = await deleteMyAccount(supabase, copy.fallbackError);
50
+ setBusy(false);
51
+ if (result.ok) {
52
+ setDone(true);
53
+ onDeleted?.();
54
+ }
55
+ else {
56
+ setError(result.error);
57
+ }
58
+ }
59
+ return createPortal(_jsx("div", { style: overlayStyle, role: "presentation", onClick: (e) => {
60
+ // The backdrop is Cancel, the safe answer, except mid-request.
61
+ if (e.target === e.currentTarget && !busy)
62
+ onClose();
63
+ }, children: _jsx("div", { role: "dialog", "aria-modal": "true", "aria-labelledby": "unisim-delete-account-title", "data-testid": "unisim-delete-account-dialog", style: cardStyle(p), children: done ? (_jsxs(_Fragment, { children: [_jsx("h2", { id: "unisim-delete-account-title", style: titleStyle(p.text), children: copy.doneTitle }), _jsx("p", { style: bodyStyle(p), children: copy.doneBody }), _jsx("div", { style: buttonRowStyle, children: _jsx("button", { type: "button", onClick: onClose, autoFocus: true, style: dangerButtonStyle(false), children: copy.close }) })] })) : (_jsxs(_Fragment, { children: [_jsx("h2", { id: "unisim-delete-account-title", style: titleStyle(p.danger), children: copy.title }), _jsxs("div", { style: scrollStyle, children: [_jsxs("p", { style: bodyStyle(p), children: [copy.introBefore, email ? (_jsxs(_Fragment, { children: [' ', "(", _jsx("strong", { style: { color: p.text, wordBreak: 'break-all' }, children: email }), ")"] })) : null, ' ', copy.introAfter] }), _jsx("ul", { style: listStyle(p), children: copy.bullets.map((b) => _jsx("li", { style: { marginTop: 6 }, children: b }, b)) }), _jsxs("label", { htmlFor: "unisim-delete-account-confirm", style: labelStyle(p), children: [copy.confirmBefore, ' ', _jsx("span", { style: { fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace', fontWeight: 700, color: p.danger }, children: DELETE_ACCOUNT_PHRASE }), ' ', copy.confirmAfter] }), _jsx("input", { id: "unisim-delete-account-confirm", value: typed, onChange: (e) => setTyped(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter')
64
+ void run(); }, placeholder: DELETE_ACCOUNT_PHRASE, autoCapitalize: "none", autoCorrect: "off", autoComplete: "off", spellCheck: false, disabled: busy, style: inputStyle(p) }), error && (_jsx("div", { role: "alert", style: errorStyle(p), children: error }))] }), _jsxs("div", { style: buttonRowStyle, children: [_jsx("button", { type: "button", onClick: onClose, disabled: busy, autoFocus: true, style: cancelButtonStyle(p, busy), children: copy.cancel }), _jsx("button", { type: "button", onClick: () => void run(), disabled: !confirmed || busy, style: dangerButtonStyle(!confirmed || busy), children: busy ? copy.deleting : copy.row })] })] })) }) }), document.body);
65
+ }
66
+ const overlayStyle = {
67
+ position: 'fixed',
68
+ inset: 0,
69
+ background: 'rgba(15, 23, 42, 0.5)',
70
+ display: 'flex',
71
+ alignItems: 'center',
72
+ justifyContent: 'center',
73
+ // The notch and the home indicator: a phone is where this dialog matters.
74
+ padding: 'max(16px, env(safe-area-inset-top)) 16px max(16px, env(safe-area-inset-bottom))',
75
+ boxSizing: 'border-box',
76
+ zIndex: NAV_OVERLAY_Z_INDEX + 100,
77
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif",
78
+ };
79
+ const cardStyle = (p) => ({
80
+ width: '100%',
81
+ maxWidth: 420,
82
+ maxHeight: '100%',
83
+ display: 'flex',
84
+ flexDirection: 'column',
85
+ background: p.surface,
86
+ color: p.text,
87
+ borderRadius: 16,
88
+ border: `1px solid ${p.border}`,
89
+ boxShadow: p.shadow,
90
+ padding: '22px 22px 18px',
91
+ boxSizing: 'border-box',
92
+ });
93
+ // Only the middle scrolls, so the two buttons stay on screen on a short phone
94
+ // with the keyboard up.
95
+ const scrollStyle = {
96
+ minHeight: 0,
97
+ flex: 1,
98
+ overflowY: 'auto',
99
+ margin: '0 -22px',
100
+ padding: '0 22px',
101
+ };
102
+ const titleStyle = (color) => ({
103
+ margin: 0,
104
+ fontSize: 18,
105
+ fontWeight: 700,
106
+ letterSpacing: '-0.01em',
107
+ color,
108
+ flexShrink: 0,
109
+ });
110
+ const bodyStyle = (p) => ({
111
+ margin: '10px 0 0',
112
+ fontSize: 14,
113
+ lineHeight: 1.5,
114
+ color: p.body,
115
+ });
116
+ const listStyle = (p) => ({
117
+ margin: '10px 0 0',
118
+ paddingLeft: 18,
119
+ fontSize: 12.5,
120
+ lineHeight: 1.5,
121
+ color: p.muted,
122
+ });
123
+ const labelStyle = (p) => ({
124
+ display: 'block',
125
+ margin: '16px 0 6px',
126
+ fontSize: 12.5,
127
+ fontWeight: 600,
128
+ color: p.body,
129
+ });
130
+ /**
131
+ * ⚠️ 16px on purpose, not a taste call: iOS zooms the page in on focus below
132
+ * that, and does not zoom back out.
133
+ */
134
+ const inputStyle = (p) => ({
135
+ width: '100%',
136
+ padding: '9px 11px',
137
+ borderRadius: 9,
138
+ border: `1px solid ${p.danger}`,
139
+ background: p.inputBg,
140
+ color: p.inputText,
141
+ fontSize: 16,
142
+ boxSizing: 'border-box',
143
+ outline: 'none',
144
+ });
145
+ const errorStyle = (p) => ({
146
+ marginTop: 12,
147
+ padding: '8px 11px',
148
+ borderRadius: 9,
149
+ background: p.dangerHoverBg,
150
+ color: p.dangerHoverText,
151
+ fontSize: 12.5,
152
+ lineHeight: 1.45,
153
+ });
154
+ const buttonRowStyle = {
155
+ display: 'flex',
156
+ flexWrap: 'wrap',
157
+ justifyContent: 'flex-end',
158
+ gap: 8,
159
+ marginTop: 16,
160
+ flexShrink: 0,
161
+ };
162
+ const cancelButtonStyle = (p, disabled) => ({
163
+ padding: '10px 16px',
164
+ borderRadius: 10,
165
+ border: `1px solid ${p.border}`,
166
+ background: 'transparent',
167
+ color: p.body,
168
+ fontSize: 14,
169
+ fontWeight: 600,
170
+ cursor: disabled ? 'default' : 'pointer',
171
+ opacity: disabled ? 0.5 : 1,
172
+ });
173
+ // White on red-700 is 6.5:1, so it holds on both palettes.
174
+ const dangerButtonStyle = (disabled) => ({
175
+ padding: '10px 16px',
176
+ borderRadius: 10,
177
+ border: 0,
178
+ background: '#b91c1c',
179
+ color: '#ffffff',
180
+ fontSize: 14,
181
+ fontWeight: 600,
182
+ cursor: disabled ? 'default' : 'pointer',
183
+ opacity: disabled ? 0.5 : 1,
184
+ });
185
+ //# sourceMappingURL=DeleteAccountDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteAccountDialog.js","sourceRoot":"","sources":["../src/DeleteAccountDialog.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SignInDialog.d.ts","sourceRoot":"","sources":["../src/SignInDialog.tsx"],"names":[],"mappings":"AAuEA;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAA;AAEpE,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,qFAAqF;IACrF,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAC/B;AA2BD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,WAAsB,GACvB,EAAE,iBAAiB,sCA8bnB"}
1
+ {"version":3,"file":"SignInDialog.d.ts","sourceRoot":"","sources":["../src/SignInDialog.tsx"],"names":[],"mappings":"AA+EA;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAA;AAEpE,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,qFAAqF;IACrF,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAC/B;AA2BD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,WAAsB,GACvB,EAAE,iBAAiB,sCAwenB"}