flash-notifications 0.0.33 → 0.0.35
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/AGENTS.md +3 -0
- package/build/container/index.js +44 -8
- package/build/container/notification.js +20 -5
- package/package.json +8 -11
- package/scripts/velocious-test.js +186 -0
- package/spec/flash-notifications-spec.js +46 -0
- package/spec/support/dummy-http-server.js +52 -0
- package/spec/support/system-test-helper.js +99 -0
- package/src/container/index.jsx +44 -6
- package/src/container/notification.jsx +31 -6
package/AGENTS.md
ADDED
package/build/container/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { shapeComponent, ShapeComponent } from "set-state-compare/build/shape-co
|
|
|
7
7
|
import useBreakpoint from "@kaspernj/api-maker/build/use-breakpoint.js";
|
|
8
8
|
import useEventEmitter from "@kaspernj/api-maker/build/use-event-emitter.js";
|
|
9
9
|
import useEnvSense from "env-sense/build/use-env-sense.js";
|
|
10
|
-
import { View } from "react-native";
|
|
10
|
+
import { Animated, View } from "react-native";
|
|
11
11
|
import events from "../events.js";
|
|
12
12
|
import Notification from "./notification";
|
|
13
13
|
/**
|
|
@@ -23,6 +23,7 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
23
23
|
});
|
|
24
24
|
/** @type {number[]} */
|
|
25
25
|
timeouts = [];
|
|
26
|
+
notificationSpacing = 15;
|
|
26
27
|
setup() {
|
|
27
28
|
this.useStates({
|
|
28
29
|
count: 0,
|
|
@@ -74,7 +75,7 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
74
75
|
// @ts-expect-error
|
|
75
76
|
dataSet: this.rootViewDataSet ||= { component: "flash-notifications-container" },
|
|
76
77
|
// @ts-expect-error
|
|
77
|
-
style: viewStyle, testID: "flash-notificaitons/container" }, notifications.map((notification) => React.createElement(Notification, { count: notification.count, key: `notification-${notification.count}`, message: notification.message, notification: notification, onRemovedClicked: this.onRemovedClicked, title: notification.title, type: notification.type }))));
|
|
78
|
+
style: viewStyle, testID: "flash-notificaitons/container" }, notifications.map((notification) => React.createElement(Notification, { count: notification.count, key: `notification-${notification.count}`, message: notification.message, notification: notification, onMeasured: this.onNotificationMeasured, onRemovedClicked: this.onRemovedClicked, title: notification.title, type: notification.type }))));
|
|
78
79
|
}
|
|
79
80
|
/**
|
|
80
81
|
* @param {NotificationObjectType} detail
|
|
@@ -82,21 +83,56 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
82
83
|
*/
|
|
83
84
|
onPushNotification = (detail) => {
|
|
84
85
|
const count = this.s.count + 1;
|
|
85
|
-
const timeout = setTimeout(() => this.
|
|
86
|
+
const timeout = setTimeout(() => this.dismissNotificationByCount(count), 4000);
|
|
86
87
|
this.timeouts.push(timeout);
|
|
87
88
|
const notification = {
|
|
88
89
|
count,
|
|
90
|
+
height: new Animated.Value(0),
|
|
91
|
+
marginBottom: new Animated.Value(this.notificationSpacing),
|
|
92
|
+
measuredHeight: undefined,
|
|
89
93
|
message: digg(detail, "message"),
|
|
94
|
+
opacity: new Animated.Value(1),
|
|
95
|
+
removing: false,
|
|
96
|
+
timeout,
|
|
90
97
|
title: digg(detail, "title"),
|
|
91
98
|
type: digg(detail, "type")
|
|
92
99
|
};
|
|
93
100
|
this.setState({ count, notifications: this.s.notifications.concat([notification]) });
|
|
94
101
|
};
|
|
95
|
-
onRemovedClicked = (notification) => this.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
onRemovedClicked = (notification) => this.dismissNotification(notification);
|
|
103
|
+
onNotificationMeasured = (notification, measuredHeight) => {
|
|
104
|
+
if (notification.measuredHeight)
|
|
105
|
+
return;
|
|
106
|
+
notification.measuredHeight = measuredHeight;
|
|
107
|
+
notification.height.setValue(measuredHeight);
|
|
108
|
+
this.setState({ notifications: [...this.s.notifications] });
|
|
109
|
+
};
|
|
110
|
+
dismissNotificationByCount = (count) => {
|
|
111
|
+
const notification = this.s.notifications.find((item) => item.count == count);
|
|
112
|
+
if (!notification)
|
|
113
|
+
return;
|
|
114
|
+
this.dismissNotification(notification);
|
|
115
|
+
};
|
|
116
|
+
dismissNotification = (notification) => {
|
|
117
|
+
if (notification.removing)
|
|
118
|
+
return;
|
|
119
|
+
notification.removing = true;
|
|
120
|
+
if (notification.timeout)
|
|
121
|
+
clearTimeout(notification.timeout);
|
|
122
|
+
if (!notification.measuredHeight) {
|
|
123
|
+
notification.measuredHeight = 1;
|
|
124
|
+
notification.height.setValue(1);
|
|
125
|
+
this.setState({ notifications: [...this.s.notifications] });
|
|
126
|
+
}
|
|
127
|
+
Animated.parallel([
|
|
128
|
+
Animated.timing(notification.opacity, { toValue: 0, duration: 200, useNativeDriver: false }),
|
|
129
|
+
Animated.timing(notification.height, { toValue: 0, duration: 200, useNativeDriver: false }),
|
|
130
|
+
Animated.timing(notification.marginBottom, { toValue: 0, duration: 200, useNativeDriver: false })
|
|
131
|
+
]).start(() => {
|
|
132
|
+
this.setState({
|
|
133
|
+
notifications: this.s.notifications.filter((item) => item.count != notification.count)
|
|
134
|
+
});
|
|
99
135
|
});
|
|
100
136
|
};
|
|
101
137
|
}));
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbImNvbnRhaW5lci9pbmRleC5qc3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFBO0FBQzdDLE9BQU8sS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDckQsT0FBTyxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN6RixPQUFPLGFBQWEsTUFBTSw2Q0FBNkMsQ0FBQTtBQUN2RSxPQUFPLGVBQWUsTUFBTSxnREFBZ0QsQ0FBQTtBQUM1RSxPQUFPLFdBQVcsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRWpDLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLFlBQVksTUFBTSxnQkFBZ0IsQ0FBQTtBQUV6Qzs7Ozs7O0dBTUc7QUFFSCxlQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSwyQkFBNEIsU0FBUSxjQUFjO0lBQ3pGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtLQUN6QixDQUFDLENBQUE7SUFFRix1QkFBdUI7SUFDdkIsUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUViLEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2IsS0FBSyxFQUFFLENBQUM7WUFDUixhQUFhLEVBQUUsRUFBRTtTQUNsQixDQUFDLENBQUE7UUFFRixlQUFlLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ3BF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Q0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFM0IsTUFBTSxZQUFZLEdBQUc7WUFDbkIsS0FBSztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1NBQzNCLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtJQUNwRixDQUFDLENBQUE7SUFFRCxnQkFBZ0IsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUV6RixrQkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztTQUMxRixDQUFDLENBQUE7SUFDSixDQUFDLENBQUE7Q0FDRixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgcHJvcFR5cGVzRXhhY3QgZnJvbSBcInByb3AtdHlwZXMtZXhhY3RcIlxuaW1wb3J0IFJlYWN0LCB7bWVtbywgdXNlRWZmZWN0LCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtzaGFwZUNvbXBvbmVudCwgU2hhcGVDb21wb25lbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9zaGFwZS1jb21wb25lbnQuanNcIlxuaW1wb3J0IHVzZUJyZWFrcG9pbnQgZnJvbSBcIkBrYXNwZXJuai9hcGktbWFrZXIvYnVpbGQvdXNlLWJyZWFrcG9pbnQuanNcIlxuaW1wb3J0IHVzZUV2ZW50RW1pdHRlciBmcm9tIFwiQGthc3Blcm5qL2FwaS1tYWtlci9idWlsZC91c2UtZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgdXNlRW52U2Vuc2UgZnJvbSBcImVudi1zZW5zZS9idWlsZC91c2UtZW52LXNlbnNlLmpzXCJcbmltcG9ydCB7Vmlld30gZnJvbSBcInJlYWN0LW5hdGl2ZVwiXG5cbmltcG9ydCBldmVudHMgZnJvbSBcIi4uL2V2ZW50cy5qc1wiXG5pbXBvcnQgTm90aWZpY2F0aW9uIGZyb20gXCIuL25vdGlmaWNhdGlvblwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpY2F0aW9uT2JqZWN0VHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IG1lbW8oc2hhcGVDb21wb25lbnQoY2xhc3MgRmxhc2hOb3RpZmljYXRpb25zQ29udGFpbmVyIGV4dGVuZHMgU2hhcGVDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0gcHJvcFR5cGVzRXhhY3Qoe1xuICAgIGluc2V0czogUHJvcFR5cGVzLm9iamVjdFxuICB9KVxuXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIHRpbWVvdXRzID0gW11cblxuICBzZXR1cCgpIHtcbiAgICB0aGlzLnVzZVN0YXRlcyh7XG4gICAgICBjb3VudDogMCxcbiAgICAgIG5vdGlmaWNhdGlvbnM6IFtdXG4gICAgfSlcblxuICAgIHVzZUV2ZW50RW1pdHRlcihldmVudHMsIFwicHVzaE5vdGlmaWNhdGlvblwiLCB0aGlzLm9uUHVzaE5vdGlmaWNhdGlvbilcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB0aW1lb3V0IG9mIHRoaXMudGltZW91dHMpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFtdKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtub3RpZmljYXRpb25zfSA9IHRoaXMuc1xuICAgIGNvbnN0IGluc2V0cyA9IHRoaXMucHJvcHMuaW5zZXRzIHx8IHt9XG5cbiAgICBjb25zdCB7c21Eb3duLCBtZFVwfSA9IHVzZUJyZWFrcG9pbnQoKVxuICAgIGNvbnN0IHtpc05hdGl2ZX0gPSB1c2VFbnZTZW5zZSgpXG5cbiAgICBjb25zdCB2aWV3U3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGxldCB0b3AgPSAyMFxuICAgICAgbGV0IHJpZ2h0ID0gMFxuICAgICAgbGV0IGxlZnQgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKGluc2V0cy50b3ApIHRvcCArPSBpbnNldHMudG9wXG4gICAgICBpZiAoaW5zZXRzLnJpZ2h0KSByaWdodCArPSBpbnNldHMucmlnaHRcblxuICAgICAgaWYgKHNtRG93bikge1xuICAgICAgICBsZWZ0ID0gMjBcblxuICAgICAgICBpZiAoaW5zZXRzLmxlZnQpIGxlZnQgKz0gaW5zZXRzLmxlZnRcblxuICAgICAgICByaWdodCArPSAyMFxuICAgICAgfSBlbHNlIGlmIChtZFVwKSB7XG4gICAgICAgIHJpZ2h0ICs9IDIwXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgICBwb3NpdGlvbjogaXNOYXRpdmUgPyBcImFic29sdXRlXCIgOiBcImZpeGVkXCIsXG4gICAgICAgIHRvcCxcbiAgICAgICAgcmlnaHQsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHpJbmRleDogOTk5OTlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0eWxlXG4gICAgfSwgW2lzTmF0aXZlLCBzbURvd24sIG1kVXAsIGluc2V0cy50b3AsIGluc2V0cy5yaWdodCwgaW5zZXRzLmxlZnRdKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgZGF0YVNldD17dGhpcy5yb290Vmlld0RhdGFTZXQgfHw9IHtjb21wb25lbnQ6IFwiZmxhc2gtbm90aWZpY2F0aW9ucy1jb250YWluZXJcIn19XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgc3R5bGU9e3ZpZXdTdHlsZX1cbiAgICAgICAgdGVzdElEPVwiZmxhc2gtbm90aWZpY2FpdG9ucy9jb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICB7bm90aWZpY2F0aW9ucy5tYXAoKG5vdGlmaWNhdGlvbikgPT5cbiAgICAgICAgICA8Tm90aWZpY2F0aW9uXG4gICAgICAgICAgICBjb3VudD17bm90aWZpY2F0aW9uLmNvdW50fVxuICAgICAgICAgICAga2V5PXtgbm90aWZpY2F0aW9uLSR7bm90aWZpY2F0aW9uLmNvdW50fWB9XG4gICAgICAgICAgICBtZXNzYWdlPXtub3RpZmljYXRpb24ubWVzc2FnZX1cbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbj17bm90aWZpY2F0aW9ufVxuICAgICAgICAgICAgb25SZW1vdmVkQ2xpY2tlZD17dGhpcy5vblJlbW92ZWRDbGlja2VkfVxuICAgICAgICAgICAgdGl0bGU9e25vdGlmaWNhdGlvbi50aXRsZX1cbiAgICAgICAgICAgIHR5cGU9e25vdGlmaWNhdGlvbi50eXBlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uT2JqZWN0VHlwZX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25QdXNoTm90aWZpY2F0aW9uID0gKGRldGFpbCkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zLmNvdW50ICsgMVxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVtb3ZlTm90aWZpY2F0aW9uKGNvdW50KSwgNDAwMClcblxuICAgIHRoaXMudGltZW91dHMucHVzaCh0aW1lb3V0KVxuXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0ge1xuICAgICAgY291bnQsXG4gICAgICBtZXNzYWdlOiBkaWdnKGRldGFpbCwgXCJtZXNzYWdlXCIpLFxuICAgICAgdGl0bGU6IGRpZ2coZGV0YWlsLCBcInRpdGxlXCIpLFxuICAgICAgdHlwZTogZGlnZyhkZXRhaWwsIFwidHlwZVwiKVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe2NvdW50LCBub3RpZmljYXRpb25zOiB0aGlzLnMubm90aWZpY2F0aW9ucy5jb25jYXQoW25vdGlmaWNhdGlvbl0pfSlcbiAgfVxuXG4gIG9uUmVtb3ZlZENsaWNrZWQgPSAobm90aWZpY2F0aW9uKSA9PiB0aGlzLnJlbW92ZU5vdGlmaWNhdGlvbihkaWdnKG5vdGlmaWNhdGlvbiwgXCJjb3VudFwiKSlcblxuICByZW1vdmVOb3RpZmljYXRpb24gPSAoY291bnQpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG5vdGlmaWNhdGlvbnM6IHRoaXMucy5ub3RpZmljYXRpb25zLmZpbHRlcigobm90aWZpY2F0aW9uKSA9PiBub3RpZmljYXRpb24uY291bnQgIT0gY291bnQpXG4gICAgfSlcbiAgfVxufSkpXG4iXX0=
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbImNvbnRhaW5lci9pbmRleC5qc3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFBO0FBQzdDLE9BQU8sS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDckQsT0FBTyxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN6RixPQUFPLGFBQWEsTUFBTSw2Q0FBNkMsQ0FBQTtBQUN2RSxPQUFPLGVBQWUsTUFBTSxnREFBZ0QsQ0FBQTtBQUM1RSxPQUFPLFdBQVcsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUUzQyxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxZQUFZLE1BQU0sZ0JBQWdCLENBQUE7QUFFekM7Ozs7OztHQU1HO0FBRUgsZUFBZSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sMkJBQTRCLFNBQVEsY0FBYztJQUN6RixNQUFNLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUNoQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFBO0lBRUYsdUJBQXVCO0lBQ3ZCLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFDYixtQkFBbUIsR0FBRyxFQUFFLENBQUE7SUFFeEIsS0FBSztRQUNILElBQUksQ0FBQyxTQUFTLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQztZQUNSLGFBQWEsRUFBRSxFQUFFO1NBQ2xCLENBQUMsQ0FBQTtRQUVGLGVBQWUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtC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QyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQztZQUMxRixRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDO1lBQ3pGLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUM7U0FDaEcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQzthQUN2RixDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQTtDQUNGLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBwcm9wVHlwZXNFeGFjdCBmcm9tIFwicHJvcC10eXBlcy1leGFjdFwiXG5pbXBvcnQgUmVhY3QsIHttZW1vLCB1c2VFZmZlY3QsIHVzZU1lbW99IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge3NoYXBlQ29tcG9uZW50LCBTaGFwZUNvbXBvbmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL2J1aWxkL3NoYXBlLWNvbXBvbmVudC5qc1wiXG5pbXBvcnQgdXNlQnJlYWtwb2ludCBmcm9tIFwiQGthc3Blcm5qL2FwaS1tYWtlci9idWlsZC91c2UtYnJlYWtwb2ludC5qc1wiXG5pbXBvcnQgdXNlRXZlbnRFbWl0dGVyIGZyb20gXCJAa2FzcGVybmovYXBpLW1ha2VyL2J1aWxkL3VzZS1ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB1c2VFbnZTZW5zZSBmcm9tIFwiZW52LXNlbnNlL2J1aWxkL3VzZS1lbnYtc2Vuc2UuanNcIlxuaW1wb3J0IHtBbmltYXRlZCwgVmlld30gZnJvbSBcInJlYWN0LW5hdGl2ZVwiXG5cbmltcG9ydCBldmVudHMgZnJvbSBcIi4uL2V2ZW50cy5qc1wiXG5pbXBvcnQgTm90aWZpY2F0aW9uIGZyb20gXCIuL25vdGlmaWNhdGlvblwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpY2F0aW9uT2JqZWN0VHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IG1lbW8oc2hhcGVDb21wb25lbnQoY2xhc3MgRmxhc2hOb3RpZmljYXRpb25zQ29udGFpbmVyIGV4dGVuZHMgU2hhcGVDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0gcHJvcFR5cGVzRXhhY3Qoe1xuICAgIGluc2V0czogUHJvcFR5cGVzLm9iamVjdFxuICB9KVxuXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIHRpbWVvdXRzID0gW11cbiAgbm90aWZpY2F0aW9uU3BhY2luZyA9IDE1XG5cbiAgc2V0dXAoKSB7XG4gICAgdGhpcy51c2VTdGF0ZXMoe1xuICAgICAgY291bnQ6IDAsXG4gICAgICBub3RpZmljYXRpb25zOiBbXVxuICAgIH0pXG5cbiAgICB1c2VFdmVudEVtaXR0ZXIoZXZlbnRzLCBcInB1c2hOb3RpZmljYXRpb25cIiwgdGhpcy5vblB1c2hOb3RpZmljYXRpb24pXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgdGltZW91dCBvZiB0aGlzLnRpbWVvdXRzKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBbXSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9uc30gPSB0aGlzLnNcbiAgICBjb25zdCBpbnNldHMgPSB0aGlzLnByb3BzLmluc2V0cyB8fCB7fVxuXG4gICAgY29uc3Qge3NtRG93biwgbWRVcH0gPSB1c2VCcmVha3BvaW50KClcbiAgICBjb25zdCB7aXNOYXRpdmV9ID0gdXNlRW52U2Vuc2UoKVxuXG4gICAgY29uc3Qgdmlld1N0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBsZXQgdG9wID0gMjBcbiAgICAgIGxldCByaWdodCA9IDBcbiAgICAgIGxldCBsZWZ0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmIChpbnNldHMudG9wKSB0b3AgKz0gaW5zZXRzLnRvcFxuICAgICAgaWYgKGluc2V0cy5yaWdodCkgcmlnaHQgKz0gaW5zZXRzLnJpZ2h0XG5cbiAgICAgIGlmIChzbURvd24pIHtcbiAgICAgICAgbGVmdCA9IDIwXG5cbiAgICAgICAgaWYgKGluc2V0cy5sZWZ0KSBsZWZ0ICs9IGluc2V0cy5sZWZ0XG5cbiAgICAgICAgcmlnaHQgKz0gMjBcbiAgICAgIH0gZWxzZSBpZiAobWRVcCkge1xuICAgICAgICByaWdodCArPSAyMFxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgICAgcG9zaXRpb246IGlzTmF0aXZlID8gXCJhYnNvbHV0ZVwiIDogXCJmaXhlZFwiLFxuICAgICAgICB0b3AsXG4gICAgICAgIHJpZ2h0LFxuICAgICAgICBsZWZ0LFxuICAgICAgICB6SW5kZXg6IDk5OTk5XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHlsZVxuICAgIH0sIFtpc05hdGl2ZSwgc21Eb3duLCBtZFVwLCBpbnNldHMudG9wLCBpbnNldHMucmlnaHQsIGluc2V0cy5sZWZ0XSlcblxuICAgIHJldHVybiAoXG4gICAgICA8Vmlld1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGRhdGFTZXQ9e3RoaXMucm9vdFZpZXdEYXRhU2V0IHx8PSB7Y29tcG9uZW50OiBcImZsYXNoLW5vdGlmaWNhdGlvbnMtY29udGFpbmVyXCJ9fVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHN0eWxlPXt2aWV3U3R5bGV9XG4gICAgICAgIHRlc3RJRD1cImZsYXNoLW5vdGlmaWNhaXRvbnMvY29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAge25vdGlmaWNhdGlvbnMubWFwKChub3RpZmljYXRpb24pID0+XG4gICAgICAgICAgPE5vdGlmaWNhdGlvblxuICAgICAgICAgICAgY291bnQ9e25vdGlmaWNhdGlvbi5jb3VudH1cbiAgICAgICAgICAgIGtleT17YG5vdGlmaWNhdGlvbi0ke25vdGlmaWNhdGlvbi5jb3VudH1gfVxuICAgICAgICAgICAgbWVzc2FnZT17bm90aWZpY2F0aW9uLm1lc3NhZ2V9XG4gICAgICAgICAgICBub3RpZmljYXRpb249e25vdGlmaWNhdGlvbn1cbiAgICAgICAgICAgIG9uTWVhc3VyZWQ9e3RoaXMub25Ob3RpZmljYXRpb25NZWFzdXJlZH1cbiAgICAgICAgICAgIG9uUmVtb3ZlZENsaWNrZWQ9e3RoaXMub25SZW1vdmVkQ2xpY2tlZH1cbiAgICAgICAgICAgIHRpdGxlPXtub3RpZmljYXRpb24udGl0bGV9XG4gICAgICAgICAgICB0eXBlPXtub3RpZmljYXRpb24udHlwZX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vdGlmaWNhdGlvbk9iamVjdFR5cGV9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uUHVzaE5vdGlmaWNhdGlvbiA9IChkZXRhaWwpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucy5jb3VudCArIDFcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpc21pc3NOb3RpZmljYXRpb25CeUNvdW50KGNvdW50KSwgNDAwMClcblxuICAgIHRoaXMudGltZW91dHMucHVzaCh0aW1lb3V0KVxuXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0ge1xuICAgICAgY291bnQsXG4gICAgICBoZWlnaHQ6IG5ldyBBbmltYXRlZC5WYWx1ZSgwKSxcbiAgICAgIG1hcmdpbkJvdHRvbTogbmV3IEFuaW1hdGVkLlZhbHVlKHRoaXMubm90aWZpY2F0aW9uU3BhY2luZyksXG4gICAgICBtZWFzdXJlZEhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZTogZGlnZyhkZXRhaWwsIFwibWVzc2FnZVwiKSxcbiAgICAgIG9wYWNpdHk6IG5ldyBBbmltYXRlZC5WYWx1ZSgxKSxcbiAgICAgIHJlbW92aW5nOiBmYWxzZSxcbiAgICAgIHRpbWVvdXQsXG4gICAgICB0aXRsZTogZGlnZyhkZXRhaWwsIFwidGl0bGVcIiksXG4gICAgICB0eXBlOiBkaWdnKGRldGFpbCwgXCJ0eXBlXCIpXG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7Y291bnQsIG5vdGlmaWNhdGlvbnM6IHRoaXMucy5ub3RpZmljYXRpb25zLmNvbmNhdChbbm90aWZpY2F0aW9uXSl9KVxuICB9XG5cbiAgb25SZW1vdmVkQ2xpY2tlZCA9IChub3RpZmljYXRpb24pID0+IHRoaXMuZGlzbWlzc05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXG5cbiAgb25Ob3RpZmljYXRpb25NZWFzdXJlZCA9IChub3RpZmljYXRpb24sIG1lYXN1cmVkSGVpZ2h0KSA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCkgcmV0dXJuXG5cbiAgICBub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQgPSBtZWFzdXJlZEhlaWdodFxuICAgIG5vdGlmaWNhdGlvbi5oZWlnaHQuc2V0VmFsdWUobWVhc3VyZWRIZWlnaHQpXG4gICAgdGhpcy5zZXRTdGF0ZSh7bm90aWZpY2F0aW9uczogWy4uLnRoaXMucy5ub3RpZmljYXRpb25zXX0pXG4gIH1cblxuICBkaXNtaXNzTm90aWZpY2F0aW9uQnlDb3VudCA9IChjb3VudCkgPT4ge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHRoaXMucy5ub3RpZmljYXRpb25zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY291bnQgPT0gY291bnQpXG4gICAgaWYgKCFub3RpZmljYXRpb24pIHJldHVyblxuICAgIHRoaXMuZGlzbWlzc05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXG4gIH1cblxuICBkaXNtaXNzTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbikgPT4ge1xuICAgIGlmIChub3RpZmljYXRpb24ucmVtb3ZpbmcpIHJldHVyblxuICAgIG5vdGlmaWNhdGlvbi5yZW1vdmluZyA9IHRydWVcbiAgICBpZiAobm90aWZpY2F0aW9uLnRpbWVvdXQpIGNsZWFyVGltZW91dChub3RpZmljYXRpb24udGltZW91dClcblxuICAgIGlmICghbm90aWZpY2F0aW9uLm1lYXN1cmVkSGVpZ2h0KSB7XG4gICAgICBub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQgPSAxXG4gICAgICBub3RpZmljYXRpb24uaGVpZ2h0LnNldFZhbHVlKDEpXG4gICAgICB0aGlzLnNldFN0YXRlKHtub3RpZmljYXRpb25zOiBbLi4udGhpcy5zLm5vdGlmaWNhdGlvbnNdfSlcbiAgICB9XG5cbiAgICBBbmltYXRlZC5wYXJhbGxlbChbXG4gICAgICBBbmltYXRlZC50aW1pbmcobm90aWZpY2F0aW9uLm9wYWNpdHksIHt0b1ZhbHVlOiAwLCBkdXJhdGlvbjogMjAwLCB1c2VOYXRpdmVEcml2ZXI6IGZhbHNlfSksXG4gICAgICBBbmltYXRlZC50aW1pbmcobm90aWZpY2F0aW9uLmhlaWdodCwge3RvVmFsdWU6IDAsIGR1cmF0aW9uOiAyMDAsIHVzZU5hdGl2ZURyaXZlcjogZmFsc2V9KSxcbiAgICAgIEFuaW1hdGVkLnRpbWluZyhub3RpZmljYXRpb24ubWFyZ2luQm90dG9tLCB7dG9WYWx1ZTogMCwgZHVyYXRpb246IDIwMCwgdXNlTmF0aXZlRHJpdmVyOiBmYWxzZX0pXG4gICAgXSkuc3RhcnQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG5vdGlmaWNhdGlvbnM6IHRoaXMucy5ub3RpZmljYXRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5jb3VudCAhPSBub3RpZmljYXRpb24uY291bnQpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn0pKVxuIl19
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import PropTypes from "prop-types";
|
|
2
2
|
import PropTypesExact from "prop-types-exact";
|
|
3
3
|
import React, { memo, useMemo } from "react";
|
|
4
|
-
import { Pressable, StyleSheet, Text, View } from "react-native";
|
|
4
|
+
import { Animated, Pressable, StyleSheet, Text, View } from "react-native";
|
|
5
5
|
import { shapeComponent, ShapeComponent } from "set-state-compare/build/shape-component.js";
|
|
6
6
|
import useStyles from "@kaspernj/api-maker/build/use-styles.js";
|
|
7
7
|
const styles = StyleSheet.create({
|
|
8
8
|
view: {
|
|
9
|
-
marginBottom: 15,
|
|
10
9
|
padding: 15,
|
|
11
10
|
borderRadius: 11,
|
|
12
11
|
cursor: "pointer"
|
|
@@ -47,6 +46,7 @@ export default memo(shapeComponent(class FlashNotificationsNotification extends
|
|
|
47
46
|
count: PropTypes.number.isRequired,
|
|
48
47
|
message: PropTypes.string.isRequired,
|
|
49
48
|
notification: PropTypes.object.isRequired,
|
|
49
|
+
onMeasured: PropTypes.func.isRequired,
|
|
50
50
|
onRemovedClicked: PropTypes.func.isRequired,
|
|
51
51
|
title: PropTypes.string.isRequired,
|
|
52
52
|
type: PropTypes.string.isRequired
|
|
@@ -64,13 +64,28 @@ export default memo(shapeComponent(class FlashNotificationsNotification extends
|
|
|
64
64
|
role: "dialog",
|
|
65
65
|
type
|
|
66
66
|
}), [className, type]);
|
|
67
|
-
return (React.createElement(
|
|
68
|
-
React.createElement(
|
|
67
|
+
return (React.createElement(Animated.View, { style: this.tt.wrapperStyle },
|
|
68
|
+
React.createElement(Pressable, { dataSet: pressableDataSet, onLayout: this.tt.onLayout, onPress: this.tt.onRemovedClicked, style: viewStyles, testID: "flash-notifications-notification" },
|
|
69
69
|
React.createElement(View, { style: styles.titleview, testID: "notification-title" },
|
|
70
70
|
React.createElement(Text, { style: styles.titleText, testID: `flash-notifications/notification-${count}/title` }, title)),
|
|
71
71
|
React.createElement(View, { testID: "notification-message" },
|
|
72
72
|
React.createElement(Text, { style: styles.messageText, testID: `flash-notifications/notification-${count}/message` }, message)))));
|
|
73
73
|
}
|
|
74
|
+
get wrapperStyle() {
|
|
75
|
+
const { notification } = this.p;
|
|
76
|
+
return {
|
|
77
|
+
height: notification.measuredHeight ? notification.height : undefined,
|
|
78
|
+
marginBottom: notification.marginBottom,
|
|
79
|
+
opacity: notification.opacity,
|
|
80
|
+
overflow: "hidden"
|
|
81
|
+
};
|
|
82
|
+
}
|
|
74
83
|
onRemovedClicked = () => this.p.onRemovedClicked(this.p.notification);
|
|
84
|
+
onLayout = (event) => {
|
|
85
|
+
const { notification } = this.p;
|
|
86
|
+
if (!notification.measuredHeight) {
|
|
87
|
+
this.p.onMeasured(notification, event.nativeEvent.layout.height);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
75
90
|
}));
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb250YWluZXIvbm90aWZpY2F0aW9uLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQzFDLE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ3hFLE9BQU8sRUFBQyxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sNENBQTRDLENBQUE7QUFDekYsT0FBTyxTQUFTLE1BQU0seUNBQXlDLENBQUE7QUFFL0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUMvQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsRUFBRTtRQUNYLFlBQVksRUFBRSxFQUFFO1FBQ2hCLE1BQU0sRUFBRSxTQUFTO0tBQ2xCO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFLE1BQU07S0FDZDtJQUNELFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRSxHQUFHO1FBQ1YsUUFBUSxFQUFFLE1BQU07S0FDakI7SUFDRCxTQUFTLEVBQUU7UUFDVCxNQUFNLEVBQUUsbUNBQW1DO1FBQzNDLGVBQWUsRUFBRSx5QkFBeUI7S0FDM0M7SUFDRCxXQUFXLEVBQUU7UUFDWCxNQUFNLEVBQUUsK0JBQStCO1FBQ3ZDLGVBQWUsRUFBRSxxQkFBcUI7S0FDdkM7SUFDRCxTQUFTLEVBQUU7UUFDVCxNQUFNLEVBQUUsa0NBQWtDO1FBQzFDLGVBQWUsRUFBRSx3QkFBd0I7S0FDMUM7SUFDRCxTQUFTLEVBQUU7UUFDVCxZQUFZLEVBQUUsQ0FBQztLQUNoQjtJQUNELFNBQVMsRUFBRTtRQUNULEtBQUssRUFBRSxNQUFNO1FBQ2IsVUFBVSxFQUFFLE1BQU07S0FDbkI7SUFDRCxXQUFXLEVBQUU7UUFDWCxLQUFLLEVBQUUsTUFBTTtLQUNkO0NBQ0YsQ0FBQyxDQUFBO0FBRUYsZUFBZSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sOEJBQStCLFNBQVEsY0FBYztJQUM1RixNQUFNLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztRQUNoQyxTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU07UUFDM0IsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNsQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ3BDLFlBQVksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDekMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVTtRQUNyQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDM0MsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNsQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVO0tBQ2xDLENBQUMsQ0FBQTtJQUVGLE1BQU07UUFDSixNQUFNLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1QyxNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUU5QixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUM1QyxTQUFTLEVBQUUsSUFBSSxJQUFJLE9BQU87Z0JBQzFCLFdBQVcsRUFBRSxJQUFJLElBQUksU0FBUztnQkFDOUIsU0FBUyxFQUFFLElBQUksSUFBSSxPQUFPO2FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBRUgsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQzlCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDTCxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUk7U0FDTCxDQUFDLEVBQ0YsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQ2xCLENBQUE7UUFFRCxPQUFPLENBQ0wsb0JBQUMsUUFBUSxDQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZO1lBQ3hDLG9CQUFDLFNBQVMsSUFDUixPQUFPLEVBQUUsZ0JBQWdCLEVBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQ2pDLEtBQUssRUFBRSxVQUFVLEVBQ2pCLE1BQU0sRUFBQyxrQ0FBa0M7Z0JBRXpDLG9CQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUMsb0JBQW9CO29CQUN4RCxvQkFBQyxJQUFJLElBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLG9DQUFvQyxLQUFLLFFBQVEsSUFDckYsS0FBSyxDQUNELENBQ0Y7Z0JBQ1Asb0JBQUMsSUFBSSxJQUFDLE1BQU0sRUFBQyxzQkFBc0I7b0JBQ2pDLG9CQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsb0NBQW9DLEtBQUssVUFBVSxJQUN6RixPQUFPLENBQ0gsQ0FDRixDQUNHLENBQ0UsQ0FDakIsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUU3QixPQUFPO1lBQ0wsTUFBTSxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDckUsWUFBWSxFQUFFLFlBQVksQ0FBQyxZQUFZO1lBQ3ZDLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTztZQUM3QixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUVyRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUU3QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsRSxDQUFDO0lBQ0gsQ0FBQyxDQUFBO0NBQ0YsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBQcm9wVHlwZXNFeGFjdCBmcm9tIFwicHJvcC10eXBlcy1leGFjdFwiXG5pbXBvcnQgUmVhY3QsIHttZW1vLCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtBbmltYXRlZCwgUHJlc3NhYmxlLCBTdHlsZVNoZWV0LCBUZXh0LCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCB7c2hhcGVDb21wb25lbnQsIFNoYXBlQ29tcG9uZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvc2hhcGUtY29tcG9uZW50LmpzXCJcbmltcG9ydCB1c2VTdHlsZXMgZnJvbSBcIkBrYXNwZXJuai9hcGktbWFrZXIvYnVpbGQvdXNlLXN0eWxlcy5qc1wiXG5cbmNvbnN0IHN0eWxlcyA9IFN0eWxlU2hlZXQuY3JlYXRlKHtcbiAgdmlldzoge1xuICAgIHBhZGRpbmc6IDE1LFxuICAgIGJvcmRlclJhZGl1czogMTEsXG4gICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICB9LFxuICB2aWV3U21Eb3duOiB7XG4gICAgd2lkdGg6IFwiMTAwJVwiXG4gIH0sXG4gIHZpZXdNZFVwOiB7XG4gICAgd2lkdGg6IDMwMCxcbiAgICBtYXhXaWR0aDogXCIxMDAlXCJcbiAgfSxcbiAgdmlld0Vycm9yOiB7XG4gICAgYm9yZGVyOiBcIjFweCBzb2xpZCByZ2JhKDE2MSwgMzQsIDMyLCAwLjk1KVwiLFxuICAgIGJhY2tncm91bmRDb2xvcjogXCJyZ2JhKDE2MSwgMzQsIDMyLCAwLjg3KVwiXG4gIH0sXG4gIHZpZXdTdWNjZXNzOiB7XG4gICAgYm9yZGVyOiBcIjFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuOTUpXCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC44NylcIlxuICB9LFxuICB2aWV3QWxlcnQ6IHtcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHJnYmEoMjA0LCA1MSwgMCwgMC45NSlcIixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmdiYSgyMDQsIDUxLCAwLCAwLjg3KVwiXG4gIH0sXG4gIHRpdGxldmlldzoge1xuICAgIG1hcmdpbkJvdHRvbTogNVxuICB9LFxuICB0aXRsZVRleHQ6IHtcbiAgICBjb2xvcjogXCIjZmZmXCIsXG4gICAgZm9udFdlaWdodDogXCJib2xkXCJcbiAgfSxcbiAgbWVzc2FnZVRleHQ6IHtcbiAgICBjb2xvcjogXCIjZmZmXCJcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhzaGFwZUNvbXBvbmVudChjbGFzcyBGbGFzaE5vdGlmaWNhdGlvbnNOb3RpZmljYXRpb24gZXh0ZW5kcyBTaGFwZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBQcm9wVHlwZXNFeGFjdCh7XG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIG5vdGlmaWNhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIG9uTWVhc3VyZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25SZW1vdmVkQ2xpY2tlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICB9KVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7Y291bnQsIG1lc3NhZ2UsIHRpdGxlLCB0eXBlfSA9IHRoaXMucFxuICAgIGNvbnN0IHtjbGFzc05hbWV9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3Qgdmlld1N0eWxlcyA9IHVzZVN0eWxlcyhzdHlsZXMsIFtcInZpZXdcIiwge1xuICAgICAgdmlld0Vycm9yOiB0eXBlID09IFwiZXJyb3JcIixcbiAgICAgIHZpZXdTdWNjZXNzOiB0eXBlID09IFwic3VjY2Vzc1wiLFxuICAgICAgdmlld0FsZXJ0OiB0eXBlID09IFwiYWxlcnRcIlxuICAgIH1dKVxuXG4gICAgY29uc3QgcHJlc3NhYmxlRGF0YVNldCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBjbGFzczogY2xhc3NOYW1lLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICB0eXBlXG4gICAgICB9KSxcbiAgICAgIFtjbGFzc05hbWUsIHR5cGVdXG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxBbmltYXRlZC5WaWV3IHN0eWxlPXt0aGlzLnR0LndyYXBwZXJTdHlsZX0+XG4gICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICBkYXRhU2V0PXtwcmVzc2FibGVEYXRhU2V0fVxuICAgICAgICAgIG9uTGF5b3V0PXt0aGlzLnR0Lm9uTGF5b3V0fVxuICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25SZW1vdmVkQ2xpY2tlZH1cbiAgICAgICAgICBzdHlsZT17dmlld1N0eWxlc31cbiAgICAgICAgICB0ZXN0SUQ9XCJmbGFzaC1ub3RpZmljYXRpb25zLW5vdGlmaWNhdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8VmlldyBzdHlsZT17c3R5bGVzLnRpdGxldmlld30gdGVzdElEPVwibm90aWZpY2F0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8VGV4dCBzdHlsZT17c3R5bGVzLnRpdGxlVGV4dH0gdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vdGl0bGVgfT5cbiAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICA8VmlldyB0ZXN0SUQ9XCJub3RpZmljYXRpb24tbWVzc2FnZVwiPlxuICAgICAgICAgICAgPFRleHQgc3R5bGU9e3N0eWxlcy5tZXNzYWdlVGV4dH0gdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vbWVzc2FnZWB9PlxuICAgICAgICAgICAgICB7bWVzc2FnZX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgPC9BbmltYXRlZC5WaWV3PlxuICAgIClcbiAgfVxuXG4gIGdldCB3cmFwcGVyU3R5bGUoKSB7XG4gICAgY29uc3Qge25vdGlmaWNhdGlvbn0gPSB0aGlzLnBcblxuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCA/IG5vdGlmaWNhdGlvbi5oZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICBtYXJnaW5Cb3R0b206IG5vdGlmaWNhdGlvbi5tYXJnaW5Cb3R0b20sXG4gICAgICBvcGFjaXR5OiBub3RpZmljYXRpb24ub3BhY2l0eSxcbiAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVkQ2xpY2tlZCA9ICgpID0+IHRoaXMucC5vblJlbW92ZWRDbGlja2VkKHRoaXMucC5ub3RpZmljYXRpb24pXG5cbiAgb25MYXlvdXQgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9ufSA9IHRoaXMucFxuXG4gICAgaWYgKCFub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMucC5vbk1lYXN1cmVkKG5vdGlmaWNhdGlvbiwgZXZlbnQubmF0aXZlRXZlbnQubGF5b3V0LmhlaWdodClcbiAgICB9XG4gIH1cbn0pKVxuIl19
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flash-notifications",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.35",
|
|
4
4
|
"description": "My new module",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "expo-module build",
|
|
9
9
|
"clean": "expo-module clean",
|
|
10
|
+
"export:web": "cd example && npm install && cd .. && npm run prepare:dummy && cd example && npx expo export -p web --output-dir dist",
|
|
10
11
|
"lint": "expo-module lint -- --max-warnings 0",
|
|
11
|
-
"test": "
|
|
12
|
-
"test-expo": "expo-module test",
|
|
12
|
+
"test": "node scripts/velocious-test.js",
|
|
13
13
|
"prepare": "expo-module prepare",
|
|
14
|
+
"prepare:dummy": "npm run build && rm -rf example/node_modules/flash-notifications && mkdir -p example/node_modules/flash-notifications && cp -r build package.json example/node_modules/flash-notifications/",
|
|
14
15
|
"prepublishOnly": "expo-module prepublishOnly",
|
|
15
16
|
"expo-module": "expo-module",
|
|
16
17
|
"open:ios": "xed example/ios",
|
|
@@ -30,12 +31,6 @@
|
|
|
30
31
|
"author": "kaspernj <kasper@diestoeckels.de> (https://github.com/kaspernj)",
|
|
31
32
|
"license": "MIT",
|
|
32
33
|
"homepage": "https://github.com/kaspernj/flash-notifications#readme",
|
|
33
|
-
"jest": {
|
|
34
|
-
"preset": "jest-expo",
|
|
35
|
-
"transformIgnorePatterns": [
|
|
36
|
-
"node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg|diggerize|env-sense|fetching-object|set-state-compare|@kaspernj/api-maker)"
|
|
37
|
-
]
|
|
38
|
-
},
|
|
39
34
|
"dependencies": {
|
|
40
35
|
"diggerize": "^1.0.9",
|
|
41
36
|
"env-sense": "^1.0.2",
|
|
@@ -44,11 +39,13 @@
|
|
|
44
39
|
"prop-types-exact": "*"
|
|
45
40
|
},
|
|
46
41
|
"devDependencies": {
|
|
47
|
-
"@testing-library/react-native": "~13.2.0",
|
|
48
42
|
"@types/react": "~18.3.12",
|
|
49
43
|
"expo": "~53.0.9",
|
|
50
44
|
"expo-module-scripts": "^4.0.2",
|
|
51
|
-
"react-native": "~0.76.9"
|
|
45
|
+
"react-native": "~0.76.9",
|
|
46
|
+
"selenium-webdriver": "^4.35.0",
|
|
47
|
+
"system-testing": "^1.0.56",
|
|
48
|
+
"velocious": "^1.0.175"
|
|
52
49
|
},
|
|
53
50
|
"peerDependencies": {
|
|
54
51
|
"@kaspernj/api-maker": ">= 1.0.2058",
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import Configuration from "velocious/build/src/configuration.js"
|
|
2
|
+
import NodeEnvironmentHandler from "velocious/build/src/environment-handlers/node.js"
|
|
3
|
+
import TestFilesFinder from "velocious/build/src/testing/test-files-finder.js"
|
|
4
|
+
import TestRunner from "velocious/build/src/testing/test-runner.js"
|
|
5
|
+
import fs from "node:fs/promises"
|
|
6
|
+
import {execFileSync} from "node:child_process"
|
|
7
|
+
import path from "node:path"
|
|
8
|
+
|
|
9
|
+
const INCLUDE_TAG_FLAGS = new Set(["--tag", "--include-tag", "-t"])
|
|
10
|
+
const EXCLUDE_TAG_FLAGS = new Set(["--exclude-tag", "--skip-tag", "-x"])
|
|
11
|
+
|
|
12
|
+
const splitTags = (value) => {
|
|
13
|
+
if (!value) return []
|
|
14
|
+
|
|
15
|
+
return value
|
|
16
|
+
.split(",")
|
|
17
|
+
.map((tag) => tag.trim())
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const parseTagFilters = (processArgs) => {
|
|
22
|
+
const includeTags = []
|
|
23
|
+
const excludeTags = []
|
|
24
|
+
const filteredProcessArgs = []
|
|
25
|
+
let inRestArgs = false
|
|
26
|
+
|
|
27
|
+
for (let i = 0; i < processArgs.length; i++) {
|
|
28
|
+
const arg = processArgs[i]
|
|
29
|
+
|
|
30
|
+
if (arg === "--") {
|
|
31
|
+
inRestArgs = true
|
|
32
|
+
filteredProcessArgs.push(arg)
|
|
33
|
+
continue
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (!inRestArgs) {
|
|
37
|
+
if (INCLUDE_TAG_FLAGS.has(arg)) {
|
|
38
|
+
const nextValue = processArgs[i + 1]
|
|
39
|
+
|
|
40
|
+
if (nextValue && !nextValue.startsWith("-")) {
|
|
41
|
+
includeTags.push(...splitTags(nextValue))
|
|
42
|
+
i++
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
continue
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (EXCLUDE_TAG_FLAGS.has(arg)) {
|
|
49
|
+
const nextValue = processArgs[i + 1]
|
|
50
|
+
|
|
51
|
+
if (nextValue && !nextValue.startsWith("-")) {
|
|
52
|
+
excludeTags.push(...splitTags(nextValue))
|
|
53
|
+
i++
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
continue
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (arg.startsWith("--tag=")) {
|
|
60
|
+
includeTags.push(...splitTags(arg.slice("--tag=".length)))
|
|
61
|
+
continue
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (arg.startsWith("--include-tag=")) {
|
|
65
|
+
includeTags.push(...splitTags(arg.slice("--include-tag=".length)))
|
|
66
|
+
continue
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (arg.startsWith("--exclude-tag=")) {
|
|
70
|
+
excludeTags.push(...splitTags(arg.slice("--exclude-tag=".length)))
|
|
71
|
+
continue
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (arg.startsWith("--skip-tag=")) {
|
|
75
|
+
excludeTags.push(...splitTags(arg.slice("--skip-tag=".length)))
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
filteredProcessArgs.push(arg)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
includeTags: Array.from(new Set(includeTags)),
|
|
85
|
+
excludeTags: Array.from(new Set(excludeTags)),
|
|
86
|
+
filteredProcessArgs
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const main = async () => {
|
|
91
|
+
const processArgs = process.argv.slice(2)
|
|
92
|
+
|
|
93
|
+
const distPath = path.join(process.cwd(), "example", "dist")
|
|
94
|
+
try {
|
|
95
|
+
await fs.stat(distPath)
|
|
96
|
+
} catch {
|
|
97
|
+
execFileSync("npm", ["run", "export:web"], {stdio: "inherit"})
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const environmentHandler = new NodeEnvironmentHandler()
|
|
101
|
+
const configuration = new Configuration({
|
|
102
|
+
environment: "test",
|
|
103
|
+
environmentHandler,
|
|
104
|
+
directory: process.cwd(),
|
|
105
|
+
database: {test: {}}
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
configuration.setCurrent()
|
|
109
|
+
|
|
110
|
+
let directory
|
|
111
|
+
const directories = []
|
|
112
|
+
|
|
113
|
+
if (process.env.VELOCIOUS_TEST_DIR) {
|
|
114
|
+
directory = process.env.VELOCIOUS_TEST_DIR
|
|
115
|
+
directories.push(process.env.VELOCIOUS_TEST_DIR)
|
|
116
|
+
} else {
|
|
117
|
+
directory = process.cwd()
|
|
118
|
+
directories.push(process.cwd())
|
|
119
|
+
directories.push(`${process.cwd()}/__tests__`)
|
|
120
|
+
directories.push(`${process.cwd()}/tests`)
|
|
121
|
+
directories.push(`${process.cwd()}/spec`)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const {includeTags, excludeTags, filteredProcessArgs} = parseTagFilters(processArgs)
|
|
125
|
+
const testFilesFinder = new TestFilesFinder({
|
|
126
|
+
directory,
|
|
127
|
+
directories,
|
|
128
|
+
processArgs: filteredProcessArgs
|
|
129
|
+
})
|
|
130
|
+
const testFiles = await testFilesFinder.findTestFiles()
|
|
131
|
+
const testRunner = new TestRunner({configuration, excludeTags, includeTags, testFiles})
|
|
132
|
+
|
|
133
|
+
let signalHandled = false
|
|
134
|
+
const handleSignal = async (signal) => {
|
|
135
|
+
if (signalHandled) return
|
|
136
|
+
|
|
137
|
+
signalHandled = true
|
|
138
|
+
console.error(`\nReceived ${signal}, running afterAll hooks before exit...`)
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
await testRunner.runAfterAllsForActiveScopes()
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.error("Failed while running afterAll hooks:", error)
|
|
144
|
+
} finally {
|
|
145
|
+
process.exit(130)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
process.once("SIGINT", () => { void handleSignal("SIGINT") })
|
|
150
|
+
process.once("SIGTERM", () => { void handleSignal("SIGTERM") })
|
|
151
|
+
|
|
152
|
+
await testRunner.prepare()
|
|
153
|
+
|
|
154
|
+
if (testRunner.getTestsCount() === 0) {
|
|
155
|
+
throw new Error(`${testRunner.getTestsCount()} tests was found in ${testFiles.length} file(s)`)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
await testRunner.run()
|
|
159
|
+
|
|
160
|
+
const executedTests = testRunner.getExecutedTestsCount()
|
|
161
|
+
|
|
162
|
+
if ((includeTags.length > 0 || excludeTags.length > 0) && executedTests === 0) {
|
|
163
|
+
console.error("\nNo tests matched the provided tag filters")
|
|
164
|
+
process.exit(1)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (testRunner.isFailed()) {
|
|
168
|
+
console.error(
|
|
169
|
+
`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`
|
|
170
|
+
)
|
|
171
|
+
process.exit(1)
|
|
172
|
+
} else if (testRunner.areAnyTestsFocussed()) {
|
|
173
|
+
console.error(
|
|
174
|
+
`\nFocussed run with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`
|
|
175
|
+
)
|
|
176
|
+
process.exit(1)
|
|
177
|
+
} else {
|
|
178
|
+
console.log(`\nTest run succeeded with ${testRunner.getSuccessfulTests()} successful tests`)
|
|
179
|
+
process.exit(0)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
main().catch((error) => {
|
|
184
|
+
console.error(error)
|
|
185
|
+
process.exit(1)
|
|
186
|
+
})
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import "velocious/build/src/testing/test.js"
|
|
4
|
+
import SystemTest from "system-testing/build/system-test.js"
|
|
5
|
+
import SystemTestHelper from "./support/system-test-helper.js"
|
|
6
|
+
|
|
7
|
+
SystemTest.rootPath = "/?systemTest=true"
|
|
8
|
+
|
|
9
|
+
const systemTestHelper = new SystemTestHelper()
|
|
10
|
+
systemTestHelper.installHooks()
|
|
11
|
+
|
|
12
|
+
describe("Flash notifications", () => {
|
|
13
|
+
it("dismisses a notification when pressed", async () => {
|
|
14
|
+
await SystemTest.run(async (systemTest) => {
|
|
15
|
+
await systemTest.visit("/")
|
|
16
|
+
|
|
17
|
+
const triggerButton = await systemTest.findByTestID("flashNotifications/showNotification")
|
|
18
|
+
await systemTest.click(triggerButton)
|
|
19
|
+
|
|
20
|
+
const notificationMessage = await systemTest.findByTestID("notification-message", {useBaseSelector: false})
|
|
21
|
+
const notificationText = await notificationMessage.getText()
|
|
22
|
+
expect(notificationText).toEqual("Dismiss me")
|
|
23
|
+
const notificationContainer = await systemTest.findByTestID("flash-notifications-notification", {useBaseSelector: false})
|
|
24
|
+
|
|
25
|
+
await systemTest.click(notificationContainer)
|
|
26
|
+
await systemTest.waitForNoSelector("[data-testid='flash-notifications-notification']", {useBaseSelector: false})
|
|
27
|
+
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it("auto dismisses a notification after a delay", async () => {
|
|
32
|
+
await SystemTest.run(async (systemTest) => {
|
|
33
|
+
await systemTest.visit("/")
|
|
34
|
+
|
|
35
|
+
const triggerButton = await systemTest.findByTestID("flashNotifications/showNotification")
|
|
36
|
+
await systemTest.click(triggerButton)
|
|
37
|
+
|
|
38
|
+
const notificationMessage = await systemTest.findByTestID("notification-message", {useBaseSelector: false})
|
|
39
|
+
const notificationText = await notificationMessage.getText()
|
|
40
|
+
expect(notificationText).toEqual("Dismiss me")
|
|
41
|
+
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, 4500))
|
|
43
|
+
await systemTest.expectNoElement("[data-testid='notification-message']", {useBaseSelector: false})
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
})
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs/promises"
|
|
4
|
+
import path from "node:path"
|
|
5
|
+
import {fileURLToPath} from "node:url"
|
|
6
|
+
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Ensures the dummy app's dist folder is served for system tests.
|
|
11
|
+
*/
|
|
12
|
+
export default class DummyHttpServerEnvironment {
|
|
13
|
+
constructor({host = "dist"} = {}) {
|
|
14
|
+
this.host = host
|
|
15
|
+
this.dummyAppRoot = path.resolve(__dirname, "..", "..", "example")
|
|
16
|
+
/** @type {string | undefined} */
|
|
17
|
+
this.originalCwd = undefined
|
|
18
|
+
this.started = false
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** @returns {Promise<void>} */
|
|
22
|
+
async start() {
|
|
23
|
+
if (this.started) return
|
|
24
|
+
|
|
25
|
+
this.originalCwd = process.cwd()
|
|
26
|
+
await this.ensureDistFolder()
|
|
27
|
+
process.chdir(this.dummyAppRoot)
|
|
28
|
+
process.env.SYSTEM_TEST_HOST ||= this.host
|
|
29
|
+
this.started = true
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @returns {Promise<void>} */
|
|
33
|
+
async stop() {
|
|
34
|
+
if (!this.started) return
|
|
35
|
+
if (this.originalCwd) process.chdir(this.originalCwd)
|
|
36
|
+
this.started = false
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** @returns {Promise<void>} */
|
|
40
|
+
async ensureDistFolder() {
|
|
41
|
+
const distPath = path.join(this.dummyAppRoot, "dist")
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const stats = await fs.stat(distPath)
|
|
45
|
+
if (!stats.isDirectory()) {
|
|
46
|
+
throw new Error(`Expected dist path to be a directory: ${distPath}`)
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
throw new Error(`Missing dist folder for dummy app at ${distPath}: ${error instanceof Error ? error.message : error}`)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import wait from "awaitery/build/wait.js"
|
|
4
|
+
|
|
5
|
+
import SystemTest from "system-testing/build/system-test.js"
|
|
6
|
+
import DummyHttpServerEnvironment from "./dummy-http-server.js"
|
|
7
|
+
|
|
8
|
+
const globalState = /** @type {any} */ (globalThis)
|
|
9
|
+
const sharedState = globalState.__systemTestHelperState ??= {
|
|
10
|
+
refCount: 0,
|
|
11
|
+
started: false,
|
|
12
|
+
/** @type {SystemTest | undefined} */
|
|
13
|
+
systemTest: undefined,
|
|
14
|
+
dummyHttpServerEnvironment: new DummyHttpServerEnvironment()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default class SystemTestHelper {
|
|
18
|
+
constructor({debug = process.env.SYSTEM_TEST_DEBUG === "true"} = {}) {
|
|
19
|
+
this.debug = debug
|
|
20
|
+
this.dummyHttpServerEnvironment = sharedState.dummyHttpServerEnvironment
|
|
21
|
+
this.systemTest = sharedState.systemTest
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** @param {...any} args */
|
|
25
|
+
debugLog(...args) { if (this.debug) console.log(...args) }
|
|
26
|
+
|
|
27
|
+
installHooks() {
|
|
28
|
+
beforeAll(async () => {
|
|
29
|
+
await this.start()
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
afterAll(async () => {
|
|
33
|
+
await this.stop()
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** @returns {Promise<void>} */
|
|
38
|
+
async start() {
|
|
39
|
+
sharedState.refCount += 1
|
|
40
|
+
if (sharedState.started) {
|
|
41
|
+
this.systemTest = sharedState.systemTest
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
sharedState.started = true
|
|
46
|
+
this.debugLog("[system-test] beforeAll: starting dummy HTTP env")
|
|
47
|
+
try {
|
|
48
|
+
await this.dummyHttpServerEnvironment.start()
|
|
49
|
+
await wait(1000)
|
|
50
|
+
|
|
51
|
+
this.debugLog("[system-test] beforeAll: creating SystemTest")
|
|
52
|
+
this.systemTest = SystemTest.current({
|
|
53
|
+
debug: this.debug,
|
|
54
|
+
host: "127.0.0.1",
|
|
55
|
+
port: 3601,
|
|
56
|
+
httpHost: "0.0.0.0",
|
|
57
|
+
httpPort: 3602,
|
|
58
|
+
errorFilter: (error) => {
|
|
59
|
+
if (typeof error?.value?.[0] === "string" && error.value[0].includes("Uncaught Error: Minified React error #418; visit")) return false
|
|
60
|
+
return true
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
sharedState.systemTest = this.systemTest
|
|
64
|
+
this.debugLog("[system-test] beforeAll: starting SystemTest")
|
|
65
|
+
await this.systemTest.start()
|
|
66
|
+
this.debugLog("[system-test] beforeAll: SystemTest started")
|
|
67
|
+
} catch (error) {
|
|
68
|
+
sharedState.started = false
|
|
69
|
+
sharedState.refCount = Math.max(0, sharedState.refCount - 1)
|
|
70
|
+
console.error("[system-test] beforeAll error", error)
|
|
71
|
+
throw error
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** @returns {Promise<void>} */
|
|
76
|
+
async stop() {
|
|
77
|
+
if (!sharedState.started) return
|
|
78
|
+
sharedState.refCount = Math.max(0, sharedState.refCount - 1)
|
|
79
|
+
if (sharedState.refCount > 0) return
|
|
80
|
+
|
|
81
|
+
this.debugLog("[system-test] afterAll: stopping SystemTest and dummy HTTP env")
|
|
82
|
+
try {
|
|
83
|
+
await this.systemTest?.stop()
|
|
84
|
+
await this.dummyHttpServerEnvironment.stop()
|
|
85
|
+
this.debugLog("[system-test] afterAll: teardown complete")
|
|
86
|
+
sharedState.started = false
|
|
87
|
+
sharedState.systemTest = undefined
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error("[system-test] afterAll error", error)
|
|
90
|
+
throw error
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** @returns {SystemTest} */
|
|
95
|
+
getSystemTest() {
|
|
96
|
+
if (!this.systemTest) throw new Error("SystemTest hasn't been started yet")
|
|
97
|
+
return this.systemTest
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/container/index.jsx
CHANGED
|
@@ -8,7 +8,7 @@ import {shapeComponent, ShapeComponent} from "set-state-compare/build/shape-comp
|
|
|
8
8
|
import useBreakpoint from "@kaspernj/api-maker/build/use-breakpoint.js"
|
|
9
9
|
import useEventEmitter from "@kaspernj/api-maker/build/use-event-emitter.js"
|
|
10
10
|
import useEnvSense from "env-sense/build/use-env-sense.js"
|
|
11
|
-
import {View} from "react-native"
|
|
11
|
+
import {Animated, View} from "react-native"
|
|
12
12
|
|
|
13
13
|
import events from "../events.js"
|
|
14
14
|
import Notification from "./notification"
|
|
@@ -28,6 +28,7 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
28
28
|
|
|
29
29
|
/** @type {number[]} */
|
|
30
30
|
timeouts = []
|
|
31
|
+
notificationSpacing = 15
|
|
31
32
|
|
|
32
33
|
setup() {
|
|
33
34
|
this.useStates({
|
|
@@ -95,6 +96,7 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
95
96
|
key={`notification-${notification.count}`}
|
|
96
97
|
message={notification.message}
|
|
97
98
|
notification={notification}
|
|
99
|
+
onMeasured={this.onNotificationMeasured}
|
|
98
100
|
onRemovedClicked={this.onRemovedClicked}
|
|
99
101
|
title={notification.title}
|
|
100
102
|
type={notification.type}
|
|
@@ -110,13 +112,19 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
110
112
|
*/
|
|
111
113
|
onPushNotification = (detail) => {
|
|
112
114
|
const count = this.s.count + 1
|
|
113
|
-
const timeout = setTimeout(() => this.
|
|
115
|
+
const timeout = setTimeout(() => this.dismissNotificationByCount(count), 4000)
|
|
114
116
|
|
|
115
117
|
this.timeouts.push(timeout)
|
|
116
118
|
|
|
117
119
|
const notification = {
|
|
118
120
|
count,
|
|
121
|
+
height: new Animated.Value(0),
|
|
122
|
+
marginBottom: new Animated.Value(this.notificationSpacing),
|
|
123
|
+
measuredHeight: undefined,
|
|
119
124
|
message: digg(detail, "message"),
|
|
125
|
+
opacity: new Animated.Value(1),
|
|
126
|
+
removing: false,
|
|
127
|
+
timeout,
|
|
120
128
|
title: digg(detail, "title"),
|
|
121
129
|
type: digg(detail, "type")
|
|
122
130
|
}
|
|
@@ -124,11 +132,41 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
|
|
|
124
132
|
this.setState({count, notifications: this.s.notifications.concat([notification])})
|
|
125
133
|
}
|
|
126
134
|
|
|
127
|
-
onRemovedClicked = (notification) => this.
|
|
135
|
+
onRemovedClicked = (notification) => this.dismissNotification(notification)
|
|
128
136
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
137
|
+
onNotificationMeasured = (notification, measuredHeight) => {
|
|
138
|
+
if (notification.measuredHeight) return
|
|
139
|
+
|
|
140
|
+
notification.measuredHeight = measuredHeight
|
|
141
|
+
notification.height.setValue(measuredHeight)
|
|
142
|
+
this.setState({notifications: [...this.s.notifications]})
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
dismissNotificationByCount = (count) => {
|
|
146
|
+
const notification = this.s.notifications.find((item) => item.count == count)
|
|
147
|
+
if (!notification) return
|
|
148
|
+
this.dismissNotification(notification)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
dismissNotification = (notification) => {
|
|
152
|
+
if (notification.removing) return
|
|
153
|
+
notification.removing = true
|
|
154
|
+
if (notification.timeout) clearTimeout(notification.timeout)
|
|
155
|
+
|
|
156
|
+
if (!notification.measuredHeight) {
|
|
157
|
+
notification.measuredHeight = 1
|
|
158
|
+
notification.height.setValue(1)
|
|
159
|
+
this.setState({notifications: [...this.s.notifications]})
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
Animated.parallel([
|
|
163
|
+
Animated.timing(notification.opacity, {toValue: 0, duration: 200, useNativeDriver: false}),
|
|
164
|
+
Animated.timing(notification.height, {toValue: 0, duration: 200, useNativeDriver: false}),
|
|
165
|
+
Animated.timing(notification.marginBottom, {toValue: 0, duration: 200, useNativeDriver: false})
|
|
166
|
+
]).start(() => {
|
|
167
|
+
this.setState({
|
|
168
|
+
notifications: this.s.notifications.filter((item) => item.count != notification.count)
|
|
169
|
+
})
|
|
132
170
|
})
|
|
133
171
|
}
|
|
134
172
|
}))
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import PropTypes from "prop-types"
|
|
2
2
|
import PropTypesExact from "prop-types-exact"
|
|
3
3
|
import React, {memo, useMemo} from "react"
|
|
4
|
-
import {Pressable, StyleSheet, Text, View} from "react-native"
|
|
4
|
+
import {Animated, Pressable, StyleSheet, Text, View} from "react-native"
|
|
5
5
|
import {shapeComponent, ShapeComponent} from "set-state-compare/build/shape-component.js"
|
|
6
6
|
import useStyles from "@kaspernj/api-maker/build/use-styles.js"
|
|
7
7
|
|
|
8
8
|
const styles = StyleSheet.create({
|
|
9
9
|
view: {
|
|
10
|
-
marginBottom: 15,
|
|
11
10
|
padding: 15,
|
|
12
11
|
borderRadius: 11,
|
|
13
12
|
cursor: "pointer"
|
|
@@ -49,6 +48,7 @@ export default memo(shapeComponent(class FlashNotificationsNotification extends
|
|
|
49
48
|
count: PropTypes.number.isRequired,
|
|
50
49
|
message: PropTypes.string.isRequired,
|
|
51
50
|
notification: PropTypes.object.isRequired,
|
|
51
|
+
onMeasured: PropTypes.func.isRequired,
|
|
52
52
|
onRemovedClicked: PropTypes.func.isRequired,
|
|
53
53
|
title: PropTypes.string.isRequired,
|
|
54
54
|
type: PropTypes.string.isRequired
|
|
@@ -74,8 +74,14 @@ export default memo(shapeComponent(class FlashNotificationsNotification extends
|
|
|
74
74
|
)
|
|
75
75
|
|
|
76
76
|
return (
|
|
77
|
-
<
|
|
78
|
-
<
|
|
77
|
+
<Animated.View style={this.tt.wrapperStyle}>
|
|
78
|
+
<Pressable
|
|
79
|
+
dataSet={pressableDataSet}
|
|
80
|
+
onLayout={this.tt.onLayout}
|
|
81
|
+
onPress={this.tt.onRemovedClicked}
|
|
82
|
+
style={viewStyles}
|
|
83
|
+
testID="flash-notifications-notification"
|
|
84
|
+
>
|
|
79
85
|
<View style={styles.titleview} testID="notification-title">
|
|
80
86
|
<Text style={styles.titleText} testID={`flash-notifications/notification-${count}/title`}>
|
|
81
87
|
{title}
|
|
@@ -86,10 +92,29 @@ export default memo(shapeComponent(class FlashNotificationsNotification extends
|
|
|
86
92
|
{message}
|
|
87
93
|
</Text>
|
|
88
94
|
</View>
|
|
89
|
-
</
|
|
90
|
-
</
|
|
95
|
+
</Pressable>
|
|
96
|
+
</Animated.View>
|
|
91
97
|
)
|
|
92
98
|
}
|
|
93
99
|
|
|
100
|
+
get wrapperStyle() {
|
|
101
|
+
const {notification} = this.p
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
height: notification.measuredHeight ? notification.height : undefined,
|
|
105
|
+
marginBottom: notification.marginBottom,
|
|
106
|
+
opacity: notification.opacity,
|
|
107
|
+
overflow: "hidden"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
94
111
|
onRemovedClicked = () => this.p.onRemovedClicked(this.p.notification)
|
|
112
|
+
|
|
113
|
+
onLayout = (event) => {
|
|
114
|
+
const {notification} = this.p
|
|
115
|
+
|
|
116
|
+
if (!notification.measuredHeight) {
|
|
117
|
+
this.p.onMeasured(notification, event.nativeEvent.layout.height)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
95
120
|
}))
|