@amityco/ts-sdk-react-native 7.2.0 → 7.3.0
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/dist/@types/core/events.d.ts +4 -0
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/core/model.d.ts +4 -0
- package/dist/@types/core/model.d.ts.map +1 -1
- package/dist/@types/core/payload.d.ts +24 -0
- package/dist/@types/core/payload.d.ts.map +1 -1
- package/dist/@types/domains/ad.d.ts +1 -1
- package/dist/@types/domains/ad.d.ts.map +1 -1
- package/dist/@types/domains/notification.d.ts +78 -0
- package/dist/@types/domains/notification.d.ts.map +1 -0
- package/dist/@types/index.d.ts +1 -0
- package/dist/@types/index.d.ts.map +1 -1
- package/dist/core/events.d.ts +3 -3
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/model/idResolvers.d.ts.map +1 -1
- package/dist/core/model/index.d.ts.map +1 -1
- package/dist/index.cjs.js +433 -46
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +416 -30
- package/dist/index.umd.js +3 -3
- package/dist/notificationTray/api/index.d.ts +3 -0
- package/dist/notificationTray/api/index.d.ts.map +1 -0
- package/dist/notificationTray/api/markItemsSeen.d.ts +16 -0
- package/dist/notificationTray/api/markItemsSeen.d.ts.map +1 -0
- package/dist/notificationTray/api/markTraySeen.d.ts +19 -0
- package/dist/notificationTray/api/markTraySeen.d.ts.map +1 -0
- package/dist/notificationTray/events/index.d.ts +2 -0
- package/dist/notificationTray/events/index.d.ts.map +1 -0
- package/dist/notificationTray/events/onNotificationTraySeenUpdated.d.ts +17 -0
- package/dist/notificationTray/events/onNotificationTraySeenUpdated.d.ts.map +1 -0
- package/dist/notificationTray/index.d.ts +4 -0
- package/dist/notificationTray/index.d.ts.map +1 -0
- package/dist/notificationTray/internalApi/getNotificationTraySeen.d.ts +30 -0
- package/dist/notificationTray/internalApi/getNotificationTraySeen.d.ts.map +1 -0
- package/dist/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsLiveCollectionController.d.ts +13 -0
- package/dist/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsLiveCollectionController.d.ts.map +1 -0
- package/dist/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsPaginationController.d.ts +9 -0
- package/dist/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsPaginationController.d.ts.map +1 -0
- package/dist/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsQuerystreamController.d.ts +9 -0
- package/dist/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsQuerystreamController.d.ts.map +1 -0
- package/dist/notificationTray/observers/getNotificationTrayItems.d.ts +12 -0
- package/dist/notificationTray/observers/getNotificationTrayItems.d.ts.map +1 -0
- package/dist/notificationTray/observers/getNotificationTraySeen.d.ts +20 -0
- package/dist/notificationTray/observers/getNotificationTraySeen.d.ts.map +1 -0
- package/dist/notificationTray/observers/index.d.ts +3 -0
- package/dist/notificationTray/observers/index.d.ts.map +1 -0
- package/dist/notificationTray/utils/prepareNotificationTrayItemsPayload.d.ts +2 -0
- package/dist/notificationTray/utils/prepareNotificationTrayItemsPayload.d.ts.map +1 -0
- package/dist/utils/linkedObject/index.d.ts +1 -0
- package/dist/utils/linkedObject/index.d.ts.map +1 -1
- package/dist/utils/linkedObject/notificationTrayLinkedObject.d.ts +2 -0
- package/dist/utils/linkedObject/notificationTrayLinkedObject.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/@types/core/events.ts +5 -0
- package/src/@types/core/model.ts +6 -0
- package/src/@types/core/payload.ts +29 -0
- package/src/@types/domains/ad.ts +1 -1
- package/src/@types/domains/notification.ts +94 -0
- package/src/@types/index.ts +1 -0
- package/src/core/model/idResolvers.ts +3 -0
- package/src/core/model/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/notificationTray/api/index.ts +2 -0
- package/src/notificationTray/api/markItemsSeen.ts +62 -0
- package/src/notificationTray/api/markTraySeen.ts +65 -0
- package/src/notificationTray/events/index.ts +1 -0
- package/src/notificationTray/events/onNotificationTraySeenUpdated.ts +36 -0
- package/src/notificationTray/index.ts +3 -0
- package/src/notificationTray/internalApi/getNotificationTraySeen.ts +80 -0
- package/src/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsLiveCollectionController.ts +96 -0
- package/src/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsPaginationController.ts +31 -0
- package/src/notificationTray/observers/getNotificationTrayItems/NotificationTrayItemsQuerystreamController.ts +68 -0
- package/src/notificationTray/observers/getNotificationTrayItems.ts +44 -0
- package/src/notificationTray/observers/getNotificationTraySeen.ts +60 -0
- package/src/notificationTray/observers/index.ts +2 -0
- package/src/notificationTray/utils/prepareNotificationTrayItemsPayload.ts +12 -0
- package/src/utils/linkedObject/index.ts +2 -0
- package/src/utils/linkedObject/notificationTrayLinkedObject.ts +19 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api/activeClient';
|
|
2
|
+
import { createEventSubscriber } from '~/core/events';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* ```js
|
|
6
|
+
* import { onNotificationTraySeenUpdated } from '@amityco/ts-sdk'
|
|
7
|
+
* const dispose = onNotificationTraySeenUpdated(data => {
|
|
8
|
+
* // ...
|
|
9
|
+
* })
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* Fired when an {@link Amity.NotificationTraySeen} has been updated
|
|
13
|
+
*
|
|
14
|
+
* @param callback The function to call when the event was fired
|
|
15
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
16
|
+
*
|
|
17
|
+
* @category NotificationTraySeen Events
|
|
18
|
+
*/
|
|
19
|
+
export const onNotificationTraySeenUpdated = (
|
|
20
|
+
callback: Amity.Listener<Amity.InternalNotificationTraySeen>,
|
|
21
|
+
): Amity.Unsubscriber => {
|
|
22
|
+
const client = getActiveClient();
|
|
23
|
+
|
|
24
|
+
const disposers = [
|
|
25
|
+
createEventSubscriber(
|
|
26
|
+
client,
|
|
27
|
+
'onNotificationTraySeenUpdated',
|
|
28
|
+
'local.notificationTraySeen.updated',
|
|
29
|
+
payload => callback(payload),
|
|
30
|
+
),
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
return () => {
|
|
34
|
+
disposers.forEach(fn => fn());
|
|
35
|
+
};
|
|
36
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api/activeClient';
|
|
2
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
3
|
+
|
|
4
|
+
/* begin_public_function
|
|
5
|
+
id: notificationTray.getNotificationTraySeen
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* ```js
|
|
9
|
+
* import { notificationTray } from '@amityco/ts-sdk'
|
|
10
|
+
* const notificationTraySeen = await notificationTray.getNotificationTraySeen()
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
*
|
|
14
|
+
* @returns A page of {@link Amity.NotificationTraySeen} objects
|
|
15
|
+
*
|
|
16
|
+
* @category NotificationTray API
|
|
17
|
+
* @async
|
|
18
|
+
* */
|
|
19
|
+
export const getNotificationTraySeen = async (): Promise<
|
|
20
|
+
Amity.Cached<Amity.InternalNotificationTraySeen>
|
|
21
|
+
> => {
|
|
22
|
+
const client = getActiveClient();
|
|
23
|
+
client.log('notificationTray/getNotificationTraySeen', {});
|
|
24
|
+
|
|
25
|
+
const { data: payload } = await client.http.get<Amity.NotificationTraySeenPayload>(
|
|
26
|
+
`api/v1/notification-tray/tray/seen`,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const cachedAt = client.cache && Date.now();
|
|
30
|
+
|
|
31
|
+
if (client.cache) {
|
|
32
|
+
const cacheKey = ['notificationTraySeen', 'get', client.userId];
|
|
33
|
+
pushToCache(cacheKey, {
|
|
34
|
+
userId: client.userId,
|
|
35
|
+
lastTraySeenAt: payload.lastTraySeenAt,
|
|
36
|
+
lastTrayOccuredAt: payload.lastTrayOccurredAt,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
data: {
|
|
42
|
+
userId: client.userId!,
|
|
43
|
+
lastTraySeenAt: payload.lastTraySeenAt,
|
|
44
|
+
lastTrayOccurredAt: payload.lastTrayOccurredAt,
|
|
45
|
+
isSeen: payload.lastTraySeenAt > payload.lastTrayOccurredAt,
|
|
46
|
+
},
|
|
47
|
+
cachedAt,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
/* end_public_function */
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* ```js
|
|
54
|
+
* import { notificationTray } from '@amityco/ts-sdk'
|
|
55
|
+
* const notificationTraySeen = await notificationTray.getNotificationTraySeen.locally()
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* Queries a paginable list of {@link Amity.NotificationTraySeen} objects from cache
|
|
59
|
+
*
|
|
60
|
+
* @returns A page of {@link Amity.NotificationTraySeen} objects
|
|
61
|
+
*
|
|
62
|
+
* @category NotificationTray API
|
|
63
|
+
* @async
|
|
64
|
+
* */
|
|
65
|
+
getNotificationTraySeen.locally = ():
|
|
66
|
+
| Amity.Cached<Amity.InternalNotificationTraySeen>
|
|
67
|
+
| undefined => {
|
|
68
|
+
const client = getActiveClient();
|
|
69
|
+
client.log('notificationTray/getNotificationTraySeen.locally', {});
|
|
70
|
+
|
|
71
|
+
if (!client.cache) return;
|
|
72
|
+
|
|
73
|
+
const queryKey = ['notificationTraySeen', 'get'];
|
|
74
|
+
|
|
75
|
+
const { data, cachedAt } = pullFromCache<Amity.InternalNotificationTraySeen>(queryKey) ?? {};
|
|
76
|
+
|
|
77
|
+
if (!data) return;
|
|
78
|
+
|
|
79
|
+
return { data, cachedAt };
|
|
80
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import hash from 'object-hash';
|
|
2
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
3
|
+
import { NotificationTrayItemsPaginationController } from './NotificationTrayItemsPaginationController';
|
|
4
|
+
import { NotificationTrayItemsQuerystreamController } from './NotificationTrayItemsQuerystreamController';
|
|
5
|
+
import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
|
|
6
|
+
import { prepareNotificationTrayItemsPayload } from '~/notificationTray/utils/prepareNotificationTrayItemsPayload';
|
|
7
|
+
import { isNonNullable } from '~/utils';
|
|
8
|
+
import { LinkedObject } from '~/utils/linkedObject';
|
|
9
|
+
|
|
10
|
+
export class NotificationTrayItemsLiveCollectionController extends LiveCollectionController<
|
|
11
|
+
'notificationTrayItem',
|
|
12
|
+
Amity.NotificationTrayItemLiveCollection,
|
|
13
|
+
Amity.NotificationTrayItem,
|
|
14
|
+
NotificationTrayItemsPaginationController
|
|
15
|
+
> {
|
|
16
|
+
private queryStreamController: NotificationTrayItemsQuerystreamController;
|
|
17
|
+
|
|
18
|
+
private query: Amity.NotificationTrayItemLiveCollection;
|
|
19
|
+
|
|
20
|
+
constructor(
|
|
21
|
+
query: Amity.NotificationTrayItemLiveCollection,
|
|
22
|
+
callback: Amity.LiveCollectionCallback<Amity.NotificationTrayItem>,
|
|
23
|
+
) {
|
|
24
|
+
const queryStreamId = hash(query);
|
|
25
|
+
const cacheKey = ['notificationTrayItem', 'collection', queryStreamId];
|
|
26
|
+
const paginationController = new NotificationTrayItemsPaginationController(query);
|
|
27
|
+
|
|
28
|
+
super(paginationController, queryStreamId, cacheKey, callback);
|
|
29
|
+
|
|
30
|
+
this.query = query;
|
|
31
|
+
this.queryStreamController = new NotificationTrayItemsQuerystreamController(
|
|
32
|
+
this.query,
|
|
33
|
+
this.cacheKey,
|
|
34
|
+
this.notifyChange.bind(this),
|
|
35
|
+
prepareNotificationTrayItemsPayload,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
this.callback = callback.bind(this);
|
|
39
|
+
this.loadPage({ initial: true });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected setup() {
|
|
43
|
+
const collection = pullFromCache<Amity.NotificationTrayItemLiveCollectionCache>(
|
|
44
|
+
this.cacheKey,
|
|
45
|
+
)?.data;
|
|
46
|
+
if (!collection) {
|
|
47
|
+
pushToCache(this.cacheKey, {
|
|
48
|
+
data: [],
|
|
49
|
+
params: {},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected async persistModel(queryPayload: Amity.NotificationTrayPayload & Amity.Pagination) {
|
|
55
|
+
await this.queryStreamController.saveToMainDB(queryPayload);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
protected persistQueryStream({
|
|
59
|
+
response,
|
|
60
|
+
direction,
|
|
61
|
+
refresh,
|
|
62
|
+
}: Amity.LiveCollectionPersistQueryStreamParams<'notificationTrayItem'>) {
|
|
63
|
+
this.queryStreamController.appendToQueryStream(response, direction, refresh);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// eslint-disable-next-line class-methods-use-this
|
|
67
|
+
startSubscription() {
|
|
68
|
+
return [] as Amity.Unsubscriber[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
|
|
72
|
+
const collection = pullFromCache<Amity.NotificationTrayItemLiveCollectionCache>(
|
|
73
|
+
this.cacheKey,
|
|
74
|
+
)?.data;
|
|
75
|
+
if (!collection) return;
|
|
76
|
+
|
|
77
|
+
const data = (
|
|
78
|
+
collection.data
|
|
79
|
+
.map(id =>
|
|
80
|
+
pullFromCache<Amity.InternalNotificationTrayItem>(['notificationTrayItem', 'get', id]),
|
|
81
|
+
)
|
|
82
|
+
.filter(isNonNullable)
|
|
83
|
+
.map(({ data }) => data) ?? []
|
|
84
|
+
).map(LinkedObject.notificationTray);
|
|
85
|
+
|
|
86
|
+
if (!this.shouldNotify(data) && origin === 'event') return;
|
|
87
|
+
|
|
88
|
+
this.callback({
|
|
89
|
+
onNextPage: () => this.loadPage({ direction: Amity.LiveCollectionPageDirection.NEXT }),
|
|
90
|
+
data,
|
|
91
|
+
hasNextPage: !!this.paginationController.getNextToken(),
|
|
92
|
+
loading,
|
|
93
|
+
error,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PaginationController } from '~/core/liveCollection/PaginationController';
|
|
2
|
+
import { COLLECTION_DEFAULT_PAGINATION_LIMIT } from '~/utils/constants';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* TODO: handle cache receive cache option, and cache policy
|
|
6
|
+
* TODO: check if querybyIds is supported
|
|
7
|
+
*/
|
|
8
|
+
export class NotificationTrayItemsPaginationController extends PaginationController<
|
|
9
|
+
'notificationTrayItem',
|
|
10
|
+
Amity.NotificationTrayItemLiveCollection
|
|
11
|
+
> {
|
|
12
|
+
async getRequest(
|
|
13
|
+
queryParams: Amity.NotificationTrayItemLiveCollection,
|
|
14
|
+
token: string | undefined,
|
|
15
|
+
) {
|
|
16
|
+
const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT, ...params } = queryParams;
|
|
17
|
+
|
|
18
|
+
const options = token ? { token } : { limit };
|
|
19
|
+
|
|
20
|
+
const { data: queryResponse } = await this.http.get<
|
|
21
|
+
Amity.NotificationTrayPayload & Amity.Pagination
|
|
22
|
+
>(`/api/v1/notification-tray`, {
|
|
23
|
+
params: {
|
|
24
|
+
...params,
|
|
25
|
+
options,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return queryResponse;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
|
|
2
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
3
|
+
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
4
|
+
import { getResolver } from '~/core/model';
|
|
5
|
+
import { getActiveClient } from '~/client';
|
|
6
|
+
|
|
7
|
+
export class NotificationTrayItemsQuerystreamController extends QueryStreamController<
|
|
8
|
+
Amity.NotificationTrayPayload,
|
|
9
|
+
Amity.NotificationTrayItemLiveCollection
|
|
10
|
+
> {
|
|
11
|
+
private notifyChange: (params: Amity.LiveCollectionNotifyParams) => void;
|
|
12
|
+
|
|
13
|
+
private preparePayload: (
|
|
14
|
+
response: Amity.NotificationTrayPayload,
|
|
15
|
+
) => Amity.ProcessedNotificationTrayPayload;
|
|
16
|
+
|
|
17
|
+
constructor(
|
|
18
|
+
query: Amity.NotificationTrayItemLiveCollection,
|
|
19
|
+
cacheKey: string[],
|
|
20
|
+
notifyChange: (params: Amity.LiveCollectionNotifyParams) => void,
|
|
21
|
+
preparePayload: (
|
|
22
|
+
response: Amity.NotificationTrayPayload,
|
|
23
|
+
) => Amity.ProcessedNotificationTrayPayload,
|
|
24
|
+
) {
|
|
25
|
+
super(query, cacheKey);
|
|
26
|
+
this.notifyChange = notifyChange;
|
|
27
|
+
this.preparePayload = preparePayload;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async saveToMainDB(response: Amity.NotificationTrayPayload) {
|
|
31
|
+
const processedPayload = await this.preparePayload(response);
|
|
32
|
+
|
|
33
|
+
const client = getActiveClient();
|
|
34
|
+
const cachedAt = client.cache && Date.now();
|
|
35
|
+
|
|
36
|
+
if (client.cache) {
|
|
37
|
+
ingestInCache(processedPayload, { cachedAt });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
appendToQueryStream(
|
|
42
|
+
response: Amity.NotificationTrayPayload & Partial<Amity.Pagination>,
|
|
43
|
+
direction: Amity.LiveCollectionPageDirection,
|
|
44
|
+
refresh = false,
|
|
45
|
+
) {
|
|
46
|
+
if (refresh) {
|
|
47
|
+
pushToCache(this.cacheKey, {
|
|
48
|
+
data: response.notificationTrayItems.map(getResolver('notificationTrayItem')),
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
const collection = pullFromCache<Amity.NotificationTrayItemLiveCollectionCache>(
|
|
52
|
+
this.cacheKey,
|
|
53
|
+
)?.data;
|
|
54
|
+
|
|
55
|
+
const notifications = collection?.data ?? [];
|
|
56
|
+
|
|
57
|
+
pushToCache(this.cacheKey, {
|
|
58
|
+
...collection,
|
|
59
|
+
data: [
|
|
60
|
+
...new Set([
|
|
61
|
+
...notifications,
|
|
62
|
+
...response.notificationTrayItems.map(getResolver('notificationTrayItem')),
|
|
63
|
+
]),
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api';
|
|
2
|
+
import { dropFromCache } from '~/cache/api';
|
|
3
|
+
import { ENABLE_CACHE_MESSAGE } from '~/utils/constants';
|
|
4
|
+
import { NotificationTrayItemsLiveCollectionController } from './getNotificationTrayItems/NotificationTrayItemsLiveCollectionController';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Get notification tray items for a notification tray page
|
|
8
|
+
*
|
|
9
|
+
* @param params the limit query parameters
|
|
10
|
+
* @param callback the callback to be called when the notification tray items are updated
|
|
11
|
+
* @returns items in the notification tray
|
|
12
|
+
*
|
|
13
|
+
* @category Notification tray items Live Collection
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
16
|
+
export const getNotificationTrayItems = (
|
|
17
|
+
params: Amity.LiveCollectionParams<Amity.NotificationTrayItemLiveCollection>,
|
|
18
|
+
callback: Amity.LiveCollectionCallback<Amity.NotificationTrayItem>,
|
|
19
|
+
config?: Amity.LiveCollectionConfig,
|
|
20
|
+
) => {
|
|
21
|
+
const { log, cache } = getActiveClient();
|
|
22
|
+
|
|
23
|
+
if (!cache) {
|
|
24
|
+
console.log(ENABLE_CACHE_MESSAGE);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const timestamp = Date.now();
|
|
28
|
+
log(`getNotificationTrayItems(tmpid: ${timestamp}) > listen`);
|
|
29
|
+
|
|
30
|
+
const notiTrayItemsLiveCollection = new NotificationTrayItemsLiveCollectionController(
|
|
31
|
+
params,
|
|
32
|
+
callback,
|
|
33
|
+
);
|
|
34
|
+
const disposers = notiTrayItemsLiveCollection.startSubscription();
|
|
35
|
+
|
|
36
|
+
const cacheKey = notiTrayItemsLiveCollection.getCacheKey();
|
|
37
|
+
|
|
38
|
+
disposers.push(() => dropFromCache(cacheKey));
|
|
39
|
+
|
|
40
|
+
return () => {
|
|
41
|
+
log(`getNotificationTrayItems(tmpid: ${timestamp}) > dispose`);
|
|
42
|
+
disposers.forEach(fn => fn());
|
|
43
|
+
};
|
|
44
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { liveObject } from '~/utils/liveObject';
|
|
2
|
+
import { getNotificationTraySeen as _getNotificationTraySeen } from '../internalApi/getNotificationTraySeen';
|
|
3
|
+
import { onNotificationTraySeenUpdated } from '../events/onNotificationTraySeenUpdated';
|
|
4
|
+
import { getActiveUser } from '~/client';
|
|
5
|
+
import { convertDateStringToTimestamp } from '~/utils/dateTime';
|
|
6
|
+
|
|
7
|
+
/* begin_public_function
|
|
8
|
+
id: notificationTray.getNotificationTraySeen
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* ```js
|
|
12
|
+
* import { notificationTray } from '@amityco/ts-sdk';
|
|
13
|
+
*
|
|
14
|
+
* let notificationTraySeen;
|
|
15
|
+
*
|
|
16
|
+
* const unsubscribe = getNotificationTraySeen(response => {
|
|
17
|
+
* notificationTraySeen = response.data;
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Observe all mutation on a given {@link Amity.NotificationTraySeen}
|
|
22
|
+
*
|
|
23
|
+
* @param callback the function to call when new data are available
|
|
24
|
+
* @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the message
|
|
25
|
+
*
|
|
26
|
+
* @category NotificationTraySeen Live Object
|
|
27
|
+
*/
|
|
28
|
+
export const getNotificationTraySeen = (
|
|
29
|
+
callback: Amity.LiveObjectCallback<Amity.NotificationTraySeen>,
|
|
30
|
+
): Amity.Unsubscriber => {
|
|
31
|
+
const { userId } = getActiveUser();
|
|
32
|
+
return liveObject(
|
|
33
|
+
userId,
|
|
34
|
+
callback,
|
|
35
|
+
'userId',
|
|
36
|
+
_getNotificationTraySeen,
|
|
37
|
+
[onNotificationTraySeenUpdated],
|
|
38
|
+
{
|
|
39
|
+
callbackDataSelector: (data: Amity.InternalNotificationTraySeen) => {
|
|
40
|
+
let isSeen = true;
|
|
41
|
+
|
|
42
|
+
if (data?.lastTrayOccurredAt) {
|
|
43
|
+
if (!data.lastTraySeenAt) {
|
|
44
|
+
isSeen = false;
|
|
45
|
+
} else {
|
|
46
|
+
isSeen =
|
|
47
|
+
convertDateStringToTimestamp(data.lastTraySeenAt) >
|
|
48
|
+
convertDateStringToTimestamp(data.lastTrayOccurredAt);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
lastTrayOccurredAt: data?.lastTrayOccurredAt,
|
|
53
|
+
lastTraySeenAt: data?.lastTraySeenAt,
|
|
54
|
+
isSeen,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
/* end_public_function */
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { convertRawUserToInternalUser } from '~/userRepository/utils/convertRawUserToInternalUser';
|
|
2
|
+
|
|
3
|
+
export const prepareNotificationTrayItemsPayload = (
|
|
4
|
+
rawPayload: Amity.NotificationTrayPayload,
|
|
5
|
+
): Amity.ProcessedNotificationTrayPayload => {
|
|
6
|
+
const users = rawPayload.users.map(convertRawUserToInternalUser);
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
...rawPayload,
|
|
10
|
+
users,
|
|
11
|
+
};
|
|
12
|
+
};
|
|
@@ -10,6 +10,7 @@ import { reactorLinkedObject } from './reactorLinkedObject';
|
|
|
10
10
|
import { channelLinkedObject } from './channelLinkedObject';
|
|
11
11
|
import { adLinkedObject } from './adLinkedObject';
|
|
12
12
|
import { pinnedPostLinkedObject } from './pinnedPostLinkedObject';
|
|
13
|
+
import { notificationTrayLinkedObject } from './notificationTrayLinkedObject';
|
|
13
14
|
|
|
14
15
|
export const LinkedObject = {
|
|
15
16
|
ad: adLinkedObject,
|
|
@@ -24,4 +25,5 @@ export const LinkedObject = {
|
|
|
24
25
|
reactor: reactorLinkedObject,
|
|
25
26
|
channel: channelLinkedObject,
|
|
26
27
|
pinnedPost: pinnedPostLinkedObject,
|
|
28
|
+
notificationTray: notificationTrayLinkedObject,
|
|
27
29
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { pullFromCache } from '~/cache/api';
|
|
2
|
+
import { isNonNullable } from '..';
|
|
3
|
+
import { WEEK } from '../constants';
|
|
4
|
+
import { userLinkedObject } from './userLinkedObject';
|
|
5
|
+
|
|
6
|
+
export const notificationTrayLinkedObject = (
|
|
7
|
+
noti: Amity.InternalNotificationTrayItem,
|
|
8
|
+
): Amity.NotificationTrayItem => {
|
|
9
|
+
return {
|
|
10
|
+
...noti,
|
|
11
|
+
isSeen: noti.lastSeenAt > noti.lastOccurredAt,
|
|
12
|
+
isRecent: new Date(noti.lastOccurredAt).getTime() >= Date.now() - WEEK,
|
|
13
|
+
users: noti.actors
|
|
14
|
+
.map(({ publicId }) => pullFromCache<Amity.InternalUser>(['user', 'get', publicId])!)
|
|
15
|
+
.filter(isNonNullable)
|
|
16
|
+
.map(({ data }) => data)
|
|
17
|
+
.map(user => userLinkedObject(user)),
|
|
18
|
+
};
|
|
19
|
+
};
|