Skip to content

Commit bd0d86b

Browse files
authored
Handle updated activities on StoriesFeedUpdated (#135)
1 parent 7826840 commit bd0d86b

File tree

5 files changed

+48
-14
lines changed

5 files changed

+48
-14
lines changed

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImpl.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,22 @@ internal class FeedStateImpl(
307307
_notificationStatus.update { notificationStatus }
308308
}
309309

310-
override fun onStoriesFeedUpdated(aggregatedActivities: List<AggregatedActivityData>) {
310+
override fun onStoriesFeedUpdated(
311+
activities: List<ActivityData>,
312+
aggregatedActivities: List<AggregatedActivityData>,
313+
) {
314+
updateActivities(activities)
311315
updateAggregatedActivities(aggregatedActivities)
312316
}
313317

318+
private fun updateActivities(activities: List<ActivityData>) {
319+
val updatedMap = activities.associateBy(ActivityData::id)
320+
321+
updateActivitiesWhere({ it.id in updatedMap }) { activity ->
322+
updatedMap[activity.id]?.let(activity::update) ?: activity
323+
}
324+
}
325+
314326
private fun updateAggregatedActivities(aggregatedActivities: List<AggregatedActivityData>) {
315327
val updatedMap = aggregatedActivities.associateBy(AggregatedActivityData::group)
316328

@@ -470,8 +482,12 @@ internal interface FeedStateUpdates {
470482
/**
471483
* Handles updates to a stories feed.
472484
*
485+
* @param activities The list of activities that were updated in the stories feed.
473486
* @param aggregatedActivities The list of aggregated activities that were updated in the
474487
* stories feed.
475488
*/
476-
fun onStoriesFeedUpdated(aggregatedActivities: List<AggregatedActivityData>)
489+
fun onStoriesFeedUpdated(
490+
activities: List<ActivityData>,
491+
aggregatedActivities: List<AggregatedActivityData>,
492+
)
477493
}

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/event/StateUpdateEvent.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import io.getstream.feeds.android.network.models.ActivityReactionAddedEvent
3636
import io.getstream.feeds.android.network.models.ActivityReactionDeletedEvent
3737
import io.getstream.feeds.android.network.models.ActivityReactionUpdatedEvent
3838
import io.getstream.feeds.android.network.models.ActivityRemovedFromFeedEvent
39+
import io.getstream.feeds.android.network.models.ActivityResponse
3940
import io.getstream.feeds.android.network.models.ActivityUnpinnedEvent
4041
import io.getstream.feeds.android.network.models.ActivityUpdatedEvent
4142
import io.getstream.feeds.android.network.models.AggregatedActivityResponse
@@ -157,6 +158,7 @@ internal sealed interface StateUpdateEvent {
157158

158159
data class StoriesFeedUpdated(
159160
val fid: String,
161+
val activities: List<ActivityData>,
160162
val aggregatedActivities: List<AggregatedActivityData>,
161163
) : StateUpdateEvent
162164

@@ -268,6 +270,7 @@ internal fun WSEvent.toModel(): StateUpdateEvent? =
268270
is StoriesFeedUpdatedEvent ->
269271
StateUpdateEvent.StoriesFeedUpdated(
270272
fid = fid,
273+
activities = activities?.map(ActivityResponse::toModel).orEmpty(),
271274
aggregatedActivities =
272275
aggregatedActivities?.map(AggregatedActivityResponse::toModel).orEmpty(),
273276
)

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/internal/state/event/handler/FeedEventHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ internal class FeedEventHandler(
191191

192192
is StateUpdateEvent.StoriesFeedUpdated -> {
193193
if (event.fid == fid.rawValue) {
194-
state.onStoriesFeedUpdated(event.aggregatedActivities)
194+
state.onStoriesFeedUpdated(event.activities, event.aggregatedActivities)
195195
}
196196
}
197197

stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/FeedStateImplTest.kt

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -518,8 +518,9 @@ internal class FeedStateImplTest {
518518
}
519519

520520
@Test
521-
fun `on onStoriesFeedUpdated, update matching groups`() = runTest {
522-
val initial =
521+
fun `on onStoriesFeedUpdated, update matching activities and groups`() = runTest {
522+
val initialActivities = List(3) { activityData("story-$it") }
523+
val initialAggregated =
523524
List(3) {
524525
aggregatedActivityData(
525526
activities = listOf(activityData("story-$it")),
@@ -528,27 +529,38 @@ internal class FeedStateImplTest {
528529
userCount = it,
529530
)
530531
}
532+
setupInitialState(activities = initialActivities, aggregatedActivities = initialAggregated)
531533

532-
setupInitialState(aggregatedActivities = initial)
533-
534-
val updated0 =
534+
val updatedActivity0 = activityData("story-0", text = "Updated 0")
535+
val updatedActivity2 = activityData("story-2", text = "Updated 2")
536+
val updatedAggregated0 =
535537
aggregatedActivityData(
536538
activities = listOf(activityData("story-0-updated")),
537539
activityCount = 10,
538540
group = "story-group-0",
539541
userCount = 10,
540542
)
541-
val updated2 =
543+
val updatedAggregated2 =
542544
aggregatedActivityData(
543545
activities = listOf(activityData("story-2-updated")),
544546
activityCount = 30,
545547
group = "story-group-2",
546548
userCount = 30,
547549
)
548550

549-
feedState.onStoriesFeedUpdated(listOf(updated0, updated2))
551+
feedState.onStoriesFeedUpdated(
552+
listOf(updatedActivity0, updatedActivity2),
553+
listOf(updatedAggregated0, updatedAggregated2),
554+
)
550555

551-
assertEquals(listOf(updated0, initial[1], updated2), feedState.aggregatedActivities.value)
556+
assertEquals(
557+
listOf(updatedActivity0, initialActivities[1], updatedActivity2),
558+
feedState.activities.value,
559+
)
560+
assertEquals(
561+
listOf(updatedAggregated0, initialAggregated[1], updatedAggregated2),
562+
feedState.aggregatedActivities.value,
563+
)
552564
}
553565

554566
// Helper functions

stream-feeds-android-client/src/test/kotlin/io/getstream/feeds/android/client/internal/state/event/handler/FeedEventHandlerTest.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ internal class FeedEventHandlerTest(
9393
private val matchingFollow = followData(sourceFid = fid.rawValue)
9494
private val nonMatchingFollow =
9595
followData(sourceFid = "other:feed", targetFid = "another:feed")
96+
private val activities = listOf(activity)
9697
private val aggregatedActivities =
9798
listOf(
9899
AggregatedActivityData(
@@ -364,12 +365,14 @@ internal class FeedEventHandlerTest(
364365
),
365366
testParams<FeedStateUpdates>(
366367
name = "StoriesFeedUpdated matching feed",
367-
event = StoriesFeedUpdated(fid.rawValue, aggregatedActivities),
368-
verifyBlock = { state -> state.onStoriesFeedUpdated(aggregatedActivities) },
368+
event = StoriesFeedUpdated(fid.rawValue, activities, aggregatedActivities),
369+
verifyBlock = { state ->
370+
state.onStoriesFeedUpdated(activities, aggregatedActivities)
371+
},
369372
),
370373
testParams<FeedStateUpdates>(
371374
name = "StoriesFeedUpdated non-matching feed",
372-
event = StoriesFeedUpdated("group:different", aggregatedActivities),
375+
event = StoriesFeedUpdated("group:different", activities, aggregatedActivities),
373376
verifyBlock = { state -> state wasNot called },
374377
),
375378
testParams<FeedStateUpdates>(

0 commit comments

Comments
 (0)