@stream-io/feeds-client 0.2.1 → 0.2.3
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/@react-bindings/hooks/feed-state-hooks/index.ts +4 -0
- package/CHANGELOG.md +16 -0
- package/dist/@react-bindings/contexts/StreamSearchContext.d.ts +1 -1
- package/dist/@react-bindings/contexts/StreamSearchResultsContext.d.ts +1 -1
- package/dist/@react-bindings/hooks/feed-state-hooks/index.d.ts +4 -0
- package/dist/@react-bindings/hooks/feed-state-hooks/useAggregatedActivities.d.ts +11 -0
- package/dist/@react-bindings/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -0
- package/dist/@react-bindings/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -0
- package/dist/@react-bindings/hooks/feed-state-hooks/useNotificationStatus.d.ts +13 -0
- package/dist/@react-bindings/hooks/search-state-hooks/useSearchQuery.d.ts +1 -1
- package/dist/@react-bindings/hooks/search-state-hooks/useSearchResult.d.ts +1 -1
- package/dist/@react-bindings/hooks/search-state-hooks/useSearchSources.d.ts +2 -2
- package/dist/@react-bindings/wrappers/StreamFeed.d.ts +1 -1
- package/dist/@react-bindings/wrappers/StreamSearch.d.ts +1 -1
- package/dist/@react-bindings/wrappers/StreamSearchResults.d.ts +1 -1
- package/dist/index-react-bindings.browser.cjs +178 -35
- package/dist/index-react-bindings.browser.cjs.map +1 -1
- package/dist/index-react-bindings.browser.js +175 -36
- package/dist/index-react-bindings.browser.js.map +1 -1
- package/dist/index-react-bindings.node.cjs +178 -35
- package/dist/index-react-bindings.node.cjs.map +1 -1
- package/dist/index-react-bindings.node.js +175 -36
- package/dist/index-react-bindings.node.js.map +1 -1
- package/dist/index.browser.cjs +328 -180
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +328 -181
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.node.cjs +328 -180
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +328 -181
- package/dist/index.node.js.map +1 -1
- package/dist/src/common/{ActivitySearchSource.d.ts → search/ActivitySearchSource.d.ts} +3 -3
- package/dist/src/common/{BaseSearchSource.d.ts → search/BaseSearchSource.d.ts} +41 -35
- package/dist/src/common/{FeedSearchSource.d.ts → search/FeedSearchSource.d.ts} +3 -3
- package/dist/src/common/{SearchController.d.ts → search/SearchController.d.ts} +1 -3
- package/dist/src/common/{UserSearchSource.d.ts → search/UserSearchSource.d.ts} +4 -4
- package/dist/src/common/search/index.d.ts +6 -0
- package/dist/src/common/search/types.d.ts +22 -0
- package/dist/src/common/types.d.ts +1 -0
- package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +5 -12
- package/dist/src/feed/event-handlers/activity/handle-activity-marked.d.ts +11 -0
- package/dist/src/feed/event-handlers/activity/index.d.ts +1 -0
- package/dist/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +8 -1
- package/dist/src/feed/feed.d.ts +2 -2
- package/dist/src/gen/models/index.d.ts +58 -26
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/index.ts +1 -5
- package/package.json +1 -1
- package/src/common/{ActivitySearchSource.ts → search/ActivitySearchSource.ts} +3 -3
- package/src/common/{BaseSearchSource.ts → search/BaseSearchSource.ts} +137 -69
- package/src/common/{FeedSearchSource.ts → search/FeedSearchSource.ts} +3 -3
- package/src/common/{SearchController.ts → search/SearchController.ts} +2 -7
- package/src/common/{UserSearchSource.ts → search/UserSearchSource.ts} +3 -3
- package/src/common/search/index.ts +6 -0
- package/src/common/search/types.ts +21 -0
- package/src/common/types.ts +2 -0
- package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +208 -0
- package/src/feed/event-handlers/activity/activity-utils.test.ts +2 -2
- package/src/feed/event-handlers/activity/handle-activity-added.test.ts +86 -0
- package/src/feed/event-handlers/activity/handle-activity-deleted.test.ts +117 -0
- package/src/feed/event-handlers/activity/handle-activity-deleted.ts +8 -4
- package/src/feed/event-handlers/activity/handle-activity-marked.ts +68 -0
- package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +15 -15
- package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +14 -14
- package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +4 -3
- package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +4 -4
- package/src/feed/event-handlers/activity/index.ts +2 -1
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +14 -14
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +14 -14
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +16 -16
- package/src/feed/event-handlers/comment/handle-comment-added.test.ts +147 -0
- package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +133 -0
- package/src/feed/event-handlers/comment/handle-comment-deleted.ts +24 -10
- package/src/feed/event-handlers/comment/handle-comment-reaction.test.ts +315 -0
- package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +131 -0
- package/src/feed/event-handlers/feed-member/handle-feed-member-added.test.ts +75 -0
- package/src/feed/event-handlers/feed-member/handle-feed-member-removed.test.ts +82 -0
- package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +19 -9
- package/src/feed/event-handlers/feed-member/handle-feed-member-updated.test.ts +84 -0
- package/src/feed/event-handlers/follow/handle-follow-created.test.ts +7 -7
- package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +2 -2
- package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +1 -1
- package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +120 -0
- package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +47 -3
- package/src/feed/feed.ts +4 -2
- package/src/gen/feeds/FeedsApi.ts +6 -0
- package/src/gen/model-decoders/decoders.ts +12 -0
- package/src/gen/models/index.ts +90 -34
- package/src/test-utils/response-generators.ts +230 -0
- package/dist/src/test-utils/index.d.ts +0 -1
- package/dist/src/test-utils/response-generators.d.ts +0 -54
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { Feed } from '../../../feed';
|
|
3
|
+
import { FeedsClient } from '../../../feeds-client';
|
|
4
|
+
import { handleFeedMemberUpdated } from './handle-feed-member-updated';
|
|
5
|
+
import {
|
|
6
|
+
generateFeedResponse,
|
|
7
|
+
generateFeedMemberUpdatedEvent,
|
|
8
|
+
generateFeedMemberResponse,
|
|
9
|
+
generateOwnUser,
|
|
10
|
+
getHumanId,
|
|
11
|
+
} from '../../../test-utils/response-generators';
|
|
12
|
+
|
|
13
|
+
describe(handleFeedMemberUpdated.name, () => {
|
|
14
|
+
let feed: Feed;
|
|
15
|
+
let client: FeedsClient;
|
|
16
|
+
let currentUserId: string;
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
client = new FeedsClient('mock-api-key');
|
|
20
|
+
currentUserId = getHumanId();
|
|
21
|
+
client.state.partialNext({
|
|
22
|
+
connected_user: generateOwnUser({ id: currentUserId }),
|
|
23
|
+
});
|
|
24
|
+
const feedResponse = generateFeedResponse({
|
|
25
|
+
id: 'main',
|
|
26
|
+
group_id: 'user',
|
|
27
|
+
created_by: { id: currentUserId },
|
|
28
|
+
});
|
|
29
|
+
feed = new Feed(
|
|
30
|
+
client,
|
|
31
|
+
feedResponse.group_id,
|
|
32
|
+
feedResponse.id,
|
|
33
|
+
feedResponse,
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('updates an existing member in members array', () => {
|
|
38
|
+
const member1 = generateFeedMemberResponse();
|
|
39
|
+
const member2 = generateFeedMemberResponse();
|
|
40
|
+
feed.state.partialNext({ members: [member1, member2] });
|
|
41
|
+
|
|
42
|
+
const event = generateFeedMemberUpdatedEvent({
|
|
43
|
+
member: { user: { id: member1.user.id }, role: 'admin' },
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
handleFeedMemberUpdated.call(feed, event);
|
|
47
|
+
|
|
48
|
+
const stateAfter = feed.currentState;
|
|
49
|
+
expect(stateAfter.members).toHaveLength(2);
|
|
50
|
+
expect(stateAfter.members?.[0]).toBe(event.member);
|
|
51
|
+
expect(stateAfter.members?.[1]).toBe(member2);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('does not modify members when target is not present', () => {
|
|
55
|
+
const existingMember = generateFeedMemberResponse();
|
|
56
|
+
feed.state.partialNext({ members: [existingMember] });
|
|
57
|
+
|
|
58
|
+
const event = generateFeedMemberUpdatedEvent();
|
|
59
|
+
|
|
60
|
+
const stateBefore = feed.currentState;
|
|
61
|
+
handleFeedMemberUpdated.call(feed, event);
|
|
62
|
+
|
|
63
|
+
const stateAfter = feed.currentState;
|
|
64
|
+
expect(stateAfter).toBe(stateBefore);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('sets own_membership when the updated member is the connected user', () => {
|
|
68
|
+
const event = generateFeedMemberUpdatedEvent({
|
|
69
|
+
member: {
|
|
70
|
+
user: { id: currentUserId },
|
|
71
|
+
role: 'owner',
|
|
72
|
+
status: 'member',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const stateBefore = feed.currentState;
|
|
77
|
+
expect(stateBefore.own_membership).toBeUndefined();
|
|
78
|
+
|
|
79
|
+
handleFeedMemberUpdated.call(feed, event);
|
|
80
|
+
|
|
81
|
+
const stateAfter = feed.currentState;
|
|
82
|
+
expect(stateAfter.own_membership).toBe(event.member);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -78,10 +78,10 @@ describe('handle-follow-created', () => {
|
|
|
78
78
|
|
|
79
79
|
expect(result.changed).toBe(true);
|
|
80
80
|
expect(result.data.following).toHaveLength(1);
|
|
81
|
-
expect(result.data.following?.[0]).
|
|
81
|
+
expect(result.data.following?.[0]).toBe(follow);
|
|
82
82
|
expect(result.data).toMatchObject(follow.source_feed);
|
|
83
83
|
expect(result.data.own_follows).toBeUndefined();
|
|
84
|
-
expect(result.data.following_count).
|
|
84
|
+
expect(result.data.following_count).toBe(1);
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
it('should handle when someone follows this feed', () => {
|
|
@@ -120,10 +120,10 @@ describe('handle-follow-created', () => {
|
|
|
120
120
|
|
|
121
121
|
expect(result.changed).toBe(true);
|
|
122
122
|
expect(result.data.followers).toHaveLength(1);
|
|
123
|
-
expect(result.data.followers?.[0]).
|
|
123
|
+
expect(result.data.followers?.[0]).toBe(follow);
|
|
124
124
|
expect(result.data).toMatchObject(follow.target_feed);
|
|
125
125
|
expect(result.data.own_follows).toBeUndefined();
|
|
126
|
-
expect(result.data.follower_count).
|
|
126
|
+
expect(result.data.follower_count).toBe(1);
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
it('should add to own_follows when connected user is the source', () => {
|
|
@@ -161,7 +161,7 @@ describe('handle-follow-created', () => {
|
|
|
161
161
|
|
|
162
162
|
expect(result.changed).toBe(true);
|
|
163
163
|
expect(result.data.own_follows).toHaveLength(1);
|
|
164
|
-
expect(result.data.own_follows?.[0]).
|
|
164
|
+
expect(result.data.own_follows?.[0]).toBe(follow);
|
|
165
165
|
});
|
|
166
166
|
|
|
167
167
|
it('should not update followers/following when they are undefined', () => {
|
|
@@ -243,8 +243,8 @@ describe('handle-follow-created', () => {
|
|
|
243
243
|
|
|
244
244
|
expect(result.changed).toBe(true);
|
|
245
245
|
expect(result.data.followers).toHaveLength(2);
|
|
246
|
-
expect(result.data.followers?.[0]).
|
|
247
|
-
expect(result.data.followers?.[1]).
|
|
246
|
+
expect(result.data.followers?.[0]).toBe(follow);
|
|
247
|
+
expect(result.data.followers?.[1]).toBe(existingFollow);
|
|
248
248
|
});
|
|
249
249
|
});
|
|
250
250
|
});
|
|
@@ -95,7 +95,7 @@ describe('handle-follow-deleted', () => {
|
|
|
95
95
|
|
|
96
96
|
expect(result.changed).toBe(true);
|
|
97
97
|
expect(result.data.followers).toHaveLength(0);
|
|
98
|
-
expect(result.data.own_follows).
|
|
98
|
+
expect(result.data.own_follows).toBe(currentState.own_follows);
|
|
99
99
|
expect(result.data).toMatchObject(follow.target_feed);
|
|
100
100
|
});
|
|
101
101
|
|
|
@@ -262,7 +262,7 @@ describe('handle-follow-deleted', () => {
|
|
|
262
262
|
|
|
263
263
|
expect(result.changed).toBe(true);
|
|
264
264
|
expect(result.data.following).toHaveLength(1);
|
|
265
|
-
expect(result.data.following?.[0]).
|
|
265
|
+
expect(result.data.following?.[0]).toBe(followToKeep);
|
|
266
266
|
});
|
|
267
267
|
});
|
|
268
268
|
});
|
|
@@ -148,7 +148,7 @@ describe(handleFollowUpdated.name, () => {
|
|
|
148
148
|
|
|
149
149
|
// State should not change
|
|
150
150
|
const stateAfter = feed.currentState;
|
|
151
|
-
expect(stateAfter).
|
|
151
|
+
expect(stateAfter).toBe(stateBefore);
|
|
152
152
|
});
|
|
153
153
|
|
|
154
154
|
it('allows update again after clearing stateUpdateQueue', () => {
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
NotificationFeedUpdatedEvent,
|
|
4
|
+
NotificationStatusResponse,
|
|
5
|
+
AggregatedActivityResponse,
|
|
6
|
+
} from '../../../gen/models';
|
|
7
|
+
import { updateNotificationFeedFromEvent } from './handle-notification-feed-updated';
|
|
8
|
+
|
|
9
|
+
const createMockNotificationFeedUpdatedEvent = (
|
|
10
|
+
overrides: Partial<NotificationFeedUpdatedEvent> = {},
|
|
11
|
+
): NotificationFeedUpdatedEvent => ({
|
|
12
|
+
created_at: new Date(),
|
|
13
|
+
fid: 'user:notification',
|
|
14
|
+
custom: {},
|
|
15
|
+
type: 'feeds.notification_feed.updated',
|
|
16
|
+
...overrides,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const createMockNotificationStatus = (
|
|
20
|
+
overrides: Partial<NotificationStatusResponse> = {},
|
|
21
|
+
): NotificationStatusResponse => ({
|
|
22
|
+
unread: 0,
|
|
23
|
+
unseen: 0,
|
|
24
|
+
...overrides,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const createMockAggregatedActivity = (
|
|
28
|
+
overrides: Partial<AggregatedActivityResponse> = {},
|
|
29
|
+
): AggregatedActivityResponse => ({
|
|
30
|
+
activity_count: 1,
|
|
31
|
+
created_at: new Date(),
|
|
32
|
+
group: 'test-group',
|
|
33
|
+
score: 1,
|
|
34
|
+
updated_at: new Date(),
|
|
35
|
+
user_count: 1,
|
|
36
|
+
activities: [],
|
|
37
|
+
...overrides,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe('notification-feed-utils', () => {
|
|
41
|
+
describe('updateNotificationFeedFromEvent', () => {
|
|
42
|
+
it('should return unchanged if event has no notification_status or aggregated_activities', () => {
|
|
43
|
+
const event = createMockNotificationFeedUpdatedEvent();
|
|
44
|
+
|
|
45
|
+
const result = updateNotificationFeedFromEvent(event);
|
|
46
|
+
|
|
47
|
+
expect(result.changed).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should update notification_status when event has notification_status', () => {
|
|
51
|
+
const notificationStatus = createMockNotificationStatus({
|
|
52
|
+
unread: 5,
|
|
53
|
+
unseen: 3,
|
|
54
|
+
read_activities: ['activity1', 'activity2'],
|
|
55
|
+
});
|
|
56
|
+
const event = createMockNotificationFeedUpdatedEvent({
|
|
57
|
+
notification_status: notificationStatus,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const result = updateNotificationFeedFromEvent(event);
|
|
61
|
+
|
|
62
|
+
expect(result.changed).toBe(true);
|
|
63
|
+
expect(result.data?.notification_status).toBe(notificationStatus);
|
|
64
|
+
expect(result.data?.aggregated_activities).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should update aggregated_activities when event has aggregated_activities', () => {
|
|
68
|
+
const aggregatedActivities = [
|
|
69
|
+
createMockAggregatedActivity({ group: 'group1' }),
|
|
70
|
+
createMockAggregatedActivity({ group: 'group2' }),
|
|
71
|
+
];
|
|
72
|
+
const event = createMockNotificationFeedUpdatedEvent({
|
|
73
|
+
aggregated_activities: aggregatedActivities,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const result = updateNotificationFeedFromEvent(event);
|
|
77
|
+
|
|
78
|
+
expect(result.changed).toBe(true);
|
|
79
|
+
expect(result.data?.aggregated_activities).toBe(aggregatedActivities);
|
|
80
|
+
expect(result.data?.notification_status).toBeUndefined();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should update both notification_status and aggregated_activities when event has both', () => {
|
|
84
|
+
const notificationStatus = createMockNotificationStatus({
|
|
85
|
+
unread: 2,
|
|
86
|
+
unseen: 1,
|
|
87
|
+
});
|
|
88
|
+
const aggregatedActivities = [
|
|
89
|
+
createMockAggregatedActivity({ group: 'group1' }),
|
|
90
|
+
];
|
|
91
|
+
const event = createMockNotificationFeedUpdatedEvent({
|
|
92
|
+
notification_status: notificationStatus,
|
|
93
|
+
aggregated_activities: aggregatedActivities,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const result = updateNotificationFeedFromEvent(event);
|
|
97
|
+
|
|
98
|
+
expect(result.changed).toBe(true);
|
|
99
|
+
expect(result.data?.notification_status).toBe(notificationStatus);
|
|
100
|
+
expect(result.data?.aggregated_activities).toBe(aggregatedActivities);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('should handle notification_status with all fields', () => {
|
|
104
|
+
const notificationStatus = createMockNotificationStatus({
|
|
105
|
+
unread: 10,
|
|
106
|
+
unseen: 5,
|
|
107
|
+
last_seen_at: new Date('2023-01-01'),
|
|
108
|
+
read_activities: ['activity1', 'activity2', 'activity3'],
|
|
109
|
+
});
|
|
110
|
+
const event = createMockNotificationFeedUpdatedEvent({
|
|
111
|
+
notification_status: notificationStatus,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const result = updateNotificationFeedFromEvent(event);
|
|
115
|
+
|
|
116
|
+
expect(result.changed).toBe(true);
|
|
117
|
+
expect(result.data?.notification_status).toBe(notificationStatus);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
@@ -1,10 +1,54 @@
|
|
|
1
1
|
import type { Feed } from '../../../feed';
|
|
2
|
-
import
|
|
2
|
+
import {
|
|
3
|
+
AggregatedActivityResponse,
|
|
4
|
+
NotificationFeedUpdatedEvent,
|
|
5
|
+
NotificationStatusResponse,
|
|
6
|
+
} from '../../../gen/models';
|
|
7
|
+
import type { EventPayload, UpdateStateResult } from '../../../types-internal';
|
|
8
|
+
|
|
9
|
+
export const updateNotificationFeedFromEvent = (
|
|
10
|
+
event: NotificationFeedUpdatedEvent,
|
|
11
|
+
): UpdateStateResult<{
|
|
12
|
+
data?: {
|
|
13
|
+
notification_status?: NotificationStatusResponse;
|
|
14
|
+
aggregated_activities?: AggregatedActivityResponse[];
|
|
15
|
+
};
|
|
16
|
+
}> => {
|
|
17
|
+
const updates: {
|
|
18
|
+
notification_status?: NotificationStatusResponse;
|
|
19
|
+
aggregated_activities?: AggregatedActivityResponse[];
|
|
20
|
+
} = {};
|
|
21
|
+
|
|
22
|
+
if (event.notification_status) {
|
|
23
|
+
updates.notification_status = event.notification_status;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (event.aggregated_activities) {
|
|
27
|
+
updates.aggregated_activities = event.aggregated_activities;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Only return changed if we have actual updates
|
|
31
|
+
if (Object.keys(updates).length > 0) {
|
|
32
|
+
return {
|
|
33
|
+
changed: true,
|
|
34
|
+
data: updates,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
changed: false,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
3
42
|
|
|
4
43
|
export function handleNotificationFeedUpdated(
|
|
5
44
|
this: Feed,
|
|
6
45
|
event: EventPayload<'feeds.notification_feed.updated'>,
|
|
7
46
|
) {
|
|
8
|
-
|
|
9
|
-
|
|
47
|
+
const result = updateNotificationFeedFromEvent(event);
|
|
48
|
+
if (result.changed) {
|
|
49
|
+
this.state.partialNext({
|
|
50
|
+
notification_status: result.data?.notification_status,
|
|
51
|
+
aggregated_activities: result.data?.aggregated_activities,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
10
54
|
}
|
package/src/feed/feed.ts
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
SortParamRequest,
|
|
13
13
|
ThreadedCommentResponse,
|
|
14
14
|
FollowRequest,
|
|
15
|
+
QueryCommentsRequest,
|
|
15
16
|
} from '../gen/models';
|
|
16
17
|
import { StreamResponse } from '../gen-imports';
|
|
17
18
|
import { StateStore } from '../common/StateStore';
|
|
@@ -41,6 +42,7 @@ import {
|
|
|
41
42
|
handleActivityReactionAdded,
|
|
42
43
|
handleFeedUpdated,
|
|
43
44
|
handleNotificationFeedUpdated,
|
|
45
|
+
handleActivityMarked,
|
|
44
46
|
} from './event-handlers';
|
|
45
47
|
import { capitalize } from '../common/utils';
|
|
46
48
|
import type {
|
|
@@ -70,7 +72,7 @@ export type FeedState = Omit<
|
|
|
70
72
|
| {
|
|
71
73
|
pagination?: PagerResponseWithLoadingStates & {
|
|
72
74
|
// registered on first pagination attempt and then used for real-time updates & subsequent pagination calls
|
|
73
|
-
sort?: string;
|
|
75
|
+
sort?: QueryCommentsRequest['sort'] | (string & {});
|
|
74
76
|
};
|
|
75
77
|
/**
|
|
76
78
|
* Id of the "store" where the actual parent is stored in the comments array.
|
|
@@ -180,7 +182,7 @@ export class Feed extends FeedApi {
|
|
|
180
182
|
'feeds.poll.vote_removed': Feed.noop,
|
|
181
183
|
'feeds.activity.pinned': Feed.noop,
|
|
182
184
|
'feeds.activity.unpinned': Feed.noop,
|
|
183
|
-
'feeds.activity.marked':
|
|
185
|
+
'feeds.activity.marked': handleActivityMarked.bind(this),
|
|
184
186
|
'moderation.custom_action': Feed.noop,
|
|
185
187
|
'moderation.flagged': Feed.noop,
|
|
186
188
|
'moderation.mark_reviewed': Feed.noop,
|
|
@@ -578,6 +578,7 @@ export class FeedsApi {
|
|
|
578
578
|
const body = {
|
|
579
579
|
type: request?.type,
|
|
580
580
|
create_notification_activity: request?.create_notification_activity,
|
|
581
|
+
skip_push: request?.skip_push,
|
|
581
582
|
custom: request?.custom,
|
|
582
583
|
};
|
|
583
584
|
|
|
@@ -888,6 +889,7 @@ export class FeedsApi {
|
|
|
888
889
|
object_type: request?.object_type,
|
|
889
890
|
create_notification_activity: request?.create_notification_activity,
|
|
890
891
|
parent_id: request?.parent_id,
|
|
892
|
+
skip_push: request?.skip_push,
|
|
891
893
|
attachments: request?.attachments,
|
|
892
894
|
mentioned_user_ids: request?.mentioned_user_ids,
|
|
893
895
|
custom: request?.custom,
|
|
@@ -1003,6 +1005,7 @@ export class FeedsApi {
|
|
|
1003
1005
|
};
|
|
1004
1006
|
const body = {
|
|
1005
1007
|
comment: request?.comment,
|
|
1008
|
+
skip_push: request?.skip_push,
|
|
1006
1009
|
custom: request?.custom,
|
|
1007
1010
|
};
|
|
1008
1011
|
|
|
@@ -1031,6 +1034,7 @@ export class FeedsApi {
|
|
|
1031
1034
|
const body = {
|
|
1032
1035
|
type: request?.type,
|
|
1033
1036
|
create_notification_activity: request?.create_notification_activity,
|
|
1037
|
+
skip_push: request?.skip_push,
|
|
1034
1038
|
custom: request?.custom,
|
|
1035
1039
|
};
|
|
1036
1040
|
|
|
@@ -1554,6 +1558,7 @@ export class FeedsApi {
|
|
|
1554
1558
|
create_notification_activity: request?.create_notification_activity,
|
|
1555
1559
|
follower_role: request?.follower_role,
|
|
1556
1560
|
push_preference: request?.push_preference,
|
|
1561
|
+
skip_push: request?.skip_push,
|
|
1557
1562
|
custom: request?.custom,
|
|
1558
1563
|
};
|
|
1559
1564
|
|
|
@@ -1581,6 +1586,7 @@ export class FeedsApi {
|
|
|
1581
1586
|
target: request?.target,
|
|
1582
1587
|
create_notification_activity: request?.create_notification_activity,
|
|
1583
1588
|
push_preference: request?.push_preference,
|
|
1589
|
+
skip_push: request?.skip_push,
|
|
1584
1590
|
custom: request?.custom,
|
|
1585
1591
|
};
|
|
1586
1592
|
|
|
@@ -584,6 +584,8 @@ decoders.CommentAddedEvent = (input?: Record<string, any>) => {
|
|
|
584
584
|
const typeMappings: TypeMapping = {
|
|
585
585
|
created_at: { type: 'DatetimeType', isSingle: true },
|
|
586
586
|
|
|
587
|
+
activity: { type: 'ActivityResponse', isSingle: true },
|
|
588
|
+
|
|
587
589
|
comment: { type: 'CommentResponse', isSingle: true },
|
|
588
590
|
|
|
589
591
|
received_at: { type: 'DatetimeType', isSingle: true },
|
|
@@ -606,6 +608,8 @@ decoders.CommentReactionAddedEvent = (input?: Record<string, any>) => {
|
|
|
606
608
|
const typeMappings: TypeMapping = {
|
|
607
609
|
created_at: { type: 'DatetimeType', isSingle: true },
|
|
608
610
|
|
|
611
|
+
activity: { type: 'ActivityResponse', isSingle: true },
|
|
612
|
+
|
|
609
613
|
comment: { type: 'CommentResponse', isSingle: true },
|
|
610
614
|
|
|
611
615
|
reaction: { type: 'FeedsReactionResponse', isSingle: true },
|
|
@@ -632,6 +636,8 @@ decoders.CommentReactionUpdatedEvent = (input?: Record<string, any>) => {
|
|
|
632
636
|
const typeMappings: TypeMapping = {
|
|
633
637
|
created_at: { type: 'DatetimeType', isSingle: true },
|
|
634
638
|
|
|
639
|
+
activity: { type: 'ActivityResponse', isSingle: true },
|
|
640
|
+
|
|
635
641
|
comment: { type: 'CommentResponse', isSingle: true },
|
|
636
642
|
|
|
637
643
|
reaction: { type: 'FeedsReactionResponse', isSingle: true },
|
|
@@ -1128,6 +1134,8 @@ decoders.Message = (input?: Record<string, any>) => {
|
|
|
1128
1134
|
|
|
1129
1135
|
thread_participants: { type: 'User', isSingle: false },
|
|
1130
1136
|
|
|
1137
|
+
member: { type: 'ChannelMember', isSingle: true },
|
|
1138
|
+
|
|
1131
1139
|
pinned_by: { type: 'User', isSingle: true },
|
|
1132
1140
|
|
|
1133
1141
|
poll: { type: 'Poll', isSingle: true },
|
|
@@ -1214,6 +1222,10 @@ decoders.ModerationCustomActionEvent = (input?: Record<string, any>) => {
|
|
|
1214
1222
|
|
|
1215
1223
|
decoders.ModerationFlagResponse = (input?: Record<string, any>) => {
|
|
1216
1224
|
const typeMappings: TypeMapping = {
|
|
1225
|
+
created_at: { type: 'DatetimeType', isSingle: true },
|
|
1226
|
+
|
|
1227
|
+
updated_at: { type: 'DatetimeType', isSingle: true },
|
|
1228
|
+
|
|
1217
1229
|
review_queue_item: { type: 'ReviewQueueItemResponse', isSingle: true },
|
|
1218
1230
|
|
|
1219
1231
|
user: { type: 'UserResponse', isSingle: true },
|