diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index d5eb22755..260eadd87 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -2638,7 +2638,9 @@ class ClientProxyMock: ClientProxyProtocol { func joinRoomAlias(_ roomAlias: String) async -> Result { joinRoomAliasCallsCount += 1 joinRoomAliasReceivedRoomAlias = roomAlias - joinRoomAliasReceivedInvocations.append(roomAlias) + DispatchQueue.main.async { + self.joinRoomAliasReceivedInvocations.append(roomAlias) + } if let joinRoomAliasClosure = joinRoomAliasClosure { return await joinRoomAliasClosure(roomAlias) } else { @@ -4478,7 +4480,9 @@ class ComposerDraftServiceMock: ComposerDraftServiceProtocol { func saveDraft(_ draft: ComposerDraftProxy) async -> Result { saveDraftCallsCount += 1 saveDraftReceivedDraft = draft - saveDraftReceivedInvocations.append(draft) + DispatchQueue.main.async { + self.saveDraftReceivedInvocations.append(draft) + } if let saveDraftClosure = saveDraftClosure { return await saveDraftClosure(draft) } else { @@ -4674,7 +4678,9 @@ class ComposerDraftServiceMock: ComposerDraftServiceProtocol { func getReply(eventID: String) async -> Result { getReplyEventIDCallsCount += 1 getReplyEventIDReceivedEventID = eventID - getReplyEventIDReceivedInvocations.append(eventID) + DispatchQueue.main.async { + self.getReplyEventIDReceivedInvocations.append(eventID) + } if let getReplyEventIDClosure = getReplyEventIDClosure { return await getReplyEventIDClosure(eventID) } else { @@ -10715,7 +10721,9 @@ class RoomProxyMock: RoomProxyProtocol { func saveDraft(_ draft: ComposerDraft) async -> Result { saveDraftCallsCount += 1 saveDraftReceivedDraft = draft - saveDraftReceivedInvocations.append(draft) + DispatchQueue.main.async { + self.saveDraftReceivedInvocations.append(draft) + } if let saveDraftClosure = saveDraftClosure { return await saveDraftClosure(draft) } else { @@ -13236,7 +13244,9 @@ class TimelineProxyMock: TimelineProxyProtocol { func getLoadedReplyDetails(eventID: String) async -> Result { getLoadedReplyDetailsEventIDCallsCount += 1 getLoadedReplyDetailsEventIDReceivedEventID = eventID - getLoadedReplyDetailsEventIDReceivedInvocations.append(eventID) + DispatchQueue.main.async { + self.getLoadedReplyDetailsEventIDReceivedInvocations.append(eventID) + } if let getLoadedReplyDetailsEventIDClosure = getLoadedReplyDetailsEventIDClosure { return await getLoadedReplyDetailsEventIDClosure(eventID) } else { diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift index fd88b0889..27aec4b01 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift @@ -22,6 +22,7 @@ enum JoinRoomScreenViewModelAction { } enum JoinRoomScreenInteractionMode { + case loading case unknown case invited case join @@ -34,32 +35,9 @@ struct JoinRoomScreenViewState: BindableState { var roomDetails: RoomPreviewDetails? - var mode: JoinRoomScreenInteractionMode { - guard let roomDetails else { - return .unknown - } - - if roomDetails.isInvited { - return .invited - } - - if roomDetails.isPublic { - return .join - } - - // Knocking is not supported yet, treat it as .unknown - // if roomDetails.canKnock { - // return .knock - // } - - return .unknown - } + var mode: JoinRoomScreenInteractionMode = .loading var bindings = JoinRoomScreenViewStateBindings() - - var title: String { - roomDetails?.name ?? L10n.screenJoinRoomTitleNoPreview - } } struct JoinRoomScreenViewStateBindings { diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift index 646157640..78b41cfbe 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift @@ -74,6 +74,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo showLoadingIndicator() defer { + updateMode() hideLoadingIndicator() } @@ -85,6 +86,23 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo } } + private func updateMode() { + guard let roomDetails = state.roomDetails else { + state.mode = .unknown + return + } + + if roomDetails.isPublic { + state.mode = .join + } else if roomDetails.isInvited { + state.mode = .invited + } else if roomDetails.canKnock { // Knocking is not supported yet, treat it as .unknown + state.mode = .unknown + } else { + state.mode = .unknown + } + } + private func joinRoom() async { showLoadingIndicator() diff --git a/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift b/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift index 554d772a2..ce13decb6 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift @@ -24,7 +24,11 @@ struct JoinRoomScreen: View { var body: some View { FullscreenDialog(topPadding: 80, background: .bloom) { - mainContent + if context.viewState.mode == .loading { + EmptyView() + } else { + mainContent + } } bottomContent: { buttons } @@ -36,15 +40,17 @@ struct JoinRoomScreen: View { var mainContent: some View { VStack(spacing: 16) { + let title = context.viewState.roomDetails?.name ?? L10n.screenJoinRoomTitleNoPreview + LoadableAvatarImage(url: context.viewState.roomDetails?.avatarURL, - name: context.viewState.title, + name: title, contentID: context.viewState.roomID, avatarSize: .room(on: .joinRoom), imageProvider: context.imageProvider) .dynamicTypeSize(dynamicTypeSize < .accessibility1 ? dynamicTypeSize : .accessibility1) VStack(spacing: 8) { - Text(context.viewState.title) + Text(title) .font(.compound.headingMDBold) .foregroundStyle(.compound.textPrimary) .multilineTextAlignment(.center) @@ -73,7 +79,7 @@ struct JoinRoomScreen: View { @ViewBuilder var buttons: some View { switch context.viewState.mode { - case .unknown: + case .loading, .unknown: EmptyView() case .knock: Button(L10n.screenJoinRoomKnockAction) { context.send(viewAction: .knock) } @@ -113,11 +119,11 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview { .previewDisplayName("Unknown") .snapshot(delay: 0.25) -// NavigationStack { -// JoinRoomScreen(context: knockViewModel.context) -// } -// .previewDisplayName("Knock") -// .snapshot(delay: 0.25) + NavigationStack { + JoinRoomScreen(context: knockViewModel.context) + } + .previewDisplayName("Knock") + .snapshot(delay: 0.25) NavigationStack { JoinRoomScreen(context: joinViewModel.context) @@ -137,7 +143,7 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview { // swiftlint:disable:next large_tuple let membership: (isJoined: Bool, isInvited: Bool, isPublic: Bool, canKnock: Bool) = switch mode { - case .unknown: + case .loading, .unknown: (false, false, false, false) case .invited: (false, true, false, false) diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knock.png b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knock.png new file mode 100644 index 000000000..8228b2422 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-en-GB.Knock.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4141eb3498060912c08033afe6a4990b884e4c6e5dcfd3a68a43961fe767971b +size 2110440 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knock.png b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knock.png new file mode 100644 index 000000000..8228b2422 --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPad-pseudo.Knock.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4141eb3498060912c08033afe6a4990b884e4c6e5dcfd3a68a43961fe767971b +size 2110440 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-15-en-GB.Knock.png b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-15-en-GB.Knock.png new file mode 100644 index 000000000..6c6f227bc --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-15-en-GB.Knock.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8813f3c236f05d54b3d2d8650756db9cbf464dfab1ff1718d9871b6825aa785a +size 864729 diff --git a/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-15-pseudo.Knock.png b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-15-pseudo.Knock.png new file mode 100644 index 000000000..6c6f227bc --- /dev/null +++ b/PreviewTests/__Snapshots__/PreviewTests/test_joinRoomScreen-iPhone-15-pseudo.Knock.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8813f3c236f05d54b3d2d8650756db9cbf464dfab1ff1718d9871b6825aa785a +size 864729