flash-notifications 0.0.16 → 0.0.18

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.
@@ -1 +1 @@
1
- {"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.js"],"names":[],"mappings":";AAIA,iCAAgE"}
1
+ {"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.js"],"names":[],"mappings":";AAMA,iCAAgE"}
@@ -1,5 +1,7 @@
1
1
  if (!globalThis.flashNotificationsConfiguration) {
2
- globalThis.flashNotificationsConfiguration = {};
2
+ globalThis.flashNotificationsConfiguration = {
3
+ translate: (msgId) => msgId
4
+ };
3
5
  }
4
6
  const configuration = globalThis.flashNotificationsConfiguration;
5
7
  export default configuration;
@@ -1 +1 @@
1
- {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.js"],"names":[],"mappings":"AAAA,IAAI,CAAC,UAAU,CAAC,+BAA+B,EAAE,CAAC;IAChD,UAAU,CAAC,+BAA+B,GAAG,EAAE,CAAA;AACjD,CAAC;AAED,MAAM,aAAa,GAAG,UAAU,CAAC,+BAA+B,CAAA;AAEhE,eAAe,aAAa,CAAA","sourcesContent":["if (!globalThis.flashNotificationsConfiguration) {\n globalThis.flashNotificationsConfiguration = {}\n}\n\nconst configuration = globalThis.flashNotificationsConfiguration\n\nexport default configuration\n"]}
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.js"],"names":[],"mappings":"AAAA,IAAI,CAAC,UAAU,CAAC,+BAA+B,EAAE,CAAC;IAChD,UAAU,CAAC,+BAA+B,GAAG;QAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KAC5B,CAAA;AACH,CAAC;AAED,MAAM,aAAa,GAAG,UAAU,CAAC,+BAA+B,CAAA;AAEhE,eAAe,aAAa,CAAA","sourcesContent":["if (!globalThis.flashNotificationsConfiguration) {\n globalThis.flashNotificationsConfiguration = {\n translate: (msgId) => msgId\n }\n}\n\nconst configuration = globalThis.flashNotificationsConfiguration\n\nexport default configuration\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/container/index.jsx"],"names":[],"mappings":";;kBAE0B,OAAO"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/container/index.jsx"],"names":[],"mappings":";;kBAE8C,OAAO"}
@@ -1,32 +1,58 @@
1
- import useEventEmitter from "@kaspernj/api-maker/src/use-event-emitter";
1
+ import useEventEmitter from "@kaspernj/api-maker/build/use-event-emitter";
2
2
  import { digg } from "diggerize";
3
- import React, { memo } from "react";
3
+ import React, { memo, useEffect, useMemo } from "react";
4
4
  import { StyleSheet, View } from "react-native";
5
5
  import { shapeComponent, ShapeComponent } from "set-state-compare/src/shape-component";
6
+ import useEnvironment from "@kaspernj/api-maker/build/use-environment.js";
7
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
8
+ import useStyles from "@kaspernj/api-maker/build/use-styles.js";
6
9
  import events from "../events";
7
10
  import Notification from "./notification";
8
11
  const styles = StyleSheet.create({
9
12
  view: {
10
- position: "fixed",
11
- zIndex: 99999,
12
- top: 20,
13
+ zIndex: 99999
14
+ },
15
+ viewSmDown: {
16
+ right: 20,
17
+ left: 20
18
+ },
19
+ viewMdUp: {
13
20
  right: 20
14
21
  }
15
22
  });
