@notificationapi/react 0.0.27 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,25 @@
1
+ [![NotificationAPI](./ReadmeLogo.svg)](https://notificationapi.com)
2
+
3
+ The React SDK is mainly used for displaying In-App Notifications and allowing users to see and change their Notification Preferences.
4
+
5
+ # Docs
6
+
7
+ Please refer to our [documentations](https://docs.notificationapi.com).
8
+
9
+ # Development
10
+
11
+ 1. Install dependencies:
12
+
13
+ ```
14
+ npm install
15
+ ```
16
+
17
+ 2. Run the example application:
18
+
19
+ ```
20
+ npm run dev
21
+ ```
22
+
1
23
  # React + TypeScript + Vite
2
24
 
3
25
  This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
@@ -20,11 +42,85 @@ export default {
20
42
  ecmaVersion: 'latest',
21
43
  sourceType: 'module',
22
44
  project: ['./tsconfig.json', './tsconfig.node.json'],
23
- tsconfigRootDir: __dirname,
24
- },
25
- }
45
+ tsconfigRootDir: __dirname
46
+ }
47
+ };
26
48
  ```
27
49
 
28
50
  - Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
29
51
  - Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
30
52
  - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list
53
+
54
+ ## Contributing
55
+
56
+ We welcome contributions! To ensure smooth collaboration, please follow these steps:
57
+
58
+ 1. **Clone the Repository**
59
+
60
+ - Fork the repository to your GitHub account.
61
+ - Clone it to your local machine:
62
+
63
+ ```bash
64
+ git clone https://github.com/your-username/repo-name.git
65
+ cd repo-name
66
+ ```
67
+
68
+ 2. **Create a Branch**
69
+
70
+ - Create a new branch for your changes:
71
+
72
+ ```bash
73
+ git checkout -b your-branch-name
74
+ ```
75
+
76
+ 3. **Make Your Changes**
77
+
78
+ - Make your changes in the relevant files.
79
+ - Thoroughly test your changes to ensure they work as expected.
80
+
81
+ 4. **Versioning**
82
+
83
+ - Before committing your changes, update the package version by running:
84
+
85
+ ```bash
86
+ npm version <type>
87
+ ```
88
+
89
+ - **Versioning Types:**
90
+
91
+ - **major**: For breaking changes or large-scale features.
92
+ - **minor**: For adding functionality in a backwards-compatible manner.
93
+ - **patch**: For backwards-compatible bug fixes or small improvements.
94
+
95
+ - For example, to update a patch version:
96
+
97
+ ```bash
98
+ npm version patch
99
+ ```
100
+
101
+ 5. **Commit and Push**
102
+
103
+ - Once you’ve made and tested your changes, commit them with a meaningful message:
104
+
105
+ ```bash
106
+ git add .
107
+ git commit -m "Describe your changes"
108
+ ```
109
+
110
+ - Push your branch to GitHub:
111
+
112
+ ```bash
113
+ git push origin your-branch-name
114
+ ```
115
+
116
+ 6. **Submit a Pull Request**
117
+
118
+ - Create a pull request (PR) on GitHub.
119
+ - Provide a clear description of what your changes do.
120
+ - Link any relevant issues.
121
+
122
+ 7. **Update Documentation**
123
+ - If your changes affect the documentation, please update it accordingly.
124
+ - You can find the documentation repository here: [NotificationAPI Docs](https://github.com/notificationapi-com/docs).
125
+
126
+ Thank you for contributing!
@@ -6185,7 +6185,7 @@ const us = (e) => {
6185
6185
  data: s,
6186
6186
  height: e.maxHeight,
6187
6187
  itemHeight: 47,
6188
- itemKey: "id",
6188
+ itemKey: (u) => u[0].id,
6189
6189
  onScroll: (u) => {
6190
6190
  Math.abs(
6191
6191
  u.currentTarget.scrollHeight - u.currentTarget.scrollTop - e.maxHeight
@@ -1,24 +1,25 @@
1
- import { jsx as i, jsxs as h } from "react/jsx-runtime";
2
- import { Inbox as l } from "./Inbox.js";
1
+ import { jsx as i, jsxs as l } from "react/jsx-runtime";
2
+ import { Inbox as h } from "./Inbox.js";
3
3
  import { UnreadBadge as g } from "./UnreadBadge.js";
4
4
  import { useState as m, useContext as b } from "react";
5
5
  import { NotificationAPIContext as s } from "../Provider/index.js";
6
6
  import { NotificationPreferencesPopup as I } from "../Preferences/NotificationPreferencesPopup.js";
7
7
  import "../Preferences/PreferenceInput.js";
8
- import { R as p } from "../../assets/channelUtils.js";
9
- import { P as S } from "../../assets/index.js";
10
- import { B as P } from "../../assets/button.js";
8
+ import { R as S } from "../../assets/channelUtils.js";
9
+ import { P } from "../../assets/index.js";
10
+ import { B as C } from "../../assets/button.js";
11
11
  const B = (t) => {
12
- var a, r, d, u;
13
- const [c, o] = m(!1), n = b(s);
12
+ var a, r, d, c;
13
+ const [u, o] = m(!1), n = b(s);
14
14
  if (!n)
15
15
  return null;
16
16
  const e = {
17
17
  buttonIcon: t.buttonIcon || /* @__PURE__ */ i(
18
- p,
18
+ S,
19
19
  {
20
20
  style: {
21
- fontSize: t.buttonIconSize || (t.buttonWidth ? t.buttonWidth / 2 : 20)
21
+ fontSize: t.buttonIconSize || (t.buttonWidth ? t.buttonWidth / 2 : 20),
22
+ color: t.iconColor || "#000000"
22
23
  }
23
24
  }
24
25
  ),
@@ -28,6 +29,7 @@ const B = (t) => {
28
29
  popupHeight: t.popupHeight || 600,
29
30
  buttonIconSize: t.buttonIconSize || (t.buttonWidth ? t.buttonWidth / 2 : 20),
30
31
  imageShape: t.imageShape || "circle",
32
+ iconColor: t.iconColor || "#000000",
31
33
  pagination: t.pagination || "INFINITE_SCROLL",
32
34
  pageSize: t.pageSize || 10,
33
35
  pagePosition: t.pagePosition || "top",
@@ -44,10 +46,10 @@ const B = (t) => {
44
46
  button2ClickHandler: ((d = t.header) == null ? void 0 : d.button2ClickHandler) ?? (() => o(!0))
45
47
  },
46
48
  renderers: {
47
- notification: (u = t.renderers) == null ? void 0 : u.notification
49
+ notification: (c = t.renderers) == null ? void 0 : c.notification
48
50
  }
49
51
  };
50
- return /* @__PURE__ */ h(
52
+ return /* @__PURE__ */ l(
51
53
  "div",
52
54
  {
53
55
  style: {
@@ -58,12 +60,12 @@ const B = (t) => {
58
60
  },
59
61
  children: [
60
62
  /* @__PURE__ */ i(
61
- S,
63
+ P,
62
64
  {
63
65
  autoAdjustOverflow: !0,
64
66
  trigger: "click",
65
67
  content: /* @__PURE__ */ i(
66
- l,
68
+ h,
67
69
  {
68
70
  maxHeight: 500,
69
71
  pagination: e.pagination,
@@ -99,7 +101,7 @@ const B = (t) => {
99
101
  },
100
102
  count: e.count,
101
103
  children: /* @__PURE__ */ i(
102
- P,
104
+ C,
103
105
  {
104
106
  icon: e.buttonIcon,
105
107
  style: {
@@ -119,7 +121,7 @@ const B = (t) => {
119
121
  /* @__PURE__ */ i(
120
122
  I,
121
123
  {
122
- open: c,
124
+ open: u,
123
125
  onClose: () => o(!1)
124
126
  }
125
127
  )
@@ -12,6 +12,7 @@ export type NotificationPopupProps = {
12
12
  popupWidth?: number | string;
13
13
  popupHeight?: number;
14
14
  imageShape?: keyof typeof ImageShape;
15
+ iconColor?: string;
15
16
  pagination?: keyof typeof Pagination;
16
17
  pageSize?: number;
17
18
  pagePosition?: 'top' | 'bottom';
@@ -6,20 +6,21 @@ import { useState as b, useContext as I } from "react";
6
6
  import { NotificationPreferencesPopup as P } from "../Preferences/NotificationPreferencesPopup.js";
7
7
  import "../Preferences/PreferenceInput.js";
8
8
  import { Filter as S } from "./interface.js";
9
- import { R as s } from "../../assets/channelUtils.js";
10
- import { P as x } from "../../assets/index.js";
11
- import { B as C } from "../../assets/button.js";
9
+ import { R as x } from "../../assets/channelUtils.js";
10
+ import { P as C } from "../../assets/index.js";
11
+ import { B as s } from "../../assets/button.js";
12
12
  const F = (t) => {
13
- var a, r, d, u;
14
- const [c, o] = b(!1), n = I(p);
13
+ var a, r, c, d;
14
+ const [u, o] = b(!1), n = I(p);
15
15
  if (!n)
16
16
  return null;
17
17
  const e = {
18
18
  buttonIcon: t.buttonIcon || /* @__PURE__ */ i(
19
- s,
19
+ x,
20
20
  {
21
21
  style: {
22
- fontSize: t.buttonIconSize || (t.buttonWidth ? t.buttonWidth / 2 : 20)
22
+ fontSize: t.buttonIconSize || (t.buttonWidth ? t.buttonWidth / 2 : 20),
23
+ color: t.iconColor || "#000000"
23
24
  }
24
25
  }
25
26
  ),
@@ -29,6 +30,7 @@ const F = (t) => {
29
30
  popupHeight: t.popupHeight || 600,
30
31
  buttonIconSize: t.buttonIconSize || (t.buttonWidth ? t.buttonWidth / 2 : 20),
31
32
  imageShape: t.imageShape || "circle",
33
+ iconColor: t.iconColor || "#000000",
32
34
  pagination: t.pagination || "INFINITE_SCROLL",
33
35
  pageSize: t.pageSize || 10,
34
36
  pagePosition: t.pagePosition || "top",
@@ -39,15 +41,15 @@ const F = (t) => {
39
41
  header: {
40
42
  title: (a = t.header) == null ? void 0 : a.title,
41
43
  button1ClickHandler: ((r = t.header) == null ? void 0 : r.button1ClickHandler) ?? n.markAsArchived,
42
- button2ClickHandler: ((d = t.header) == null ? void 0 : d.button2ClickHandler) ?? (() => o(!0))
44
+ button2ClickHandler: ((c = t.header) == null ? void 0 : c.button2ClickHandler) ?? (() => o(!0))
43
45
  },
44
46
  renderers: {
45
- notification: (u = t.renderers) == null ? void 0 : u.notification
47
+ notification: (d = t.renderers) == null ? void 0 : d.notification
46
48
  }
47
49
  };
48
50
  return /* @__PURE__ */ h(f, { children: [
49
51
  /* @__PURE__ */ i(
50
- x,
52
+ C,
51
53
  {
52
54
  autoAdjustOverflow: !0,
53
55
  trigger: "click",
@@ -90,7 +92,7 @@ const F = (t) => {
90
92
  count: e.count,
91
93
  filter: e.filter,
92
94
  children: /* @__PURE__ */ i(
93
- C,
95
+ s,
94
96
  {
95
97
  icon: e.buttonIcon,
96
98
  style: {
@@ -110,7 +112,7 @@ const F = (t) => {
110
112
  /* @__PURE__ */ i(
111
113
  P,
112
114
  {
113
- open: c,
115
+ open: u,
114
116
  onClose: () => o(!1)
115
117
  }
116
118
  )
@@ -1,5 +1,6 @@
1
1
  import { PropsWithChildren } from 'react';
2
- import { GetPreferencesResponse, InAppNotification, BaseDeliveryOptions, Channels, DeliveryOptionsForEmail, DeliveryOptionsForInappWeb } from '@notificationapi/core/dist/interfaces';
2
+ import { NotificationAPIClientSDK } from '@notificationapi/core';
3
+ import { GetPreferencesResponse, InAppNotification, User, BaseDeliveryOptions, Channels, DeliveryOptionsForEmail, DeliveryOptionsForInappWeb } from '@notificationapi/core/dist/interfaces';
3
4
 
4
5
  export type Context = {
5
6
  notifications?: InAppNotification[];
@@ -16,11 +17,15 @@ export type Context = {
16
17
  delivery: DeliveryOptionsForEmail | DeliveryOptionsForInappWeb | BaseDeliveryOptions;
17
18
  subNotificationId?: string;
18
19
  }[]) => void;
20
+ getClient: () => typeof NotificationAPIClientSDK;
19
21
  };
20
22
  export declare const NotificationAPIContext: import('react').Context<Context | undefined>;
21
- type Props = {
22
- clientId: string;
23
+ type Props = ({
23
24
  userId: string;
25
+ } | {
26
+ user: Omit<User, 'createdAt' | 'updatedAt' | 'lastSeenTime'>;
27
+ }) & {
28
+ clientId: string;
24
29
  hashedUserId?: string;
25
30
  apiURL?: string;
26
31
  wsURL?: string;
@@ -1,10 +1,10 @@
1
1
  import { jsx as B } from "react/jsx-runtime";
2
- import { createContext as F, useState as N, useCallback as b, useMemo as G, useRef as m, useEffect as M, useContext as J } from "react";
3
- const _ = async (e, c, r, a, f, w, p) => {
4
- const h = z(a, f, w), l = await fetch(
5
- `https://${c}/${a}/users/${encodeURIComponent(
2
+ import { createContext as z, useState as N, useCallback as A, useMemo as F, useRef as y, useEffect as U, useContext as G } from "react";
3
+ const J = async (e, s, c, a, f, w, p) => {
4
+ const h = _(a, f, w), l = await fetch(
5
+ `https://${s}/${a}/users/${encodeURIComponent(
6
6
  f
7
- )}/${r}`,
7
+ )}/${c}`,
8
8
  {
9
9
  method: e,
10
10
  body: JSON.stringify(p),
@@ -18,7 +18,7 @@ const _ = async (e, c, r, a, f, w, p) => {
18
18
  } catch {
19
19
  return;
20
20
  }
21
- }, z = (e, c, r) => btoa(r ? e + ":" + c + ":" + r : e + ":" + c), U = {
21
+ }, _ = (e, s, c) => btoa(c ? e + ":" + s + ":" + c : e + ":" + s), M = {
22
22
  host: "api.notificationapi.com",
23
23
  websocketHost: "ws.notificationapi.com",
24
24
  userId: "",
@@ -31,70 +31,76 @@ const _ = async (e, c, r, a, f, w, p) => {
31
31
  onNewInAppNotifications: void 0,
32
32
  keepWebSocketAliveForSeconds: 86400
33
33
  // 24 hours
34
- }, o = {
35
- config: U,
34
+ }, n = {
35
+ config: M,
36
36
  init: function(e) {
37
- return this.config = { ...U, ...e }, {
37
+ return this.config = { ...M, ...e }, {
38
38
  ...this
39
39
  };
40
40
  },
41
41
  rest: {
42
- generic: function(e, c, r) {
43
- return _(
42
+ generic: function(e, s, c) {
43
+ return J(
44
44
  e,
45
- o.config.host,
46
- c,
47
- o.config.clientId,
48
- o.config.userId,
49
- o.config.hashedUserId,
50
- r
45
+ n.config.host,
46
+ s,
47
+ n.config.clientId,
48
+ n.config.userId,
49
+ n.config.hashedUserId,
50
+ c
51
51
  );
52
52
  },
53
- getNotifications: function(e, c) {
54
- return o.rest.generic(
53
+ // The functions below are nice wrappers over the generic
54
+ // rest api function above. They must follow REST API naming:
55
+ // Method + Resource, representing the end-point.
56
+ getNotifications: function(e, s) {
57
+ return n.rest.generic(
55
58
  "GET",
56
- `notifications/INAPP_WEB?count=${c}&before=${e}`
59
+ `notifications/INAPP_WEB?count=${s}&before=${e}`
57
60
  );
58
61
  },
59
62
  patchNotifications: function(e) {
60
- return o.rest.generic(
63
+ return n.rest.generic(
61
64
  "PATCH",
62
65
  "notifications/INAPP_WEB",
63
66
  e
64
67
  );
65
68
  },
66
69
  getPreferences: function() {
67
- return o.rest.generic("GET", "preferences");
70
+ return n.rest.generic("GET", "preferences");
68
71
  },
69
72
  postPreferences: function(e) {
70
- return o.rest.generic(
73
+ return n.rest.generic(
71
74
  "POST",
72
75
  "preferences",
73
76
  e
74
77
  );
78
+ },
79
+ postUser: function(e) {
80
+ return n.rest.generic("POST", "", e);
75
81
  }
76
82
  },
77
83
  websocket: {
78
84
  object: void 0,
79
85
  connect: function() {
80
- let e = `wss://${o.config.websocketHost}?userId=${encodeURIComponent(o.config.userId)}&envId=${o.config.clientId}`;
81
- return o.config.hashedUserId && (e += `&userIdHash=${encodeURIComponent(o.config.hashedUserId)}`), o.websocket.object = new WebSocket(e), o.websocket.object.onmessage = (c) => {
82
- const r = JSON.parse(c.data);
83
- if (!(!r || !r.route) && r.route === "inapp_web/new_notifications") {
84
- const a = r;
85
- o.config.onNewInAppNotifications && o.config.onNewInAppNotifications(
86
+ let e = `wss://${n.config.websocketHost}?userId=${encodeURIComponent(n.config.userId)}&envId=${n.config.clientId}`;
87
+ return n.config.hashedUserId && (e += `&userIdHash=${encodeURIComponent(n.config.hashedUserId)}`), n.websocket.object = new WebSocket(e), n.websocket.object.onmessage = (s) => {
88
+ const c = JSON.parse(s.data);
89
+ if (!(!c || !c.route) && c.route === "inapp_web/new_notifications") {
90
+ const a = c;
91
+ n.config.onNewInAppNotifications && n.config.onNewInAppNotifications(
86
92
  a.payload.notifications
87
93
  );
88
94
  }
89
- }, o.websocket.object;
95
+ }, n.websocket.object;
90
96
  },
91
97
  disconnect: function(e) {
92
- var c;
93
- o.websocket.object && ((c = o.websocket.object) == null || c.close(), e && e(o.websocket.object));
98
+ var s;
99
+ n.websocket.object && ((s = n.websocket.object) == null || s.close(), e && e(n.websocket.object));
94
100
  }
95
101
  },
