Skip to content

Commit

Permalink
added the logic to display the banner
Browse files Browse the repository at this point in the history
  • Loading branch information
Velin92 committed Nov 22, 2024
1 parent 7b21add commit 4449579
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ struct RoomDetailsScreenViewState: BindableState {
var canJoinCall = false
var pinnedEventsActionState = RoomDetailsScreenPinnedEventsActionState.loading
var knockingEnabled = false
var isKnockgRoom = false
var isKnockableRoom = false

var canSeeKnockingRequests: Bool {
knockingEnabled && dmRecipient == nil && isKnockgRoom && (canInviteUsers || canKickUsers || canBanUsers)
knockingEnabled && dmRecipient == nil && isKnockableRoom && (canInviteUsers || canKickUsers || canBanUsers)
}

var canEdit: Bool {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,9 +191,9 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
state.bindings.isFavourite = roomInfo.isFavourite
switch roomInfo.joinRule {
case .knock, .knockRestricted:
state.isKnockgRoom = true
state.isKnockableRoom = true
default:
state.isKnockgRoom = false
state.isKnockableRoom = false
}
}

Expand Down
4 changes: 2 additions & 2 deletions ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ struct RoomScreenViewState: BindableState {
var canAcceptKnocks = false
var canDeclineKnocks = false
var canBan = false
// TODO: We still don't know how to get these, but these will be the non already seen knock requests of the room
var unseenKnockRequests: [KnockRequestInfo] = []
// TODO: We still don't know how to get these, but these will be the non already seen knock requests of the room, for now we are using this as a mock for testing purposes
var unseenKnockRequests: [KnockRequestInfo] = [.init(displayName: "Alice", avatarURL: nil, userID: "@alice:matrix.org", reason: "Helloooo")]

var shouldSeeKnockRequests: Bool {
isKnockingEnabled && isKnockableRoom && !unseenKnockRequests.isEmpty && (canAcceptKnocks || canDeclineKnocks || canBan)
Expand Down
17 changes: 8 additions & 9 deletions ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -240,19 +240,18 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
state.pinnedEventsBannerState = .loading(numbersOfEvents: pinnedEventIDs.count)
}

let userID = roomProxy.ownUserID
if case let .success(permission) = await roomProxy.canUserJoinCall(userID: userID) {
state.canJoinCall = permission
}
state.canAcceptKnocks = await (try? roomProxy.canUserInvite(userID: roomProxy.ownUserID).get()) == true
state.canDeclineKnocks = await (try? roomProxy.canUserKick(userID: roomProxy.ownUserID).get()) == true
state.canBan = await (try? roomProxy.canUserBan(userID: roomProxy.ownUserID).get()) == true
switch roomInfo.joinRule {
case .knock, .knockRestricted:
switch (roomProxy.isEncryptedOneToOneRoom, roomInfo.joinRule) {
case (false, .knock), (false, .knockRestricted):
state.isKnockableRoom = true
default:
state.isKnockableRoom = false
}

let ownUserID = roomProxy.ownUserID
state.canJoinCall = await (try? roomProxy.canUserJoinCall(userID: ownUserID).get()) == true
state.canAcceptKnocks = await (try? roomProxy.canUserInvite(userID: ownUserID).get()) == true
state.canDeclineKnocks = await (try? roomProxy.canUserKick(userID: ownUserID).get()) == true
state.canBan = await (try? roomProxy.canUserBan(userID: ownUserID).get()) == true
}

private func setupPinnedEventsTimelineProviderIfNeeded() {
Expand Down
53 changes: 43 additions & 10 deletions ElementX/Sources/Screens/RoomScreen/View/RoomScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,11 @@ struct RoomScreen: View {
timeline
.background(Color.compound.bgCanvasDefault.ignoresSafeArea())
.overlay(alignment: .top) {
Group {
if roomContext.viewState.shouldShowPinnedEventsBanner {
pinnedItemsBanner
}
}
.animation(.elementDefault, value: roomContext.viewState.shouldShowPinnedEventsBanner)
pinnedItemsBanner
}
// This can overlay on top of the pinnedItemsBanner
.overlay(alignment: .top) {
knockRequestsBanner
}
.safeAreaInset(edge: .bottom, spacing: 0) {
VStack(spacing: 0) {
Expand Down Expand Up @@ -119,11 +118,45 @@ struct RoomScreen: View {
}
}

@ViewBuilder
private var pinnedItemsBanner: some View {
PinnedItemsBannerView(state: roomContext.viewState.pinnedEventsBannerState,
onMainButtonTap: { roomContext.send(viewAction: .tappedPinnedEventsBanner) },
onViewAllButtonTap: { roomContext.send(viewAction: .viewAllPins) })
.transition(.move(edge: .top))
Group {
if roomContext.viewState.shouldShowPinnedEventsBanner {
PinnedItemsBannerView(state: roomContext.viewState.pinnedEventsBannerState,
onMainButtonTap: { roomContext.send(viewAction: .tappedPinnedEventsBanner) },
onViewAllButtonTap: { roomContext.send(viewAction: .viewAllPins) })
.transition(.move(edge: .top))
}
}
.animation(.elementDefault, value: roomContext.viewState.shouldShowPinnedEventsBanner)
}

@ViewBuilder
private var knockRequestsBanner: some View {
Group {
if roomContext.viewState.shouldSeeKnockRequests {
KnockRequestsBannerView(requests: roomContext.viewState.unseenKnockRequests,
onDismiss: dismissKnockRequestsBanner,
onAccept: roomContext.viewState.canAcceptKnocks ? acceptKnockRequest : nil,
onViewAll: onViewAllKnockRequests,
mediaProvider: roomContext.mediaProvider)
.padding(.top, 16)
.transition(.move(edge: .top))
}
}
.animation(.elementDefault, value: roomContext.viewState.shouldSeeKnockRequests)
}

private func dismissKnockRequestsBanner() {
// TODO: Implement
}

private func acceptKnockRequest(userID: String) {
// TODO: Implement
}

private func onViewAllKnockRequests() {
// TODO: Implement
}

private var scrollToBottomButton: some View {
Expand Down

0 comments on commit 4449579

Please sign in to comment.