Skip to content

Commit 4fddf89

Browse files
authored
Redesign group channel info edit screen (#6301)
* Replace the "Add Members" button with a "Edit" action button in the top bar of `GroupChannelInfoScreen`. * Replace `RenameChannel` (with `isReadOnly` flag) and `UserInfo` options with a single `EditChannel` option in `ChannelInfoViewState`. * Introduce `GroupChannelEditScreen` * Mark `AddMembersViewAction` and `AddMembersViewState` as internal APIs * Fix stale loadMore results contaminating search in AddMembersViewController. Cancel any in-flight loadMore job when a new search starts, preventing results from a previous query from being appended to the new search results. * strings still used by XML SDK (old design) * Remove unused `UserInfoClick` action and `CopyToClipboardHandler` dependency from `ChannelInfoViewModel` and `ChannelInfoViewController`. * Implement group channel image editing in `GroupChannelEditScreen` * Increase coverage of GroupChannelEditScreen and update snapshot files * Refactor group channel editing logic to move image selection and caching state from the UI to `GroupChannelEditViewModel`. * Update `Edit` option documentation in `ChannelInfoViewState`. * Update `GroupChannelInfoLoading` preview and implementation * Update unit tests for `GroupChannelEditViewModel` and `AddMembersViewController` to cover edge cases. - Add test to verify that `GroupChannelEditViewModel` ignores duplicate gallery imports while an import is already in progress. - Add test to ensure `GroupChannelEditViewModel` preserves the existing pending image state if a gallery import fails. - Add test to confirm that `AddMembersViewController` cancels ongoing `LoadMore` jobs when the search query is changed. * Refactor `GroupChannelEditScreen` to handle `GroupChannelEditViewModel` initialization internally. - Update `GroupChannelEditScreen` to accept `GroupChannelEditViewModelFactory` instead of a pre-initialized `GroupChannelEditViewModel`. - Move `GroupChannelEditViewModel` creation logic from `GroupChannelInfoScreen` into `GroupChannelEditScreen` using `viewModel()`. - Wrap `GroupChannelEditPlaceholder` in a `ViewModelStore` and update it to use the new factory-based signature to improve preview reliability. - Remove unnecessary `GroupChannelEditViewModel` import in `GroupChannelInfoScreen`. * Refactor `GroupChannelEditScreen` to handle its own `GroupChannelEditViewModelFactory` instantiation. - Remove `viewModelFactory` parameter from `GroupChannelEditScreen` and internalize its creation using `LocalContext` and the provided `channel.cid`. - Update `GroupChannelInfoScreen` to no longer pass a factory to `GroupChannelEditScreen`. - Simplify `GroupChannelEditPlaceholder` by removing redundant factory initialization. - Provide a default empty lambda for the `onDismiss` parameter in `GroupChannelEditScreen`. * rebase from v7 * No need to add `.jpg` suffix when copying image to cache * Trim channel name before saving in `GroupChannelEditViewModel`
1 parent 59d7436 commit 4fddf89

48 files changed

Lines changed: 1490 additions & 429 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/channel/DirectChannelInfoActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ class DirectChannelInfoActivity : ComponentActivity() {
6060

6161
private val viewModelFactory by lazy {
6262
ChannelInfoViewModelFactory(
63-
context = applicationContext,
6463
cid = channelId,
6564
)
6665
}

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/channel/GroupChannelInfoActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ class GroupChannelInfoActivity : ComponentActivity() {
6262

6363
private val viewModelFactory by lazy {
6464
ChannelInfoViewModelFactory(
65-
context = applicationContext,
6665
cid = channelId,
6766
)
6867
}

stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/chats/ChatsActivity.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import androidx.compose.foundation.lazy.LazyListState
2929
import androidx.compose.material3.ExperimentalMaterial3Api
3030
import androidx.compose.material3.Icon
3131
import androidx.compose.material3.IconButton
32+
import androidx.compose.material3.OutlinedButton
3233
import androidx.compose.material3.Surface
3334
import androidx.compose.material3.Text
3435
import androidx.compose.material3.TopAppBar
@@ -75,7 +76,6 @@ import io.getstream.chat.android.compose.ui.theme.ChatTheme
7576
import io.getstream.chat.android.compose.ui.theme.ChatUiConfig
7677
import io.getstream.chat.android.compose.ui.theme.CompoundComponentFactory
7778
import io.getstream.chat.android.compose.ui.theme.DirectChannelInfoTopBarParams
78-
import io.getstream.chat.android.compose.ui.theme.GroupChannelInfoAddMembersButtonParams
7979
import io.getstream.chat.android.compose.ui.theme.GroupChannelInfoTopBarParams
8080
import io.getstream.chat.android.compose.ui.theme.TranslationConfig
8181
import io.getstream.chat.android.compose.ui.util.adaptivelayout.AdaptiveLayoutInfo
@@ -107,6 +107,7 @@ import kotlinx.coroutines.delay
107107
import kotlinx.coroutines.flow.collectLatest
108108
import kotlinx.coroutines.flow.flatMapLatest
109109
import kotlinx.coroutines.launch
110+
import io.getstream.chat.android.compose.R as ComposeR
110111

111112
class ChatsActivity : ComponentActivity() {
112113

@@ -330,7 +331,7 @@ class ChatsActivity : ComponentActivity() {
330331
onNavigateToFilesAttachments: () -> Unit,
331332
) {
332333
val viewModelFactory = remember(channelId) {
333-
ChannelInfoViewModelFactory(context = applicationContext, cid = channelId)
334+
ChannelInfoViewModelFactory(cid = channelId)
334335
}
335336
val viewModel = viewModel<ChannelInfoViewModel>(factory = viewModelFactory)
336337

@@ -384,7 +385,7 @@ class ChatsActivity : ComponentActivity() {
384385
onNavigateToChannel: (cid: String) -> Unit,
385386
) {
386387
val viewModelFactory = remember(channelId) {
387-
ChannelInfoViewModelFactory(context = applicationContext, cid = channelId)
388+
ChannelInfoViewModelFactory(cid = channelId)
388389
}
389390
val viewModel = viewModel<ChannelInfoViewModel>(factory = viewModelFactory)
390391

@@ -412,7 +413,7 @@ class ChatsActivity : ComponentActivity() {
412413
infoState = params.infoState,
413414
listState = params.listState,
414415
navigationIcon = { CloseButton(onClick = params.onNavigationIconClick) },
415-
onAddMembersClick = params.onAddMembersClick,
416+
onActionClick = params.onActionClick,
416417
)
417418
}
418419
}
@@ -466,7 +467,7 @@ class ChatsActivity : ComponentActivity() {
466467
infoState: ChannelInfoViewState,
467468
listState: LazyListState,
468469
navigationIcon: @Composable () -> Unit,
469-
onAddMembersClick: () -> Unit,
470+
onActionClick: () -> Unit,
470471
) {
471472
val elevation by animateDpAsState(
472473
targetValue = if (listState.canScrollBackward) {
@@ -503,11 +504,13 @@ class ChatsActivity : ComponentActivity() {
503504
),
504505
actions = {
505506
if (infoState is ChannelInfoViewState.Content &&
506-
infoState.options.contains(ChannelInfoViewState.Content.Option.AddMember)
507+
infoState.options.any { option -> option is ChannelInfoViewState.Content.Option.EditChannel }
507508
) {
508-
ChatTheme.componentFactory.GroupChannelInfoAddMembersButton(
509-
params = GroupChannelInfoAddMembersButtonParams(onClick = onAddMembersClick),
510-
)
509+
OutlinedButton(
510+
onClick = onActionClick,
511+
) {
512+
Text(text = stringResource(id = ComposeR.string.stream_ui_channel_info_edit_action))
513+
}
511514
}
512515
},
513516
)

stream-chat-android-compose/api/stream-chat-android-compose.api

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -871,15 +871,6 @@ public final class io/getstream/chat/android/compose/ui/channel/info/ComposableS
871871
public final fun getLambda-4$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
872872
}
873873

874-
public final class io/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$ChannelInfoNameFieldKt {
875-
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$ChannelInfoNameFieldKt;
876-
public static field lambda-1 Lkotlin/jvm/functions/Function2;
877-
public static field lambda-2 Lkotlin/jvm/functions/Function2;
878-
public fun <init> ()V
879-
public final fun getLambda-1$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
880-
public final fun getLambda-2$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
881-
}
882-
883874
public final class io/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$ChannelInfoOptionKt {
884875
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$ChannelInfoOptionKt;
885876
public static field lambda-1 Lkotlin/jvm/functions/Function2;
@@ -923,19 +914,40 @@ public final class io/getstream/chat/android/compose/ui/channel/info/ComposableS
923914
public final fun getLambda-3$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
924915
}
925916

926-
public final class io/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelInfoScreenKt {
927-
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelInfoScreenKt;
917+
public final class io/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelEditScreenKt {
918+
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelEditScreenKt;
928919
public static field lambda-1 Lkotlin/jvm/functions/Function2;
929-
public static field lambda-2 Lkotlin/jvm/functions/Function3;
920+
public static field lambda-2 Lkotlin/jvm/functions/Function2;
930921
public static field lambda-3 Lkotlin/jvm/functions/Function2;
931922
public static field lambda-4 Lkotlin/jvm/functions/Function2;
932923
public static field lambda-5 Lkotlin/jvm/functions/Function2;
924+
public static field lambda-6 Lkotlin/jvm/functions/Function2;
925+
public static field lambda-7 Lkotlin/jvm/functions/Function2;
926+
public static field lambda-8 Lkotlin/jvm/functions/Function2;
927+
public static field lambda-9 Lkotlin/jvm/functions/Function2;
933928
public fun <init> ()V
934929
public final fun getLambda-1$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
935-
public final fun getLambda-2$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3;
930+
public final fun getLambda-2$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
936931
public final fun getLambda-3$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
937932
public final fun getLambda-4$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
938933
public final fun getLambda-5$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
934+
public final fun getLambda-6$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
935+
public final fun getLambda-7$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
936+
public final fun getLambda-8$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
937+
public final fun getLambda-9$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
938+
}
939+
940+
public final class io/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelInfoScreenKt {
941+
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channel/info/ComposableSingletons$GroupChannelInfoScreenKt;
942+
public static field lambda-1 Lkotlin/jvm/functions/Function2;
943+
public static field lambda-2 Lkotlin/jvm/functions/Function2;
944+
public static field lambda-3 Lkotlin/jvm/functions/Function2;
945+
public static field lambda-4 Lkotlin/jvm/functions/Function2;
946+
public fun <init> ()V
947+
public final fun getLambda-1$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
948+
public final fun getLambda-2$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
949+
public final fun getLambda-3$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
950+
public final fun getLambda-4$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
939951
}
940952

941953
public final class io/getstream/chat/android/compose/ui/channel/info/DirectChannelInfoScreenKt {
@@ -4203,6 +4215,7 @@ public final class io/getstream/chat/android/compose/ui/theme/GroupChannelInfoMe
42034215
public final class io/getstream/chat/android/compose/ui/theme/GroupChannelInfoTopBarParams {
42044216
public static final field $stable I
42054217
public fun <init> (Lio/getstream/chat/android/ui/common/state/messages/list/ChannelHeaderViewState;Lio/getstream/chat/android/ui/common/state/channel/info/ChannelInfoViewState;Landroidx/compose/foundation/lazy/LazyListState;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V
4218+
public synthetic fun <init> (Lio/getstream/chat/android/ui/common/state/messages/list/ChannelHeaderViewState;Lio/getstream/chat/android/ui/common/state/channel/info/ChannelInfoViewState;Landroidx/compose/foundation/lazy/LazyListState;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
42064219
public final fun component1 ()Lio/getstream/chat/android/ui/common/state/messages/list/ChannelHeaderViewState;
42074220
public final fun component2 ()Lio/getstream/chat/android/ui/common/state/channel/info/ChannelInfoViewState;
42084221
public final fun component3 ()Landroidx/compose/foundation/lazy/LazyListState;
@@ -4214,7 +4227,7 @@ public final class io/getstream/chat/android/compose/ui/theme/GroupChannelInfoTo
42144227
public final fun getHeaderState ()Lio/getstream/chat/android/ui/common/state/messages/list/ChannelHeaderViewState;
42154228
public final fun getInfoState ()Lio/getstream/chat/android/ui/common/state/channel/info/ChannelInfoViewState;
42164229
public final fun getListState ()Landroidx/compose/foundation/lazy/LazyListState;
4217-
public final fun getOnAddMembersClick ()Lkotlin/jvm/functions/Function0;
4230+
public final fun getOnActionClick ()Lkotlin/jvm/functions/Function0;
42184231
public final fun getOnNavigationIconClick ()Lkotlin/jvm/functions/Function0;
42194232
public fun hashCode ()I
42204233
public fun toString ()Ljava/lang/String;
@@ -6253,7 +6266,7 @@ public final class io/getstream/chat/android/compose/ui/theme/StreamDesign$Color
62536266
public final class io/getstream/chat/android/compose/ui/theme/StreamDesign$Colors {
62546267
public static final field $stable I
62556268
public static final field Companion Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors$Companion;
6256-
public synthetic fun <init> (Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLkotlin/jvm/internal/DefaultConstructorMarker;)V
6269+
public synthetic fun <init> (Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLkotlin/jvm/internal/DefaultConstructorMarker;)V
62576270
public final fun component1 ()Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;
62586271
public final fun component10-0d7_KjU ()J
62596272
public final fun component11-0d7_KjU ()J
@@ -6313,11 +6326,12 @@ public final class io/getstream/chat/android/compose/ui/theme/StreamDesign$Color
63136326
public final fun component60-0d7_KjU ()J
63146327
public final fun component61-0d7_KjU ()J
63156328
public final fun component62-0d7_KjU ()J
6329+
public final fun component63-0d7_KjU ()J
63166330
public final fun component7-0d7_KjU ()J
63176331
public final fun component8-0d7_KjU ()J
63186332
public final fun component9-0d7_KjU ()J
6319-
public final fun copy-Gzxa-5A (Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;
6320-
public static synthetic fun copy-Gzxa-5A$default (Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;
6333+
public final fun copy-hm1G8mE (Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;
6334+
public static synthetic fun copy-hm1G8mE$default (Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ColorScale;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;
63216335
public fun equals (Ljava/lang/Object;)Z
63226336
public final fun getAccentError-0d7_KjU ()J
63236337
public final fun getAccentNeutral-0d7_KjU ()J
@@ -6374,6 +6388,7 @@ public final class io/getstream/chat/android/compose/ui/theme/StreamDesign$Color
63746388
public final fun getChrome ()Lio/getstream/chat/android/compose/ui/theme/StreamDesign$ChromeScale;
63756389
public final fun getSkeletonLoadingBase-0d7_KjU ()J
63766390
public final fun getSkeletonLoadingHighlight-0d7_KjU ()J
6391+
public final fun getSystemCaret-0d7_KjU ()J
63776392
public final fun getTextDisabled-0d7_KjU ()J
63786393
public final fun getTextLink-0d7_KjU ()J
63796394
public final fun getTextOnAccent-0d7_KjU ()J
@@ -6904,8 +6919,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelIn
69046919

69056920
public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelInfoViewModel : androidx/lifecycle/ViewModel {
69066921
public static final field $stable I
6907-
public fun <init> (Ljava/lang/String;Lio/getstream/chat/android/ui/common/helper/CopyToClipboardHandler;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
6908-
public synthetic fun <init> (Ljava/lang/String;Lio/getstream/chat/android/ui/common/helper/CopyToClipboardHandler;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
6922+
public fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
6923+
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
69096924
public final fun addMembers (Ljava/util/Set;)V
69106925
public final fun getEvents ()Lkotlinx/coroutines/flow/SharedFlow;
69116926
public final fun getState ()Lkotlinx/coroutines/flow/StateFlow;
@@ -6915,8 +6930,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelIn
69156930

69166931
public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelInfoViewModelFactory : androidx/lifecycle/ViewModelProvider$Factory {
69176932
public static final field $stable I
6918-
public fun <init> (Landroid/content/Context;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
6919-
public synthetic fun <init> (Landroid/content/Context;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
6933+
public fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
6934+
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
69206935
public fun create (Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;
69216936
}
69226937

0 commit comments

Comments
 (0)