@stream-io/feeds-client 1.0.0 → 1.1.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/CHANGELOG.md +9 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-bindings.js +5 -19
- package/dist/cjs/react-bindings.js.map +1 -1
- package/dist/es/index.mjs +2 -2
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react-bindings.mjs +5 -19
- package/dist/es/react-bindings.mjs.map +1 -1
- package/dist/{feeds-client-tw63OGrd.js → feeds-client-C1c6lcS3.js} +529 -155
- package/dist/feeds-client-C1c6lcS3.js.map +1 -0
- package/dist/{feeds-client-B03y08Kq.mjs → feeds-client-jtUTE4AC.mjs} +529 -155
- package/dist/feeds-client-jtUTE4AC.mjs.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts +6 -2
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.d.ts.map +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts +6 -2
- package/dist/types/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-deleted.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts +5 -0
- package/dist/types/feed/event-handlers/activity/handle-activity-feedback.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-pinned.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -2
- package/dist/types/feed/event-handlers/activity/handle-activity-unpinned.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/index.d.ts +3 -1
- package/dist/types/feed/event-handlers/activity/index.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity-updater.d.ts +1 -0
- package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts +1 -1
- package/dist/types/feed/event-handlers/add-aggregated-activities-to-state.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +6 -5
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +6 -5
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +6 -5
- package/dist/types/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts +4 -0
- package/dist/types/feed/event-handlers/feed/handle-feed-deleted.d.ts.map +1 -0
- package/dist/types/feed/event-handlers/feed/handle-feed-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed/index.d.ts +1 -0
- package/dist/types/feed/event-handlers/feed/index.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts +3 -2
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts +3 -2
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-removed.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts +3 -2
- package/dist/types/feed/event-handlers/feed-member/handle-feed-member-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/follow/handle-follow-updated.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts +3 -2
- package/dist/types/feed/event-handlers/notification-feed/handle-notification-feed-updated.d.ts.map +1 -1
- package/dist/types/feed/feed.d.ts.map +1 -1
- package/dist/types/feeds-client/feeds-client.d.ts +24 -1
- package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
- package/dist/types/gen/feeds/FeedsApi.d.ts +6 -4
- package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
- package/dist/types/gen/models/index.d.ts +40 -2
- package/dist/types/gen/models/index.d.ts.map +1 -1
- package/dist/types/utils/state-update-queue.d.ts +11 -2
- package/dist/types/utils/state-update-queue.d.ts.map +1 -1
- package/dist/types/utils/unique-array-merge.d.ts +1 -1
- package/dist/types/utils/unique-array-merge.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivityRead.ts +6 -20
- package/src/bindings/react/hooks/feed-state-hooks/useIsAggregatedActivitySeen.ts +6 -20
- package/src/feed/event-handlers/activity/handle-activity-deleted.ts +28 -2
- package/src/feed/event-handlers/activity/handle-activity-feedback.ts +17 -7
- package/src/feed/event-handlers/activity/handle-activity-pinned.ts +25 -3
- package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +25 -2
- package/src/feed/event-handlers/activity/index.ts +3 -1
- package/src/feed/event-handlers/add-aggregated-activities-to-state.ts +11 -2
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +20 -11
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +21 -11
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +24 -10
- package/src/feed/event-handlers/feed/handle-feed-deleted.ts +12 -0
- package/src/feed/event-handlers/feed/handle-feed-updated.ts +8 -0
- package/src/feed/event-handlers/feed/index.ts +1 -0
- package/src/feed/event-handlers/feed-member/handle-feed-member-added.ts +25 -2
- package/src/feed/event-handlers/feed-member/handle-feed-member-removed.ts +25 -2
- package/src/feed/event-handlers/feed-member/handle-feed-member-updated.ts +25 -2
- package/src/feed/event-handlers/follow/handle-follow-updated.ts +14 -0
- package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts +68 -2
- package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts +1 -1
- package/src/feed/feed.ts +7 -5
- package/src/feeds-client/feeds-client.ts +255 -0
- package/src/gen/feeds/FeedsApi.ts +79 -12
- package/src/gen/model-decoders/decoders.ts +7 -0
- package/src/gen/models/index.ts +66 -4
- package/src/utils/state-update-queue.ts +42 -28
- package/src/utils/unique-array-merge.ts +11 -3
- package/dist/feeds-client-B03y08Kq.mjs.map +0 -1
- package/dist/feeds-client-tw63OGrd.js.map +0 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts +0 -12
- package/dist/types/feed/event-handlers/activity/handle-activity-marked.d.ts.map +0 -1
- package/src/feed/event-handlers/activity/handle-activity-marked.ts +0 -68
|
@@ -1,30 +1,16 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
2
|
-
|
|
3
|
-
import { useFeedContext } from '../../contexts/StreamFeedContext';
|
|
4
|
-
import { useNotificationStatus } from './useNotificationStatus';
|
|
5
1
|
import type { Feed } from '../../../../feed';
|
|
6
2
|
import type { AggregatedActivityResponse } from '../../../../gen/models';
|
|
7
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated use aggregatedActivity.is_seen instead
|
|
6
|
+
* @returns
|
|
7
|
+
*/
|
|
8
8
|
export const useIsAggregatedActivitySeen = ({
|
|
9
|
-
feed:
|
|
9
|
+
feed: _,
|
|
10
10
|
aggregatedActivity,
|
|
11
11
|
}: {
|
|
12
12
|
feed?: Feed;
|
|
13
13
|
aggregatedActivity: AggregatedActivityResponse;
|
|
14
14
|
}) => {
|
|
15
|
-
|
|
16
|
-
const feed = feedFromProps ?? feedFromContext;
|
|
17
|
-
|
|
18
|
-
const { seen_activities: seenActivities, last_seen_at: lastSeenAt } =
|
|
19
|
-
useNotificationStatus(feed) ?? {};
|
|
20
|
-
|
|
21
|
-
const group = aggregatedActivity.group;
|
|
22
|
-
|
|
23
|
-
return useMemo(
|
|
24
|
-
() =>
|
|
25
|
-
(lastSeenAt &&
|
|
26
|
-
aggregatedActivity.updated_at.getTime() < lastSeenAt.getTime()) ||
|
|
27
|
-
(seenActivities ?? []).includes(group),
|
|
28
|
-
[lastSeenAt, aggregatedActivity.updated_at, seenActivities, group],
|
|
29
|
-
);
|
|
15
|
+
return aggregatedActivity.is_seen;
|
|
30
16
|
};
|
|
@@ -3,7 +3,13 @@ import type {
|
|
|
3
3
|
ActivityPinResponse,
|
|
4
4
|
ActivityResponse,
|
|
5
5
|
} from '../../../gen/models';
|
|
6
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
EventPayload,
|
|
8
|
+
PartializeAllBut,
|
|
9
|
+
UpdateStateResult,
|
|
10
|
+
} from '../../../types-internal';
|
|
11
|
+
import { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';
|
|
12
|
+
import { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';
|
|
7
13
|
|
|
8
14
|
export function removeActivityFromState(
|
|
9
15
|
this: Feed,
|
|
@@ -45,10 +51,30 @@ export const removePinnedActivityFromState = (
|
|
|
45
51
|
}
|
|
46
52
|
};
|
|
47
53
|
|
|
54
|
+
export type ActivityDeletedPayload = PartializeAllBut<
|
|
55
|
+
EventPayload<'feeds.activity.deleted'>,
|
|
56
|
+
'activity'
|
|
57
|
+
>;
|
|
58
|
+
|
|
48
59
|
export function handleActivityDeleted(
|
|
49
60
|
this: Feed,
|
|
50
|
-
event:
|
|
61
|
+
event: ActivityDeletedPayload,
|
|
62
|
+
fromWs?: boolean,
|
|
51
63
|
) {
|
|
64
|
+
if (
|
|
65
|
+
!shouldUpdateState({
|
|
66
|
+
stateUpdateQueueId: getStateUpdateQueueId(event, 'activity-deleted'),
|
|
67
|
+
stateUpdateQueue: this.stateUpdateQueue,
|
|
68
|
+
watch: this.currentState.watch,
|
|
69
|
+
fromWs,
|
|
70
|
+
isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
|
|
71
|
+
this,
|
|
72
|
+
event,
|
|
73
|
+
),
|
|
74
|
+
})
|
|
75
|
+
) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
52
78
|
const {
|
|
53
79
|
activities: currentActivities,
|
|
54
80
|
pinned_activities: currentPinnedActivities,
|
|
@@ -2,12 +2,16 @@ import { updateEntityInArray } from '../../../utils';
|
|
|
2
2
|
import { isPin } from '../is-activity-pin';
|
|
3
3
|
import type { Feed } from '../../feed';
|
|
4
4
|
import type { EventPayload } from '../../../types-internal';
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
ActivityFeedbackEventPayload,
|
|
7
|
+
ActivityPinResponse,
|
|
8
|
+
ActivityResponse,
|
|
9
|
+
} from '../../../gen/models';
|
|
6
10
|
|
|
7
|
-
const updateActivityFromFeedback = <
|
|
11
|
+
export const updateActivityFromFeedback = <
|
|
8
12
|
T extends ActivityResponse | ActivityPinResponse,
|
|
9
13
|
>(
|
|
10
|
-
feedback: ActivityFeedbackEventPayload,
|
|
14
|
+
feedback: Pick<ActivityFeedbackEventPayload, 'activity_id' | 'value'>,
|
|
11
15
|
activities: T[] | undefined,
|
|
12
16
|
) => {
|
|
13
17
|
if (!activities) {
|
|
@@ -18,10 +22,16 @@ const updateActivityFromFeedback = <
|
|
|
18
22
|
}
|
|
19
23
|
return updateEntityInArray<T>({
|
|
20
24
|
entities: activities,
|
|
21
|
-
matcher: (e) =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
matcher: (e) => {
|
|
26
|
+
const newHidden = feedback.value === 'true';
|
|
27
|
+
if (isPin(e)) {
|
|
28
|
+
return (
|
|
29
|
+
e.activity.id === feedback.activity_id &&
|
|
30
|
+
e.activity.hidden !== newHidden
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return e.id === feedback.activity_id && e.hidden !== newHidden;
|
|
34
|
+
},
|
|
25
35
|
updater: (e) => {
|
|
26
36
|
if (isPin(e)) {
|
|
27
37
|
return {
|
|
@@ -1,11 +1,34 @@
|
|
|
1
1
|
import type { ActivityPinResponse } from '../../../gen/models';
|
|
2
|
-
import type { EventPayload } from '../../../types-internal';
|
|
2
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
3
3
|
import type { Feed } from '../../feed';
|
|
4
|
+
import { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';
|
|
5
|
+
import { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';
|
|
6
|
+
|
|
7
|
+
export type ActivityPinnedPayload = PartializeAllBut<
|
|
8
|
+
EventPayload<'feeds.activity.pinned'>,
|
|
9
|
+
'pinned_activity'
|
|
10
|
+
>;
|
|
4
11
|
|
|
5
12
|
export function handleActivityPinned(
|
|
6
13
|
this: Feed,
|
|
7
|
-
event:
|
|
14
|
+
event: ActivityPinnedPayload,
|
|
15
|
+
fromWs?: boolean,
|
|
8
16
|
) {
|
|
17
|
+
if (
|
|
18
|
+
!shouldUpdateState({
|
|
19
|
+
stateUpdateQueueId: getStateUpdateQueueId(event, 'activity-pinned'),
|
|
20
|
+
stateUpdateQueue: this.stateUpdateQueue,
|
|
21
|
+
watch: this.currentState.watch,
|
|
22
|
+
fromWs,
|
|
23
|
+
isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
|
|
24
|
+
this,
|
|
25
|
+
event,
|
|
26
|
+
),
|
|
27
|
+
})
|
|
28
|
+
) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
9
32
|
this.state.next((currentState) => {
|
|
10
33
|
const newState = {
|
|
11
34
|
...currentState,
|
|
@@ -17,7 +40,6 @@ export function handleActivityPinned(
|
|
|
17
40
|
const pinnedActivity: ActivityPinResponse = {
|
|
18
41
|
...event.pinned_activity,
|
|
19
42
|
user: event.user!,
|
|
20
|
-
feed: event.fid,
|
|
21
43
|
updated_at: new Date(),
|
|
22
44
|
};
|
|
23
45
|
|
|
@@ -1,10 +1,33 @@
|
|
|
1
|
-
import type { EventPayload } from '../../../types-internal';
|
|
1
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
2
2
|
import type { Feed, FeedState } from '../../feed';
|
|
3
|
+
import { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';
|
|
4
|
+
import { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';
|
|
5
|
+
|
|
6
|
+
export type ActivityUnpinnedPayload = PartializeAllBut<
|
|
7
|
+
EventPayload<'feeds.activity.unpinned'>,
|
|
8
|
+
'pinned_activity'
|
|
9
|
+
>;
|
|
3
10
|
|
|
4
11
|
export function handleActivityUnpinned(
|
|
5
12
|
this: Feed,
|
|
6
|
-
event:
|
|
13
|
+
event: ActivityUnpinnedPayload,
|
|
14
|
+
fromWs?: boolean,
|
|
7
15
|
) {
|
|
16
|
+
if (
|
|
17
|
+
!shouldUpdateState({
|
|
18
|
+
stateUpdateQueueId: getStateUpdateQueueId(event, 'activity-unpinned'),
|
|
19
|
+
stateUpdateQueue: this.stateUpdateQueue,
|
|
20
|
+
watch: this.currentState.watch,
|
|
21
|
+
fromWs,
|
|
22
|
+
isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
|
|
23
|
+
this,
|
|
24
|
+
event,
|
|
25
|
+
),
|
|
26
|
+
})
|
|
27
|
+
) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
this.state.next((currentState) => {
|
|
9
32
|
let newState: FeedState | undefined;
|
|
10
33
|
|
|
@@ -5,4 +5,6 @@ export * from './handle-activity-updated';
|
|
|
5
5
|
export * from './handle-activity-reaction-added';
|
|
6
6
|
export * from './handle-activity-reaction-deleted';
|
|
7
7
|
export * from './handle-activity-reaction-updated';
|
|
8
|
-
export * from './handle-activity-
|
|
8
|
+
export * from './handle-activity-pinned';
|
|
9
|
+
export * from './handle-activity-unpinned';
|
|
10
|
+
export * from './handle-activity-feedback';
|
|
@@ -6,7 +6,7 @@ import { updateActivity } from './activity-updater';
|
|
|
6
6
|
export const addAggregatedActivitiesToState = (
|
|
7
7
|
newAggregatedActivities: AggregatedActivityResponse[],
|
|
8
8
|
aggregatedActivities: AggregatedActivityResponse[] | undefined,
|
|
9
|
-
position: 'start' | 'end' | 'replace',
|
|
9
|
+
position: 'start' | 'end' | 'replace-then-end' | 'replace-then-start',
|
|
10
10
|
) => {
|
|
11
11
|
let result: UpdateStateResult<{
|
|
12
12
|
aggregated_activities: AggregatedActivityResponse[];
|
|
@@ -58,11 +58,20 @@ export const addAggregatedActivitiesToState = (
|
|
|
58
58
|
(a) => a.group,
|
|
59
59
|
);
|
|
60
60
|
break;
|
|
61
|
-
case 'replace':
|
|
61
|
+
case 'replace-then-end':
|
|
62
62
|
result.aggregated_activities = replaceUniqueArrayMerge(
|
|
63
63
|
aggregatedActivities ?? [],
|
|
64
64
|
newAggregatedActivities,
|
|
65
65
|
(a) => a.group,
|
|
66
|
+
'end',
|
|
67
|
+
);
|
|
68
|
+
break;
|
|
69
|
+
case 'replace-then-start':
|
|
70
|
+
result.aggregated_activities = replaceUniqueArrayMerge(
|
|
71
|
+
aggregatedActivities ?? [],
|
|
72
|
+
newAggregatedActivities,
|
|
73
|
+
(a) => a.group,
|
|
74
|
+
'start',
|
|
66
75
|
);
|
|
67
76
|
break;
|
|
68
77
|
}
|
|
@@ -2,10 +2,15 @@ import type { Feed } from '../../../feed';
|
|
|
2
2
|
import type {
|
|
3
3
|
ActivityPinResponse,
|
|
4
4
|
ActivityResponse,
|
|
5
|
-
BookmarkAddedEvent,
|
|
6
5
|
} from '../../../gen/models';
|
|
7
|
-
import type { EventPayload } from '../../../types-internal';
|
|
6
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
8
7
|
import { updateEntityInArray } from '../../../utils';
|
|
8
|
+
import { isSameBookmark } from './handle-bookmark-deleted';
|
|
9
|
+
|
|
10
|
+
export type BookmarkAddedPayload = PartializeAllBut<
|
|
11
|
+
EventPayload<'feeds.bookmark.added'>,
|
|
12
|
+
'bookmark'
|
|
13
|
+
>;
|
|
9
14
|
|
|
10
15
|
const sharedUpdateActivity = ({
|
|
11
16
|
currentActivity,
|
|
@@ -13,7 +18,7 @@ const sharedUpdateActivity = ({
|
|
|
13
18
|
eventBelongsToCurrentUser,
|
|
14
19
|
}: {
|
|
15
20
|
currentActivity: ActivityResponse;
|
|
16
|
-
event:
|
|
21
|
+
event: BookmarkAddedPayload;
|
|
17
22
|
eventBelongsToCurrentUser: boolean;
|
|
18
23
|
}): ActivityResponse => {
|
|
19
24
|
let newOwnBookmarks = currentActivity.own_bookmarks;
|
|
@@ -30,13 +35,16 @@ const sharedUpdateActivity = ({
|
|
|
30
35
|
};
|
|
31
36
|
|
|
32
37
|
export const addBookmarkToActivities = (
|
|
33
|
-
event:
|
|
38
|
+
event: BookmarkAddedPayload,
|
|
34
39
|
activities: ActivityResponse[] | undefined,
|
|
35
40
|
eventBelongsToCurrentUser: boolean,
|
|
36
41
|
) =>
|
|
37
42
|
updateEntityInArray({
|
|
38
43
|
entities: activities,
|
|
39
|
-
matcher: (activity) =>
|
|
44
|
+
matcher: (activity) =>
|
|
45
|
+
activity.id === event.bookmark.activity.id &&
|
|
46
|
+
(!eventBelongsToCurrentUser ||
|
|
47
|
+
!activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
|
|
40
48
|
updater: (matchedActivity) =>
|
|
41
49
|
sharedUpdateActivity({
|
|
42
50
|
currentActivity: matchedActivity,
|
|
@@ -46,14 +54,18 @@ export const addBookmarkToActivities = (
|
|
|
46
54
|
});
|
|
47
55
|
|
|
48
56
|
export const addBookmarkToPinnedActivities = (
|
|
49
|
-
event:
|
|
57
|
+
event: BookmarkAddedPayload,
|
|
50
58
|
pinnedActivities: ActivityPinResponse[] | undefined,
|
|
51
59
|
eventBelongsToCurrentUser: boolean,
|
|
52
60
|
) =>
|
|
53
61
|
updateEntityInArray({
|
|
54
62
|
entities: pinnedActivities,
|
|
55
63
|
matcher: (pinnedActivity) =>
|
|
56
|
-
pinnedActivity.activity.id === event.bookmark.activity.id
|
|
64
|
+
pinnedActivity.activity.id === event.bookmark.activity.id &&
|
|
65
|
+
(!eventBelongsToCurrentUser ||
|
|
66
|
+
!pinnedActivity.activity.own_bookmarks.some((b) =>
|
|
67
|
+
isSameBookmark(b, event.bookmark),
|
|
68
|
+
)),
|
|
57
69
|
updater: (matchedPinnedActivity) => {
|
|
58
70
|
const newActivity = sharedUpdateActivity({
|
|
59
71
|
currentActivity: matchedPinnedActivity.activity,
|
|
@@ -72,10 +84,7 @@ export const addBookmarkToPinnedActivities = (
|
|
|
72
84
|
},
|
|
73
85
|
});
|
|
74
86
|
|
|
75
|
-
export function handleBookmarkAdded(
|
|
76
|
-
this: Feed,
|
|
77
|
-
event: EventPayload<'feeds.bookmark.added'>,
|
|
78
|
-
) {
|
|
87
|
+
export function handleBookmarkAdded(this: Feed, event: BookmarkAddedPayload) {
|
|
79
88
|
const {
|
|
80
89
|
activities: currentActivities,
|
|
81
90
|
pinned_activities: currentPinnedActivities,
|
|
@@ -2,14 +2,16 @@ import type { Feed } from '../../../feed';
|
|
|
2
2
|
import type {
|
|
3
3
|
ActivityPinResponse,
|
|
4
4
|
ActivityResponse,
|
|
5
|
-
BookmarkDeletedEvent,
|
|
6
5
|
BookmarkResponse,
|
|
7
6
|
} from '../../../gen/models';
|
|
8
|
-
import type { EventPayload } from '../../../types-internal';
|
|
7
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
9
8
|
import { updateEntityInArray } from '../../../utils';
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
export type BookmarkDeletedPayload = PartializeAllBut<
|
|
11
|
+
EventPayload<'feeds.bookmark.deleted'>,
|
|
12
|
+
'bookmark'
|
|
13
|
+
>;
|
|
14
|
+
|
|
13
15
|
export const isSameBookmark = (
|
|
14
16
|
bookmark1: BookmarkResponse,
|
|
15
17
|
bookmark2: BookmarkResponse,
|
|
@@ -17,7 +19,8 @@ export const isSameBookmark = (
|
|
|
17
19
|
return (
|
|
18
20
|
bookmark1.user.id === bookmark2.user.id &&
|
|
19
21
|
bookmark1.activity.id === bookmark2.activity.id &&
|
|
20
|
-
bookmark1.folder?.id === bookmark2.folder?.id
|
|
22
|
+
bookmark1.folder?.id === bookmark2.folder?.id &&
|
|
23
|
+
bookmark1.updated_at.getTime() === bookmark2.updated_at.getTime()
|
|
21
24
|
);
|
|
22
25
|
};
|
|
23
26
|
|
|
@@ -27,7 +30,7 @@ const sharedUpdateActivity = ({
|
|
|
27
30
|
eventBelongsToCurrentUser,
|
|
28
31
|
}: {
|
|
29
32
|
currentActivity: ActivityResponse;
|
|
30
|
-
event:
|
|
33
|
+
event: BookmarkDeletedPayload;
|
|
31
34
|
eventBelongsToCurrentUser: boolean;
|
|
32
35
|
}): ActivityResponse => {
|
|
33
36
|
let newOwnBookmarks = currentActivity.own_bookmarks;
|
|
@@ -46,13 +49,16 @@ const sharedUpdateActivity = ({
|
|
|
46
49
|
};
|
|
47
50
|
|
|
48
51
|
export const removeBookmarkFromActivities = (
|
|
49
|
-
event:
|
|
52
|
+
event: BookmarkDeletedPayload,
|
|
50
53
|
activities: ActivityResponse[] | undefined,
|
|
51
54
|
eventBelongsToCurrentUser: boolean,
|
|
52
55
|
) =>
|
|
53
56
|
updateEntityInArray({
|
|
54
57
|
entities: activities,
|
|
55
|
-
matcher: (activity) =>
|
|
58
|
+
matcher: (activity) =>
|
|
59
|
+
activity.id === event.bookmark.activity.id &&
|
|
60
|
+
(!eventBelongsToCurrentUser ||
|
|
61
|
+
activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
|
|
56
62
|
updater: (matchedActivity) =>
|
|
57
63
|
sharedUpdateActivity({
|
|
58
64
|
currentActivity: matchedActivity,
|
|
@@ -62,14 +68,18 @@ export const removeBookmarkFromActivities = (
|
|
|
62
68
|
});
|
|
63
69
|
|
|
64
70
|
export const removeBookmarkFromPinnedActivities = (
|
|
65
|
-
event:
|
|
71
|
+
event: BookmarkDeletedPayload,
|
|
66
72
|
pinnedActivities: ActivityPinResponse[] | undefined,
|
|
67
73
|
eventBelongsToCurrentUser: boolean,
|
|
68
74
|
) =>
|
|
69
75
|
updateEntityInArray({
|
|
70
76
|
entities: pinnedActivities,
|
|
71
77
|
matcher: (pinnedActivity) =>
|
|
72
|
-
pinnedActivity.activity.id === event.bookmark.activity.id
|
|
78
|
+
pinnedActivity.activity.id === event.bookmark.activity.id &&
|
|
79
|
+
(!eventBelongsToCurrentUser ||
|
|
80
|
+
pinnedActivity.activity.own_bookmarks.some((b) =>
|
|
81
|
+
isSameBookmark(b, event.bookmark),
|
|
82
|
+
)),
|
|
73
83
|
updater: (matchedPinnedActivity) => {
|
|
74
84
|
const newActivity = sharedUpdateActivity({
|
|
75
85
|
currentActivity: matchedPinnedActivity.activity,
|
|
@@ -90,7 +100,7 @@ export const removeBookmarkFromPinnedActivities = (
|
|
|
90
100
|
|
|
91
101
|
export function handleBookmarkDeleted(
|
|
92
102
|
this: Feed,
|
|
93
|
-
event:
|
|
103
|
+
event: BookmarkDeletedPayload,
|
|
94
104
|
) {
|
|
95
105
|
const {
|
|
96
106
|
activities: currentActivities,
|
|
@@ -2,27 +2,34 @@ import type { Feed } from '../../../feed';
|
|
|
2
2
|
import type {
|
|
3
3
|
ActivityPinResponse,
|
|
4
4
|
ActivityResponse,
|
|
5
|
-
BookmarkUpdatedEvent,
|
|
6
5
|
} from '../../../gen/models';
|
|
7
|
-
import type { EventPayload } from '../../../types-internal';
|
|
6
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
8
7
|
import { updateEntityInArray } from '../../../utils';
|
|
9
8
|
|
|
10
9
|
import { isSameBookmark } from './handle-bookmark-deleted';
|
|
11
10
|
|
|
11
|
+
export type BookmarkUpdatedPayload = PartializeAllBut<
|
|
12
|
+
EventPayload<'feeds.bookmark.updated'>,
|
|
13
|
+
'bookmark'
|
|
14
|
+
>;
|
|
15
|
+
|
|
12
16
|
const sharedUpdateActivity = ({
|
|
13
17
|
currentActivity,
|
|
14
18
|
event,
|
|
15
19
|
eventBelongsToCurrentUser,
|
|
16
20
|
}: {
|
|
17
21
|
currentActivity: ActivityResponse;
|
|
18
|
-
event:
|
|
22
|
+
event: BookmarkUpdatedPayload;
|
|
19
23
|
eventBelongsToCurrentUser: boolean;
|
|
20
24
|
}): ActivityResponse => {
|
|
21
25
|
let newOwnBookmarks = currentActivity.own_bookmarks;
|
|
22
26
|
|
|
23
27
|
if (eventBelongsToCurrentUser) {
|
|
24
|
-
const bookmarkIndex = newOwnBookmarks.findIndex(
|
|
25
|
-
|
|
28
|
+
const bookmarkIndex = newOwnBookmarks.findIndex(
|
|
29
|
+
(bookmark) =>
|
|
30
|
+
bookmark.user.id === event.bookmark.user.id &&
|
|
31
|
+
bookmark.activity.id === event.bookmark.activity.id &&
|
|
32
|
+
bookmark.folder?.id === event.bookmark.folder?.id,
|
|
26
33
|
);
|
|
27
34
|
|
|
28
35
|
if (bookmarkIndex !== -1) {
|
|
@@ -39,13 +46,16 @@ const sharedUpdateActivity = ({
|
|
|
39
46
|
};
|
|
40
47
|
|
|
41
48
|
export const updateBookmarkInActivities = (
|
|
42
|
-
event:
|
|
49
|
+
event: BookmarkUpdatedPayload,
|
|
43
50
|
activities: ActivityResponse[] | undefined,
|
|
44
51
|
eventBelongsToCurrentUser: boolean,
|
|
45
52
|
) =>
|
|
46
53
|
updateEntityInArray({
|
|
47
54
|
entities: activities,
|
|
48
|
-
matcher: (activity) =>
|
|
55
|
+
matcher: (activity) =>
|
|
56
|
+
activity.id === event.bookmark.activity.id &&
|
|
57
|
+
(!eventBelongsToCurrentUser ||
|
|
58
|
+
!activity.own_bookmarks.some((b) => isSameBookmark(b, event.bookmark))),
|
|
49
59
|
updater: (matchedActivity) =>
|
|
50
60
|
sharedUpdateActivity({
|
|
51
61
|
currentActivity: matchedActivity,
|
|
@@ -55,14 +65,18 @@ export const updateBookmarkInActivities = (
|
|
|
55
65
|
});
|
|
56
66
|
|
|
57
67
|
export const updateBookmarkInPinnedActivities = (
|
|
58
|
-
event:
|
|
68
|
+
event: BookmarkUpdatedPayload,
|
|
59
69
|
pinnedActivities: ActivityPinResponse[] | undefined,
|
|
60
70
|
eventBelongsToCurrentUser: boolean,
|
|
61
71
|
) =>
|
|
62
72
|
updateEntityInArray({
|
|
63
73
|
entities: pinnedActivities,
|
|
64
74
|
matcher: (pinnedActivity) =>
|
|
65
|
-
pinnedActivity.activity.id === event.bookmark.activity.id
|
|
75
|
+
pinnedActivity.activity.id === event.bookmark.activity.id &&
|
|
76
|
+
(!eventBelongsToCurrentUser ||
|
|
77
|
+
!pinnedActivity.activity.own_bookmarks.some((b) =>
|
|
78
|
+
isSameBookmark(b, event.bookmark),
|
|
79
|
+
)),
|
|
66
80
|
updater: (matchedPinnedActivity) => {
|
|
67
81
|
const newActivity = sharedUpdateActivity({
|
|
68
82
|
currentActivity: matchedPinnedActivity.activity,
|
|
@@ -83,7 +97,7 @@ export const updateBookmarkInPinnedActivities = (
|
|
|
83
97
|
|
|
84
98
|
export function handleBookmarkUpdated(
|
|
85
99
|
this: Feed,
|
|
86
|
-
event:
|
|
100
|
+
event: BookmarkUpdatedPayload,
|
|
87
101
|
) {
|
|
88
102
|
const {
|
|
89
103
|
activities: currentActivities,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Feed } from '../../../feed';
|
|
2
|
+
import type { EventPayload } from '../../../types-internal';
|
|
3
|
+
|
|
4
|
+
export function handleFeedDeleted(
|
|
5
|
+
this: Feed,
|
|
6
|
+
event: Pick<EventPayload<'feeds.feed.deleted'>, 'created_at'>,
|
|
7
|
+
) {
|
|
8
|
+
if (this.currentState.deleted_at) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
this.state.partialNext({ deleted_at: event.created_at });
|
|
12
|
+
}
|
|
@@ -5,5 +5,13 @@ export function handleFeedUpdated(
|
|
|
5
5
|
this: Feed,
|
|
6
6
|
event: PartializeAllBut<EventPayload<'feeds.feed.updated'>, 'feed'>,
|
|
7
7
|
) {
|
|
8
|
+
const currentUpdatedAt = this.currentState.updated_at;
|
|
9
|
+
if (
|
|
10
|
+
currentUpdatedAt &&
|
|
11
|
+
event.feed.updated_at &&
|
|
12
|
+
currentUpdatedAt.getTime() >= event.feed.updated_at.getTime()
|
|
13
|
+
) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
8
16
|
this.state.partialNext({ ...event.feed });
|
|
9
17
|
}
|
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
import type { Feed, FeedState } from '../../../feed';
|
|
2
|
-
import type { EventPayload } from '../../../types-internal';
|
|
2
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
3
|
+
import { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';
|
|
4
|
+
import { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';
|
|
5
|
+
|
|
6
|
+
export type FeedMemberAddedPayload = PartializeAllBut<
|
|
7
|
+
EventPayload<'feeds.feed_member.added'>,
|
|
8
|
+
'member'
|
|
9
|
+
>;
|
|
3
10
|
|
|
4
11
|
export function handleFeedMemberAdded(
|
|
5
12
|
this: Feed,
|
|
6
|
-
event:
|
|
13
|
+
event: FeedMemberAddedPayload,
|
|
14
|
+
fromWs?: boolean,
|
|
7
15
|
) {
|
|
16
|
+
if (
|
|
17
|
+
!shouldUpdateState({
|
|
18
|
+
stateUpdateQueueId: getStateUpdateQueueId(event, 'feed-member-added'),
|
|
19
|
+
stateUpdateQueue: this.stateUpdateQueue,
|
|
20
|
+
watch: this.currentState.watch,
|
|
21
|
+
fromWs,
|
|
22
|
+
isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
|
|
23
|
+
this,
|
|
24
|
+
event,
|
|
25
|
+
),
|
|
26
|
+
})
|
|
27
|
+
) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
9
32
|
|
|
10
33
|
this.state.next((currentState) => {
|
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
import type { Feed, FeedState } from '../../../feed';
|
|
2
|
-
import type { EventPayload } from '../../../types-internal';
|
|
2
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
3
|
+
import { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';
|
|
4
|
+
import { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';
|
|
5
|
+
|
|
6
|
+
export type FeedMemberRemovedPayload = PartializeAllBut<
|
|
7
|
+
EventPayload<'feeds.feed_member.removed'>,
|
|
8
|
+
'member_id'
|
|
9
|
+
>;
|
|
3
10
|
|
|
4
11
|
export function handleFeedMemberRemoved(
|
|
5
12
|
this: Feed,
|
|
6
|
-
event:
|
|
13
|
+
event: FeedMemberRemovedPayload,
|
|
14
|
+
fromWs?: boolean,
|
|
7
15
|
) {
|
|
16
|
+
if (
|
|
17
|
+
!shouldUpdateState({
|
|
18
|
+
stateUpdateQueueId: getStateUpdateQueueId(event, 'feed-member-removed'),
|
|
19
|
+
stateUpdateQueue: this.stateUpdateQueue,
|
|
20
|
+
watch: this.currentState.watch,
|
|
21
|
+
fromWs,
|
|
22
|
+
isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
|
|
23
|
+
this,
|
|
24
|
+
event,
|
|
25
|
+
),
|
|
26
|
+
})
|
|
27
|
+
) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
9
32
|
|
|
10
33
|
this.state.next((currentState) => {
|
|
@@ -1,10 +1,33 @@
|
|
|
1
1
|
import type { Feed, FeedState } from '../../../feed';
|
|
2
|
-
import type { EventPayload } from '../../../types-internal';
|
|
2
|
+
import type { EventPayload, PartializeAllBut } from '../../../types-internal';
|
|
3
|
+
import { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';
|
|
4
|
+
import { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';
|
|
5
|
+
|
|
6
|
+
export type FeedMemberUpdatedPayload = PartializeAllBut<
|
|
7
|
+
EventPayload<'feeds.feed_member.updated'>,
|
|
8
|
+
'member'
|
|
9
|
+
>;
|
|
3
10
|
|
|
4
11
|
export function handleFeedMemberUpdated(
|
|
5
12
|
this: Feed,
|
|
6
|
-
event:
|
|
13
|
+
event: FeedMemberUpdatedPayload,
|
|
14
|
+
fromWs?: boolean,
|
|
7
15
|
) {
|
|
16
|
+
if (
|
|
17
|
+
!shouldUpdateState({
|
|
18
|
+
stateUpdateQueueId: getStateUpdateQueueId(event, 'feed-member-updated'),
|
|
19
|
+
stateUpdateQueue: this.stateUpdateQueue,
|
|
20
|
+
watch: this.currentState.watch,
|
|
21
|
+
fromWs,
|
|
22
|
+
isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(
|
|
23
|
+
this,
|
|
24
|
+
event,
|
|
25
|
+
),
|
|
26
|
+
})
|
|
27
|
+
) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
const { connected_user: connectedUser } = this.client.state.getLatestValue();
|
|
9
32
|
|
|
10
33
|
this.state.next((currentState) => {
|
|
@@ -37,6 +37,13 @@ export function handleFollowUpdated(
|
|
|
37
37
|
...currentState,
|
|
38
38
|
// Update FeedResponse fields, that has the new follower/following count
|
|
39
39
|
...follow.source_feed,
|
|
40
|
+
...(follow.source_feed.own_capabilities !== undefined
|
|
41
|
+
? {
|
|
42
|
+
own_capabilities: follow.source_feed.own_capabilities,
|
|
43
|
+
own_follows: follow.source_feed.own_follows,
|
|
44
|
+
own_followings: follow.source_feed.own_followings,
|
|
45
|
+
}
|
|
46
|
+
: {}),
|
|
40
47
|
};
|
|
41
48
|
|
|
42
49
|
const index =
|
|
@@ -58,6 +65,13 @@ export function handleFollowUpdated(
|
|
|
58
65
|
...currentState,
|
|
59
66
|
// Update FeedResponse fields, that has the new follower/following count
|
|
60
67
|
...follow.target_feed,
|
|
68
|
+
...(follow.target_feed.own_capabilities !== undefined
|
|
69
|
+
? {
|
|
70
|
+
own_capabilities: follow.target_feed.own_capabilities,
|
|
71
|
+
own_follows: follow.target_feed.own_follows,
|
|
72
|
+
own_followings: follow.target_feed.own_followings,
|
|
73
|
+
}
|
|
74
|
+
: {}),
|
|
61
75
|
};
|
|
62
76
|
|
|
63
77
|
if (
|