flash-notifications 0.0.32 → 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 ADDED
@@ -0,0 +1,3 @@
1
+ # Agent Notes
2
+
3
+ - Use .js files instead of .mjs for new test/support files in this repo.
@@ -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.removeNotification(count), 4000);
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.removeNotification(digg(notification, "count"));
96
- removeNotification = (count) => {
97
- this.setState({
98
- notifications: this.s.notifications.filter((notification) => notification.count != count)
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(Pressable, { dataSet: pressableDataSet, onPress: this.tt.onRemovedClicked, testID: "flash-notifications-notification" },
68
- React.createElement(View, { style: viewStyles },
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb250YWluZXIvbm90aWZpY2F0aW9uLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDOUQsT0FBTyxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN6RixPQUFPLFNBQVMsTUFBTSx5Q0FBeUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQy9CLElBQUksRUFBRTtRQUNKLFlBQVksRUFBRSxFQUFFO1FBQ2hCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsWUFBWSxFQUFFLEVBQUU7UUFDaEIsTUFBTSxFQUFFLFNBQVM7S0FDbEI7SUFDRCxVQUFVLEVBQUU7UUFDVixLQUFLLEVBQUUsTUFBTTtLQUNkO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsS0FBSyxFQUFFLEdBQUc7UUFDVixRQUFRLEVBQUUsTUFBTTtLQUNqQjtJQUNELFNBQVMsRUFBRTtRQUNULE1BQU0sRUFBRSxtQ0FBbUM7UUFDM0MsZUFBZSxFQUFFLHlCQUF5QjtLQUMzQztJQUNELFdBQVcsRUFBRTtRQUNYLE1BQU0sRUFBRSwrQkFBK0I7UUFDdkMsZUFBZSxFQUFFLHFCQUFxQjtLQUN2QztJQUNELFNBQVMsRUFBRTtRQUNULE1BQU0sRUFBRSxrQ0FBa0M7UUFDMUMsZUFBZSxFQUFFLHdCQUF3QjtLQUMxQztJQUNELFNBQVMsRUFBRTtRQUNULFlBQVksRUFBRSxDQUFDO0tBQ2hCO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsS0FBSyxFQUFFLE1BQU07UUFDYixVQUFVLEVBQUUsTUFBTTtLQUNuQjtJQUNELFdBQVcsRUFBRTtRQUNYLEtBQUssRUFBRSxNQUFNO0tBQ2Q7Q0FDRixDQUFDLENBQUE7QUFFRixlQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSw4QkFBK0IsU0FBUSxjQUFjO0lBQzVGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ2xDLE9BQU8sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDcEMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUN6QyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDM0MsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNsQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVO0tBQ2xDLENBQUMsQ0FBQTtJQUVGLE1BQU07UUFDSixNQUFNLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1QyxNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUU5QixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUM1QyxTQUFTLEVBQUUsSUFBSSxJQUFJLE9BQU87Z0JBQzFCLFdBQVcsRUFBRSxJQUFJLElBQUksU0FBUztnQkFDOUIsU0FBUyxFQUFFLElBQUksSUFBSSxPQUFPO2FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBRUgsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQzlCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDTCxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUk7U0FDTCxDQUFDLEVBQ0YsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQ2xCLENBQUE7UUFFRCxPQUFPLENBQ0wsb0JBQUMsU0FBUyxJQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUMsa0NBQWtDO1lBQ2hILG9CQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsVUFBVTtnQkFDckIsb0JBQUMsSUFBSSxJQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBQyxvQkFBb0I7b0JBQ3hELG9CQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsb0NBQW9DLEtBQUssUUFBUSxJQUNyRixLQUFLLENBQ0QsQ0FDRjtnQkFDUCxvQkFBQyxJQUFJLElBQUMsTUFBTSxFQUFDLHNCQUFzQjtvQkFDakMsb0JBQUMsSUFBSSxJQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxvQ0FBb0MsS0FBSyxVQUFVLElBQ3pGLE9BQU8sQ0FDSCxDQUNGLENBQ0YsQ0FDRyxDQUNiLENBQUE7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFBO0NBQ3RFLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgUHJvcFR5cGVzRXhhY3QgZnJvbSBcInByb3AtdHlwZXMtZXhhY3RcIlxuaW1wb3J0IFJlYWN0LCB7bWVtbywgdXNlTWVtb30gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7UHJlc3NhYmxlLCBTdHlsZVNoZWV0LCBUZXh0LCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCB7c2hhcGVDb21wb25lbnQsIFNoYXBlQ29tcG9uZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvc2hhcGUtY29tcG9uZW50LmpzXCJcbmltcG9ydCB1c2VTdHlsZXMgZnJvbSBcIkBrYXNwZXJuai9hcGktbWFrZXIvYnVpbGQvdXNlLXN0eWxlcy5qc1wiXG5cbmNvbnN0IHN0eWxlcyA9IFN0eWxlU2hlZXQuY3JlYXRlKHtcbiAgdmlldzoge1xuICAgIG1hcmdpbkJvdHRvbTogMTUsXG4gICAgcGFkZGluZzogMTUsXG4gICAgYm9yZGVyUmFkaXVzOiAxMSxcbiAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gIH0sXG4gIHZpZXdTbURvd246IHtcbiAgICB3aWR0aDogXCIxMDAlXCJcbiAgfSxcbiAgdmlld01kVXA6IHtcbiAgICB3aWR0aDogMzAwLFxuICAgIG1heFdpZHRoOiBcIjEwMCVcIlxuICB9LFxuICB2aWV3RXJyb3I6IHtcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHJnYmEoMTYxLCAzNCwgMzIsIDAuOTUpXCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBcInJnYmEoMTYxLCAzNCwgMzIsIDAuODcpXCJcbiAgfSxcbiAgdmlld1N1Y2Nlc3M6IHtcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC45NSlcIixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmdiYSgwLCAwLCAwLCAwLjg3KVwiXG4gIH0sXG4gIHZpZXdBbGVydDoge1xuICAgIGJvcmRlcjogXCIxcHggc29saWQgcmdiYSgyMDQsIDUxLCAwLCAwLjk1KVwiLFxuICAgIGJhY2tncm91bmRDb2xvcjogXCJyZ2JhKDIwNCwgNTEsIDAsIDAuODcpXCJcbiAgfSxcbiAgdGl0bGV2aWV3OiB7XG4gICAgbWFyZ2luQm90dG9tOiA1XG4gIH0sXG4gIHRpdGxlVGV4dDoge1xuICAgIGNvbG9yOiBcIiNmZmZcIixcbiAgICBmb250V2VpZ2h0OiBcImJvbGRcIlxuICB9LFxuICBtZXNzYWdlVGV4dDoge1xuICAgIGNvbG9yOiBcIiNmZmZcIlxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCBtZW1vKHNoYXBlQ29tcG9uZW50KGNsYXNzIEZsYXNoTm90aWZpY2F0aW9uc05vdGlmaWNhdGlvbiBleHRlbmRzIFNoYXBlQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IFByb3BUeXBlc0V4YWN0KHtcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY291bnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICBtZXNzYWdlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgbm90aWZpY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgb25SZW1vdmVkQ2xpY2tlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICB9KVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7Y291bnQsIG1lc3NhZ2UsIHRpdGxlLCB0eXBlfSA9IHRoaXMucFxuICAgIGNvbnN0IHtjbGFzc05hbWV9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3Qgdmlld1N0eWxlcyA9IHVzZVN0eWxlcyhzdHlsZXMsIFtcInZpZXdcIiwge1xuICAgICAgdmlld0Vycm9yOiB0eXBlID09IFwiZXJyb3JcIixcbiAgICAgIHZpZXdTdWNjZXNzOiB0eXBlID09IFwic3VjY2Vzc1wiLFxuICAgICAgdmlld0FsZXJ0OiB0eXBlID09IFwiYWxlcnRcIlxuICAgIH1dKVxuXG4gICAgY29uc3QgcHJlc3NhYmxlRGF0YVNldCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBjbGFzczogY2xhc3NOYW1lLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICB0eXBlXG4gICAgICB9KSxcbiAgICAgIFtjbGFzc05hbWUsIHR5cGVdXG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxQcmVzc2FibGUgZGF0YVNldD17cHJlc3NhYmxlRGF0YVNldH0gb25QcmVzcz17dGhpcy50dC5vblJlbW92ZWRDbGlja2VkfSB0ZXN0SUQ9XCJmbGFzaC1ub3RpZmljYXRpb25zLW5vdGlmaWNhdGlvblwiPlxuICAgICAgICA8VmlldyBzdHlsZT17dmlld1N0eWxlc30+XG4gICAgICAgICAgPFZpZXcgc3R5bGU9e3N0eWxlcy50aXRsZXZpZXd9IHRlc3RJRD1cIm5vdGlmaWNhdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgPFRleHQgc3R5bGU9e3N0eWxlcy50aXRsZVRleHR9IHRlc3RJRD17YGZsYXNoLW5vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uLSR7Y291bnR9L3RpdGxlYH0+XG4gICAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgICAgPFZpZXcgdGVzdElEPVwibm90aWZpY2F0aW9uLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxUZXh0IHN0eWxlPXtzdHlsZXMubWVzc2FnZVRleHR9IHRlc3RJRD17YGZsYXNoLW5vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9uLSR7Y291bnR9L21lc3NhZ2VgfT5cbiAgICAgICAgICAgICAge21lc3NhZ2V9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPC9WaWV3PlxuICAgICAgICA8L1ZpZXc+XG4gICAgICA8L1ByZXNzYWJsZT5cbiAgICApXG4gIH1cblxuICBvblJlbW92ZWRDbGlja2VkID0gKCkgPT4gdGhpcy5wLm9uUmVtb3ZlZENsaWNrZWQodGhpcy5wLm5vdGlmaWNhdGlvbilcbn0pKVxuIl19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb250YWluZXIvbm90aWZpY2F0aW9uLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQzFDLE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ3hFLE9BQU8sRUFBQyxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sNENBQTRDLENBQUE7QUFDekYsT0FBTyxTQUFTLE1BQU0seUNBQXlDLENBQUE7QUFFL0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUMvQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsRUFBRTtRQUNYLFlBQVksRUFBRSxFQUFFO1FBQ2hCLE1BQU0sRUFBRSxTQUFTO0tBQ2xCO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFLE1BQU07S0FDZDtJQUNELFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRSxHQUFHO1FBQ1YsUUFBUSxFQUFFLE1BQU07S0FDakI7SUFDRCxTQUFTLEVBQUU7UUFDVCxNQUFNLEVBQUUsbUNBQW1DO1FBQzNDLGVBQWUsRUFBRSx5QkFBeUI7S0FDM0M7SUFDRCxXQUFXLEVBQUU7UUFDWCxNQUFNLEVBQUUsK0JBQStCO1FBQ3ZDLGVBQWUsRUFBRSxxQkFBcUI7S0FDdkM7SUFDRCxTQUFTLEVBQUU7UUFDVCxNQUFNLEVBQUUsa0NBQWtDO1FBQzFDLGVBQWUsRUFBRSx3QkFBd0I7S0FDMUM7SUFDRCxTQUFTLEVBQUU7UUFDVCxZQUFZLEVBQUUsQ0FBQztLQUNoQjtJQUNELFNBQVMsRUFBRTtRQUNULEtB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LEVBQUUsUUFBUTtTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUVyRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUU3QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsRSxDQUFDO0lBQ0gsQ0FBQyxDQUFBO0NBQ0YsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBQcm9wVHlwZXNFeGFjdCBmcm9tIFwicHJvcC10eXBlcy1leGFjdFwiXG5pbXBvcnQgUmVhY3QsIHttZW1vLCB1c2VNZW1vfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtBbmltYXRlZCwgUHJlc3NhYmxlLCBTdHlsZVNoZWV0LCBUZXh0LCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCB7c2hhcGVDb21wb25lbnQsIFNoYXBlQ29tcG9uZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvc2hhcGUtY29tcG9uZW50LmpzXCJcbmltcG9ydCB1c2VTdHlsZXMgZnJvbSBcIkBrYXNwZXJuai9hcGktbWFrZXIvYnVpbGQvdXNlLXN0eWxlcy5qc1wiXG5cbmNvbnN0IHN0eWxlcyA9IFN0eWxlU2hlZXQuY3JlYXRlKHtcbiAgdmlldzoge1xuICAgIHBhZGRpbmc6IDE1LFxuICAgIGJvcmRlclJhZGl1czogMTEsXG4gICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICB9LFxuICB2aWV3U21Eb3duOiB7XG4gICAgd2lkdGg6IFwiMTAwJVwiXG4gIH0sXG4gIHZpZXdNZFVwOiB7XG4gICAgd2lkdGg6IDMwMCxcbiAgICBtYXhXaWR0aDogXCIxMDAlXCJcbiAgfSxcbiAgdmlld0Vycm9yOiB7XG4gICAgYm9yZGVyOiBcIjFweCBzb2xpZCByZ2JhKDE2MSwgMzQsIDMyLCAwLjk1KVwiLFxuICAgIGJhY2tncm91bmRDb2xvcjogXCJyZ2JhKDE2MSwgMzQsIDMyLCAwLjg3KVwiXG4gIH0sXG4gIHZpZXdTdWNjZXNzOiB7XG4gICAgYm9yZGVyOiBcIjFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuOTUpXCIsXG4gICAgYmFja2dyb3VuZENvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC44NylcIlxuICB9LFxuICB2aWV3QWxlcnQ6IHtcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHJnYmEoMjA0LCA1MSwgMCwgMC45NSlcIixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmdiYSgyMDQsIDUxLCAwLCAwLjg3KVwiXG4gIH0sXG4gIHRpdGxldmlldzoge1xuICAgIG1hcmdpbkJvdHRvbTogNVxuICB9LFxuICB0aXRsZVRleHQ6IHtcbiAgICBjb2xvcjogXCIjZmZmXCIsXG4gICAgZm9udFdlaWdodDogXCJib2xkXCJcbiAgfSxcbiAgbWVzc2FnZVRleHQ6IHtcbiAgICBjb2xvcjogXCIjZmZmXCJcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhzaGFwZUNvbXBvbmVudChjbGFzcyBGbGFzaE5vdGlmaWNhdGlvbnNOb3RpZmljYXRpb24gZXh0ZW5kcyBTaGFwZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBQcm9wVHlwZXNFeGFjdCh7XG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIG5vdGlmaWNhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIG9uTWVhc3VyZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25SZW1vdmVkQ2xpY2tlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICB9KVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7Y291bnQsIG1lc3NhZ2UsIHRpdGxlLCB0eXBlfSA9IHRoaXMucFxuICAgIGNvbnN0IHtjbGFzc05hbWV9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3Qgdmlld1N0eWxlcyA9IHVzZVN0eWxlcyhzdHlsZXMsIFtcInZpZXdcIiwge1xuICAgICAgdmlld0Vycm9yOiB0eXBlID09IFwiZXJyb3JcIixcbiAgICAgIHZpZXdTdWNjZXNzOiB0eXBlID09IFwic3VjY2Vzc1wiLFxuICAgICAgdmlld0FsZXJ0OiB0eXBlID09IFwiYWxlcnRcIlxuICAgIH1dKVxuXG4gICAgY29uc3QgcHJlc3NhYmxlRGF0YVNldCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBjbGFzczogY2xhc3NOYW1lLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICB0eXBlXG4gICAgICB9KSxcbiAgICAgIFtjbGFzc05hbWUsIHR5cGVdXG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxBbmltYXRlZC5WaWV3IHN0eWxlPXt0aGlzLnR0LndyYXBwZXJTdHlsZX0+XG4gICAgICAgIDxQcmVzc2FibGVcbiAgICAgICAgICBkYXRhU2V0PXtwcmVzc2FibGVEYXRhU2V0fVxuICAgICAgICAgIG9uTGF5b3V0PXt0aGlzLnR0Lm9uTGF5b3V0fVxuICAgICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25SZW1vdmVkQ2xpY2tlZH1cbiAgICAgICAgICBzdHlsZT17dmlld1N0eWxlc31cbiAgICAgICAgICB0ZXN0SUQ9XCJmbGFzaC1ub3RpZmljYXRpb25zLW5vdGlmaWNhdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8VmlldyBzdHlsZT17c3R5bGVzLnRpdGxldmlld30gdGVzdElEPVwibm90aWZpY2F0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8VGV4dCBzdHlsZT17c3R5bGVzLnRpdGxlVGV4dH0gdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vdGl0bGVgfT5cbiAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgICA8VmlldyB0ZXN0SUQ9XCJub3RpZmljYXRpb24tbWVzc2FnZVwiPlxuICAgICAgICAgICAgPFRleHQgc3R5bGU9e3N0eWxlcy5tZXNzYWdlVGV4dH0gdGVzdElEPXtgZmxhc2gtbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tJHtjb3VudH0vbWVzc2FnZWB9PlxuICAgICAgICAgICAgICB7bWVzc2FnZX1cbiAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8L1ZpZXc+XG4gICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgPC9BbmltYXRlZC5WaWV3PlxuICAgIClcbiAgfVxuXG4gIGdldCB3cmFwcGVyU3R5bGUoKSB7XG4gICAgY29uc3Qge25vdGlmaWNhdGlvbn0gPSB0aGlzLnBcblxuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IG5vdGlmaWNhdGlvbi5tZWFzdXJlZEhlaWdodCA/IG5vdGlmaWNhdGlvbi5oZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICBtYXJnaW5Cb3R0b206IG5vdGlmaWNhdGlvbi5tYXJnaW5Cb3R0b20sXG4gICAgICBvcGFjaXR5OiBub3RpZmljYXRpb24ub3BhY2l0eSxcbiAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVkQ2xpY2tlZCA9ICgpID0+IHRoaXMucC5vblJlbW92ZWRDbGlja2VkKHRoaXMucC5ub3RpZmljYXRpb24pXG5cbiAgb25MYXlvdXQgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7bm90aWZpY2F0aW9ufSA9IHRoaXMucFxuXG4gICAgaWYgKCFub3RpZmljYXRpb24ubWVhc3VyZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMucC5vbk1lYXN1cmVkKG5vdGlmaWNhdGlvbiwgZXZlbnQubmF0aXZlRXZlbnQubGF5b3V0LmhlaWdodClcbiAgICB9XG4gIH1cbn0pKVxuIl19
package/package.json CHANGED
@@ -1,20 +1,22 @@
1
1
  {
2
2
  "name": "flash-notifications",
3
- "version": "0.0.32",
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": "jest --detectOpenHandles",
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",
17
- "open:android": "open -a \"Android Studio\" example/android"
18
+ "open:android": "open -a \"Android Studio\" example/android",
19
+ "release:patch": "npm version patch -m \"Bump version to %s\" && git push --follow-tags && npm whoami || npm login && npm publish"
18
20
  },
19
21
  "keywords": [
20
22
  "react-native",
@@ -29,32 +31,28 @@
29
31
  "author": "kaspernj <kasper@diestoeckels.de> (https://github.com/kaspernj)",
30
32
  "license": "MIT",
31
33
  "homepage": "https://github.com/kaspernj/flash-notifications#readme",
32
- "jest": {
33
- "preset": "jest-expo",
34
- "transformIgnorePatterns": [
35
- "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)"
36
- ]
37
- },
38
34
  "dependencies": {
39
35
  "diggerize": "^1.0.9",
40
36
  "env-sense": "^1.0.2",
41
37
  "eventemitter3": "^5.0.1",
42
38
  "fetching-object": "^1.0.3",
43
- "prop-types-exact": "*",
44
- "set-state-compare": "^1.0.65"
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",
55
52
  "expo": "*",
56
53
  "react": "*",
57
- "react-native": "*"
54
+ "react-native": "*",
55
+ "set-state-compare": ">= 1.0.67"
58
56
  },
59
57
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
60
58
  }
@@ -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
+ }
@@ -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.removeNotification(count), 4000)
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.removeNotification(digg(notification, "count"))
135
+ onRemovedClicked = (notification) => this.dismissNotification(notification)
128
136
 
129
- removeNotification = (count) => {
130
- this.setState({
131
- notifications: this.s.notifications.filter((notification) => notification.count != count)
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
- <Pressable dataSet={pressableDataSet} onPress={this.tt.onRemovedClicked} testID="flash-notifications-notification">
78
- <View style={viewStyles}>
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
- </View>
90
- </Pressable>
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
  }))