@oxyhq/bloom 0.45.0 → 0.46.0
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/lib/commonjs/dialog/Dialog.js +12 -3
- package/lib/commonjs/dialog/Dialog.js.map +1 -1
- package/lib/commonjs/dialog/Dialog.web.js +23 -8
- package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
- package/lib/commonjs/index.js +29 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +73 -44
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/surfaces/SurfaceHost.js +189 -0
- package/lib/commonjs/surfaces/SurfaceHost.js.map +1 -0
- package/lib/commonjs/surfaces/api.js +83 -0
- package/lib/commonjs/surfaces/api.js.map +1 -0
- package/lib/commonjs/surfaces/index.js +82 -0
- package/lib/commonjs/surfaces/index.js.map +1 -0
- package/lib/commonjs/surfaces/index.web.js +77 -0
- package/lib/commonjs/surfaces/index.web.js.map +1 -0
- package/lib/commonjs/surfaces/prompts.js +154 -0
- package/lib/commonjs/surfaces/prompts.js.map +1 -0
- package/lib/commonjs/surfaces/surfaceStore.js +172 -0
- package/lib/commonjs/surfaces/surfaceStore.js.map +1 -0
- package/lib/commonjs/surfaces/types.js +6 -0
- package/lib/commonjs/surfaces/types.js.map +1 -0
- package/lib/commonjs/surfaces/useSurface.js +36 -0
- package/lib/commonjs/surfaces/useSurface.js.map +1 -0
- package/lib/module/dialog/Dialog.js +13 -4
- package/lib/module/dialog/Dialog.js.map +1 -1
- package/lib/module/dialog/Dialog.web.js +23 -8
- package/lib/module/dialog/Dialog.web.js.map +1 -1
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +5 -0
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/surfaces/SurfaceHost.js +184 -0
- package/lib/module/surfaces/SurfaceHost.js.map +1 -0
- package/lib/module/surfaces/api.js +48 -0
- package/lib/module/surfaces/api.js.map +1 -0
- package/lib/module/surfaces/index.js +24 -0
- package/lib/module/surfaces/index.js.map +1 -0
- package/lib/module/surfaces/index.web.js +19 -0
- package/lib/module/surfaces/index.web.js.map +1 -0
- package/lib/module/surfaces/prompts.js +148 -0
- package/lib/module/surfaces/prompts.js.map +1 -0
- package/lib/module/surfaces/surfaceStore.js +159 -0
- package/lib/module/surfaces/surfaceStore.js.map +1 -0
- package/lib/module/surfaces/types.js +4 -0
- package/lib/module/surfaces/types.js.map +1 -0
- package/lib/module/surfaces/useSurface.js +31 -0
- package/lib/module/surfaces/useSurface.js.map +1 -0
- package/lib/typescript/commonjs/dialog/Dialog.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/types.d.ts +10 -0
- package/lib/typescript/commonjs/dialog/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +2 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +2 -0
- package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/surfaces/SurfaceHost.d.ts +25 -0
- package/lib/typescript/commonjs/surfaces/SurfaceHost.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/api.d.ts +41 -0
- package/lib/typescript/commonjs/surfaces/api.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/index.d.ts +25 -0
- package/lib/typescript/commonjs/surfaces/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/index.web.d.ts +20 -0
- package/lib/typescript/commonjs/surfaces/index.web.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/prompts.d.ts +13 -0
- package/lib/typescript/commonjs/surfaces/prompts.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/surfaceStore.d.ts +51 -0
- package/lib/typescript/commonjs/surfaces/surfaceStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/types.d.ts +145 -0
- package/lib/typescript/commonjs/surfaces/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/surfaces/useSurface.d.ts +21 -0
- package/lib/typescript/commonjs/surfaces/useSurface.d.ts.map +1 -0
- package/lib/typescript/module/dialog/Dialog.d.ts.map +1 -1
- package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/types.d.ts +10 -0
- package/lib/typescript/module/dialog/types.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/index.web.d.ts +2 -0
- package/lib/typescript/module/index.web.d.ts.map +1 -1
- package/lib/typescript/module/surfaces/SurfaceHost.d.ts +25 -0
- package/lib/typescript/module/surfaces/SurfaceHost.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/api.d.ts +41 -0
- package/lib/typescript/module/surfaces/api.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/index.d.ts +25 -0
- package/lib/typescript/module/surfaces/index.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/index.web.d.ts +20 -0
- package/lib/typescript/module/surfaces/index.web.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/prompts.d.ts +13 -0
- package/lib/typescript/module/surfaces/prompts.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/surfaceStore.d.ts +51 -0
- package/lib/typescript/module/surfaces/surfaceStore.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/types.d.ts +145 -0
- package/lib/typescript/module/surfaces/types.d.ts.map +1 -0
- package/lib/typescript/module/surfaces/useSurface.d.ts +21 -0
- package/lib/typescript/module/surfaces/useSurface.d.ts.map +1 -0
- package/package.json +17 -1
- package/src/__tests__/surfaceStore.test.ts +219 -0
- package/src/dialog/Dialog.tsx +14 -3
- package/src/dialog/Dialog.web.tsx +25 -6
- package/src/dialog/types.ts +10 -0
- package/src/index.ts +15 -0
- package/src/index.web.ts +15 -0
- package/src/surfaces/SurfaceHost.tsx +207 -0
- package/src/surfaces/api.ts +55 -0
- package/src/surfaces/index.ts +38 -0
- package/src/surfaces/index.web.ts +33 -0
- package/src/surfaces/prompts.tsx +178 -0
- package/src/surfaces/surfaceStore.ts +168 -0
- package/src/surfaces/types.ts +156 -0
- package/src/surfaces/useSurface.ts +33 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SurfaceProvider = exports.SurfaceHost = void 0;
|
|
7
|
+
Object.defineProperty(exports, "confirm", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _api.confirm;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "dismiss", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _api.dismiss;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "dismissAll", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () {
|
|
22
|
+
return _api.dismissAll;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "dismissById", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () {
|
|
28
|
+
return _api.dismissById;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "dismissToRoot", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () {
|
|
34
|
+
return _api.dismissToRoot;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(exports, "present", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
get: function () {
|
|
40
|
+
return _api.present;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "prompt", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _api.prompt;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(exports, "surfaces", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
get: function () {
|
|
52
|
+
return _api.surfaces;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
Object.defineProperty(exports, "useSurface", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
get: function () {
|
|
58
|
+
return _useSurface.useSurface;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
var _dialog = require("../dialog");
|
|
62
|
+
var _SurfaceHost = require("./SurfaceHost.js");
|
|
63
|
+
var _api = require("./api.js");
|
|
64
|
+
var _useSurface = require("./useSurface.js");
|
|
65
|
+
/**
|
|
66
|
+
* The shared, content-agnostic SURFACE STACK.
|
|
67
|
+
*
|
|
68
|
+
* `<SurfaceProvider>`/`<SurfaceHost>` render the coordinated stack; the
|
|
69
|
+
* imperative `surfaces` API (+ its named functions) present into it from
|
|
70
|
+
* anywhere; `useSurface()` gives a presented surface its own controls.
|
|
71
|
+
*
|
|
72
|
+
* `SurfaceHost`/`SurfaceProvider` are bound to the NATIVE `Dialog` here; the web
|
|
73
|
+
* fork (`./index.web`) binds the web `Dialog`. The store, imperative API, hook,
|
|
74
|
+
* and types are platform-agnostic and shared by both.
|
|
75
|
+
*/
|
|
76
|
+
const {
|
|
77
|
+
SurfaceHost,
|
|
78
|
+
SurfaceProvider
|
|
79
|
+
} = (0, _SurfaceHost.createSurfaceHost)(_dialog.Dialog);
|
|
80
|
+
exports.SurfaceProvider = SurfaceProvider;
|
|
81
|
+
exports.SurfaceHost = SurfaceHost;
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_dialog","require","_SurfaceHost","_api","_useSurface","SurfaceHost","SurfaceProvider","createSurfaceHost","Dialog","exports"],"sourceRoot":"../../../src","sources":["surfaces/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAgBA,IAAAE,IAAA,GAAAF,OAAA;AAUA,IAAAG,WAAA,GAAAH,OAAA;AAxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;EAAEI,WAAW;EAAEC;AAAgB,CAAC,GAAG,IAAAC,8BAAiB,EAACC,cAAM,CAAC;AAACC,OAAA,CAAAH,eAAA,GAAAA,eAAA;AAAAG,OAAA,CAAAJ,WAAA,GAAAA,WAAA","ignoreList":[]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SurfaceProvider = exports.SurfaceHost = void 0;
|
|
7
|
+
Object.defineProperty(exports, "confirm", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _api.confirm;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "dismiss", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _api.dismiss;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "dismissAll", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () {
|
|
22
|
+
return _api.dismissAll;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "dismissById", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () {
|
|
28
|
+
return _api.dismissById;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "dismissToRoot", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () {
|
|
34
|
+
return _api.dismissToRoot;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(exports, "present", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
get: function () {
|
|
40
|
+
return _api.present;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "prompt", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _api.prompt;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(exports, "surfaces", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
get: function () {
|
|
52
|
+
return _api.surfaces;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
Object.defineProperty(exports, "useSurface", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
get: function () {
|
|
58
|
+
return _useSurface.useSurface;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
var _indexWeb = require("../dialog/index.web.js");
|
|
62
|
+
var _SurfaceHost = require("./SurfaceHost.js");
|
|
63
|
+
var _api = require("./api.js");
|
|
64
|
+
var _useSurface = require("./useSurface.js");
|
|
65
|
+
/**
|
|
66
|
+
* Web variant of the surface stack barrel. Identical surface area to the native
|
|
67
|
+
* `./index.ts` — it just binds the web-fork `Dialog` (`Dialog.web.tsx`, a
|
|
68
|
+
* pure-DOM overlay) instead of the native `BottomSheet`-backed one. The store,
|
|
69
|
+
* imperative API, hook, and types are shared, platform-agnostic modules.
|
|
70
|
+
*/
|
|
71
|
+
const {
|
|
72
|
+
SurfaceHost,
|
|
73
|
+
SurfaceProvider
|
|
74
|
+
} = (0, _SurfaceHost.createSurfaceHost)(_indexWeb.Dialog);
|
|
75
|
+
exports.SurfaceProvider = SurfaceProvider;
|
|
76
|
+
exports.SurfaceHost = SurfaceHost;
|
|
77
|
+
//# sourceMappingURL=index.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_indexWeb","require","_SurfaceHost","_api","_useSurface","SurfaceHost","SurfaceProvider","createSurfaceHost","Dialog","exports"],"sourceRoot":"../../../src","sources":["surfaces/index.web.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAWA,IAAAE,IAAA,GAAAF,OAAA;AAUA,IAAAG,WAAA,GAAAH,OAAA;AAnBA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;EAAEI,WAAW;EAAEC;AAAgB,CAAC,GAAG,IAAAC,8BAAiB,EAACC,gBAAM,CAAC;AAACC,OAAA,CAAAH,eAAA,GAAAA,eAAA;AAAAG,OAAA,CAAAJ,WAAA,GAAAA,WAAA","ignoreList":[]}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.confirm = confirm;
|
|
7
|
+
exports.prompt = prompt;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
var _button = require("../button");
|
|
11
|
+
var _index = require("../text-field/index.js");
|
|
12
|
+
var _useTheme = require("../theme/use-theme.js");
|
|
13
|
+
var _surfaceStore = require("./surfaceStore.js");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
16
|
+
/**
|
|
17
|
+
* Built-in `confirm` / `prompt` surfaces.
|
|
18
|
+
*
|
|
19
|
+
* They are implemented AS surfaces — each calls `present(...)` so it STACKS
|
|
20
|
+
* correctly above any open surface with the right layer/z (unlike Bloom's
|
|
21
|
+
* one-at-a-time `alert()` FIFO queue, which cannot layer over another surface).
|
|
22
|
+
* Their buttons resolve through the surface's own `dismiss(result)` (NOT the
|
|
23
|
+
* underlying `Dialog`'s close), so the value flows back through the `present()`
|
|
24
|
+
* promise.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const TITLE_STYLE = {
|
|
28
|
+
fontSize: 22,
|
|
29
|
+
fontWeight: '600',
|
|
30
|
+
lineHeight: 30
|
|
31
|
+
};
|
|
32
|
+
const MESSAGE_STYLE = {
|
|
33
|
+
fontSize: 16,
|
|
34
|
+
lineHeight: 22
|
|
35
|
+
};
|
|
36
|
+
function ConfirmSurface({
|
|
37
|
+
options,
|
|
38
|
+
surface
|
|
39
|
+
}) {
|
|
40
|
+
const theme = (0, _useTheme.useTheme)();
|
|
41
|
+
const onConfirm = (0, _react.useCallback)(() => surface.dismiss(true), [surface]);
|
|
42
|
+
const onCancel = (0, _react.useCallback)(() => surface.dismiss(false), [surface]);
|
|
43
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
44
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
45
|
+
style: [TITLE_STYLE, {
|
|
46
|
+
color: theme.colors.text,
|
|
47
|
+
paddingBottom: options.message ? 4 : 16
|
|
48
|
+
}],
|
|
49
|
+
children: options.title
|
|
50
|
+
}), options.message ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
51
|
+
style: [MESSAGE_STYLE, {
|
|
52
|
+
color: theme.colors.textSecondary,
|
|
53
|
+
paddingBottom: 16
|
|
54
|
+
}],
|
|
55
|
+
children: options.message
|
|
56
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
57
|
+
style: {
|
|
58
|
+
gap: 8
|
|
59
|
+
},
|
|
60
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
|
|
61
|
+
variant: options.destructive ? 'destructive' : 'primary',
|
|
62
|
+
onPress: onConfirm,
|
|
63
|
+
testID: "bloom-surface-confirm-confirm",
|
|
64
|
+
children: options.confirmLabel ?? 'Confirm'
|
|
65
|
+
}), options.hideCancel ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
|
|
66
|
+
variant: "secondary",
|
|
67
|
+
onPress: onCancel,
|
|
68
|
+
testID: "bloom-surface-confirm-cancel",
|
|
69
|
+
children: options.cancelLabel ?? 'Cancel'
|
|
70
|
+
})]
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function PromptSurface({
|
|
75
|
+
options,
|
|
76
|
+
surface
|
|
77
|
+
}) {
|
|
78
|
+
const theme = (0, _useTheme.useTheme)();
|
|
79
|
+
const [value, setValue] = (0, _react.useState)(options.defaultValue ?? '');
|
|
80
|
+
const onSubmit = (0, _react.useCallback)(() => surface.dismiss(value), [surface, value]);
|
|
81
|
+
const onCancel = (0, _react.useCallback)(() => surface.dismiss(null), [surface]);
|
|
82
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
83
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
84
|
+
style: [TITLE_STYLE, {
|
|
85
|
+
color: theme.colors.text,
|
|
86
|
+
paddingBottom: options.message ? 4 : 16
|
|
87
|
+
}],
|
|
88
|
+
children: options.title
|
|
89
|
+
}), options.message ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
90
|
+
style: [MESSAGE_STYLE, {
|
|
91
|
+
color: theme.colors.textSecondary,
|
|
92
|
+
paddingBottom: 16
|
|
93
|
+
}],
|
|
94
|
+
children: options.message
|
|
95
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.TextFieldInput, {
|
|
96
|
+
label: options.inputLabel ?? options.title,
|
|
97
|
+
placeholder: options.placeholder,
|
|
98
|
+
value: value,
|
|
99
|
+
onChangeText: setValue,
|
|
100
|
+
autoFocus: true,
|
|
101
|
+
returnKeyType: "done",
|
|
102
|
+
onSubmitEditing: onSubmit,
|
|
103
|
+
testID: "bloom-surface-prompt-input"
|
|
104
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
105
|
+
style: {
|
|
106
|
+
gap: 8,
|
|
107
|
+
paddingTop: 16
|
|
108
|
+
},
|
|
109
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
|
|
110
|
+
variant: "primary",
|
|
111
|
+
onPress: onSubmit,
|
|
112
|
+
testID: "bloom-surface-prompt-confirm",
|
|
113
|
+
children: options.confirmLabel ?? 'OK'
|
|
114
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
|
|
115
|
+
variant: "secondary",
|
|
116
|
+
onPress: onCancel,
|
|
117
|
+
testID: "bloom-surface-prompt-cancel",
|
|
118
|
+
children: options.cancelLabel ?? 'Cancel'
|
|
119
|
+
})]
|
|
120
|
+
})]
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Present a confirm surface stacked on top of anything currently open. Resolves
|
|
126
|
+
* `true` on confirm, `false` on cancel OR on backdrop/Escape/back dismissal.
|
|
127
|
+
*/
|
|
128
|
+
function confirm(options) {
|
|
129
|
+
return (0, _surfaceStore.present)(surface => /*#__PURE__*/(0, _jsxRuntime.jsx)(ConfirmSurface, {
|
|
130
|
+
options: options,
|
|
131
|
+
surface: surface
|
|
132
|
+
}), {
|
|
133
|
+
placement: options.placement ?? 'center',
|
|
134
|
+
dismissOnBackdrop: options.dismissible ?? true,
|
|
135
|
+
label: options.title
|
|
136
|
+
}).then(result => result === true);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Present a prompt surface stacked on top of anything currently open. Resolves
|
|
141
|
+
* the entered string on submit, or `null` on cancel OR backdrop/Escape/back
|
|
142
|
+
* dismissal.
|
|
143
|
+
*/
|
|
144
|
+
function prompt(options) {
|
|
145
|
+
return (0, _surfaceStore.present)(surface => /*#__PURE__*/(0, _jsxRuntime.jsx)(PromptSurface, {
|
|
146
|
+
options: options,
|
|
147
|
+
surface: surface
|
|
148
|
+
}), {
|
|
149
|
+
placement: options.placement ?? 'center',
|
|
150
|
+
dismissOnBackdrop: options.dismissible ?? true,
|
|
151
|
+
label: options.title
|
|
152
|
+
}).then(result => typeof result === 'string' ? result : null);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_button","_index","_useTheme","_surfaceStore","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TITLE_STYLE","fontSize","fontWeight","lineHeight","MESSAGE_STYLE","ConfirmSurface","options","surface","theme","useTheme","onConfirm","useCallback","dismiss","onCancel","jsxs","View","children","jsx","Text","style","color","colors","text","paddingBottom","message","title","textSecondary","gap","Button","variant","destructive","onPress","testID","confirmLabel","hideCancel","cancelLabel","PromptSurface","value","setValue","useState","defaultValue","onSubmit","TextFieldInput","label","inputLabel","placeholder","onChangeText","autoFocus","returnKeyType","onSubmitEditing","paddingTop","confirm","present","placement","dismissOnBackdrop","dismissible","then","result","prompt"],"sourceRoot":"../../../src","sources":["surfaces/prompts.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,aAAA,GAAAL,OAAA;AAAyC,IAAAM,WAAA,GAAAN,OAAA;AAAA,SAAAD,wBAAAQ,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAV,uBAAA,YAAAA,CAAAQ,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAOzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMkB,WAAW,GAAG;EAAEC,QAAQ,EAAE,EAAE;EAAEC,UAAU,EAAE,KAAc;EAAEC,UAAU,EAAE;AAAG,CAAC;AAChF,MAAMC,aAAa,GAAG;EAAEH,QAAQ,EAAE,EAAE;EAAEE,UAAU,EAAE;AAAG,CAAC;AAEtD,SAASE,cAAcA,CAAC;EACtBC,OAAO;EACPC;AAIF,CAAC,EAAE;EACD,MAAMC,KAAK,GAAG,IAAAC,kBAAQ,EAAC,CAAC;EACxB,MAAMC,SAAS,GAAG,IAAAC,kBAAW,EAAC,MAAMJ,OAAO,CAACK,OAAO,CAAC,IAAI,CAAC,EAAE,CAACL,OAAO,CAAC,CAAC;EACrE,MAAMM,QAAQ,GAAG,IAAAF,kBAAW,EAAC,MAAMJ,OAAO,CAACK,OAAO,CAAC,KAAK,CAAC,EAAE,CAACL,OAAO,CAAC,CAAC;EAErE,oBACE,IAAA3B,WAAA,CAAAkC,IAAA,EAACvC,YAAA,CAAAwC,IAAI;IAAAC,QAAA,gBACH,IAAApC,WAAA,CAAAqC,GAAA,EAAC1C,YAAA,CAAA2C,IAAI;MACHC,KAAK,EAAE,CACLnB,WAAW,EACX;QACEoB,KAAK,EAAEZ,KAAK,CAACa,MAAM,CAACC,IAAI;QACxBC,aAAa,EAAEjB,OAAO,CAACkB,OAAO,GAAG,CAAC,GAAG;MACvC,CAAC,CACD;MAAAR,QAAA,EAEDV,OAAO,CAACmB;IAAK,CACV,CAAC,EACNnB,OAAO,CAACkB,OAAO,gBACd,IAAA5C,WAAA,CAAAqC,GAAA,EAAC1C,YAAA,CAAA2C,IAAI;MACHC,KAAK,EAAE,CACLf,aAAa,EACb;QAAEgB,KAAK,EAAEZ,KAAK,CAACa,MAAM,CAACK,aAAa;QAAEH,aAAa,EAAE;MAAG,CAAC,CACxD;MAAAP,QAAA,EAEDV,OAAO,CAACkB;IAAO,CACZ,CAAC,GACL,IAAI,eACR,IAAA5C,WAAA,CAAAkC,IAAA,EAACvC,YAAA,CAAAwC,IAAI;MAACI,KAAK,EAAE;QAAEQ,GAAG,EAAE;MAAE,CAAE;MAAAX,QAAA,gBACtB,IAAApC,WAAA,CAAAqC,GAAA,EAACzC,OAAA,CAAAoD,MAAM;QACLC,OAAO,EAAEvB,OAAO,CAACwB,WAAW,GAAG,aAAa,GAAG,SAAU;QACzDC,OAAO,EAAErB,SAAU;QACnBsB,MAAM,EAAC,+BAA+B;QAAAhB,QAAA,EAErCV,OAAO,CAAC2B,YAAY,IAAI;MAAS,CAC5B,CAAC,EACR3B,OAAO,CAAC4B,UAAU,GAAG,IAAI,gBACxB,IAAAtD,WAAA,CAAAqC,GAAA,EAACzC,OAAA,CAAAoD,MAAM;QACLC,OAAO,EAAC,WAAW;QACnBE,OAAO,EAAElB,QAAS;QAClBmB,MAAM,EAAC,8BAA8B;QAAAhB,QAAA,EAEpCV,OAAO,CAAC6B,WAAW,IAAI;MAAQ,CAC1B,CACT;IAAA,CACG,CAAC;EAAA,CACH,CAAC;AAEX;AAEA,SAASC,aAAaA,CAAC;EACrB9B,OAAO;EACPC;AAIF,CAAC,EAAE;EACD,MAAMC,KAAK,GAAG,IAAAC,kBAAQ,EAAC,CAAC;EACxB,MAAM,CAAC4B,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAACjC,OAAO,CAACkC,YAAY,IAAI,EAAE,CAAC;EAC9D,MAAMC,QAAQ,GAAG,IAAA9B,kBAAW,EAAC,MAAMJ,OAAO,CAACK,OAAO,CAACyB,KAAK,CAAC,EAAE,CAAC9B,OAAO,EAAE8B,KAAK,CAAC,CAAC;EAC5E,MAAMxB,QAAQ,GAAG,IAAAF,kBAAW,EAAC,MAAMJ,OAAO,CAACK,OAAO,CAAC,IAAI,CAAC,EAAE,CAACL,OAAO,CAAC,CAAC;EAEpE,oBACE,IAAA3B,WAAA,CAAAkC,IAAA,EAACvC,YAAA,CAAAwC,IAAI;IAAAC,QAAA,gBACH,IAAApC,WAAA,CAAAqC,GAAA,EAAC1C,YAAA,CAAA2C,IAAI;MACHC,KAAK,EAAE,CACLnB,WAAW,EACX;QACEoB,KAAK,EAAEZ,KAAK,CAACa,MAAM,CAACC,IAAI;QACxBC,aAAa,EAAEjB,OAAO,CAACkB,OAAO,GAAG,CAAC,GAAG;MACvC,CAAC,CACD;MAAAR,QAAA,EAEDV,OAAO,CAACmB;IAAK,CACV,CAAC,EACNnB,OAAO,CAACkB,OAAO,gBACd,IAAA5C,WAAA,CAAAqC,GAAA,EAAC1C,YAAA,CAAA2C,IAAI;MACHC,KAAK,EAAE,CACLf,aAAa,EACb;QAAEgB,KAAK,EAAEZ,KAAK,CAACa,MAAM,CAACK,aAAa;QAAEH,aAAa,EAAE;MAAG,CAAC,CACxD;MAAAP,QAAA,EAEDV,OAAO,CAACkB;IAAO,CACZ,CAAC,GACL,IAAI,eACR,IAAA5C,WAAA,CAAAqC,GAAA,EAACxC,MAAA,CAAAiE,cAAc;MACbC,KAAK,EAAErC,OAAO,CAACsC,UAAU,IAAItC,OAAO,CAACmB,KAAM;MAC3CoB,WAAW,EAAEvC,OAAO,CAACuC,WAAY;MACjCR,KAAK,EAAEA,KAAM;MACbS,YAAY,EAAER,QAAS;MACvBS,SAAS;MACTC,aAAa,EAAC,MAAM;MACpBC,eAAe,EAAER,QAAS;MAC1BT,MAAM,EAAC;IAA4B,CACpC,CAAC,eACF,IAAApD,WAAA,CAAAkC,IAAA,EAACvC,YAAA,CAAAwC,IAAI;MAACI,KAAK,EAAE;QAAEQ,GAAG,EAAE,CAAC;QAAEuB,UAAU,EAAE;MAAG,CAAE;MAAAlC,QAAA,gBACtC,IAAApC,WAAA,CAAAqC,GAAA,EAACzC,OAAA,CAAAoD,MAAM;QACLC,OAAO,EAAC,SAAS;QACjBE,OAAO,EAAEU,QAAS;QAClBT,MAAM,EAAC,8BAA8B;QAAAhB,QAAA,EAEpCV,OAAO,CAAC2B,YAAY,IAAI;MAAI,CACvB,CAAC,eACT,IAAArD,WAAA,CAAAqC,GAAA,EAACzC,OAAA,CAAAoD,MAAM;QACLC,OAAO,EAAC,WAAW;QACnBE,OAAO,EAAElB,QAAS;QAClBmB,MAAM,EAAC,6BAA6B;QAAAhB,QAAA,EAEnCV,OAAO,CAAC6B,WAAW,IAAI;MAAQ,CAC1B,CAAC;IAAA,CACL,CAAC;EAAA,CACH,CAAC;AAEX;;AAEA;AACA;AACA;AACA;AACO,SAASgB,OAAOA,CAAC7C,OAA8B,EAAoB;EACxE,OAAO,IAAA8C,qBAAO,EACX7C,OAAO,iBAAK,IAAA3B,WAAA,CAAAqC,GAAA,EAACZ,cAAc;IAACC,OAAO,EAAEA,OAAQ;IAACC,OAAO,EAAEA;EAAQ,CAAE,CAAC,EACnE;IACE8C,SAAS,EAAE/C,OAAO,CAAC+C,SAAS,IAAI,QAAQ;IACxCC,iBAAiB,EAAEhD,OAAO,CAACiD,WAAW,IAAI,IAAI;IAC9CZ,KAAK,EAAErC,OAAO,CAACmB;EACjB,CACF,CAAC,CAAC+B,IAAI,CAAEC,MAAM,IAAKA,MAAM,KAAK,IAAI,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,MAAMA,CAACpD,OAA6B,EAA0B;EAC5E,OAAO,IAAA8C,qBAAO,EACX7C,OAAO,iBAAK,IAAA3B,WAAA,CAAAqC,GAAA,EAACmB,aAAa;IAAC9B,OAAO,EAAEA,OAAQ;IAACC,OAAO,EAAEA;EAAQ,CAAE,CAAC,EAClE;IACE8C,SAAS,EAAE/C,OAAO,CAAC+C,SAAS,IAAI,QAAQ;IACxCC,iBAAiB,EAAEhD,OAAO,CAACiD,WAAW,IAAI,IAAI;IAC9CZ,KAAK,EAAErC,OAAO,CAACmB;EACjB,CACF,CAAC,CAAC+B,IAAI,CAAEC,MAAM,IAAM,OAAOA,MAAM,KAAK,QAAQ,GAAGA,MAAM,GAAG,IAAK,CAAC;AAClE","ignoreList":[]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.__resetSurfacesForTests = __resetSurfacesForTests;
|
|
7
|
+
exports.dismissAll = dismissAll;
|
|
8
|
+
exports.dismissToRoot = dismissToRoot;
|
|
9
|
+
exports.dismissTop = dismissTop;
|
|
10
|
+
exports.finalizeClose = finalizeClose;
|
|
11
|
+
exports.getSnapshot = getSnapshot;
|
|
12
|
+
exports.present = present;
|
|
13
|
+
exports.requestDismiss = requestDismiss;
|
|
14
|
+
exports.resetSurfaces = resetSurfaces;
|
|
15
|
+
exports.subscribe = subscribe;
|
|
16
|
+
/**
|
|
17
|
+
* The shared, content-agnostic SURFACE STACK.
|
|
18
|
+
*
|
|
19
|
+
* A module-singleton store (same pattern as `theme/ambient-store.ts` and
|
|
20
|
+
* `dialog/alert-store.ts`) holding an ordered stack of surfaces presented ON TOP
|
|
21
|
+
* of each other — bottom→top, the last entry is the top. One coordinated stack
|
|
22
|
+
* that the whole ecosystem (the SDK AND consumer apps) presents into, so
|
|
23
|
+
* overlays never clash: per-layer z, top-only interactivity, backdrop/Escape/
|
|
24
|
+
* back routed to the TOP surface, lower layers dimmed.
|
|
25
|
+
*
|
|
26
|
+
* It is CONTENT-AGNOSTIC: `present` takes a render function, not a route name.
|
|
27
|
+
* Bloom must never know about routes; the SDK layers its route registry on top.
|
|
28
|
+
*
|
|
29
|
+
* `getSnapshot` returns a STABLE reference while unchanged (the array identity
|
|
30
|
+
* only changes on a real mutation), so `useSyncExternalStore` — and the React
|
|
31
|
+
* Compiler — never see a silently-stale value.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
let idCounter = 0;
|
|
35
|
+
function genId() {
|
|
36
|
+
idCounter += 1;
|
|
37
|
+
return `bloom-surface-${idCounter}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** A single frozen "empty stack" snapshot returned by `getSnapshot` when idle. */
|
|
41
|
+
const EMPTY = Object.freeze([]);
|
|
42
|
+
let surfaces = EMPTY;
|
|
43
|
+
const listeners = new Set();
|
|
44
|
+
function emit() {
|
|
45
|
+
for (const listener of listeners) listener();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Subscribe to stack changes. Returns an unsubscribe fn. */
|
|
49
|
+
function subscribe(listener) {
|
|
50
|
+
listeners.add(listener);
|
|
51
|
+
return () => {
|
|
52
|
+
listeners.delete(listener);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Current stack snapshot (stable ref while unchanged). Bottom→top. */
|
|
57
|
+
function getSnapshot() {
|
|
58
|
+
return surfaces;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Present a new surface on TOP of the stack. Returns a promise that resolves
|
|
63
|
+
* with the value passed to `dismiss(result)` (or `undefined` when the surface is
|
|
64
|
+
* dismissed without a result / by a stack-wide clear).
|
|
65
|
+
*/
|
|
66
|
+
function present(render, opts) {
|
|
67
|
+
return new Promise(resolve => {
|
|
68
|
+
const entry = {
|
|
69
|
+
id: genId(),
|
|
70
|
+
render,
|
|
71
|
+
presentation: opts ?? {},
|
|
72
|
+
status: 'open',
|
|
73
|
+
resolve: resolve,
|
|
74
|
+
settled: false,
|
|
75
|
+
generation: 0
|
|
76
|
+
};
|
|
77
|
+
surfaces = [...surfaces, entry];
|
|
78
|
+
emit();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Request dismissal of a surface. RESOLVES THE PROMISE IMMEDIATELY (the exit
|
|
84
|
+
* animation that follows is cosmetic) and flips the entry to `'closing'` so the
|
|
85
|
+
* host runs its exit animation. Resolution is resolve-once via the `settled`
|
|
86
|
+
* guard — a second request (or the host's post-exit `onClose`) never re-resolves
|
|
87
|
+
* with a different value. Bumps the entry `generation` so a completion callback
|
|
88
|
+
* from a superseded cycle is inert.
|
|
89
|
+
*/
|
|
90
|
+
function requestDismiss(id, result) {
|
|
91
|
+
const entry = surfaces.find(e => e.id === id);
|
|
92
|
+
if (!entry) return;
|
|
93
|
+
|
|
94
|
+
// Resolve-once. The mapped replacement below carries `settled: true`, so a
|
|
95
|
+
// later `requestDismiss(id)` reads the settled entry and skips this branch —
|
|
96
|
+
// no in-place mutation of the live entry is needed.
|
|
97
|
+
if (!entry.settled) {
|
|
98
|
+
entry.resolve(result);
|
|
99
|
+
}
|
|
100
|
+
if (entry.status === 'closing') return;
|
|
101
|
+
surfaces = surfaces.map(e => e.id === id ? {
|
|
102
|
+
...e,
|
|
103
|
+
settled: true,
|
|
104
|
+
status: 'closing',
|
|
105
|
+
generation: e.generation + 1
|
|
106
|
+
} : e);
|
|
107
|
+
emit();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Splice a surface out of the stack once its exit animation has settled. Called
|
|
112
|
+
* by the host from the `Dialog`'s post-exit `onClose`. Idempotent and gated on
|
|
113
|
+
* `'closing'` status: a stale/duplicate call — or one for an entry that is not
|
|
114
|
+
* actually closing — is a no-op, which (together with unique entry ids) is the
|
|
115
|
+
* stale-callback hygiene `BottomSheetBase`'s generation guard provides for its
|
|
116
|
+
* reused instance.
|
|
117
|
+
*/
|
|
118
|
+
function finalizeClose(id) {
|
|
119
|
+
const entry = surfaces.find(e => e.id === id);
|
|
120
|
+
if (!entry || entry.status !== 'closing') return;
|
|
121
|
+
const next = surfaces.filter(e => e.id !== id);
|
|
122
|
+
surfaces = next.length === 0 ? EMPTY : next;
|
|
123
|
+
emit();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Dismiss the TOP surface, resolving its promise with `result`. */
|
|
127
|
+
function dismissTop(result) {
|
|
128
|
+
const top = surfaces[surfaces.length - 1];
|
|
129
|
+
if (top) requestDismiss(top.id, result);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Dismiss every surface ABOVE the bottom-most one, keeping the root surface
|
|
134
|
+
* open. Pending awaiters of the dismissed surfaces resolve with `undefined` so
|
|
135
|
+
* they never hang. No-op with 0 or 1 surfaces.
|
|
136
|
+
*/
|
|
137
|
+
function dismissToRoot() {
|
|
138
|
+
if (surfaces.length <= 1) return;
|
|
139
|
+
const above = surfaces.slice(1).map(e => e.id);
|
|
140
|
+
for (const id of above) requestDismiss(id, undefined);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Dismiss the ENTIRE stack. Every pending awaiter resolves with `undefined` so
|
|
145
|
+
* none hang.
|
|
146
|
+
*/
|
|
147
|
+
function dismissAll() {
|
|
148
|
+
const ids = surfaces.map(e => e.id);
|
|
149
|
+
for (const id of ids) requestDismiss(id, undefined);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Hard-reset the stack synchronously (no exit animation), resolving all pending
|
|
154
|
+
* awaiters with `undefined`. Used when the host provider unmounts so no
|
|
155
|
+
* `present()` promise is stranded.
|
|
156
|
+
*/
|
|
157
|
+
function resetSurfaces() {
|
|
158
|
+
if (surfaces.length === 0) return;
|
|
159
|
+
const pending = surfaces;
|
|
160
|
+
surfaces = EMPTY;
|
|
161
|
+
for (const entry of pending) {
|
|
162
|
+
if (!entry.settled) entry.resolve(undefined);
|
|
163
|
+
}
|
|
164
|
+
emit();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Test-only: hard-reset without notifying (drops listeners' work). */
|
|
168
|
+
function __resetSurfacesForTests() {
|
|
169
|
+
surfaces = EMPTY;
|
|
170
|
+
idCounter = 0;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=surfaceStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["idCounter","genId","EMPTY","Object","freeze","surfaces","listeners","Set","emit","listener","subscribe","add","delete","getSnapshot","present","render","opts","Promise","resolve","entry","id","presentation","status","settled","generation","requestDismiss","result","find","e","map","finalizeClose","next","filter","length","dismissTop","top","dismissToRoot","above","slice","undefined","dismissAll","ids","resetSurfaces","pending","__resetSurfacesForTests"],"sourceRoot":"../../../src","sources":["surfaces/surfaceStore.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["surfaces/types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SurfaceContext = void 0;
|
|
7
|
+
exports.useSurface = useSurface;
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
/**
|
|
10
|
+
* Context carrying the CURRENT surface's controls. The host wraps each presented
|
|
11
|
+
* surface's content in a provider bound to that entry's id, so a nested surface
|
|
12
|
+
* reads its OWN controls — `dismiss` targets this surface, `present` stacks a
|
|
13
|
+
* child above it.
|
|
14
|
+
*/
|
|
15
|
+
const SurfaceContext = exports.SurfaceContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
16
|
+
SurfaceContext.displayName = 'BloomSurfaceContext';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Read the current surface's {@link SurfaceControls} from inside a presented
|
|
20
|
+
* surface. Equivalent to the `surface` argument the render function receives —
|
|
21
|
+
* use whichever is convenient (props vs. context).
|
|
22
|
+
*
|
|
23
|
+
* DEPTH only: `dismiss` (resolve this surface's promise + close) and `present`
|
|
24
|
+
* (stack a child). Navigation within a surface is the SDK's route layer, not
|
|
25
|
+
* this hook.
|
|
26
|
+
*
|
|
27
|
+
* @throws if called outside a presented surface.
|
|
28
|
+
*/
|
|
29
|
+
function useSurface() {
|
|
30
|
+
const controls = (0, _react.useContext)(SurfaceContext);
|
|
31
|
+
if (!controls) {
|
|
32
|
+
throw new Error('useSurface must be called from within a presented surface (rendered by <SurfaceProvider>/<SurfaceHost>).');
|
|
33
|
+
}
|
|
34
|
+
return controls;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=useSurface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","SurfaceContext","exports","createContext","displayName","useSurface","controls","useContext","Error"],"sourceRoot":"../../../src","sources":["surfaces/useSurface.ts"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,cAAc,GAAAC,OAAA,CAAAD,cAAA,gBAAG,IAAAE,oBAAa,EAAyB,IAAI,CAAC;AACzEF,cAAc,CAACG,WAAW,GAAG,qBAAqB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,UAAUA,CAAA,EAAoB;EAC5C,MAAMC,QAAQ,GAAG,IAAAC,iBAAU,EAACN,cAAc,CAAC;EAC3C,IAAI,CAACK,QAAQ,EAAE;IACb,MAAM,IAAIE,KAAK,CACb,0GACF,CAAC;EACH;EACA,OAAOF,QAAQ;AACjB","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@ import React, { useCallback, useEffect, useId, useImperativeHandle, useMemo, use
|
|
|
4
4
|
import { Pressable, StyleSheet, useWindowDimensions, View } from 'react-native';
|
|
5
5
|
import Animated, { cancelAnimation, Easing, runOnJS, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
6
6
|
import { BottomSheet } from '../bottom-sheet';
|
|
7
|
-
import { Z_INDEX } from "../styles/z-index.js";
|
|
7
|
+
import { Z_INDEX, Z_INDEX_LAYER_STEP } from "../styles/z-index.js";
|
|
8
8
|
import { useTheme } from "../theme/use-theme.js";
|
|
9
9
|
import { Context, useDialogControl } from "./context.js";
|
|
10
10
|
import { DialogBody } from "./DialogContent.js";
|
|
@@ -73,6 +73,7 @@ function CenteredOrSideDialog({
|
|
|
73
73
|
description,
|
|
74
74
|
actions,
|
|
75
75
|
placement,
|
|
76
|
+
layer,
|
|
76
77
|
width = DEFAULT_SIDE_WIDTH,
|
|
77
78
|
inset,
|
|
78
79
|
dismissOnBackdrop = true,
|
|
@@ -196,6 +197,7 @@ function CenteredOrSideDialog({
|
|
|
196
197
|
open: sideOpen,
|
|
197
198
|
onDismiss: handleDismiss,
|
|
198
199
|
side: placement,
|
|
200
|
+
layer: layer,
|
|
199
201
|
width: width,
|
|
200
202
|
inset: inset,
|
|
201
203
|
dismissOnBackdrop: dismissOnBackdrop,
|
|
@@ -263,6 +265,7 @@ function SideSheet({
|
|
|
263
265
|
open,
|
|
264
266
|
onDismiss,
|
|
265
267
|
side,
|
|
268
|
+
layer,
|
|
266
269
|
width,
|
|
267
270
|
inset,
|
|
268
271
|
dismissOnBackdrop,
|
|
@@ -352,7 +355,12 @@ function SideSheet({
|
|
|
352
355
|
}), [insetTop, insetBottom, side, anchorInset, sideWidth]);
|
|
353
356
|
if (!mounted) return null;
|
|
354
357
|
return /*#__PURE__*/_jsxs(View, {
|
|
355
|
-
style: [sideStyles.root,
|
|
358
|
+
style: [sideStyles.root,
|
|
359
|
+
// Per-layer offset so a side dialog stacked on top of another (surface
|
|
360
|
+
// stack) paints above it. Layer 0 → offset 0 → unchanged.
|
|
361
|
+
{
|
|
362
|
+
zIndex: Z_INDEX.fullscreen + Z_INDEX_LAYER_STEP * (layer ?? 0)
|
|
363
|
+
}, containerStyle],
|
|
356
364
|
...(containerClassName ? {
|
|
357
365
|
className: containerClassName
|
|
358
366
|
} : {}),
|
|
@@ -393,9 +401,10 @@ function SideSheet({
|
|
|
393
401
|
});
|
|
394
402
|
}
|
|
395
403
|
const sideStyles = StyleSheet.create({
|
|
404
|
+
// `zIndex` is applied inline (`Z_INDEX.fullscreen + layer offset`) so a side
|
|
405
|
+
// dialog stacked on top of another paints above it in the surface stack.
|
|
396
406
|
root: {
|
|
397
|
-
...StyleSheet.absoluteFill
|
|
398
|
-
zIndex: Z_INDEX.fullscreen
|
|
407
|
+
...StyleSheet.absoluteFill
|
|
399
408
|
},
|
|
400
409
|
backdrop: {
|
|
401
410
|
...StyleSheet.absoluteFill,
|