Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions Anytype/Sources/PresentationLayer/Modules/Chat/ChatView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,16 @@ struct ChatView: View {
.ignoresSafeArea()
}
.overlay(alignment: .top) {
ChatHeaderView(spaceId: model.spaceId, chatId: model.chatId) {
model.onTapWidgets()
}
ChatHeaderView(
spaceId: model.spaceId,
chatId: model.chatId,
onTapOpenWidgets: {
model.onTapWidgets()
},
onTapAddMembers: {
model.onTapInviteLink()
}
)
}
.onAppear {
model.keyboardDismiss = keyboardDismiss
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
import Foundation
import SwiftUI
import Services

struct ChatHeaderView: View {

@StateObject private var model: ChatHeaderViewModel

init(spaceId: String, chatId: String, onTapOpenWidgets: @escaping () -> Void) {
self._model = StateObject(wrappedValue: ChatHeaderViewModel(spaceId: spaceId, chatId: chatId, onTapOpenWidgets: onTapOpenWidgets))

init(
spaceId: String,
chatId: String,
onTapOpenWidgets: @escaping () -> Void,
onTapAddMembers: @escaping (() -> Void)
) {
self._model = StateObject(wrappedValue: ChatHeaderViewModel(
spaceId: spaceId,
chatId: chatId,
onTapOpenWidgets: onTapOpenWidgets,
onTapAddMembers: onTapAddMembers
))
}

var body: some View {
Expand All @@ -33,12 +44,23 @@ struct ChatHeaderView: View {
}
}
} rightView: {
if model.showWidgetsButton {
ExpandedTapAreaButton {
model.tapOpenWidgets()
} label: {
IconView(icon: model.icon)
.frame(width: 28, height: 28)
HStack(spacing: 16) {
if model.showAddMembersButton {
ExpandedTapAreaButton {
model.tapAddMembers()
} label: {
Image(systemName: "person.fill.badge.plus")
.foregroundColor(.Control.transparentSecondary)
.frame(width: 28, height: 28)
}
}
if model.showWidgetsButton {
ExpandedTapAreaButton {
model.tapOpenWidgets()
} label: {
IconView(icon: model.icon)
.frame(width: 28, height: 28)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,41 @@ import AnytypeCore

@MainActor
final class ChatHeaderViewModel: ObservableObject {

@Injected(\.workspaceStorage)
private var workspaceStorage: any WorkspacesStorageProtocol
@Injected(\.syncStatusStorage)
private var syncStatusStorage: any SyncStatusStorageProtocol
@Injected(\.participantSpacesStorage)
private var participantSpacesStorage: any ParticipantSpacesStorageProtocol
private let openDocumentProvider: any OpenedDocumentsProviderProtocol = Container.shared.openedDocumentProvider()

@Published var title: String?
@Published var icon: Icon?
@Published var showWidgetsButton: Bool = false
@Published var chatLoading = false
@Published var spaceLoading = false
@Published var muted = false

var showLoading: Bool {
chatLoading || spaceLoading
}

@Published var showAddMembersButton: Bool = false

var showLoading: Bool { chatLoading || spaceLoading }

private let spaceId: String
private let chatId: String
private let onTapOpenWidgets: () -> Void
private let onTapAddMembers: (() -> Void)
private let chatObject: any BaseDocumentProtocol

init(spaceId: String, chatId: String, onTapOpenWidgets: @escaping () -> Void) {

init(
spaceId: String,
chatId: String,
onTapOpenWidgets: @escaping () -> Void,
onTapAddMembers: @escaping (() -> Void)
) {
self.spaceId = spaceId
self.chatId = chatId
self.onTapOpenWidgets = onTapOpenWidgets
self.onTapAddMembers = onTapAddMembers
self.chatObject = openDocumentProvider.document(objectId: chatId, spaceId: spaceId)
}

Expand All @@ -44,18 +52,20 @@ final class ChatHeaderViewModel: ObservableObject {
_ = await (spaceViewSub, chatSub, spaceStatusSub)
}

func tapOpenWidgets() {
onTapOpenWidgets()
}
func tapOpenWidgets() { onTapOpenWidgets() }

func tapAddMembers() { onTapAddMembers() }

// MARK: - Private

private func subscribeOnSpaceView() async {
for await spaceView in workspaceStorage.spaceViewPublisher(spaceId: spaceId).values {
for await participantSpaceView in participantSpacesStorage.participantSpaceViewPublisher(spaceId: spaceId).values {
let spaceView = participantSpaceView.spaceView
title = spaceView.title
icon = spaceView.objectIconImage
showWidgetsButton = spaceView.chatId == chatId && spaceView.initialScreenIsChat
muted = FeatureFlags.muteSpacePossibility && !spaceView.pushNotificationMode.isUnmutedAll
showAddMembersButton = participantSpaceView.participant?.permission == .owner
}
}

Expand Down