@onekeyfe/react-native-native-overlay 3.0.162-alpha.272 → 6.7.0-8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/onekey/nativeoverlay/NativeOverlayHost.kt +13 -10
- package/android/src/test/java/com/onekey/nativeoverlay/NativeOverlayBackTest.kt +157 -0
- package/docs/SPEC.md +121 -26
- package/ios/NativeOverlayContainerView.swift +20 -7
- package/ios/NativeOverlaySheetController.swift +35 -1
- package/lib/module/OverlayStore.js +13 -1
- package/lib/module/OverlayStore.js.map +1 -1
- package/lib/module/OverlayView.web.js +104 -25
- package/lib/module/OverlayView.web.js.map +1 -1
- package/lib/module/useOverlayController.js +11 -3
- package/lib/module/useOverlayController.js.map +1 -1
- package/lib/module/web/animateTransition.js +20 -12
- package/lib/module/web/animateTransition.js.map +1 -1
- package/lib/module/web/overlayLayers.js +16 -0
- package/lib/module/web/overlayLayers.js.map +1 -1
- package/lib/module/web/useKeyboardShift.js +1 -1
- package/lib/module/web/useKeyboardShift.js.map +1 -1
- package/lib/module/web/useSheetDrag.js +22 -2
- package/lib/module/web/useSheetDrag.js.map +1 -1
- package/lib/typescript/src/OverlayStore.d.ts +2 -0
- package/lib/typescript/src/OverlayStore.d.ts.map +1 -1
- package/lib/typescript/src/OverlayView.web.d.ts.map +1 -1
- package/lib/typescript/src/useOverlayController.d.ts.map +1 -1
- package/lib/typescript/src/web/animateTransition.d.ts +2 -2
- package/lib/typescript/src/web/animateTransition.d.ts.map +1 -1
- package/lib/typescript/src/web/overlayLayers.d.ts +1 -0
- package/lib/typescript/src/web/overlayLayers.d.ts.map +1 -1
- package/lib/typescript/src/web/useSheetDrag.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/OverlayStore.ts +13 -1
- package/src/OverlayView.web.tsx +193 -56
- package/src/useOverlayController.ts +11 -4
- package/src/web/animateTransition.ts +30 -11
- package/src/web/overlayLayers.ts +20 -0
- package/src/web/useKeyboardShift.ts +1 -1
- package/src/web/useSheetDrag.ts +23 -2
|
@@ -100,7 +100,8 @@ export function animateTransition(
|
|
|
100
100
|
element: HTMLElement,
|
|
101
101
|
contentRoot: HTMLElement,
|
|
102
102
|
transition: IResolvedOverlayTransition,
|
|
103
|
-
direction: 'in' | 'out'
|
|
103
|
+
direction: 'in' | 'out',
|
|
104
|
+
interruptedFrames?: ReadonlyMap<HTMLElement, Keyframe>
|
|
104
105
|
): Animation | undefined {
|
|
105
106
|
if (transition.type === 'none') {
|
|
106
107
|
return undefined;
|
|
@@ -109,16 +110,32 @@ export function animateTransition(
|
|
|
109
110
|
? { ...transition, type: 'fade', fade: true }
|
|
110
111
|
: transition;
|
|
111
112
|
const extent = measureContentExtent(contentRoot);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
// The React Native root wraps the positioned panel. Animate that panel so its
|
|
114
|
+
// offset parent stays unscaled; multi-child roots retain their shared motion.
|
|
115
|
+
const anchoredContent =
|
|
116
|
+
effective.origin === 'anchor' && contentRoot.childElementCount === 1
|
|
117
|
+
? contentRoot.firstElementChild
|
|
118
|
+
: undefined;
|
|
119
|
+
const target =
|
|
120
|
+
anchoredContent instanceof HTMLElement ? anchoredContent : element;
|
|
121
|
+
const targetRect =
|
|
122
|
+
target === element ? undefined : target.getBoundingClientRect();
|
|
123
|
+
target.style.transformOrigin = `${
|
|
124
|
+
(extent.left + extent.right) / 2 - (targetRect?.left ?? 0)
|
|
125
|
+
}px ${(extent.top + extent.bottom) / 2 - (targetRect?.top ?? 0)}px`;
|
|
115
126
|
const hidden = hiddenKeyframe(effective, extent);
|
|
116
127
|
const visible: Keyframe = {};
|
|
117
128
|
Object.keys(hidden).forEach((key) => {
|
|
118
129
|
visible[key] = VISIBLE_KEYFRAME[key];
|
|
119
130
|
});
|
|
120
|
-
const
|
|
121
|
-
|
|
131
|
+
const sampled = interruptedFrames?.get(target);
|
|
132
|
+
const initial = direction === 'in' ? hidden : visible;
|
|
133
|
+
const start: Keyframe = {};
|
|
134
|
+
Object.keys(initial).forEach((key) => {
|
|
135
|
+
start[key] = sampled?.[key] ?? initial[key];
|
|
136
|
+
});
|
|
137
|
+
const keyframes = [start, direction === 'in' ? visible : hidden];
|
|
138
|
+
return target.animate(keyframes, {
|
|
122
139
|
...toTiming(effective.motion),
|
|
123
140
|
fill: 'forwards',
|
|
124
141
|
});
|
|
@@ -127,11 +144,13 @@ export function animateTransition(
|
|
|
127
144
|
export function animateBackdrop(
|
|
128
145
|
element: HTMLElement,
|
|
129
146
|
motion: IOverlayMotion,
|
|
130
|
-
direction: 'in' | 'out'
|
|
147
|
+
direction: 'in' | 'out',
|
|
148
|
+
interruptedFrames?: ReadonlyMap<HTMLElement, Keyframe>
|
|
131
149
|
): Animation {
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
150
|
+
const sampled = interruptedFrames?.get(element)?.opacity;
|
|
151
|
+
const keyframes = [
|
|
152
|
+
{ opacity: sampled ?? (direction === 'in' ? 0 : 1) },
|
|
153
|
+
{ opacity: direction === 'in' ? 1 : 0 },
|
|
154
|
+
];
|
|
136
155
|
return element.animate(keyframes, { ...toTiming(motion), fill: 'forwards' });
|
|
137
156
|
}
|
package/src/web/overlayLayers.ts
CHANGED
|
@@ -15,6 +15,7 @@ const APP_ROOT_ID = 'root';
|
|
|
15
15
|
|
|
16
16
|
const layerRoots = new Map<IOverlayLevel, HTMLDivElement>();
|
|
17
17
|
const pageHosts = new Map<string, HTMLDivElement>();
|
|
18
|
+
const pageHostListeners = new Map<string, Set<() => void>>();
|
|
18
19
|
const dismissRequesters = new Map<
|
|
19
20
|
string,
|
|
20
21
|
(reason: IOverlayRequestDismissReason) => void
|
|
@@ -186,13 +187,32 @@ export function registerOverlayPageHost(
|
|
|
186
187
|
): () => void {
|
|
187
188
|
installOverlayWebManager();
|
|
188
189
|
pageHosts.set(hostKey, element);
|
|
190
|
+
pageHostListeners.get(hostKey)?.forEach((listener) => listener());
|
|
189
191
|
return () => {
|
|
190
192
|
if (pageHosts.get(hostKey) === element) {
|
|
191
193
|
pageHosts.delete(hostKey);
|
|
194
|
+
pageHostListeners.get(hostKey)?.forEach((listener) => listener());
|
|
192
195
|
}
|
|
193
196
|
};
|
|
194
197
|
}
|
|
195
198
|
|
|
199
|
+
export function subscribeOverlayPageHost(
|
|
200
|
+
hostKey: string | undefined,
|
|
201
|
+
listener: () => void
|
|
202
|
+
): () => void {
|
|
203
|
+
if (!hostKey) return () => {};
|
|
204
|
+
let listeners = pageHostListeners.get(hostKey);
|
|
205
|
+
if (!listeners) {
|
|
206
|
+
listeners = new Set();
|
|
207
|
+
pageHostListeners.set(hostKey, listeners);
|
|
208
|
+
}
|
|
209
|
+
listeners.add(listener);
|
|
210
|
+
return () => {
|
|
211
|
+
listeners.delete(listener);
|
|
212
|
+
if (listeners.size === 0) pageHostListeners.delete(hostKey);
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
196
216
|
export function getOverlayPageHost(
|
|
197
217
|
hostKey: string | undefined
|
|
198
218
|
): HTMLDivElement | undefined {
|
|
@@ -99,7 +99,7 @@ export function useKeyboardShift({
|
|
|
99
99
|
top = origin + sheet.offsetTop;
|
|
100
100
|
bottom = top + sheet.offsetHeight;
|
|
101
101
|
} else {
|
|
102
|
-
const extent = layoutExtent(contentRef.current);
|
|
102
|
+
const extent = layoutExtent(sheet ?? contentRef.current);
|
|
103
103
|
if (extent) {
|
|
104
104
|
top = origin + extent.top;
|
|
105
105
|
bottom = origin + extent.bottom;
|
package/src/web/useSheetDrag.ts
CHANGED
|
@@ -129,15 +129,36 @@ export function useSheetDrag({
|
|
|
129
129
|
);
|
|
130
130
|
};
|
|
131
131
|
|
|
132
|
+
const onPointerCancel = (event: PointerEvent) => {
|
|
133
|
+
if (!tracking || event.pointerId !== pointerId) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
tracking = false;
|
|
137
|
+
dragging = false;
|
|
138
|
+
velocity = 0;
|
|
139
|
+
if (sheet.hasPointerCapture?.(pointerId)) {
|
|
140
|
+
sheet.releasePointerCapture(pointerId);
|
|
141
|
+
}
|
|
142
|
+
pointerId = -1;
|
|
143
|
+
sheet.style.transform = '';
|
|
144
|
+
sheet.style.transition = '';
|
|
145
|
+
if (backdropRef.current) {
|
|
146
|
+
backdropRef.current.style.opacity = '1';
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
132
150
|
sheet.addEventListener('pointerdown', onPointerDown);
|
|
133
151
|
sheet.addEventListener('pointermove', onPointerMove);
|
|
134
152
|
sheet.addEventListener('pointerup', onPointerUp);
|
|
135
|
-
sheet.addEventListener('pointercancel',
|
|
153
|
+
sheet.addEventListener('pointercancel', onPointerCancel);
|
|
136
154
|
return () => {
|
|
155
|
+
if (sheet.hasPointerCapture?.(pointerId)) {
|
|
156
|
+
sheet.releasePointerCapture(pointerId);
|
|
157
|
+
}
|
|
137
158
|
sheet.removeEventListener('pointerdown', onPointerDown);
|
|
138
159
|
sheet.removeEventListener('pointermove', onPointerMove);
|
|
139
160
|
sheet.removeEventListener('pointerup', onPointerUp);
|
|
140
|
-
sheet.removeEventListener('pointercancel',
|
|
161
|
+
sheet.removeEventListener('pointercancel', onPointerCancel);
|
|
141
162
|
};
|
|
142
163
|
}, [sheetRef, backdropRef, enabled]);
|
|
143
164
|
}
|