Epic: create and join rooms - Start Chat (#680)

* add start chat flow with UI

* add feature flag for start chat

* add changelog

* fix naming and tests

* fix empty display name in user cell

* Update ElementX/Sources/Application/AppSettings.swift

Co-authored-by: Alfonso Grillo <alfogrillo@element.io>

* add screenshots from UI test

* fix swiftFormat and add identifiers

* fix warnings

---------

Co-authored-by: Alfonso Grillo <alfogrillo@element.io>
This commit is contained in:
Flescio
2023-03-14 10:50:09 +01:00
committed by GitHub
parent 7eef86970a
commit 8a069ecfa5
29 changed files with 495 additions and 2 deletions
@@ -29,6 +29,7 @@ enum HomeScreenCoordinatorAction {
case presentSettingsScreen
case presentFeedbackScreen
case presentSessionVerificationScreen
case presentStartChatScreen
case signOut
}
@@ -62,6 +63,8 @@ final class HomeScreenCoordinator: CoordinatorProtocol {
self.callback?(.presentSessionVerificationScreen)
case .signOut:
self.callback?(.signOut)
case .presentStartChatScreen:
self.callback?(.presentStartChatScreen)
}
}
}
@@ -24,6 +24,7 @@ enum HomeScreenViewModelAction {
case presentSettingsScreen
case presentInviteFriendsScreen
case presentFeedbackScreen
case presentStartChatScreen
case signOut
}
@@ -37,6 +38,7 @@ enum HomeScreenViewUserMenuAction {
enum HomeScreenViewAction {
case selectRoom(roomIdentifier: String)
case userMenu(action: HomeScreenViewUserMenuAction)
case startChat
case verifySession
case skipSessionVerification
case updateVisibleItemRange(range: Range<Int>, isScrolling: Bool)
@@ -67,6 +69,10 @@ struct HomeScreenViewState: BindableState {
var roomListMode: HomeScreenRoomListMode = .skeletons
var showStartChatFlowEnabled: Bool {
ServiceLocator.shared.settings.startChatFlowFeatureFlag
}
var visibleRooms: [HomeScreenRoom] {
if roomListMode == .skeletons {
return placeholderRooms
@@ -154,6 +154,8 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
state.showSessionVerificationBanner = false
case .updateVisibleItemRange(let range, let isScrolling):
visibleItemRangePublisher.send((range, isScrolling))
case .startChat:
callback?(.presentStartChatScreen)
}
}
@@ -102,6 +102,12 @@ struct HomeScreen: View {
ToolbarItem(placement: .navigationBarLeading) {
userMenuButton
}
if context.viewState.showStartChatFlowEnabled {
ToolbarItemGroup(placement: .bottomBar) {
Spacer()
newRoomButton
}
}
}
.background(Color.element.background.ignoresSafeArea())
}
@@ -148,6 +154,12 @@ struct HomeScreen: View {
.accessibilityLabel(ElementL10n.a11yAllChatsUserAvatarMenu)
}
private var newRoomButton: some View {
Button(action: startChat) {
Image(systemName: "square.and.pencil")
}
}
private var sessionVerificationBanner: some View {
VStack(alignment: .leading, spacing: 16) {
VStack(alignment: .leading, spacing: 4) {
@@ -191,6 +203,10 @@ struct HomeScreen: View {
context.send(viewAction: .userMenu(action: .inviteFriends))
}
private func startChat() {
context.send(viewAction: .startChat)
}
private func feedback() {
context.send(viewAction: .userMenu(action: .feedback))
}