@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.
- package/README.md +95 -3
- package/android/src/main/AndroidManifest.xml +24 -0
- package/android/src/main/java/uk/co/unisim/sdk/OAuthCallbackActivity.java +72 -0
- package/android/src/main/java/uk/co/unisim/sdk/UnisimSuiteAuthPlugin.java +129 -0
- package/dist/DeleteAccountDialog.d.ts +12 -0
- package/dist/DeleteAccountDialog.d.ts.map +1 -0
- package/dist/DeleteAccountDialog.js +185 -0
- package/dist/DeleteAccountDialog.js.map +1 -0
- package/dist/SignInDialog.d.ts.map +1 -1
- package/dist/SignInDialog.js +49 -3
- package/dist/SignInDialog.js.map +1 -1
- package/dist/UniversalAppsNavBar.d.ts +8 -1
- package/dist/UniversalAppsNavBar.d.ts.map +1 -1
- package/dist/UniversalAppsNavBar.js +2 -2
- package/dist/UniversalAppsNavBar.js.map +1 -1
- package/dist/UserProfile.d.ts +22 -1
- package/dist/UserProfile.d.ts.map +1 -1
- package/dist/UserProfile.js +26 -4
- package/dist/UserProfile.js.map +1 -1
- package/dist/deleteAccount.d.ts +32 -0
- package/dist/deleteAccount.d.ts.map +1 -0
- package/dist/deleteAccount.js +61 -0
- package/dist/deleteAccount.js.map +1 -0
- package/dist/deleteAccountCopy.d.ts +22 -0
- package/dist/deleteAccountCopy.d.ts.map +1 -0
- package/dist/deleteAccountCopy.js +217 -0
- package/dist/deleteAccountCopy.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/nativeOAuth.d.ts +208 -0
- package/dist/nativeOAuth.d.ts.map +1 -0
- package/dist/nativeOAuth.js +372 -0
- package/dist/nativeOAuth.js.map +1 -0
- package/dist/oauth.d.ts +6 -0
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +9 -1
- package/dist/oauth.js.map +1 -1
- package/ios/Sources/UnisimSuiteAuthPlugin/SuiteOAuth.swift +257 -0
- package/ios/Sources/UnisimSuiteAuthPlugin/UnisimSuiteAuthPlugin.swift +14 -1
- 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
|
|
76
|
-
|
|
77
|
-
|
|
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":"
|
|
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"}
|