ugly-app 0.1.1076 → 0.1.1077
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 +2 -0
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/InstallPrompt.d.ts +25 -0
- package/dist/client/InstallPrompt.d.ts.map +1 -0
- package/dist/client/InstallPrompt.js +213 -0
- package/dist/client/InstallPrompt.js.map +1 -0
- package/dist/client/LoginPopup.d.ts.map +1 -1
- package/dist/client/LoginPopup.js +8 -0
- package/dist/client/LoginPopup.js.map +1 -1
- package/dist/client/NewVersionBanner.d.ts +8 -0
- package/dist/client/NewVersionBanner.d.ts.map +1 -0
- package/dist/client/NewVersionBanner.js +30 -0
- package/dist/client/NewVersionBanner.js.map +1 -0
- package/dist/client/auth/startLogin.d.ts +27 -0
- package/dist/client/auth/startLogin.d.ts.map +1 -1
- package/dist/client/auth/startLogin.js +90 -1
- package/dist/client/auth/startLogin.js.map +1 -1
- package/dist/client/bootstrapApp.d.ts +17 -0
- package/dist/client/bootstrapApp.d.ts.map +1 -1
- package/dist/client/bootstrapApp.js +28 -3
- package/dist/client/bootstrapApp.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/installPromptLogic.d.ts +33 -0
- package/dist/client/installPromptLogic.d.ts.map +1 -0
- package/dist/client/installPromptLogic.js +64 -0
- package/dist/client/installPromptLogic.js.map +1 -0
- package/dist/client/staleBuild.d.ts +38 -0
- package/dist/client/staleBuild.d.ts.map +1 -0
- package/dist/client/staleBuild.js +244 -0
- package/dist/client/staleBuild.js.map +1 -0
- package/package.json +2 -2
- package/src/cli/version.ts +1 -1
- package/src/client/InstallPrompt.tsx +289 -0
- package/src/client/LoginPopup.tsx +11 -0
- package/src/client/NewVersionBanner.tsx +53 -0
- package/src/client/auth/startLogin.test.ts +118 -1
- package/src/client/auth/startLogin.ts +96 -1
- package/src/client/bootstrapApp.tsx +59 -1
- package/src/client/index.ts +4 -0
- package/src/client/installPromptLogic.test.ts +113 -0
- package/src/client/installPromptLogic.ts +91 -0
- package/src/client/staleBuild.test.ts +130 -0
- package/src/client/staleBuild.ts +274 -0
package/README.md
CHANGED
|
@@ -399,6 +399,8 @@ bootstrapApp({
|
|
|
399
399
|
| `strings?` | Localization config — when present, wraps the tree with `<StringsProvider>`. |
|
|
400
400
|
| `keyboard?: false` | Disable the framework `<KeyboardProvider>` wrapper. |
|
|
401
401
|
| `billingBanner?: false` | Disable the out-of-credit banner. Only set on apps where the developer pays for AI (owner-billed proxy token) — apps that make user-billed calls should leave it on so a user with no credit sees a warning instead of silent request failures. Has no effect inside Ugly Studio (which shows its own). |
|
|
402
|
+
| `autoReloadOnNewBuild?: false` | Disable the automatic stale-build reload. By default, a page that was hidden or just resumed reloads onto a newer deploy; a page in active use gets a `<NewVersionBanner>` and reloads on next resume. Inert in dev (no build id). |
|
|
403
|
+
| `installPrompt?: boolean` | Opt in to the framework-level "Install <app>" banner on mobile browsers (Android Chromium install dialog, iOS "Add to Home Screen" hint). Default off. Shown to signed-in sessions only, never when already installed, framed, inside a native Ugly host, or on desktop. Apps can place `<InstallPrompt />` themselves instead. |
|
|
402
404
|
| `silentSso?` | Apex-domain apps that use ugly.bot as their auth authority but don't share its cookie. When `true`, a logged-out boot attempts a top-level SSO redirect (once per tab) to adopt an existing ugly.bot session. Leave unset for `*.ugly.bot` subdomains and Mode B apps. |
|
|
403
405
|
| `testMode?` | Skip ugly.bot silent SSO and trust the auth cookie the fixture set. Only honored when `UGLY_APP_TEST_MODE=1`. |
|
|
404
406
|
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.1077";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compact bottom banner that tells mobile users the app can be installed.
|
|
3
|
+
*
|
|
4
|
+
* - Android / Chromium: captures `beforeinstallprompt` and offers an Install
|
|
5
|
+
* button that opens the browser's native install dialog.
|
|
6
|
+
* - iOS / iPadOS Safari (and Chrome/Edge on iOS 16.4+): there is no API, so it
|
|
7
|
+
* explains the Share sheet step instead.
|
|
8
|
+
*
|
|
9
|
+
* Never shown when already installed (standalone), inside an iframe (Ugly
|
|
10
|
+
* Studio preview), inside a native Ugly host, on desktop, or in known in-app
|
|
11
|
+
* browsers. A dismissal is remembered for 30 days. OPT-IN: `bootstrapApp`
|
|
12
|
+
* mounts it for signed-in sessions only when the app passes
|
|
13
|
+
* `installPrompt: true`; apps can also place it themselves.
|
|
14
|
+
*/
|
|
15
|
+
import { type ReactElement } from 'react';
|
|
16
|
+
/** Start listening for `beforeinstallprompt` / `appinstalled`. Idempotent. */
|
|
17
|
+
export declare function installInstallPromptCapture(): void;
|
|
18
|
+
export interface InstallPromptProps {
|
|
19
|
+
/** Delay before the banner appears (ms). Default 4000. */
|
|
20
|
+
delayMs?: number;
|
|
21
|
+
/** App name shown as "Install <title>". Default: manifest/document title. */
|
|
22
|
+
title?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function InstallPrompt({ delayMs, title: titleProp, }?: InstallPromptProps): ReactElement | null;
|
|
25
|
+
//# sourceMappingURL=InstallPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstallPrompt.d.ts","sourceRoot":"","sources":["../../src/client/InstallPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AA4B/D,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,IAAI,CAalD;AA4GD,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAc,EACd,KAAK,EAAE,SAAS,GACjB,GAAE,kBAAuB,GAAG,YAAY,GAAG,IAAI,CAkH/C"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Compact bottom banner that tells mobile users the app can be installed.
|
|
4
|
+
*
|
|
5
|
+
* - Android / Chromium: captures `beforeinstallprompt` and offers an Install
|
|
6
|
+
* button that opens the browser's native install dialog.
|
|
7
|
+
* - iOS / iPadOS Safari (and Chrome/Edge on iOS 16.4+): there is no API, so it
|
|
8
|
+
* explains the Share sheet step instead.
|
|
9
|
+
*
|
|
10
|
+
* Never shown when already installed (standalone), inside an iframe (Ugly
|
|
11
|
+
* Studio preview), inside a native Ugly host, on desktop, or in known in-app
|
|
12
|
+
* browsers. A dismissal is remembered for 30 days. OPT-IN: `bootstrapApp`
|
|
13
|
+
* mounts it for signed-in sessions only when the app passes
|
|
14
|
+
* `installPrompt: true`; apps can also place it themselves.
|
|
15
|
+
*/
|
|
16
|
+
import { useEffect, useState } from 'react';
|
|
17
|
+
import { createPortal } from 'react-dom';
|
|
18
|
+
import { isNativeAvailable } from '../native/index.js';
|
|
19
|
+
import { isStandaloneDisplay } from './auth/startLogin.js';
|
|
20
|
+
import { Button } from './components/Button.js';
|
|
21
|
+
import { Z } from './components/zIndex.js';
|
|
22
|
+
import { INSTALL_DISMISS_KEY, installPromptMode, } from './installPromptLogic.js';
|
|
23
|
+
// ── beforeinstallprompt capture (module-level: the event can fire before the
|
|
24
|
+
// component mounts, and fires at most once per page) ─────────────────────────
|
|
25
|
+
let deferredPrompt = null;
|
|
26
|
+
let appInstalled = false;
|
|
27
|
+
const listeners = new Set();
|
|
28
|
+
const notify = () => {
|
|
29
|
+
for (const l of listeners)
|
|
30
|
+
l();
|
|
31
|
+
};
|
|
32
|
+
let captureInstalled = false;
|
|
33
|
+
/** Start listening for `beforeinstallprompt` / `appinstalled`. Idempotent. */
|
|
34
|
+
export function installInstallPromptCapture() {
|
|
35
|
+
if (captureInstalled || typeof window === 'undefined')
|
|
36
|
+
return;
|
|
37
|
+
captureInstalled = true;
|
|
38
|
+
window.addEventListener('beforeinstallprompt', (e) => {
|
|
39
|
+
e.preventDefault(); // suppress the mini-infobar; we show our own banner
|
|
40
|
+
deferredPrompt = e;
|
|
41
|
+
notify();
|
|
42
|
+
});
|
|
43
|
+
window.addEventListener('appinstalled', () => {
|
|
44
|
+
appInstalled = true;
|
|
45
|
+
deferredPrompt = null;
|
|
46
|
+
notify();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function readDismissedAt() {
|
|
50
|
+
try {
|
|
51
|
+
const raw = localStorage.getItem(INSTALL_DISMISS_KEY);
|
|
52
|
+
const n = raw ? Number(raw) : NaN;
|
|
53
|
+
return Number.isFinite(n) ? n : null;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function writeDismissed() {
|
|
60
|
+
try {
|
|
61
|
+
localStorage.setItem(INSTALL_DISMISS_KEY, String(Date.now()));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
/* no storage: the banner just comes back next visit */
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function inIframe() {
|
|
68
|
+
try {
|
|
69
|
+
return window.top !== window.self;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return true; // cross-origin parent
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function nativeHost() {
|
|
76
|
+
try {
|
|
77
|
+
return isNativeAvailable();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function currentMode() {
|
|
84
|
+
if (typeof window === 'undefined' || typeof navigator === 'undefined') {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
if (appInstalled)
|
|
88
|
+
return null;
|
|
89
|
+
return installPromptMode({
|
|
90
|
+
userAgent: navigator.userAgent,
|
|
91
|
+
maxTouchPoints: navigator.maxTouchPoints || 0,
|
|
92
|
+
standalone: isStandaloneDisplay(),
|
|
93
|
+
inIframe: inIframe(),
|
|
94
|
+
nativeHost: nativeHost(),
|
|
95
|
+
hasDeferredPrompt: deferredPrompt !== null,
|
|
96
|
+
dismissedAt: readDismissedAt(),
|
|
97
|
+
now: Date.now(),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/** Best app name: manifest short_name/name, then meta tags, then the title. */
|
|
101
|
+
async function resolveAppTitle() {
|
|
102
|
+
const fromDoc = () => {
|
|
103
|
+
const meta = document
|
|
104
|
+
.querySelector('meta[name="apple-mobile-web-app-title"]')
|
|
105
|
+
?.getAttribute('content') ??
|
|
106
|
+
document
|
|
107
|
+
.querySelector('meta[name="application-name"]')
|
|
108
|
+
?.getAttribute('content');
|
|
109
|
+
if (meta?.trim())
|
|
110
|
+
return meta.trim();
|
|
111
|
+
// "Page - App" / "Page | App": the app name is usually the last segment.
|
|
112
|
+
const parts = document.title.split(/\s+[|–—-]\s+/);
|
|
113
|
+
return (parts[parts.length - 1] ?? '').trim();
|
|
114
|
+
};
|
|
115
|
+
try {
|
|
116
|
+
const href = document
|
|
117
|
+
.querySelector('link[rel="manifest"]')
|
|
118
|
+
?.getAttribute('href');
|
|
119
|
+
if (href) {
|
|
120
|
+
const res = await fetch(href, { credentials: 'same-origin' });
|
|
121
|
+
if (res.ok) {
|
|
122
|
+
const m = (await res.json());
|
|
123
|
+
const name = m.short_name?.trim() || m.name?.trim();
|
|
124
|
+
if (name)
|
|
125
|
+
return name;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
/* fall back to the document */
|
|
131
|
+
}
|
|
132
|
+
return fromDoc();
|
|
133
|
+
}
|
|
134
|
+
/** iOS share glyph (square with an up arrow), inline so no icon dependency. */
|
|
135
|
+
function ShareGlyph() {
|
|
136
|
+
return (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", style: { verticalAlign: '-3px', margin: '0 2px' }, children: [_jsx("path", { d: "M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7" }), _jsx("polyline", { points: "16 6 12 2 8 6" }), _jsx("line", { x1: "12", y1: "2", x2: "12", y2: "15" })] }));
|
|
137
|
+
}
|
|
138
|
+
export function InstallPrompt({ delayMs = 4000, title: titleProp, } = {}) {
|
|
139
|
+
const [ready, setReady] = useState(false);
|
|
140
|
+
const [mode, setMode] = useState(null);
|
|
141
|
+
const [title, setTitle] = useState(titleProp ?? '');
|
|
142
|
+
const [hidden, setHidden] = useState(false);
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
installInstallPromptCapture();
|
|
145
|
+
const update = () => setMode(currentMode());
|
|
146
|
+
listeners.add(update);
|
|
147
|
+
const t = setTimeout(() => {
|
|
148
|
+
update();
|
|
149
|
+
setReady(true);
|
|
150
|
+
}, delayMs);
|
|
151
|
+
return () => {
|
|
152
|
+
clearTimeout(t);
|
|
153
|
+
listeners.delete(update);
|
|
154
|
+
};
|
|
155
|
+
}, [delayMs]);
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (titleProp !== undefined) {
|
|
158
|
+
setTitle(titleProp);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
let live = true;
|
|
162
|
+
void resolveAppTitle().then((t) => {
|
|
163
|
+
if (live)
|
|
164
|
+
setTitle(t);
|
|
165
|
+
});
|
|
166
|
+
return () => {
|
|
167
|
+
live = false;
|
|
168
|
+
};
|
|
169
|
+
}, [titleProp]);
|
|
170
|
+
if (!ready || hidden || !mode || typeof document === 'undefined')
|
|
171
|
+
return null;
|
|
172
|
+
const dismiss = () => {
|
|
173
|
+
writeDismissed();
|
|
174
|
+
setHidden(true);
|
|
175
|
+
};
|
|
176
|
+
const install = () => {
|
|
177
|
+
const p = deferredPrompt;
|
|
178
|
+
if (!p)
|
|
179
|
+
return;
|
|
180
|
+
deferredPrompt = null; // single-use
|
|
181
|
+
void p
|
|
182
|
+
.prompt()
|
|
183
|
+
.then(() => p.userChoice)
|
|
184
|
+
.then(({ outcome }) => {
|
|
185
|
+
if (outcome === 'dismissed')
|
|
186
|
+
writeDismissed();
|
|
187
|
+
})
|
|
188
|
+
.catch(() => { })
|
|
189
|
+
.finally(() => setHidden(true));
|
|
190
|
+
};
|
|
191
|
+
const heading = title ? `Install ${title}` : 'Install this app';
|
|
192
|
+
return createPortal(_jsxs("div", { "data-id": "install-prompt", role: "dialog", "aria-label": heading, style: {
|
|
193
|
+
position: 'fixed',
|
|
194
|
+
left: 'calc(env(safe-area-inset-left, 0px) + 12px)',
|
|
195
|
+
right: 'calc(env(safe-area-inset-right, 0px) + 12px)',
|
|
196
|
+
bottom: 'calc(env(safe-area-inset-bottom, 0px) + 12px)',
|
|
197
|
+
maxWidth: 480,
|
|
198
|
+
margin: '0 auto',
|
|
199
|
+
zIndex: Z.toast,
|
|
200
|
+
display: 'flex',
|
|
201
|
+
alignItems: 'center',
|
|
202
|
+
gap: 10,
|
|
203
|
+
padding: '10px 8px 10px 14px',
|
|
204
|
+
borderRadius: 14,
|
|
205
|
+
background: 'rgba(17,17,17,0.94)',
|
|
206
|
+
color: '#fff',
|
|
207
|
+
fontSize: 14,
|
|
208
|
+
lineHeight: 1.35,
|
|
209
|
+
boxShadow: '0 6px 24px rgba(0,0,0,0.3)',
|
|
210
|
+
fontFamily: 'var(--app-font-body, system-ui, sans-serif)',
|
|
211
|
+
}, children: [_jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { style: { fontWeight: 600 }, children: heading }), mode === 'ios' ? (_jsxs("div", { style: { opacity: 0.85, fontSize: 13 }, children: ["Tap Share", _jsx(ShareGlyph, {}), ", then Add to Home Screen"] })) : null] }), mode === 'android' ? (_jsx(Button, { "data-id": "install-prompt-install", "aria-label": heading, size: "sm", onClick: install, children: "Install" })) : null, _jsx(Button, { "data-id": "install-prompt-dismiss", "aria-label": "Dismiss install prompt", size: "sm", variant: "ghost", onClick: dismiss, style: { color: '#fff', fontSize: 18, lineHeight: 1 }, children: "\u00D7" })] }), document.body);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=InstallPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstallPrompt.js","sourceRoot":"","sources":["../../src/client/InstallPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginPopup.d.ts","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LoginPopup.d.ts","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"AAYA,UAAU,eAAe;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,MAAc,EAAE,EAAE,eAAe,+BAmOxE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { isStandaloneDisplay, startUglyBotRedirectLogin, } from './auth/startLogin.js';
|
|
3
4
|
const UGLY_BOT_URL = typeof window !== 'undefined'
|
|
4
5
|
? (window.__UGLY_BOT_URL__ ??
|
|
5
6
|
'https://ugly.bot')
|
|
@@ -78,6 +79,13 @@ export function LoginPopup({ onSuccess, inline = false }) {
|
|
|
78
79
|
})();
|
|
79
80
|
}, [onSuccess]);
|
|
80
81
|
const openPopup = useCallback(() => {
|
|
82
|
+
// Installed PWA: a popup lands in a separate browser context (or the native
|
|
83
|
+
// ugly.bot app), so the code never gets back here. Sign in same-window.
|
|
84
|
+
if (isStandaloneDisplay()) {
|
|
85
|
+
setStatus('waiting');
|
|
86
|
+
startUglyBotRedirectLogin();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
81
89
|
const origin = encodeURIComponent(window.location.origin);
|
|
82
90
|
const popup = window.open(`${UGLY_BOT_URL}/oauth?origin=${origin}`, 'ugly-bot-login', 'width=480,height=640,left=200,top=100');
|
|
83
91
|
setStatus('waiting');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginPopup.js","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LoginPopup.js","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small, non-blocking "A new version is available" banner with a Reload button.
|
|
3
|
+
* Driven by `staleBuild.ts`; renders nothing until a newer build is detected
|
|
4
|
+
* while the user is actively using the page. Mounted by `bootstrapApp`.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactElement } from 'react';
|
|
7
|
+
export declare function NewVersionBanner(): ReactElement | null;
|
|
8
|
+
//# sourceMappingURL=NewVersionBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewVersionBanner.d.ts","sourceRoot":"","sources":["../../src/client/NewVersionBanner.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAyCtD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createPortal } from 'react-dom';
|
|
3
|
+
import { Button } from './components/Button.js';
|
|
4
|
+
import { Z } from './components/zIndex.js';
|
|
5
|
+
import { reloadForNewVersion, useNewVersionAvailable } from './staleBuild.js';
|
|
6
|
+
export function NewVersionBanner() {
|
|
7
|
+
const visible = useNewVersionAvailable();
|
|
8
|
+
if (!visible || typeof document === 'undefined')
|
|
9
|
+
return null;
|
|
10
|
+
return createPortal(_jsxs("div", { "data-id": "new-version-banner", role: "status", "aria-live": "polite", style: {
|
|
11
|
+
position: 'fixed',
|
|
12
|
+
top: 'calc(env(safe-area-inset-top, 0px) + 8px)',
|
|
13
|
+
left: '50%',
|
|
14
|
+
transform: 'translateX(-50%)',
|
|
15
|
+
zIndex: Z.tooltip + 5,
|
|
16
|
+
maxWidth: 'calc(100vw - 32px)',
|
|
17
|
+
display: 'flex',
|
|
18
|
+
alignItems: 'center',
|
|
19
|
+
gap: 10,
|
|
20
|
+
padding: '6px 6px 6px 14px',
|
|
21
|
+
borderRadius: 999,
|
|
22
|
+
background: 'rgba(17,17,17,0.92)',
|
|
23
|
+
color: '#fff',
|
|
24
|
+
fontSize: 14,
|
|
25
|
+
lineHeight: 1.3,
|
|
26
|
+
boxShadow: '0 4px 16px rgba(0,0,0,0.25)',
|
|
27
|
+
fontFamily: 'var(--app-font-body, system-ui, sans-serif)',
|
|
28
|
+
}, children: [_jsx("span", { children: "A new version is available" }), _jsx(Button, { "data-id": "new-version-reload", "aria-label": "Reload to get the new version", size: "sm", onClick: reloadForNewVersion, style: { borderRadius: 999 }, children: "Reload" })] }), document.body);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=NewVersionBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewVersionBanner.js","sourceRoot":"","sources":["../../src/client/NewVersionBanner.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,YAAY,CACjB,0BACU,oBAAoB,EAC5B,IAAI,EAAC,QAAQ,eACH,QAAQ,EAClB,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,2CAA2C;YAChD,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,kBAAkB;YAC7B,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;YACrB,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,EAAE;YACP,OAAO,EAAE,kBAAkB;YAC3B,YAAY,EAAE,GAAG;YACjB,UAAU,EAAE,qBAAqB;YACjC,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,6BAA6B;YACxC,UAAU,EAAE,6CAA6C;SAC1D,aAED,wDAAuC,EACvC,KAAC,MAAM,eACG,oBAAoB,gBACjB,+BAA+B,EAC1C,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,uBAGrB,IACL,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -42,6 +42,33 @@ export declare function startUglyBotAuthorize(opts?: {
|
|
|
42
42
|
scopes?: string[];
|
|
43
43
|
aiCapCents?: number;
|
|
44
44
|
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* True when the app runs as an installed home-screen PWA (iOS/Android
|
|
47
|
+
* standalone or fullscreen display mode, or iOS Safari's legacy
|
|
48
|
+
* `navigator.standalone`). Login must not use a popup there: it opens in a
|
|
49
|
+
* separate browser context whose cookies/BroadcastChannel never reach the PWA.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isStandaloneDisplay(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Same-window (no popup) ugly.bot login, used when `isStandaloneDisplay()`.
|
|
54
|
+
* A top-level navigation to ugly.bot's `/oauth`: if the user has an ugly.bot
|
|
55
|
+
* session it mints a code and, finding no `window.opener`, redirects back to
|
|
56
|
+
* `origin/?ugly_oauth_code=CODE` (bootstrap / LoginPopup redeem it); otherwise
|
|
57
|
+
* it shows its sign-in page first and then does the same.
|
|
58
|
+
*
|
|
59
|
+
* ugly.bot's `/oauth` currently ignores `return` and always lands on the origin
|
|
60
|
+
* root, so the desired path is also stashed in sessionStorage (same tab, same
|
|
61
|
+
* origin — survives the round-trip) for `consumeLoginReturnPath()`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function startUglyBotRedirectLogin(opts?: {
|
|
64
|
+
returnTo?: string | undefined;
|
|
65
|
+
}): void;
|
|
66
|
+
/**
|
|
67
|
+
* The same-origin path a same-window login (`startUglyBotRedirectLogin`) asked
|
|
68
|
+
* to return to, cleared on read. Null if none, or if it is not a safe relative
|
|
69
|
+
* path. Meant for bootstrap after it redeems `?ugly_oauth_code=`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function consumeLoginReturnPath(): string | null;
|
|
45
72
|
/**
|
|
46
73
|
* A dev/preview origin that ugly.bot's `/oauth/silent` redirect mode will reject
|
|
47
74
|
* with 400 "Invalid origin": plain-http (localhost dev servers) or a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startLogin.d.ts","sourceRoot":"","sources":["../../../src/client/auth/startLogin.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAoBD;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CASlD;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,iBAAsB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"startLogin.d.ts","sourceRoot":"","sources":["../../../src/client/auth/startLogin.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAoBD;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CASlD;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,iBAAsB,GAAG,IAAI,CAyFpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,IAAI,CAWN;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAkB7C;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GAC3C,IAAI,CAsBN;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAYtD;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAUV;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAyB1C;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAS1C"}
|
|
@@ -72,6 +72,13 @@ export function broadcastLoginSuccess() {
|
|
|
72
72
|
export function startUglyBotLogin(opts = {}) {
|
|
73
73
|
if (typeof window === 'undefined')
|
|
74
74
|
return;
|
|
75
|
+
// Installed PWA: a popup would open in a separate browser context (its own
|
|
76
|
+
// cookie jar, no opener, no shared BroadcastChannel) — or be handed to the
|
|
77
|
+
// native ugly.bot app by universal/app links. Sign in in THIS window instead.
|
|
78
|
+
if (isStandaloneDisplay()) {
|
|
79
|
+
startUglyBotRedirectLogin({ returnTo: opts.redirectTo });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
75
82
|
const origin = encodeURIComponent(window.location.origin);
|
|
76
83
|
const url = `${UGLY_BOT_URL}/oauth?origin=${origin}`;
|
|
77
84
|
// Only COI apps hit the severed-opener path; tagging non-COI would leave a stale
|
|
@@ -170,7 +177,89 @@ export function startUglyBotAuthorize(opts = {}) {
|
|
|
170
177
|
});
|
|
171
178
|
if (opts.aiCapCents != null)
|
|
172
179
|
params.set('ai_cap', String(opts.aiCapCents));
|
|
173
|
-
window.location.assign(
|
|
180
|
+
window.location.assign(oauthUrl(params));
|
|
181
|
+
}
|
|
182
|
+
function oauthUrl(params) {
|
|
183
|
+
return `${UGLY_BOT_URL}/oauth?${params.toString()}`;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* True when the app runs as an installed home-screen PWA (iOS/Android
|
|
187
|
+
* standalone or fullscreen display mode, or iOS Safari's legacy
|
|
188
|
+
* `navigator.standalone`). Login must not use a popup there: it opens in a
|
|
189
|
+
* separate browser context whose cookies/BroadcastChannel never reach the PWA.
|
|
190
|
+
*/
|
|
191
|
+
export function isStandaloneDisplay() {
|
|
192
|
+
if (typeof window === 'undefined')
|
|
193
|
+
return false;
|
|
194
|
+
try {
|
|
195
|
+
const mm = typeof window.matchMedia === 'function' ? window.matchMedia : null;
|
|
196
|
+
if (mm?.call(window, '(display-mode: standalone)').matches ||
|
|
197
|
+
mm?.call(window, '(display-mode: fullscreen)').matches) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
/* matchMedia unavailable/throws — fall through */
|
|
203
|
+
}
|
|
204
|
+
return (typeof navigator !== 'undefined' &&
|
|
205
|
+
navigator.standalone === true);
|
|
206
|
+
}
|
|
207
|
+
const LOGIN_RETURN_KEY = 'uglyBotLoginReturn';
|
|
208
|
+
/**
|
|
209
|
+
* Same-window (no popup) ugly.bot login, used when `isStandaloneDisplay()`.
|
|
210
|
+
* A top-level navigation to ugly.bot's `/oauth`: if the user has an ugly.bot
|
|
211
|
+
* session it mints a code and, finding no `window.opener`, redirects back to
|
|
212
|
+
* `origin/?ugly_oauth_code=CODE` (bootstrap / LoginPopup redeem it); otherwise
|
|
213
|
+
* it shows its sign-in page first and then does the same.
|
|
214
|
+
*
|
|
215
|
+
* ugly.bot's `/oauth` currently ignores `return` and always lands on the origin
|
|
216
|
+
* root, so the desired path is also stashed in sessionStorage (same tab, same
|
|
217
|
+
* origin — survives the round-trip) for `consumeLoginReturnPath()`.
|
|
218
|
+
*/
|
|
219
|
+
export function startUglyBotRedirectLogin(opts = {}) {
|
|
220
|
+
if (typeof window === 'undefined')
|
|
221
|
+
return;
|
|
222
|
+
const ret = opts.returnTo ??
|
|
223
|
+
window.location.pathname + window.location.search + window.location.hash;
|
|
224
|
+
try {
|
|
225
|
+
// A stale popup flag would make bootstrap treat THIS window as the popup
|
|
226
|
+
// and try to close it after redeeming the code.
|
|
227
|
+
localStorage.removeItem(LOGIN_POPUP_KEY);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
/* ignore */
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
sessionStorage.setItem(LOGIN_RETURN_KEY, ret);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
/* ignore — lands on the origin root */
|
|
237
|
+
}
|
|
238
|
+
const params = new URLSearchParams({
|
|
239
|
+
origin: window.location.origin,
|
|
240
|
+
return: ret,
|
|
241
|
+
});
|
|
242
|
+
window.location.assign(oauthUrl(params));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* The same-origin path a same-window login (`startUglyBotRedirectLogin`) asked
|
|
246
|
+
* to return to, cleared on read. Null if none, or if it is not a safe relative
|
|
247
|
+
* path. Meant for bootstrap after it redeems `?ugly_oauth_code=`.
|
|
248
|
+
*/
|
|
249
|
+
export function consumeLoginReturnPath() {
|
|
250
|
+
try {
|
|
251
|
+
const raw = sessionStorage.getItem(LOGIN_RETURN_KEY);
|
|
252
|
+
if (raw == null)
|
|
253
|
+
return null;
|
|
254
|
+
sessionStorage.removeItem(LOGIN_RETURN_KEY);
|
|
255
|
+
if (!raw.startsWith('/') || raw.startsWith('//') || raw.startsWith('/\\')) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
return raw;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
174
263
|
}
|
|
175
264
|
const SILENT_SSO_TRIED_KEY = 'uglySilentSsoTried';
|
|
176
265
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startLogin.js","sourceRoot":"","sources":["../../../src/client/auth/startLogin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"startLogin.js","sourceRoot":"","sources":["../../../src/client/auth/startLogin.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,23 @@ interface BootstrapAppOptions {
|
|
|
39
39
|
* fail. Has no effect inside Ugly Studio, which shows its own version.
|
|
40
40
|
*/
|
|
41
41
|
billingBanner?: false;
|
|
42
|
+
/**
|
|
43
|
+
* Disable the automatic stale-build reload. Defaults to enabled.
|
|
44
|
+
*
|
|
45
|
+
* When a newer deploy is live, a page that was hidden or just resumed (an
|
|
46
|
+
* installed PWA the OS kept suspended) reloads onto it; a page in active use
|
|
47
|
+
* gets a small "A new version is available" banner instead and reloads on its
|
|
48
|
+
* next resume. Inert in dev (no build id).
|
|
49
|
+
*/
|
|
50
|
+
autoReloadOnNewBuild?: false;
|
|
51
|
+
/**
|
|
52
|
+
* Opt in to the framework-level "Install <app>" banner on mobile browsers
|
|
53
|
+
* (Android Chromium install dialog, iOS "Add to Home Screen" hint). Defaults
|
|
54
|
+
* to OFF. Shown to signed-in sessions only, never when already installed,
|
|
55
|
+
* framed, inside a native Ugly host, or on desktop. Apps can instead place
|
|
56
|
+
* `<InstallPrompt />` themselves.
|
|
57
|
+
*/
|
|
58
|
+
installPrompt?: boolean;
|
|
42
59
|
/**
|
|
43
60
|
* Apex-domain apps (ugly.chat, ugly.press, …) that use ugly.bot as their auth
|
|
44
61
|
* authority but don't share its cookie. When true, a logged-out boot attempts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrapApp.d.ts","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrapApp.d.ts","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA0BzE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAoFlE,UAAU,mBAAmB;IAC3B,mFAAmF;IACnF,QAAQ,EAAE,eAAe,CAAC;IAE1B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,eAAe,CAAC;IAE3B,uDAAuD;IACvD,cAAc,EAAE,aAAa,CAAC;QAC5B,QAAQ,EAAE,SAAS,CAAC;QACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC;QAChC,6DAA6D;QAC7D,UAAU,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACnD,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,EAAE,MAAM,YAAY,CAAC;IAE3B,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAE5B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qFAAqF;IACrF,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,KAAK,CAAC;IAEjB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC;IAEtB;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,KAAK,CAAC;IAE7B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;qFACiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+ID,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CA0e/D"}
|