tombstoned and upgraded rooms implementation

added tests

tombstoned room avatar
This commit is contained in:
Mauro Romito
2025-06-03 12:52:31 +02:00
committed by Mauro
parent b628f5d2c2
commit 155b47e849
76 changed files with 438 additions and 171 deletions
@@ -151,7 +151,9 @@ struct RoomScreen: View {
@ViewBuilder
private var composer: some View {
if roomContext.viewState.canSendMessage {
if roomContext.viewState.hasSuccessor {
tombstonedDialogue
} else if roomContext.viewState.canSendMessage {
composerToolbar
} else {
Text(L10n.screenRoomTimelineNoPermissionToPost)
@@ -162,6 +164,28 @@ struct RoomScreen: View {
}
}
private var tombstonedDialogue: some View {
VStack(spacing: 16) {
Text(L10n.screenRoomTimelineTombstonedRoomMessage)
.font(.compound.bodyMD)
.foregroundStyle(.compound.textPrimary)
Button {
roomContext.send(viewAction: .displaySuccessorRoom)
} label: {
Text(L10n.screenRoomTimelineTombstonedRoomAction)
.frame(maxWidth: .infinity)
}
.buttonStyle(.compound(.primary, size: .medium))
}
.padding(.top, 16)
.padding(.horizontal, 16)
.padding(.bottom, 8)
.highlight(borderColor: .compound.borderInfoSubtle,
primaryColor: .compound.bgInfoSubtle,
secondaryColor: .compound.bgCanvasDefault)
}
@ViewBuilder
private var loadingIndicator: some View {
if timelineContext.viewState.showLoading {
@@ -233,6 +257,7 @@ struct RoomScreen: View {
struct RoomScreen_Previews: PreviewProvider, TestablePreview {
static let viewModels = makeViewModels()
static let readOnlyViewModels = makeViewModels(canSendMessage: false)
static let tombstonedViewModels = makeViewModels(hasSuccessor: true)
static var previews: some View {
NavigationStack {
@@ -249,13 +274,22 @@ struct RoomScreen_Previews: PreviewProvider, TestablePreview {
}
.previewDisplayName("Read-only")
.snapshotPreferences(expect: readOnlyViewModels.room.context.$viewState.map { !$0.canSendMessage })
NavigationStack {
RoomScreen(roomViewModel: tombstonedViewModels.room,
timelineViewModel: tombstonedViewModels.timeline,
composerToolbar: ComposerToolbar.mock())
}
.previewDisplayName("Tombstoned")
.snapshotPreferences(expect: tombstonedViewModels.room.context.$viewState.map(\.hasSuccessor))
}
static func makeViewModels(canSendMessage: Bool = true) -> ViewModels {
static func makeViewModels(canSendMessage: Bool = true, hasSuccessor: Bool = false) -> ViewModels {
let roomProxyMock = JoinedRoomProxyMock(.init(id: "stable_id",
name: "Preview room",
hasOngoingCall: true,
canUserSendMessage: canSendMessage))
canUserSendMessage: canSendMessage,
successor: hasSuccessor ? .init(roomId: UUID().uuidString, reason: nil) : nil))
let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock)
let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(),
@@ -12,32 +12,44 @@ struct RoomScreenFooterView: View {
let mediaProvider: MediaProviderProtocol?
let callback: (RoomScreenFooterViewAction) -> Void
private var borderColor: Color {
switch details {
case .pinViolation:
.compound.borderInfoSubtle
case .verificationViolation:
.compound.borderCriticalSubtle
case .none:
Color.compound.bgCanvasDefault
}
}
private var gradientColor: Color {
switch details {
case .pinViolation:
.compound.bgInfoSubtle
case .verificationViolation:
.compound.bgCriticalSubtle
case .none:
Color.compound.bgCanvasDefault
}
}
var body: some View {
if let details {
ZStack(alignment: .top) {
switch details {
case .pinViolation(let member, let learnMoreURL):
VStack(spacing: 0) {
Color.compound.borderInfoSubtle
.frame(height: 1)
LinearGradient(colors: [.compound.bgInfoSubtle, .compound.bgCanvasDefault],
startPoint: .top,
endPoint: .bottom)
}
pinViolation(member: member, learnMoreURL: learnMoreURL)
case .verificationViolation(member: let member, learnMoreURL: let learnMoreURL):
VStack(spacing: 0) {
Color.compound.borderCriticalSubtle
.frame(height: 1)
LinearGradient(colors: [.compound.bgCriticalSubtle, .compound.bgCanvasDefault],
startPoint: .top,
endPoint: .bottom)
}
verificationViolation(member: member, learnMoreURL: learnMoreURL)
}
}
.padding(.top, 8)
.fixedSize(horizontal: false, vertical: true)
detailsView(details)
.highlight(borderColor: borderColor, primaryColor: gradientColor, secondaryColor: .compound.bgCanvasDefault)
.padding(.top, 8)
.fixedSize(horizontal: false, vertical: true)
}
}
@ViewBuilder
private func detailsView(_ details: RoomScreenFooterViewDetails) -> some View {
switch details {
case .pinViolation(let member, let learnMoreURL):
pinViolation(member: member, learnMoreURL: learnMoreURL)
case .verificationViolation(member: let member, learnMoreURL: let learnMoreURL):
verificationViolation(member: member, learnMoreURL: learnMoreURL)
}
}