96
102
  openWebSocket: function() {
97
- return o.websocket.connect(() => {
103
+ return n.websocket.connect(() => {
98
104
  setTimeout(
99
105
  () => {
100
106
  this.websocket.disconnect(() => {
@@ -105,20 +111,23 @@ const _ = async (e, c, r, a, f, w, p) => {
105
111
  );
106
112
  });
107
113
  },
114
+ // These functions are developer friendly wrappers over the rest APIs
115
+ // They may or may not do additional tasks.
116
+ // e.g. identify simply maps to postUsers
108
117
  getInAppNotifications: async (e) => {
109
- const c = e.maxCountNeeded || o.config.getInAppDefaultCount, r = e.oldestNeeded || o.config.getInAppDefaultOldest;
118
+ const s = e.maxCountNeeded || n.config.getInAppDefaultCount, c = e.oldestNeeded || n.config.getInAppDefaultOldest;
110
119
  let a = [], f = e.before, w = !0, p = !0;
111
120
  for (; p; ) {
112
- const h = (await o.rest.getNotifications(
121
+ const h = (await n.rest.getNotifications(
113
122
  f,
114
- c
123
+ s
115
124
  )).notifications.filter(
116
125
  (l) => !a.find((g) => g.id === l.id)
117
126
  );
118
127
  f = h.reduce(
119
128
  (l, g) => l < g.date ? l : g.date,
120
129
  e.before
121
- ), a = [...a, ...h], w = h.length > 0, p = !0, (!w || a.length >= c || f < r) && (p = !1);
130
+ ), a = [...a, ...h], w = h.length > 0, p = !0, (!w || a.length >= s || f < c) && (p = !1);
122
131
  }
123
132
  return {
124
133
  items: a,
@@ -127,17 +136,24 @@ const _ = async (e, c, r, a, f, w, p) => {
127
136
  };
128
137
  },
129
138
  updateInAppNotifications: async (e) => {
130
- const c = {
139
+ const s = {
131
140
  trackingIds: e.ids
132
141
  };
133
- return e.archived === !0 ? c.archived = (/* @__PURE__ */ new Date()).toISOString() : e.archived === !1 && (c.archived = null), e.clicked === !0 ? c.clicked = (/* @__PURE__ */ new Date()).toISOString() : e.clicked === !1 && (c.clicked = null), e.opened === !0 ? c.opened = (/* @__PURE__ */ new Date()).toISOString() : e.opened === !1 && (c.opened = null), o.rest.patchNotifications(c);
142
+ return e.archived === !0 ? s.archived = (/* @__PURE__ */ new Date()).toISOString() : e.archived === !1 && (s.archived = null), e.clicked === !0 ? s.clicked = (/* @__PURE__ */ new Date()).toISOString() : e.clicked === !1 && (s.clicked = null), e.opened === !0 ? s.opened = (/* @__PURE__ */ new Date()).toISOString() : e.opened === !1 && (s.opened = null), n.rest.patchNotifications(s);
134
143
  },
135
- getPreferences: async () => o.rest.getPreferences(),
136
- updateDeliveryOption: async (e) => o.rest.postPreferences([e])
137
- }, R = F(
144
+ getPreferences: async () => n.rest.getPreferences(),
145
+ updateDeliveryOption: async (e) => n.rest.postPreferences([e]),
146
+ identify: async (e) => {
147
+ if (e.id && e.id !== n.config.userId)
148
+ throw new Error(
149
+ "The id in the parameters does not match the initialized userId."
150
+ );
151
+ return n.rest.postUser(e);
152
+ }
153
+ }, E = z(
138
154
  void 0
139
155
  ), q = (e) => {
140
- const r = {
156
+ const c = {
141
157
  ...{
142
158
  apiURL: "https://api.notificationapi.com",
143
159
  wsURL: "wss://ws.notificationapi.com",
@@ -146,148 +162,153 @@ const _ = async (e, c, r, a, f, w, p) => {
146
162
  playSoundOnNewNotification: !1,
147
163
  newNotificationSoundPath: "https://proxy.notificationsounds.com/notification-sounds/elegant-notification-sound/download/file-sounds-1233-elegant.mp3"
148
164
  },
149
- ...e
150
- }, [a, f] = N(), [w, p] = N(), [h, l] = N(!1), [g, y] = N((/* @__PURE__ */ new Date()).toISOString()), [A, D] = N(!0), P = b(() => {
151
- r.playSoundOnNewNotification && new Audio(r.newNotificationSoundPath).play().catch((s) => {
152
- console.log("Failed to play new notification sound:", s);
165
+ ...e,
166
+ user: "userId" in e ? { id: e.userId } : e.user
167
+ }, [a, f] = N(), [w, p] = N(), [h, l] = N(!1), [g, m] = N((/* @__PURE__ */ new Date()).toISOString()), [b, P] = N(!0), D = A(() => {
168
+ c.playSoundOnNewNotification && new Audio(c.newNotificationSoundPath).play().catch((r) => {
169
+ console.log("Failed to play new notification sound:", r);
153
170
  });
154
- }, [r.newNotificationSoundPath, r.playSoundOnNewNotification]), S = b((n) => {
155
- const s = (/* @__PURE__ */ new Date()).toISOString();
156
- f((t) => (n = n.filter((i) => !(i.expDate && new Date(i.expDate * 1e3).toISOString() > s || i.date > s)), t ? [
157
- ...n.filter((i) => !t.find((d) => d.id === i.id)),
171
+ }, [c.newNotificationSoundPath, c.playSoundOnNewNotification]), S = A((i) => {
172
+ const r = (/* @__PURE__ */ new Date()).toISOString();
173
+ f((t) => (i = i.filter((o) => !(o.expDate && new Date(o.expDate * 1e3).toISOString() > r || o.date > r)), t ? [
174
+ ...i.filter((o) => !t.find((d) => d.id === o.id)),
158
175
  ...t
159
- ] : n));
160
- }, []), u = G(() => o.init({
161
- clientId: e.clientId,
162
- userId: e.userId,
163
- hashedUserId: e.hashedUserId,
164
- onNewInAppNotifications: (n) => {
165
- P(), S(n);
166
- }
167
- }), [
168
- e.clientId,
169
- e.userId,
170
- e.hashedUserId,
176
+ ] : i));
177
+ }, []), u = F(() => {
178
+ const i = n.init({
179
+ clientId: c.clientId,
180
+ userId: c.user.id,
181
+ hashedUserId: c.hashedUserId,
182
+ onNewInAppNotifications: (r) => {
183
+ D(), S(r);
184
+ }
185
+ });
186
+ return i.identify(c.user), i;
187
+ }, [
188
+ c.clientId,
189
+ c.user,
190
+ c.hashedUserId,
171
191
  S,
172
- P
173
- ]), v = b(
174
- async (n, s) => {
175
- const t = await u.rest.getNotifications(n, s);
176
- y(t.oldestReceived), D(t.couldLoadMore), S(t.notifications);
192
+ D
193
+ ]), O = A(
194
+ async (i, r) => {
195
+ const t = await u.rest.getNotifications(i, r);
196
+ m(t.oldestReceived), P(t.couldLoadMore), S(t.notifications);
177
197
  },
178
198
  [S, u.rest]
179
- ), O = m(A), C = m(h), x = m(g);
180
- M(() => {
181
- O.current = A, C.current = h, x.current = g;
182
- }, [A, h, g]);
183
- const k = b(
184
- async (n) => {
185
- if (!(!n && (!O.current || C.current))) {
199
+ ), v = y(b), C = y(h), x = y(g);
200
+ U(() => {
201
+ v.current = b, C.current = h, x.current = g;
202
+ }, [b, h, g]);
203
+ const k = A(
204
+ async (i) => {
205
+ if (!(!i && (!v.current || C.current))) {
186
206
  l(!0);
187
207
  try {
188
- await v(
189
- n ? (/* @__PURE__ */ new Date()).toISOString() : x.current,
190
- n ? r.initialLoadMaxCount : 1e3
208
+ await O(
209
+ i ? (/* @__PURE__ */ new Date()).toISOString() : x.current,
210
+ i ? c.initialLoadMaxCount : 1e3
191
211
  );
192
212
  } finally {
193
213
  l(!1);
194
214
  }
195
215
  }
196
216
  },
197
- [r.initialLoadMaxCount, v]
198
- ), $ = async (n) => {
217
+ [c.initialLoadMaxCount, O]
218
+ ), R = async (i) => {
199
219
  if (!a)
200
220
  return;
201
- const s = (/* @__PURE__ */ new Date()).toISOString(), t = a.filter((i) => n.includes(i.id) && !i.clicked).map((i) => i.id);
202
- u.updateInAppNotifications({ ids: t, clicked: !0 }), f((i) => {
203
- if (!i)
221
+ const r = (/* @__PURE__ */ new Date()).toISOString(), t = a.filter((o) => i.includes(o.id) && !o.clicked).map((o) => o.id);
222
+ u.updateInAppNotifications({ ids: t, clicked: !0 }), f((o) => {
223
+ if (!o)
204
224
  return [];
205
- const d = [...i];
225
+ const d = [...o];
206
226
  return d.filter((I) => t.includes(I.id)).forEach((I) => {
207
- I.clicked = s;
227
+ I.clicked = r;
208
228
  }), d;
209
229
  });
210
- }, E = async () => {
230
+ }, $ = async () => {
211
231
  if (!a)
212
232
  return;
213
- const n = (/* @__PURE__ */ new Date()).toISOString(), s = a.filter((t) => !t.opened || !t.seen).map((t) => t.id);
214
- s.length !== 0 && (u.updateInAppNotifications({
215
- ids: s,
233
+ const i = (/* @__PURE__ */ new Date()).toISOString(), r = a.filter((t) => !t.opened || !t.seen).map((t) => t.id);
234
+ r.length !== 0 && (u.updateInAppNotifications({
235
+ ids: r,
216
236
  opened: !0
217
237
  }), f((t) => {
218
238
  if (!t)
219
239
  return [];
220
- const i = [...t];
221
- return i.filter((d) => s.includes(d.id)).forEach((d) => {
222
- d.opened = n, d.seen = !0;
223
- }), i;
240
+ const o = [...t];
241
+ return o.filter((d) => r.includes(d.id)).forEach((d) => {
242
+ d.opened = i, d.seen = !0;
243
+ }), o;
224
244
  }));
225
- }, j = async (n) => {
245
+ }, j = async (i) => {
226
246
  if (!a)
227
247
  return;
228
- const s = a.filter((t) => t.archived && (n === "ALL" || n.includes(t.id))).map((t) => t.id);
229
- s.length !== 0 && (u.updateInAppNotifications({
230
- ids: s,
248
+ const r = a.filter((t) => t.archived && (i === "ALL" || i.includes(t.id))).map((t) => t.id);
249
+ r.length !== 0 && (u.updateInAppNotifications({
250
+ ids: r,
231
251
  archived: !1
232
252
  }), f((t) => {
233
253
  if (!t)
234
254
  return [];
235
- const i = [...t];
236
- return i.filter((d) => s.includes(d.id)).forEach((d) => {
255
+ const o = [...t];
256
+ return o.filter((d) => r.includes(d.id)).forEach((d) => {
237
257
  d.archived = void 0;
238
- }), i;
258
+ }), o;
239
259
  }));
240
- }, T = async (n) => {
260
+ }, T = async (i) => {
241
261
  if (!a)
242
262
  return;
243
- const s = (/* @__PURE__ */ new Date()).toISOString(), t = a.filter((i) => !i.archived && (n === "ALL" || n.includes(i.id))).map((i) => i.id);
244
- t.length !== 0 && (u.updateInAppNotifications({ ids: t, archived: !0 }), f((i) => {
245
- if (!i)
263
+ const r = (/* @__PURE__ */ new Date()).toISOString(), t = a.filter((o) => !o.archived && (i === "ALL" || i.includes(o.id))).map((o) => o.id);
264
+ t.length !== 0 && (u.updateInAppNotifications({ ids: t, archived: !0 }), f((o) => {
265
+ if (!o)
246
266
  return [];
247
- const d = [...i];
267
+ const d = [...o];
248
268
  return d.filter((I) => t.includes(I.id)).forEach((I) => {
249
- I.archived = s;
269
+ I.archived = r;
250
270
  }), d;
251
271
  }));
252
- }, W = (n, s, t, i) => L([
272
+ }, W = (i, r, t, o) => L([
253
273
  {
254
- notificationId: n,
255
- channel: s,
274
+ notificationId: i,
275
+ channel: r,
256
276
  delivery: t,
257
- subNotificationId: i
277
+ subNotificationId: o
258
278
  }
259
- ]), L = (n) => {
260
- u.rest.postPreferences(n).then(() => {
261
- u.getPreferences().then((s) => {
262
- p(s);
279
+ ]), L = (i) => {
280
+ u.rest.postPreferences(i).then(() => {
281
+ u.getPreferences().then((r) => {
282
+ p(r);
263
283
  });
264
284
  });
265
285
  };
266
- M(() => {
267
- f([]), l(!1), p(void 0), y((/* @__PURE__ */ new Date()).toISOString()), D(!0), k(!0), u.openWebSocket(), u.getPreferences().then((n) => {
268
- p(n);
286
+ U(() => {
287
+ f([]), l(!1), p(void 0), m((/* @__PURE__ */ new Date()).toISOString()), P(!0), k(!0), u.openWebSocket(), u.getPreferences().then((i) => {
288
+ p(i);
269
289
  });
270
290
  }, [u, k]);
271
291
  const H = {
272
292
  notifications: a,
273
293
  preferences: w,
274
294
  loadNotifications: k,
275
- markAsOpened: E,
295
+ markAsOpened: $,
276
296
  markAsArchived: T,
277
297
  markAsUnarchived: j,
278
- markAsClicked: $,
298
+ markAsClicked: R,
279
299
  updateDelivery: W,
280
- updateDeliveries: L
300
+ updateDeliveries: L,
301
+ getClient: () => u
281
302
  };
282
- return /* @__PURE__ */ B(R.Provider, { value: H, children: e.children });
303
+ return /* @__PURE__ */ B(E.Provider, { value: H, children: e.children });
283
304
  }, K = () => {
284
- const e = J(R);
305
+ const e = G(E);
285
306
  if (!e)
286
307
  throw new Error("useMyContext must be used within a MyProvider");
287
308
  return e;
288
309
  };
289
310
  q.useNotificationAPIContext = K;
290
311
  export {
291
- R as NotificationAPIContext,
312
+ E as NotificationAPIContext,
292
313
  q as NotificationAPIProvider
293
314
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@notificationapi/react",
3
3
  "private": false,
4
- "version": "0.0.27",
4
+ "version": "0.0.29",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -27,8 +27,8 @@
27
27
  "eslint": "^8.57.0",
28
28
  "eslint-plugin-react-hooks": "^4.6.0",
29
29
  "eslint-plugin-react-refresh": "^0.4.6",
30
- "prettier": "^3.3.3",
31
30
  "glob": "^10.4.1",
31
+ "prettier": "^3.3.3",
32
32
  "typescript": "^5.2.2",
33
33
  "vite": "^5.2.0",
34
34
  "vite-plugin-dts": "^3.9.1",
@@ -43,7 +43,7 @@
43
43
  "**/*.css"
44
44
  ],
45
45
  "dependencies": {
46
- "@notificationapi/core": "^0.0.8",
46
+ "@notificationapi/core": "^0.0.9",
47
47
  "antd": "^5.17.4",
48
48
  "javascript-time-ago": "^2.5.10",
49
49
  "liquidjs": "^10.14.0",