16
23
  export default memo(shapeComponent(class FlashNotificationsContainer extends ShapeComponent {
24
+ timeouts = [];
17
25
  setup() {
18
26
  this.useStates({
19
27
  count: 0,
20
28
  notifications: []
21
29
  });
22
30
  useEventEmitter(events, "pushNotification", this.tt.onPushNotification);
31
+ useEffect(() => {
32
+ return () => {
33
+ for (const timeout of this.tt.timeouts) {
34
+ clearTimeout(timeout);
35
+ }
36
+ };
37
+ }, []);
23
38
  }
24
39
  render() {
25
- return (React.createElement(View, { dataSet: this.rootViewDataSet ||= { class: "flash-notifications-container" }, style: styles.view }, this.s.notifications.map((notification) => React.createElement(Notification, { key: `notification-${notification.count}`, message: notification.message, notification: notification, onRemovedClicked: this.tt.onRemovedClicked, title: notification.title, type: notification.type }))));
40
+ const { isNative } = useEnvironment();
41
+ const insets = useSafeAreaInsets();
42
+ const viewStyleFromStyles = useStyles(styles, "view");
43
+ const viewStyle = useMemo(() => [
44
+ viewStyleFromStyles,
45
+ {
46
+ position: isNative ? "absolute" : "fixed",
47
+ top: insets.top + 20
48
+ }
49
+ ], [insets.top]);
50
+ return (React.createElement(View, { dataSet: this.rootViewDataSet ||= { component: "flash-notifications-container" }, style: viewStyle, testID: "flash-notificaitons/container" }, this.s.notifications.map((notification) => React.createElement(Notification, { count: notification.count, key: `notification-${notification.count}`, message: notification.message, notification: notification, onRemovedClicked: this.tt.onRemovedClicked, title: notification.title, type: notification.type }))));
26
51
  }
27
52
  onPushNotification = (detail) => {
28
53
  const count = this.s.count + 1;
29
- setTimeout(() => this.removeNotification(count), 4000);
54
+ const timeout = setTimeout(() => this.removeNotification(count), 4000);
55
+ this.tt.timeouts.push(timeout);
30
56
  const notification = {
31
57
  count,
32
58
  message: digg(detail, "message"),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/container/index.jsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,EAAC,IAAI,EAAC,MAAM,OAAO,CAAA;AACjC,OAAO,EAAC,UAAU,EAAE,IAAI,EAAC,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,uCAAuC,CAAA;AAEpF,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,EAAE;KACV;CACF,CAAC,CAAA;AAEF,eAAe,IAAI,CAAC,cAAc,CAAC,MAAM,2BAA4B,SAAQ,cAAc;IACzF,KAAK;QACH,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE,CAAC;YACR,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;QAEF,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAA;IACzE,CAAC;IAED,MAAM;QACJ,OAAO,CACL,oBAAC,IAAI,IACH,OAAO,EAAE,IAAI,CAAC,eAAe,KAAK,EAAC,KAAK,EAAE,+BAA+B,EAAC,EAC1E,KAAK,EAAE,MAAM,CAAC,IAAI,IAEjB,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACzC,oBAAC,YAAY,IACX,GAAG,EAAE,gBAAgB,YAAY,CAAC,KAAK,EAAE,EACzC,OAAO,EAAE,YAAY,CAAC,OAAO,EAC7B,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAC1C,KAAK,EAAE,YAAY,CAAC,KAAK,EACzB,IAAI,EAAE,YAAY,CAAC,IAAI,GACvB,CACH,CACI,CACR,CAAA;IACH,CAAC;IAED,kBAAkB,GAAG,CAAC,MAAM,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;QAE9B,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;QAEtD,MAAM,YAAY,GAAG;YACnB,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;YAChC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;SAC3B,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,EAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAC,CAAC,CAAA;IACpF,CAAC,CAAA;IAED,gBAAgB,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;IAEzF,kBAAkB,GAAG,CAAC,KAAK,EAAE,EAAE;QAC7B,IAAI,CAAC,QAAQ,CAAC;YACZ,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,IAAI,KAAK,CAAC;SAC1F,CAAC,CAAA;IACJ,CAAC,CAAA;CACF,CAAC,CAAC,CAAA","sourcesContent":["import useEventEmitter from \"@kaspernj/api-maker/src/use-event-emitter\"\nimport {digg} from \"diggerize\"\nimport React, {memo} from \"react\"\nimport {StyleSheet, View} from \"react-native\"\nimport {shapeComponent, ShapeComponent} from \"set-state-compare/src/shape-component\"\n\nimport events from \"../events\"\nimport Notification from \"./notification\"\n\nconst styles = StyleSheet.create({\n view: {\n position: \"fixed\",\n zIndex: 99999,\n top: 20,\n right: 20\n }\n})\n\nexport default memo(shapeComponent(class FlashNotificationsContainer extends ShapeComponent {\n setup() {\n this.useStates({\n count: 0,\n notifications: []\n })\n\n useEventEmitter(events, \"pushNotification\", this.tt.onPushNotification)\n }\n\n render() {\n return (\n <View\n dataSet={this.rootViewDataSet ||= {class: \"flash-notifications-container\"}}\n style={styles.view}\n >\n {this.s.notifications.map((notification) =>\n <Notification\n key={`notification-${notification.count}`}\n message={notification.message}\n notification={notification}\n onRemovedClicked={this.tt.onRemovedClicked}\n title={notification.title}\n type={notification.type}\n />\n )}\n </View>\n )\n }\n\n onPushNotification = (detail) => {\n const count = this.s.count + 1\n\n setTimeout(() => this.removeNotification(count), 4000)\n\n const notification = {\n count,\n message: digg(detail, \"message\"),\n title: digg(detail, \"title\"),\n type: digg(detail, \"type\")\n }\n\n this.setState({count, notifications: this.s.notifications.concat([notification])})\n }\n\n onRemovedClicked = (notification) => this.removeNotification(digg(notification, \"count\"))\n\n removeNotification = (count) => {\n this.setState({\n notifications: this.s.notifications.filter((notification) => notification.count != count)\n })\n }\n}))\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/container/index.jsx"],"names":[],"mappings":"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","sourcesContent":["import useEventEmitter from \"@kaspernj/api-maker/build/use-event-emitter\"\nimport {digg} from \"diggerize\"\nimport React, {memo, useEffect, useMemo} from \"react\"\nimport {StyleSheet, View} from \"react-native\"\nimport {shapeComponent, ShapeComponent} from \"set-state-compare/src/shape-component\"\nimport useEnvironment from \"@kaspernj/api-maker/build/use-environment.js\"\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\"\nimport useStyles from \"@kaspernj/api-maker/build/use-styles.js\"\n\nimport events from \"../events\"\nimport Notification from \"./notification\"\n\nconst styles = StyleSheet.create({\n view: {\n zIndex: 99999\n },\n viewSmDown: {\n right: 20,\n left: 20\n },\n viewMdUp: {\n right: 20\n }\n})\n\nexport default memo(shapeComponent(class FlashNotificationsContainer extends ShapeComponent {\n timeouts = []\n\n setup() {\n this.useStates({\n count: 0,\n notifications: []\n })\n\n useEventEmitter(events, \"pushNotification\", this.tt.onPushNotification)\n useEffect(() => {\n return () => {\n for (const timeout of this.tt.timeouts) {\n clearTimeout(timeout)\n }\n }\n }, [])\n }\n\n render() {\n const {isNative} = useEnvironment()\n const insets = useSafeAreaInsets()\n const viewStyleFromStyles = useStyles(styles, \"view\")\n const viewStyle = useMemo(() => [\n viewStyleFromStyles,\n {\n position: isNative ? \"absolute\" : \"fixed\",\n top: insets.top + 20\n }\n ], [insets.top])\n\n return (\n <View\n dataSet={this.rootViewDataSet ||= {component: \"flash-notifications-container\"}}\n style={viewStyle}\n testID=\"flash-notificaitons/container\"\n >\n {this.s.notifications.map((notification) =>\n <Notification\n count={notification.count}\n key={`notification-${notification.count}`}\n message={notification.message}\n notification={notification}\n onRemovedClicked={this.tt.onRemovedClicked}\n title={notification.title}\n type={notification.type}\n />\n )}\n </View>\n )\n }\n\n onPushNotification = (detail) => {\n const count = this.s.count + 1\n const timeout = setTimeout(() => this.removeNotification(count), 4000)\n\n this.tt.timeouts.push(timeout)\n\n const notification = {\n count,\n message: digg(detail, \"message\"),\n title: digg(detail, \"title\"),\n type: digg(detail, \"type\")\n }\n\n this.setState({count, notifications: this.s.notifications.concat([notification])})\n }\n\n onRemovedClicked = (notification) => this.removeNotification(digg(notification, \"count\"))\n\n removeNotification = (count) => {\n this.setState({\n notifications: this.s.notifications.filter((notification) => notification.count != count)\n })\n }\n}))\n"]}
@@ -4,15 +4,21 @@ import PropTypesExact from "prop-types-exact";
4
4
  import React, { memo, useMemo } from "react";
5
5
  import { Pressable, StyleSheet, Text, View } from "react-native";
6
6
  import { shapeComponent, ShapeComponent } from "set-state-compare/src/shape-component";
7
+ import useStyles from "@kaspernj/api-maker/build/use-styles.js";
7
8
  const styles = StyleSheet.create({
8
9
  view: {
9
- width: 300,
10
- maxWidth: "100%",
11
10
  marginBottom: 15,
12
11
  padding: 15,
13
12
  borderRadius: 11,
14
13
  cursor: "pointer"
15
14
  },
15
+ viewSmDown: {
16
+ width: "100%"
17
+ },
18
+ viewMdUp: {
19
+ width: 300,
20
+ maxWidth: "100%"
21
+ },
16
22
  viewError: {
17
23
  border: "1px solid rgba(161, 34, 32, 0.95)",
18
24
  backgroundColor: "rgba(161, 34, 32, 0.87)"
@@ -38,9 +44,10 @@ const styles = StyleSheet.create({
38
44
  });
39
45
  const titleViewDataSet = { class: "notification-title" };
40
46
  const messageViewDataSet = { class: "notification-message" };
41
- export default memo(shapeComponent(class NotificationsNotification extends ShapeComponent {
47
+ export default memo(shapeComponent(class FlashNotificationsNotification extends ShapeComponent {
42
48
  static propTypes = PropTypesExact({
43
49
  className: PropTypes.string,
50
+ count: PropTypes.number.isRequired,
44
51
  message: PropTypes.string.isRequired,
45
52
  notification: PropTypes.object.isRequired,
46
53
  onRemovedClicked: PropTypes.func.isRequired,
@@ -48,17 +55,13 @@ export default memo(shapeComponent(class NotificationsNotification extends Shape
48
55
  type: PropTypes.string.isRequired
49
56
  });
50
57
  render() {
51
- const { className, message, title, type } = this.props;
52
- const viewStyles = useMemo(() => {
53
- const viewStyles = [styles.view];
54
- if (type == "error")
55
- viewStyles.push(styles.viewError);
56
- if (type == "success")
57
- viewStyles.push(styles.viewSuccess);
58
- if (type == "alert")
59
- viewStyles.push(styles.viewAlert);
60
- return viewStyles;
61
- }, [type]);
58
+ const { count, message, title, type } = this.p;
59
+ const { className } = this.props;
60
+ const viewStyles = useStyles(styles, ["view", {
61
+ viewError: type == "error",
62
+ viewSuccess: type == "success",
63
+ viewAlert: type == "alert"
64
+ }]);
62
65
  const pressableDataSet = useMemo(() => ({
63
66
  class: classNames("flash-notifications-notification", className),
64
67
  type
@@ -66,9 +69,9 @@ export default memo(shapeComponent(class NotificationsNotification extends Shape
66
69
  return (React.createElement(Pressable, { dataSet: pressableDataSet, onPress: this.tt.onRemovedClicked },
67
70
  React.createElement(View, { style: viewStyles },
68
71
  React.createElement(View, { dataSet: titleViewDataSet, style: styles.titleview },
69
- React.createElement(Text, { style: styles.titleText }, title)),
72
+ React.createElement(Text, { style: styles.titleText, testID: `flash-notifications/notification-${count}/title` }, title)),
70
73
  React.createElement(View, { dataSet: messageViewDataSet },
71
- React.createElement(Text, { style: styles.messageText }, message)))));
74
+ React.createElement(Text, { style: styles.messageText, testID: `flash-notifications/notification-${count}/message` }, message)))));
72
75
  }
73
76
  onRemovedClicked = () => this.p.onRemovedClicked(this.p.notification);
74
77
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/container/notification.jsx"],"names":[],"mappings":"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","sourcesContent":["import classNames from \"classnames\"\nimport PropTypes from \"prop-types\"\nimport PropTypesExact from \"prop-types-exact\"\nimport React, {memo, useMemo} from \"react\"\nimport {Pressable, StyleSheet, Text, View} from \"react-native\"\nimport {shapeComponent, ShapeComponent} from \"set-state-compare/src/shape-component\"\n\nconst styles = StyleSheet.create({\n view: {\n width: 300,\n maxWidth: \"100%\",\n marginBottom: 15,\n padding: 15,\n borderRadius: 11,\n cursor: \"pointer\"\n },\n viewError: {\n border: \"1px solid rgba(161, 34, 32, 0.95)\",\n backgroundColor: \"rgba(161, 34, 32, 0.87)\"\n },\n viewSuccess: {\n border: \"1px solid rgba(0, 0, 0, 0.95)\",\n backgroundColor: \"rgba(0, 0, 0, 0.87)\"\n },\n viewAlert: {\n border: \"1px solid rgba(204, 51, 0, 0.95)\",\n backgroundColor: \"rgba(204, 51, 0, 0.87)\"\n },\n titleview: {\n marginBottom: 5\n },\n titleText: {\n color: \"#fff\",\n fontWeight: \"bold\"\n },\n messageText: {\n color: \"#fff\"\n }\n})\n\nconst titleViewDataSet = {class: \"notification-title\"}\nconst messageViewDataSet = {class: \"notification-message\"}\n\nexport default memo(shapeComponent(class NotificationsNotification extends ShapeComponent {\n static propTypes = PropTypesExact({\n className: PropTypes.string,\n message: PropTypes.string.isRequired,\n notification: PropTypes.object.isRequired,\n onRemovedClicked: PropTypes.func.isRequired,\n title: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired\n })\n\n render() {\n const {className, message, title, type} = this.props\n\n const viewStyles = useMemo(\n () => {\n const viewStyles = [styles.view]\n\n if (type == \"error\") viewStyles.push(styles.viewError)\n if (type == \"success\") viewStyles.push(styles.viewSuccess)\n if (type == \"alert\") viewStyles.push(styles.viewAlert)\n\n return viewStyles\n },\n [type]\n )\n\n const pressableDataSet = useMemo(\n () => ({\n class: classNames(\"flash-notifications-notification\", className),\n type\n }),\n [className, type]\n )\n\n return (\n <Pressable dataSet={pressableDataSet} onPress={this.tt.onRemovedClicked}>\n <View style={viewStyles}>\n <View dataSet={titleViewDataSet} style={styles.titleview}>\n <Text style={styles.titleText}>\n {title}\n </Text>\n </View>\n <View dataSet={messageViewDataSet}>\n <Text style={styles.messageText}>\n {message}\n </Text>\n </View>\n </View>\n </Pressable>\n )\n }\n\n onRemovedClicked = () => this.p.onRemovedClicked(this.p.notification)\n}))\n"]}
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/container/notification.jsx"],"names":[],"mappings":"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","sourcesContent":["import classNames from \"classnames\"\nimport PropTypes from \"prop-types\"\nimport PropTypesExact from \"prop-types-exact\"\nimport React, {memo, useMemo} from \"react\"\nimport {Pressable, StyleSheet, Text, View} from \"react-native\"\nimport {shapeComponent, ShapeComponent} from \"set-state-compare/src/shape-component\"\nimport useStyles from \"@kaspernj/api-maker/build/use-styles.js\"\n\nconst styles = StyleSheet.create({\n view: {\n marginBottom: 15,\n padding: 15,\n borderRadius: 11,\n cursor: \"pointer\"\n },\n viewSmDown: {\n width: \"100%\"\n },\n viewMdUp: {\n width: 300,\n maxWidth: \"100%\"\n },\n viewError: {\n border: \"1px solid rgba(161, 34, 32, 0.95)\",\n backgroundColor: \"rgba(161, 34, 32, 0.87)\"\n },\n viewSuccess: {\n border: \"1px solid rgba(0, 0, 0, 0.95)\",\n backgroundColor: \"rgba(0, 0, 0, 0.87)\"\n },\n viewAlert: {\n border: \"1px solid rgba(204, 51, 0, 0.95)\",\n backgroundColor: \"rgba(204, 51, 0, 0.87)\"\n },\n titleview: {\n marginBottom: 5\n },\n titleText: {\n color: \"#fff\",\n fontWeight: \"bold\"\n },\n messageText: {\n color: \"#fff\"\n }\n})\n\nconst titleViewDataSet = {class: \"notification-title\"}\nconst messageViewDataSet = {class: \"notification-message\"}\n\nexport default memo(shapeComponent(class FlashNotificationsNotification extends ShapeComponent {\n static propTypes = PropTypesExact({\n className: PropTypes.string,\n count: PropTypes.number.isRequired,\n message: PropTypes.string.isRequired,\n notification: PropTypes.object.isRequired,\n onRemovedClicked: PropTypes.func.isRequired,\n title: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired\n })\n\n render() {\n const {count, message, title, type} = this.p\n const {className} = this.props\n\n const viewStyles = useStyles(styles, [\"view\", {\n viewError: type == \"error\",\n viewSuccess: type == \"success\",\n viewAlert: type == \"alert\"\n }])\n\n const pressableDataSet = useMemo(\n () => ({\n class: classNames(\"flash-notifications-notification\", className),\n type\n }),\n [className, type]\n )\n\n return (\n <Pressable dataSet={pressableDataSet} onPress={this.tt.onRemovedClicked}>\n <View style={viewStyles}>\n <View dataSet={titleViewDataSet} style={styles.titleview}>\n <Text style={styles.titleText} testID={`flash-notifications/notification-${count}/title`}>\n {title}\n </Text>\n </View>\n <View dataSet={messageViewDataSet}>\n <Text style={styles.messageText} testID={`flash-notifications/notification-${count}/message`}>\n {message}\n </Text>\n </View>\n </View>\n </Pressable>\n )\n }\n\n onRemovedClicked = () => this.p.onRemovedClicked(this.p.notification)\n}))\n"]}
@@ -1,5 +1,5 @@
1
- import BaseError from "@kaspernj/api-maker/src/base-error";
2
- import ValidationError from "@kaspernj/api-maker/src/validation-error";
1
+ import BaseError from "@kaspernj/api-maker/build/base-error";
2
+ import ValidationError from "@kaspernj/api-maker/build/validation-error";
3
3
  import { digg } from "diggerize";
4
4
  import configuration from "./configuration";
5
5
  import events from "./events";
@@ -1 +1 @@
1
- {"version":3,"file":"flash-notifications.js","sourceRoot":"","sources":["../src/flash-notifications.js"],"names":[],"mappings":"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","sourcesContent":["import BaseError from \"@kaspernj/api-maker/src/base-error\"\nimport ValidationError from \"@kaspernj/api-maker/src/validation-error\"\nimport {digg} from \"diggerize\"\n\nimport configuration from \"./configuration\"\nimport events from \"./events\"\n\nexport default class FlashNotifications {\n static alert(message) {\n FlashNotifications.show({type: \"alert\", text: message})\n }\n\n static error(error) {\n if (error instanceof BaseError) {\n if (error.args.response && error.args.response.errors) {\n const errors = digg(error, \"args\", \"response\", \"errors\")\n const errorMessages = errors.map((error) => {\n if (typeof error == \"string\") {\n return error\n }\n\n return digg(error, \"message\")\n })\n\n FlashNotifications.alert(errorMessages.join(\". \"))\n } else {\n throw error\n }\n } else if (error instanceof ValidationError) {\n if (error.hasUnhandledErrors()) {\n FlashNotifications.alert(error.message)\n } else {\n const defaultValue = \"Couldn't submit because of validation errors.\"\n\n FlashNotifications.alert(configuration.translate(\"js.notification.couldnt_submit_because_of_validation_errors\", {defaultValue}))\n }\n } else {\n console.error(\"Didnt know what to do with that error\", error)\n throw error\n }\n }\n\n static errorResponse(error) {\n this.error(error)\n }\n\n static success(message) {\n FlashNotifications.show({type: \"success\", text: message})\n }\n\n static show(args) {\n let title\n\n if (args.type == \"alert\") {\n title = configuration.translate(\"js.shared.alert\", {defaultValue: \"Alert\"})\n } else if (args.type == \"error\") {\n title = configuration.translate(\"js.shared.error\", {defaultValue: \"Error\"})\n } else if (args.type == \"success\") {\n title = configuration.translate(\"js.shared.success\", {defaultValue: \"Success\"})\n } else {\n title = configuration.translate(\"js.shared.notification\", {defaultValue: \"Notification\"})\n }\n\n events.emit(\"pushNotification\", {\n message: args.text,\n title,\n type: args.type\n })\n }\n}\n"]}
1
+ {"version":3,"file":"flash-notifications.js","sourceRoot":"","sources":["../src/flash-notifications.js"],"names":[],"mappings":"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","sourcesContent":["import BaseError from \"@kaspernj/api-maker/build/base-error\"\nimport ValidationError from \"@kaspernj/api-maker/build/validation-error\"\nimport {digg} from \"diggerize\"\n\nimport configuration from \"./configuration\"\nimport events from \"./events\"\n\nexport default class FlashNotifications {\n static alert(message) {\n FlashNotifications.show({type: \"alert\", text: message})\n }\n\n static error(error) {\n if (error instanceof BaseError) {\n if (error.args.response && error.args.response.errors) {\n const errors = digg(error, \"args\", \"response\", \"errors\")\n const errorMessages = errors.map((error) => {\n if (typeof error == \"string\") {\n return error\n }\n\n return digg(error, \"message\")\n })\n\n FlashNotifications.alert(errorMessages.join(\". \"))\n } else {\n throw error\n }\n } else if (error instanceof ValidationError) {\n if (error.hasUnhandledErrors()) {\n FlashNotifications.alert(error.message)\n } else {\n const defaultValue = \"Couldn't submit because of validation errors.\"\n\n FlashNotifications.alert(configuration.translate(\"js.notification.couldnt_submit_because_of_validation_errors\", {defaultValue}))\n }\n } else {\n console.error(\"Didnt know what to do with that error\", error)\n throw error\n }\n }\n\n static errorResponse(error) {\n this.error(error)\n }\n\n static success(message) {\n FlashNotifications.show({type: \"success\", text: message})\n }\n\n static show(args) {\n let title\n\n if (args.type == \"alert\") {\n title = configuration.translate(\"js.shared.alert\", {defaultValue: \"Alert\"})\n } else if (args.type == \"error\") {\n title = configuration.translate(\"js.shared.error\", {defaultValue: \"Error\"})\n } else if (args.type == \"success\") {\n title = configuration.translate(\"js.shared.success\", {defaultValue: \"Success\"})\n } else {\n title = configuration.translate(\"js.shared.notification\", {defaultValue: \"Notification\"})\n }\n\n events.emit(\"pushNotification\", {\n message: args.text,\n title,\n type: args.type\n })\n }\n}\n"]}
package/jest.setup.js ADDED
@@ -0,0 +1,3 @@
1
+ import mockSafeAreaContext from "react-native-safe-area-context/jest/mock"
2
+
3
+ jest.mock("react-native-safe-area-context", () => mockSafeAreaContext)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flash-notifications",
3
- "version": "0.0.16",
3
+ "version": "0.0.18",
4
4
  "description": "My new module",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -8,7 +8,8 @@
8
8
  "build": "expo-module build",
9
9
  "clean": "expo-module clean",
10
10
  "lint": "expo-module lint",
11
- "test": "expo-module test",
11
+ "test": "jest --detectOpenHandles",
12
+ "test-expo": "expo-module test",
12
13
  "prepare": "expo-module prepare",
13
14
  "prepublishOnly": "expo-module prepublishOnly",
14
15
  "expo-module": "expo-module",
@@ -28,21 +29,35 @@
28
29
  "author": "kaspernj <kasper@diestoeckels.de> (https://github.com/kaspernj)",
29
30
  "license": "MIT",
30
31
  "homepage": "https://github.com/kaspernj/flash-notifications#readme",
32
+ "jest": {
33
+ "preset": "jest-expo",
34
+ "setupFiles": [
35
+ "./jest.setup.js"
36
+ ],
37
+ "transformIgnorePatterns": [
38
+ "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|fetching-object|set-state-compare|@kaspernj/api-maker)"
39
+ ]
40
+ },
31
41
  "dependencies": {
32
42
  "classnames": "^2.5.1",
33
- "diggerize": "*",
43
+ "diggerize": "^1.0.9",
44
+ "fetching-object": "^1.0.3",
34
45
  "prop-types-exact": "*",
35
- "set-state-compare": "*"
46
+ "set-state-compare": "^1.0.57"
36
47
  },
37
48
  "devDependencies": {
49
+ "@testing-library/react-native": "~13.0.1",
38
50
  "@types/react": "~18.3.12",
39
51
  "expo": "~53.0.9",
40
52
  "expo-module-scripts": "^4.0.2",
41
53
  "react-native": "~0.76.9"
42
54
  },
43
55
  "peerDependencies": {
56
+ "@kaspernj/api-maker": ">= 1.0.2043",
44
57
  "expo": "*",
45
58
  "react": "*",
46
- "react-native": "*"
47
- }
59
+ "react-native": "*",
60
+ "react-native-safe-area-context": "*"
61
+ },
62
+ "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
48
63
  }
package/peak_flow.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  before_script:
2
2
  - npm install
3
3
  script:
4
+ - npm run test
4
5
  - npm run lint
@@ -1,5 +1,7 @@
1
1
  if (!globalThis.flashNotificationsConfiguration) {
2
- globalThis.flashNotificationsConfiguration = {}
2
+ globalThis.flashNotificationsConfiguration = {
3
+ translate: (msgId) => msgId
4
+ }
3
5
  }
4
6
 
5
7
  const configuration = globalThis.flashNotificationsConfiguration
@@ -1,22 +1,31 @@
1
- import useEventEmitter from "@kaspernj/api-maker/src/use-event-emitter"
1
+ import useEventEmitter from "@kaspernj/api-maker/build/use-event-emitter"
2
2
  import {digg} from "diggerize"
3
- import React, {memo} from "react"
3
+ import React, {memo, useEffect, useMemo} from "react"
4
4
  import {StyleSheet, View} from "react-native"
5
5
  import {shapeComponent, ShapeComponent} from "set-state-compare/src/shape-component"
6
+ import useEnvironment from "@kaspernj/api-maker/build/use-environment.js"
7
+ import {useSafeAreaInsets} from "react-native-safe-area-context"
8
+ import useStyles from "@kaspernj/api-maker/build/use-styles.js"
6
9
 
7
10
  import events from "../events"
8
11
  import Notification from "./notification"
9
12
 
10
13
  const styles = StyleSheet.create({
11
14
  view: {
12
- position: "fixed",
13
- zIndex: 99999,
14
- top: 20,
15
+ zIndex: 99999
16
+ },
17
+ viewSmDown: {
18
+ right: 20,
19
+ left: 20
20
+ },
21
+ viewMdUp: {
15
22
  right: 20
16
23
  }
17
24
  })
18
25
 
19
26
  export default memo(shapeComponent(class FlashNotificationsContainer extends ShapeComponent {
27
+ timeouts = []
28
+
20
29
  setup() {
21
30
  this.useStates({
22
31
  count: 0,
@@ -24,16 +33,36 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
24
33
  })
25
34
 
26
35
  useEventEmitter(events, "pushNotification", this.tt.onPushNotification)
36
+ useEffect(() => {
37
+ return () => {
38
+ for (const timeout of this.tt.timeouts) {
39
+ clearTimeout(timeout)
40
+ }
41
+ }
42
+ }, [])
27
43
  }
28
44
 
29
45
  render() {
46
+ const {isNative} = useEnvironment()
47
+ const insets = useSafeAreaInsets()
48
+ const viewStyleFromStyles = useStyles(styles, "view")
49
+ const viewStyle = useMemo(() => [
50
+ viewStyleFromStyles,
51
+ {
52
+ position: isNative ? "absolute" : "fixed",
53
+ top: insets.top + 20
54
+ }
55
+ ], [insets.top])
56
+
30
57
  return (
31
58
  <View
32
- dataSet={this.rootViewDataSet ||= {class: "flash-notifications-container"}}
33
- style={styles.view}
59
+ dataSet={this.rootViewDataSet ||= {component: "flash-notifications-container"}}
60
+ style={viewStyle}
61
+ testID="flash-notificaitons/container"
34
62
  >
35
63
  {this.s.notifications.map((notification) =>
36
64
  <Notification
65
+ count={notification.count}
37
66
  key={`notification-${notification.count}`}
38
67
  message={notification.message}
39
68
  notification={notification}
@@ -48,8 +77,9 @@ export default memo(shapeComponent(class FlashNotificationsContainer extends Sha
48
77
 
49
78
  onPushNotification = (detail) => {
50
79
  const count = this.s.count + 1
80
+ const timeout = setTimeout(() => this.removeNotification(count), 4000)
51
81
 
52
- setTimeout(() => this.removeNotification(count), 4000)
82
+ this.tt.timeouts.push(timeout)
53
83
 
54
84
  const notification = {
55
85
  count,
@@ -4,16 +4,22 @@ import PropTypesExact from "prop-types-exact"
4
4
  import React, {memo, useMemo} from "react"
5
5
  import {Pressable, StyleSheet, Text, View} from "react-native"
6
6
  import {shapeComponent, ShapeComponent} from "set-state-compare/src/shape-component"
7
+ import useStyles from "@kaspernj/api-maker/build/use-styles.js"
7
8
 
8
9
  const styles = StyleSheet.create({
9
10
  view: {
10
- width: 300,
11
- maxWidth: "100%",
12
11
  marginBottom: 15,
13
12
  padding: 15,
14
13
  borderRadius: 11,
15
14
  cursor: "pointer"
16
15
  },
16
+ viewSmDown: {
17
+ width: "100%"
18
+ },
19
+ viewMdUp: {
20
+ width: 300,
21
+ maxWidth: "100%"
22
+ },
17
23
  viewError: {
18
24
  border: "1px solid rgba(161, 34, 32, 0.95)",
19
25
  backgroundColor: "rgba(161, 34, 32, 0.87)"
@@ -41,9 +47,10 @@ const styles = StyleSheet.create({
41
47
  const titleViewDataSet = {class: "notification-title"}
42
48
  const messageViewDataSet = {class: "notification-message"}
43
49
 
44
- export default memo(shapeComponent(class NotificationsNotification extends ShapeComponent {
50
+ export default memo(shapeComponent(class FlashNotificationsNotification extends ShapeComponent {
45
51
  static propTypes = PropTypesExact({
46
52
  className: PropTypes.string,
53
+ count: PropTypes.number.isRequired,
47
54
  message: PropTypes.string.isRequired,
48
55
  notification: PropTypes.object.isRequired,
49
56
  onRemovedClicked: PropTypes.func.isRequired,
@@ -52,20 +59,14 @@ export default memo(shapeComponent(class NotificationsNotification extends Shape
52
59
  })
53
60
 
54
61
  render() {
55
- const {className, message, title, type} = this.props
62
+ const {count, message, title, type} = this.p
63
+ const {className} = this.props
56
64
 
57
- const viewStyles = useMemo(
58
- () => {
59
- const viewStyles = [styles.view]
60
-
61
- if (type == "error") viewStyles.push(styles.viewError)
62
- if (type == "success") viewStyles.push(styles.viewSuccess)
63
- if (type == "alert") viewStyles.push(styles.viewAlert)
64
-
65
- return viewStyles
66
- },
67
- [type]
68
- )
65
+ const viewStyles = useStyles(styles, ["view", {
66
+ viewError: type == "error",
67
+ viewSuccess: type == "success",
68
+ viewAlert: type == "alert"
69
+ }])
69
70
 
70
71
  const pressableDataSet = useMemo(
71
72
  () => ({
@@ -79,12 +80,12 @@ export default memo(shapeComponent(class NotificationsNotification extends Shape
79
80
  <Pressable dataSet={pressableDataSet} onPress={this.tt.onRemovedClicked}>
80
81
  <View style={viewStyles}>
81
82
  <View dataSet={titleViewDataSet} style={styles.titleview}>
82
- <Text style={styles.titleText}>
83
+ <Text style={styles.titleText} testID={`flash-notifications/notification-${count}/title`}>
83
84
  {title}
84
85
  </Text>
85
86
  </View>
86
87
  <View dataSet={messageViewDataSet}>
87
- <Text style={styles.messageText}>
88
+ <Text style={styles.messageText} testID={`flash-notifications/notification-${count}/message`}>
88
89
  {message}
89
90
  </Text>
90
91
  </View>
@@ -1,5 +1,5 @@
1
- import BaseError from "@kaspernj/api-maker/src/base-error"
2
- import ValidationError from "@kaspernj/api-maker/src/validation-error"
1
+ import BaseError from "@kaspernj/api-maker/build/base-error"
2
+ import ValidationError from "@kaspernj/api-maker/build/validation-error"
3
3
  import {digg} from "diggerize"
4
4
 
5
5
  import configuration from "./configuration"