react-native-bottom-sheet-stack 1.0.3 → 1.1.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/README.md +262 -50
- package/lib/commonjs/BottomSheetHost.js +96 -20
- package/lib/commonjs/BottomSheetHost.js.map +1 -1
- package/lib/commonjs/BottomSheetManager.provider.js +7 -4
- package/lib/commonjs/BottomSheetManager.provider.js.map +1 -1
- package/lib/commonjs/BottomSheetPortal.js +46 -0
- package/lib/commonjs/BottomSheetPortal.js.map +1 -0
- package/lib/commonjs/bottomSheet.store.js +19 -0
- package/lib/commonjs/bottomSheet.store.js.map +1 -1
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/portal.types.js +2 -0
- package/lib/commonjs/portal.types.js.map +1 -0
- package/lib/commonjs/useBottomSheetControl.js +81 -0
- package/lib/commonjs/useBottomSheetControl.js.map +1 -0
- package/lib/typescript/example/src/App.d.ts.map +1 -1
- package/lib/typescript/src/BottomSheetHost.d.ts.map +1 -1
- package/lib/typescript/src/BottomSheetManager.provider.d.ts.map +1 -1
- package/lib/typescript/src/BottomSheetPortal.d.ts +9 -0
- package/lib/typescript/src/BottomSheetPortal.d.ts.map +1 -0
- package/lib/typescript/src/bottomSheet.store.d.ts +5 -0
- package/lib/typescript/src/bottomSheet.store.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/portal.types.d.ts +24 -0
- package/lib/typescript/src/portal.types.d.ts.map +1 -0
- package/lib/typescript/src/useBottomSheetControl.d.ts +10 -0
- package/lib/typescript/src/useBottomSheetControl.d.ts.map +1 -0
- package/lib/typescript/src/useBottomSheetManager.d.ts +2 -0
- package/lib/typescript/src/useBottomSheetManager.d.ts.map +1 -1
- package/package.json +3 -1
- package/src/BottomSheetHost.tsx +23 -2
- package/src/BottomSheetManager.provider.tsx +6 -3
- package/src/BottomSheetPortal.tsx +39 -0
- package/src/bottomSheet.store.ts +27 -0
- package/src/index.tsx +6 -0
- package/src/portal.types.ts +25 -0
- package/src/useBottomSheetControl.ts +52 -0
|
@@ -70,6 +70,25 @@ const useBottomSheetStore = exports.useBottomSheetStore = (0, _traditional.creat
|
|
|
70
70
|
stackOrder: [...state.stackOrder, sheet.id]
|
|
71
71
|
};
|
|
72
72
|
}),
|
|
73
|
+
openPortal: (id, groupId, options) => set(state => {
|
|
74
|
+
if (state.sheetsById[id]) {
|
|
75
|
+
return state;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
sheetsById: {
|
|
79
|
+
...state.sheetsById,
|
|
80
|
+
[id]: {
|
|
81
|
+
id,
|
|
82
|
+
groupId,
|
|
83
|
+
content: null,
|
|
84
|
+
status: 'opening',
|
|
85
|
+
usePortal: true,
|
|
86
|
+
scaleBackground: options?.scaleBackground
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
stackOrder: [...state.stackOrder, id]
|
|
90
|
+
};
|
|
91
|
+
}),
|
|
73
92
|
markOpen: id => set(state => {
|
|
74
93
|
const sheet = state.sheetsById[id];
|
|
75
94
|
if (!sheet) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_middleware","require","_traditional","useBottomSheetStore","exports","create","subscribeWithSelector","set","sheetsById","stackOrder","push","sheet","state","id","status","switch","newSheetsById","topId","length","replace","markOpen","startClosing","index","indexOf","belowId","belowSheet","undefined","finishClosing","newStackOrder","filter","sheetId","topSheet","clearAll"],"sourceRoot":"../../src","sources":["bottomSheet.store.ts"],"mappings":";;;;;;AACA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;
|
|
1
|
+
{"version":3,"names":["_middleware","require","_traditional","useBottomSheetStore","exports","create","subscribeWithSelector","set","sheetsById","stackOrder","push","sheet","state","id","status","switch","newSheetsById","topId","length","replace","openPortal","groupId","options","content","usePortal","scaleBackground","markOpen","startClosing","index","indexOf","belowId","belowSheet","undefined","finishClosing","newStackOrder","filter","sheetId","topSheet","clearAll"],"sourceRoot":"../../src","sources":["bottomSheet.store.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -21,12 +21,24 @@ Object.defineProperty(exports, "BottomSheetManagerProvider", {
|
|
|
21
21
|
return _BottomSheetManager.BottomSheetManagerProvider;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
+
Object.defineProperty(exports, "BottomSheetPortal", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _BottomSheetPortal.BottomSheetPortal;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
24
30
|
Object.defineProperty(exports, "BottomSheetScaleView", {
|
|
25
31
|
enumerable: true,
|
|
26
32
|
get: function () {
|
|
27
33
|
return _BottomSheetScaleView.BottomSheetScaleView;
|
|
28
34
|
}
|
|
29
35
|
});
|
|
36
|
+
Object.defineProperty(exports, "useBottomSheetControl", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _useBottomSheetControl.useBottomSheetControl;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
30
42
|
Object.defineProperty(exports, "useBottomSheetManager", {
|
|
31
43
|
enumerable: true,
|
|
32
44
|
get: function () {
|
|
@@ -45,4 +57,6 @@ var _useBottomSheetManager = require("./useBottomSheetManager");
|
|
|
45
57
|
var _useBottomSheetState = require("./useBottomSheetState");
|
|
46
58
|
var _BottomSheetManaged = require("./BottomSheetManaged");
|
|
47
59
|
var _BottomSheetScaleView = require("./BottomSheetScaleView");
|
|
60
|
+
var _BottomSheetPortal = require("./BottomSheetPortal");
|
|
61
|
+
var _useBottomSheetControl = require("./useBottomSheetControl");
|
|
48
62
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BottomSheetHost","require","_BottomSheetManager","_useBottomSheetManager","_useBottomSheetState","_BottomSheetManaged","_BottomSheetScaleView"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_BottomSheetHost","require","_BottomSheetManager","_useBottomSheetManager","_useBottomSheetState","_BottomSheetManaged","_BottomSheetScaleView","_BottomSheetPortal","_useBottomSheetControl"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AACA,IAAAG,oBAAA,GAAAH,OAAA;AACA,IAAAI,mBAAA,GAAAJ,OAAA;AACA,IAAAK,qBAAA,GAAAL,OAAA;AAEA,IAAAM,kBAAA,GAAAN,OAAA;AACA,IAAAO,sBAAA,GAAAP,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["portal.types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useBottomSheetControl = useBottomSheetControl;
|
|
7
|
+
var _compilerRuntime = require("react/compiler-runtime");
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _bottomSheet = require("./bottomSheet.store");
|
|
10
|
+
var _BottomSheetManager = require("./BottomSheetManager.provider");
|
|
11
|
+
var _refsMap = require("./refsMap");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
function useBottomSheetControl(id) {
|
|
14
|
+
const $ = (0, _compilerRuntime.c)(14);
|
|
15
|
+
const bottomSheetManagerContext = (0, _BottomSheetManager.useMaybeBottomSheetManagerContext)();
|
|
16
|
+
const openPortal = (0, _bottomSheet.useBottomSheetStore)(_temp);
|
|
17
|
+
const startClosing = (0, _bottomSheet.useBottomSheetStore)(_temp2);
|
|
18
|
+
let t0;
|
|
19
|
+
if ($[0] !== id) {
|
|
20
|
+
t0 = state_1 => state_1.sheetsById[id];
|
|
21
|
+
$[0] = id;
|
|
22
|
+
$[1] = t0;
|
|
23
|
+
} else {
|
|
24
|
+
t0 = $[1];
|
|
25
|
+
}
|
|
26
|
+
const sheetState = (0, _bottomSheet.useBottomSheetStore)(t0);
|
|
27
|
+
let t1;
|
|
28
|
+
if ($[2] !== bottomSheetManagerContext?.groupId || $[3] !== id || $[4] !== openPortal) {
|
|
29
|
+
t1 = options => {
|
|
30
|
+
const groupId = bottomSheetManagerContext?.groupId || "default";
|
|
31
|
+
const ref = /*#__PURE__*/_react.default.createRef();
|
|
32
|
+
_refsMap.sheetRefs[id] = ref;
|
|
33
|
+
openPortal(id, groupId, options);
|
|
34
|
+
};
|
|
35
|
+
$[2] = bottomSheetManagerContext?.groupId;
|
|
36
|
+
$[3] = id;
|
|
37
|
+
$[4] = openPortal;
|
|
38
|
+
$[5] = t1;
|
|
39
|
+
} else {
|
|
40
|
+
t1 = $[5];
|
|
41
|
+
}
|
|
42
|
+
const open = t1;
|
|
43
|
+
let t2;
|
|
44
|
+
if ($[6] !== id || $[7] !== startClosing) {
|
|
45
|
+
t2 = () => {
|
|
46
|
+
startClosing(id);
|
|
47
|
+
};
|
|
48
|
+
$[6] = id;
|
|
49
|
+
$[7] = startClosing;
|
|
50
|
+
$[8] = t2;
|
|
51
|
+
} else {
|
|
52
|
+
t2 = $[8];
|
|
53
|
+
}
|
|
54
|
+
const close = t2;
|
|
55
|
+
const status = sheetState?.status ?? null;
|
|
56
|
+
const isOpen = status === "open" || status === "opening";
|
|
57
|
+
let t3;
|
|
58
|
+
if ($[9] !== close || $[10] !== isOpen || $[11] !== open || $[12] !== status) {
|
|
59
|
+
t3 = {
|
|
60
|
+
open,
|
|
61
|
+
close,
|
|
62
|
+
isOpen,
|
|
63
|
+
status
|
|
64
|
+
};
|
|
65
|
+
$[9] = close;
|
|
66
|
+
$[10] = isOpen;
|
|
67
|
+
$[11] = open;
|
|
68
|
+
$[12] = status;
|
|
69
|
+
$[13] = t3;
|
|
70
|
+
} else {
|
|
71
|
+
t3 = $[13];
|
|
72
|
+
}
|
|
73
|
+
return t3;
|
|
74
|
+
}
|
|
75
|
+
function _temp2(state_0) {
|
|
76
|
+
return state_0.startClosing;
|
|
77
|
+
}
|
|
78
|
+
function _temp(state) {
|
|
79
|
+
return state.openPortal;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=useBottomSheetControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_bottomSheet","_BottomSheetManager","_refsMap","e","__esModule","default","useBottomSheetControl","id","$","_compilerRuntime","c","bottomSheetManagerContext","useMaybeBottomSheetManagerContext","openPortal","useBottomSheetStore","_temp","startClosing","_temp2","t0","state_1","state","sheetsById","sheetState","t1","groupId","options","ref","React","createRef","sheetRefs","open","t2","close","status","isOpen","t3","state_0"],"sourceRoot":"../../src","sources":["useBottomSheetControl.ts"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,YAAA,GAAAD,OAAA;AAKA,IAAAE,mBAAA,GAAAF,OAAA;AAEA,IAAAG,QAAA,GAAAH,OAAA;AAAsC,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAS/B,SAAAG,sBAAAC,EAAA;EAAA,MAAAC,CAAA,OAAAC,gBAAA,CAAAC,CAAA;EAGL,MAAAC,yBAAA,GAAkC,IAAAC,qDAAiC,EAAC,CAAC;EAErE,MAAAC,UAAA,GAAmB,IAAAC,gCAAmB,EAACC,KAA2B,CAAC;EACnE,MAAAC,YAAA,GAAqB,IAAAF,gCAAmB,EAACG,MAA6B,CAAC;EAAC,IAAAC,EAAA;EAAA,IAAAV,CAAA,QAAAD,EAAA;IACjCW,EAAA,GAAAC,OAAA,IAAWC,OAAK,CAAAC,UAAW,CAACd,EAAE,CAAC;IAAAC,CAAA,MAAAD,EAAA;IAAAC,CAAA,MAAAU,EAAA;EAAA;IAAAA,EAAA,GAAAV,CAAA;EAAA;EAAtE,MAAAc,UAAA,GAAmB,IAAAR,gCAAmB,EAACI,EAA+B,CAAC;EAAC,IAAAK,EAAA;EAAA,IAAAf,CAAA,QAAAG,yBAAA,EAAAa,OAAA,IAAAhB,CAAA,QAAAD,EAAA,IAAAC,CAAA,QAAAK,UAAA;IAE3DU,EAAA,GAAAE,OAAA;MACX,MAAAD,OAAA,GAAgBb,yBAAyB,EAAAa,OAAsB,IAA/C,SAA+C;MAG/D,MAAAE,GAAA,gBAAYC,cAAK,CAAAC,SAAU,CAAqB,CAAC;MACjDC,kBAAS,CAACtB,EAAE,IAAImB,GAAH;MAEbb,UAAU,CAACN,EAAE,EAAEiB,OAAO,EAAEC,OAAO,CAAC;IAAA,CACjC;IAAAjB,CAAA,MAAAG,yBAAA,EAAAa,OAAA;IAAAhB,CAAA,MAAAD,EAAA;IAAAC,CAAA,MAAAK,UAAA;IAAAL,CAAA,MAAAe,EAAA;EAAA;IAAAA,EAAA,GAAAf,CAAA;EAAA;EARD,MAAAsB,IAAA,GAAaP,EAQZ;EAAC,IAAAQ,EAAA;EAAA,IAAAvB,CAAA,QAAAD,EAAA,IAAAC,CAAA,QAAAQ,YAAA;IAEYe,EAAA,GAAAA,CAAA;MACZf,YAAY,CAACT,EAAE,CAAC;IAAA,CACjB;IAAAC,CAAA,MAAAD,EAAA;IAAAC,CAAA,MAAAQ,YAAA;IAAAR,CAAA,MAAAuB,EAAA;EAAA;IAAAA,EAAA,GAAAvB,CAAA;EAAA;EAFD,MAAAwB,KAAA,GAAcD,EAEb;EAED,MAAAE,MAAA,GAAeX,UAAU,EAAAW,MAAgB,IAA1B,IAA0B;EACzC,MAAAC,MAAA,GAAeD,MAAM,KAAK,MAA8B,IAApBA,MAAM,KAAK,SAAS;EAAC,IAAAE,EAAA;EAAA,IAAA3B,CAAA,QAAAwB,KAAA,IAAAxB,CAAA,SAAA0B,MAAA,IAAA1B,CAAA,SAAAsB,IAAA,IAAAtB,CAAA,SAAAyB,MAAA;IAElDE,EAAA;MAAAL,IAAA;MAAAE,KAAA;MAAAE,MAAA;MAAAD;IAKP,CAAC;IAAAzB,CAAA,MAAAwB,KAAA;IAAAxB,CAAA,OAAA0B,MAAA;IAAA1B,CAAA,OAAAsB,IAAA;IAAAtB,CAAA,OAAAyB,MAAA;IAAAzB,CAAA,OAAA2B,EAAA;EAAA;IAAAA,EAAA,GAAA3B,CAAA;EAAA;EAAA,OALM2B,EAKN;AAAA;AA/BI,SAAAlB,OAAAmB,OAAA;EAAA,OAM+ChB,OAAK,CAAAJ,YAAa;AAAA;AANjE,SAAAD,MAAAK,KAAA;EAAA,OAK6CA,KAAK,CAAAP,UAAW;AAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../example/src/App.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../example/src/App.tsx"],"names":[],"mappings":"AA+CA,MAAM,CAAC,OAAO,UAAU,GAAG,4CAuB1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheetHost.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetHost.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BottomSheetHost.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetHost.tsx"],"names":[],"mappings":"AAmCA,iBAAS,mBAAmB,4CA+B3B;AAgED,eAAO,MAAM,eAAe,4BAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheetManager.provider.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetManager.provider.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"BottomSheetManager.provider.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetManager.provider.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,UAAU,aAAc,SAAQ,iBAAiB;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,0BAA0B,CAAC,EACzC,EAAE,EACF,WAAW,EACX,QAAQ,GACT,EAAE,aAAa,2CAUf;AAED,eAAO,MAAM,4BAA4B,QACnC,8BASH,CAAC;AAEJ,eAAO,MAAM,iCAAiC,QACxC,8BAA8B,GAAG,IAOpC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { BottomSheetPortalId } from './portal.types';
|
|
3
|
+
interface BottomSheetPortalProps {
|
|
4
|
+
id: BottomSheetPortalId;
|
|
5
|
+
children: React.ReactElement;
|
|
6
|
+
}
|
|
7
|
+
export declare function BottomSheetPortal({ id, children }: BottomSheetPortalProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=BottomSheetPortal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomSheetPortal.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetPortal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,UAAU,sBAAsB;IAC9B,EAAE,EAAE,mBAAmB,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;CAC9B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,sBAAsB,kDAuBzE"}
|
|
@@ -7,16 +7,21 @@ export interface BottomSheetState {
|
|
|
7
7
|
content: ReactNode;
|
|
8
8
|
status: BottomSheetStatus;
|
|
9
9
|
scaleBackground?: boolean;
|
|
10
|
+
usePortal?: boolean;
|
|
10
11
|
}
|
|
11
12
|
type TriggerState = Omit<BottomSheetState, 'status'>;
|
|
12
13
|
interface BottomSheetStoreState {
|
|
13
14
|
sheetsById: Record<string, BottomSheetState>;
|
|
14
15
|
stackOrder: string[];
|
|
15
16
|
}
|
|
17
|
+
export interface PortalOpenOptions {
|
|
18
|
+
scaleBackground?: boolean;
|
|
19
|
+
}
|
|
16
20
|
interface BottomSheetStoreActions {
|
|
17
21
|
push(sheet: TriggerState): void;
|
|
18
22
|
switch(sheet: TriggerState): void;
|
|
19
23
|
replace(sheet: TriggerState): void;
|
|
24
|
+
openPortal(id: string, groupId: string, options?: PortalOpenOptions): void;
|
|
20
25
|
markOpen(id: string): void;
|
|
21
26
|
startClosing(id: string): void;
|
|
22
27
|
finishClosing(id: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bottomSheet.store.d.ts","sourceRoot":"","sources":["../../../src/bottomSheet.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC1E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"bottomSheet.store.d.ts","sourceRoot":"","sources":["../../../src/bottomSheet.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC1E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAErD,UAAU,qBAAqB;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,uBAAuB;IAC/B,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3E,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,GAAG,uBAAuB,CAAC;AAE/E,eAAO,MAAM,mBAAmB;;;;;;;;EAuJ/B,CAAC"}
|
|
@@ -5,4 +5,7 @@ export { useBottomSheetState } from './useBottomSheetState';
|
|
|
5
5
|
export { BottomSheetManaged } from './BottomSheetManaged';
|
|
6
6
|
export { BottomSheetScaleView } from './BottomSheetScaleView';
|
|
7
7
|
export { type ScaleConfig } from './useScaleAnimation';
|
|
8
|
+
export { BottomSheetPortal } from './BottomSheetPortal';
|
|
9
|
+
export { useBottomSheetControl } from './useBottomSheetControl';
|
|
10
|
+
export type { BottomSheetPortalRegistry, BottomSheetPortalId, } from './portal.types';
|
|
8
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry for portal-based bottom sheets.
|
|
3
|
+
* Augment this interface in your app to get type-safe sheet IDs:
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* declare module 'react-native-bottom-sheet-stack' {
|
|
8
|
+
* interface BottomSheetPortalRegistry {
|
|
9
|
+
* 'my-sheet': true;
|
|
10
|
+
* 'settings-sheet': true;
|
|
11
|
+
* 'profile-sheet': true;
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export interface BottomSheetPortalRegistry {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Type-safe portal sheet ID.
|
|
20
|
+
* If BottomSheetPortalRegistry is augmented, this will be a union of the registered keys.
|
|
21
|
+
* Otherwise, it falls back to `string` for flexibility.
|
|
22
|
+
*/
|
|
23
|
+
export type BottomSheetPortalId = keyof BottomSheetPortalRegistry extends never ? string : Extract<keyof BottomSheetPortalRegistry, string>;
|
|
24
|
+
//# sourceMappingURL=portal.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portal.types.d.ts","sourceRoot":"","sources":["../../../src/portal.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,yBAAyB;CAAG;AAE7C;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,yBAAyB,SAAS,KAAK,GAC3E,MAAM,GACN,OAAO,CAAC,MAAM,yBAAyB,EAAE,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type BottomSheetStatus, type PortalOpenOptions } from './bottomSheet.store';
|
|
2
|
+
import type { BottomSheetPortalId } from './portal.types';
|
|
3
|
+
export interface UseBottomSheetControlReturn {
|
|
4
|
+
open: (options?: PortalOpenOptions) => void;
|
|
5
|
+
close: () => void;
|
|
6
|
+
isOpen: boolean;
|
|
7
|
+
status: BottomSheetStatus | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function useBottomSheetControl(id: BottomSheetPortalId): UseBottomSheetControlReturn;
|
|
10
|
+
//# sourceMappingURL=useBottomSheetControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBottomSheetControl.d.ts","sourceRoot":"","sources":["../../../src/useBottomSheetControl.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,mBAAmB,GACtB,2BAA2B,CA8B7B"}
|
|
@@ -14,12 +14,14 @@ export declare const useBottomSheetManager: () => {
|
|
|
14
14
|
id: string;
|
|
15
15
|
content: React.ReactNode;
|
|
16
16
|
scaleBackground?: boolean | undefined;
|
|
17
|
+
usePortal?: boolean | undefined;
|
|
17
18
|
}) => void;
|
|
18
19
|
replaceBottomSheet: (sheet: {
|
|
19
20
|
groupId: string;
|
|
20
21
|
id: string;
|
|
21
22
|
content: React.ReactNode;
|
|
22
23
|
scaleBackground?: boolean | undefined;
|
|
24
|
+
usePortal?: boolean | undefined;
|
|
23
25
|
}) => void;
|
|
24
26
|
};
|
|
25
27
|
//# sourceMappingURL=useBottomSheetManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBottomSheetManager.d.ts","sourceRoot":"","sources":["../../../src/useBottomSheetManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAMzE,eAAO,MAAM,qBAAqB;;gBA0Db,MAAM;+BArCd,KAAK,CAAC,YAAY,YAClB;QACP,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B
|
|
1
|
+
{"version":3,"file":"useBottomSheetManager.d.ts","sourceRoot":"","sources":["../../../src/useBottomSheetManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAMzE,eAAO,MAAM,qBAAqB;;gBA0Db,MAAM;+BArCd,KAAK,CAAC,YAAY,YAClB;QACP,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B;;;;;;;;;;;;;;;CA8CJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-bottom-sheet-stack",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Bottom Sheet Stack Manager",
|
|
5
5
|
"source": "./src/index.tsx",
|
|
6
6
|
"main": "lib/commonjs/index.js",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"react-native-gesture-handler": "^2.30.0",
|
|
64
64
|
"react-native-reanimated": "^4.2.1",
|
|
65
65
|
"react-native-safe-area-context": "^5.6.2",
|
|
66
|
+
"react-native-teleport": "^0.5.6",
|
|
66
67
|
"react-native-worklets": "^0.7.1",
|
|
67
68
|
"release-it": "^17.10.0",
|
|
68
69
|
"typescript": "^5.2.2",
|
|
@@ -75,6 +76,7 @@
|
|
|
75
76
|
"react-native-gesture-handler": ">=2.0.0",
|
|
76
77
|
"react-native-reanimated": ">=3.0.0",
|
|
77
78
|
"react-native-safe-area-context": ">=5.0.0",
|
|
79
|
+
"react-native-teleport": ">=0.5.0",
|
|
78
80
|
"zustand": ">=5.0.0"
|
|
79
81
|
},
|
|
80
82
|
"workspaces": [
|
package/src/BottomSheetHost.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import { useEffect } from 'react';
|
|
|
2
2
|
import { StyleSheet, View } from 'react-native';
|
|
3
3
|
import Animated from 'react-native-reanimated';
|
|
4
4
|
import { useSafeAreaFrame } from 'react-native-safe-area-context';
|
|
5
|
+
import { PortalHost } from 'react-native-teleport';
|
|
5
6
|
|
|
6
7
|
import { shallow } from 'zustand/shallow';
|
|
7
8
|
import { cleanupAnimatedIndex } from './animatedRegistry';
|
|
@@ -16,6 +17,22 @@ import {
|
|
|
16
17
|
type ScaleConfig,
|
|
17
18
|
} from './useScaleAnimation';
|
|
18
19
|
|
|
20
|
+
function PortalHostWrapper({
|
|
21
|
+
id,
|
|
22
|
+
width,
|
|
23
|
+
height,
|
|
24
|
+
}: {
|
|
25
|
+
id: string;
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
}) {
|
|
29
|
+
return (
|
|
30
|
+
<View style={{ flex: 1, width, height }}>
|
|
31
|
+
<PortalHost name={`bottomsheet-${id}`} style={{ width, height }} />
|
|
32
|
+
</View>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
19
36
|
function BottomSheetHostComp() {
|
|
20
37
|
const queueIds = useQueueIds();
|
|
21
38
|
const clearAll = useBottomSheetStore((store) => store.clearAll);
|
|
@@ -58,7 +75,7 @@ function QueueItem({
|
|
|
58
75
|
groupId: string;
|
|
59
76
|
scaleConfig?: ScaleConfig;
|
|
60
77
|
}) {
|
|
61
|
-
const
|
|
78
|
+
const sheet = useBottomSheetStore((state) => state.sheetsById[id]);
|
|
62
79
|
|
|
63
80
|
const { width, height } = useSafeAreaFrame();
|
|
64
81
|
const value = { id };
|
|
@@ -89,7 +106,11 @@ function QueueItem({
|
|
|
89
106
|
scaleStyle,
|
|
90
107
|
]}
|
|
91
108
|
>
|
|
92
|
-
{
|
|
109
|
+
{sheet?.usePortal ? (
|
|
110
|
+
<PortalHostWrapper id={id} width={width} height={height} />
|
|
111
|
+
) : (
|
|
112
|
+
sheet?.content
|
|
113
|
+
)}
|
|
93
114
|
</Animated.View>
|
|
94
115
|
</BottomSheetContext.Provider>
|
|
95
116
|
);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React, { type PropsWithChildren } from 'react';
|
|
2
|
+
import { PortalProvider } from 'react-native-teleport';
|
|
2
3
|
|
|
3
4
|
import {
|
|
4
5
|
BottomSheetManagerContext,
|
|
@@ -19,9 +20,11 @@ export function BottomSheetManagerProvider({
|
|
|
19
20
|
const value = { groupId: id, scaleConfig };
|
|
20
21
|
|
|
21
22
|
return (
|
|
22
|
-
<
|
|
23
|
-
{
|
|
24
|
-
|
|
23
|
+
<PortalProvider>
|
|
24
|
+
<BottomSheetManagerContext.Provider key={id} value={value}>
|
|
25
|
+
{children}
|
|
26
|
+
</BottomSheetManagerContext.Provider>
|
|
27
|
+
</PortalProvider>
|
|
25
28
|
);
|
|
26
29
|
}
|
|
27
30
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use no memo';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Portal } from 'react-native-teleport';
|
|
5
|
+
|
|
6
|
+
import { BottomSheetContext } from './BottomSheet.context';
|
|
7
|
+
import { useBottomSheetStore } from './bottomSheet.store';
|
|
8
|
+
import type { BottomSheetPortalId } from './portal.types';
|
|
9
|
+
import { sheetRefs } from './refsMap';
|
|
10
|
+
|
|
11
|
+
interface BottomSheetPortalProps {
|
|
12
|
+
id: BottomSheetPortalId;
|
|
13
|
+
children: React.ReactElement;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function BottomSheetPortal({ id, children }: BottomSheetPortalProps) {
|
|
17
|
+
const sheetState = useBottomSheetStore((state) => state.sheetsById[id]);
|
|
18
|
+
|
|
19
|
+
// Only render when the sheet is active and using portal
|
|
20
|
+
if (!sheetState?.usePortal) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Get the ref that was created in useBottomSheetControl.open()
|
|
25
|
+
const ref = sheetRefs[id];
|
|
26
|
+
|
|
27
|
+
// Clone the child element to add the ref
|
|
28
|
+
// @ts-ignore - same pattern as useBottomSheetManager
|
|
29
|
+
const childWithRef = React.cloneElement(children, { ref });
|
|
30
|
+
|
|
31
|
+
// Wrap with BottomSheetContext so useBottomSheetState() works inside portal content
|
|
32
|
+
return (
|
|
33
|
+
<Portal hostName={`bottomsheet-${id}`}>
|
|
34
|
+
<BottomSheetContext.Provider value={{ id }}>
|
|
35
|
+
{childWithRef}
|
|
36
|
+
</BottomSheetContext.Provider>
|
|
37
|
+
</Portal>
|
|
38
|
+
);
|
|
39
|
+
}
|
package/src/bottomSheet.store.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface BottomSheetState {
|
|
|
11
11
|
content: ReactNode;
|
|
12
12
|
status: BottomSheetStatus;
|
|
13
13
|
scaleBackground?: boolean;
|
|
14
|
+
usePortal?: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
type TriggerState = Omit<BottomSheetState, 'status'>;
|
|
@@ -20,10 +21,15 @@ interface BottomSheetStoreState {
|
|
|
20
21
|
stackOrder: string[];
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
export interface PortalOpenOptions {
|
|
25
|
+
scaleBackground?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
23
28
|
interface BottomSheetStoreActions {
|
|
24
29
|
push(sheet: TriggerState): void;
|
|
25
30
|
switch(sheet: TriggerState): void;
|
|
26
31
|
replace(sheet: TriggerState): void;
|
|
32
|
+
openPortal(id: string, groupId: string, options?: PortalOpenOptions): void;
|
|
27
33
|
markOpen(id: string): void;
|
|
28
34
|
startClosing(id: string): void;
|
|
29
35
|
finishClosing(id: string): void;
|
|
@@ -99,6 +105,27 @@ export const useBottomSheetStore = create(
|
|
|
99
105
|
};
|
|
100
106
|
}),
|
|
101
107
|
|
|
108
|
+
openPortal: (id, groupId, options) =>
|
|
109
|
+
set((state) => {
|
|
110
|
+
if (state.sheetsById[id]) {
|
|
111
|
+
return state;
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
sheetsById: {
|
|
115
|
+
...state.sheetsById,
|
|
116
|
+
[id]: {
|
|
117
|
+
id,
|
|
118
|
+
groupId,
|
|
119
|
+
content: null,
|
|
120
|
+
status: 'opening',
|
|
121
|
+
usePortal: true,
|
|
122
|
+
scaleBackground: options?.scaleBackground,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
stackOrder: [...state.stackOrder, id],
|
|
126
|
+
};
|
|
127
|
+
}),
|
|
128
|
+
|
|
102
129
|
markOpen: (id) =>
|
|
103
130
|
set((state) => {
|
|
104
131
|
const sheet = state.sheetsById[id];
|
package/src/index.tsx
CHANGED
|
@@ -5,3 +5,9 @@ export { useBottomSheetState } from './useBottomSheetState';
|
|
|
5
5
|
export { BottomSheetManaged } from './BottomSheetManaged';
|
|
6
6
|
export { BottomSheetScaleView } from './BottomSheetScaleView';
|
|
7
7
|
export { type ScaleConfig } from './useScaleAnimation';
|
|
8
|
+
export { BottomSheetPortal } from './BottomSheetPortal';
|
|
9
|
+
export { useBottomSheetControl } from './useBottomSheetControl';
|
|
10
|
+
export type {
|
|
11
|
+
BottomSheetPortalRegistry,
|
|
12
|
+
BottomSheetPortalId,
|
|
13
|
+
} from './portal.types';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry for portal-based bottom sheets.
|
|
3
|
+
* Augment this interface in your app to get type-safe sheet IDs:
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* declare module 'react-native-bottom-sheet-stack' {
|
|
8
|
+
* interface BottomSheetPortalRegistry {
|
|
9
|
+
* 'my-sheet': true;
|
|
10
|
+
* 'settings-sheet': true;
|
|
11
|
+
* 'profile-sheet': true;
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export interface BottomSheetPortalRegistry {}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Type-safe portal sheet ID.
|
|
20
|
+
* If BottomSheetPortalRegistry is augmented, this will be a union of the registered keys.
|
|
21
|
+
* Otherwise, it falls back to `string` for flexibility.
|
|
22
|
+
*/
|
|
23
|
+
export type BottomSheetPortalId = keyof BottomSheetPortalRegistry extends never
|
|
24
|
+
? string
|
|
25
|
+
: Extract<keyof BottomSheetPortalRegistry, string>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { BottomSheetMethods } from '@gorhom/bottom-sheet/lib/typescript/types';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
useBottomSheetStore,
|
|
6
|
+
type BottomSheetStatus,
|
|
7
|
+
type PortalOpenOptions,
|
|
8
|
+
} from './bottomSheet.store';
|
|
9
|
+
import { useMaybeBottomSheetManagerContext } from './BottomSheetManager.provider';
|
|
10
|
+
import type { BottomSheetPortalId } from './portal.types';
|
|
11
|
+
import { sheetRefs } from './refsMap';
|
|
12
|
+
|
|
13
|
+
export interface UseBottomSheetControlReturn {
|
|
14
|
+
open: (options?: PortalOpenOptions) => void;
|
|
15
|
+
close: () => void;
|
|
16
|
+
isOpen: boolean;
|
|
17
|
+
status: BottomSheetStatus | null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function useBottomSheetControl(
|
|
21
|
+
id: BottomSheetPortalId
|
|
22
|
+
): UseBottomSheetControlReturn {
|
|
23
|
+
const bottomSheetManagerContext = useMaybeBottomSheetManagerContext();
|
|
24
|
+
|
|
25
|
+
const openPortal = useBottomSheetStore((state) => state.openPortal);
|
|
26
|
+
const startClosing = useBottomSheetStore((state) => state.startClosing);
|
|
27
|
+
const sheetState = useBottomSheetStore((state) => state.sheetsById[id]);
|
|
28
|
+
|
|
29
|
+
const open = (options?: PortalOpenOptions) => {
|
|
30
|
+
const groupId = bottomSheetManagerContext?.groupId || 'default';
|
|
31
|
+
|
|
32
|
+
// Create ref when opening (same pattern as useBottomSheetManager)
|
|
33
|
+
const ref = React.createRef<BottomSheetMethods>();
|
|
34
|
+
sheetRefs[id] = ref;
|
|
35
|
+
|
|
36
|
+
openPortal(id, groupId, options);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const close = () => {
|
|
40
|
+
startClosing(id);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const status = sheetState?.status ?? null;
|
|
44
|
+
const isOpen = status === 'open' || status === 'opening';
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
open,
|
|
48
|
+
close,
|
|
49
|
+
isOpen,
|
|
50
|
+
status,
|
|
51
|
+
};
|
|
52
|
+
}
|