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
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,11 @@ final class ChatCoordinatorViewModel: ChatModuleOutput {
func onWidgetsSelected() {
pageNavigation?.pushHome()
}


func onSpaceSettingsSelected() {
pageNavigation?.open(.spaceInfo(.settings(spaceId: spaceId)))
}

func onInviteLinkSelected() {
spaceShareData = SpaceShareData(spaceId: spaceId, route: .chat)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ protocol ChatModuleOutput: AnyObject {
func onShowCameraSelected(data: SimpleCameraData)
func onUrlSelected(url: URL)
func onWidgetsSelected()
func onSpaceSettingsSelected()
func onInviteLinkSelected()
func onShowQrCodeSelected(url: URL)
func onPushNotificationsAlertSelected()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ struct ChatView: View {
onTapOpenWidgets: {
model.onTapWidgets()
},
onTapOpenSpaceSettings: {
model.onTapSpaceSettings()
},
onTapAddMembers: {
model.onTapInviteLink()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,11 @@ final class ChatViewModel: MessageModuleOutput, ChatActionProviderHandler {
func onTapWidgets() {
output?.onWidgetsSelected()
}


func onTapSpaceSettings() {
output?.onSpaceSettingsSelected()
}

func onTapInviteLink() {
output?.onInviteLinkSelected()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ struct ChatHeaderView: View {
spaceId: String,
chatId: String,
onTapOpenWidgets: @escaping () -> Void,
onTapOpenSpaceSettings: @escaping () -> Void,
onTapAddMembers: @escaping (() -> Void)
) {
self._model = StateObject(wrappedValue: ChatHeaderViewModel(
spaceId: spaceId,
chatId: chatId,
onTapOpenWidgets: onTapOpenWidgets,
onTapOpenSpaceSettings: onTapOpenSpaceSettings,
onTapAddMembers: onTapAddMembers
))
}
Expand Down Expand Up @@ -54,9 +56,18 @@ struct ChatHeaderView: View {
.frame(width: 28, height: 28)
}
}
if model.showWidgetsButton {
if model.isMultiChatSpace {
ObjectSettingsMenuContainer(
objectId: model.chatId,
spaceId: model.spaceId,
output: nil
) {
IconView(icon: model.icon)
.frame(width: 28, height: 28)
}
} else {
ExpandedTapAreaButton {
model.tapOpenWidgets()
model.tapOpenSpaceSettings()
} label: {
IconView(icon: model.icon)
.frame(width: 28, height: 28)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,19 @@ final class ChatHeaderViewModel: ObservableObject {

@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
@Published var showAddMembersButton: Bool = false
@Published private(set) var isMultiChatSpace: Bool = false

var showLoading: Bool { chatLoading || spaceLoading }

private let spaceId: String
private let chatId: String
let spaceId: String
let chatId: String

private let onTapOpenWidgets: () -> Void
private let onTapOpenSpaceSettings: () -> Void
private let onTapAddMembers: (() -> Void)
private let chatObject: any BaseDocumentProtocol

Expand All @@ -40,11 +42,13 @@ final class ChatHeaderViewModel: ObservableObject {
spaceId: String,
chatId: String,
onTapOpenWidgets: @escaping () -> Void,
onTapOpenSpaceSettings: @escaping () -> Void,
onTapAddMembers: @escaping (() -> Void)
) {
self.spaceId = spaceId
self.chatId = chatId
self.onTapOpenWidgets = onTapOpenWidgets
self.onTapOpenSpaceSettings = onTapOpenSpaceSettings
self.onTapAddMembers = onTapAddMembers
self.chatObject = openDocumentProvider.document(objectId: chatId, spaceId: spaceId)
}
Expand All @@ -60,6 +64,8 @@ final class ChatHeaderViewModel: ObservableObject {

func tapOpenWidgets() { onTapOpenWidgets() }

func tapOpenSpaceSettings() { onTapOpenSpaceSettings() }

func tapAddMembers() { onTapAddMembers() }

// MARK: - Private
Expand All @@ -68,9 +74,9 @@ final class ChatHeaderViewModel: ObservableObject {
for await participantSpaceView in participantSpacesStorage.participantSpaceViewPublisher(spaceId: spaceId).values {
let spaceView = participantSpaceView.spaceView
spaceSupportsMultiChats = spaceView.uxType.supportsMultiChats
isMultiChatSpace = spaceSupportsMultiChats
spaceTitle = spaceView.title
spaceIcon = spaceView.objectIconImage
showWidgetsButton = spaceView.chatId == chatId && spaceView.initialScreenIsChat
muted = !spaceView.effectiveNotificationMode(for: chatId).isUnmutedAll
showAddMembersButton = participantSpaceView.participant?.permission == .owner
updateHeaderDisplay()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
import SwiftUI
import AnytypeCore

struct ObjectSettingsMenuContainer: View {
struct ObjectSettingsMenuContainer<Label: View>: View {

@StateObject private var model: ObjectSettingsCoordinatorViewModel
private let label: () -> Label

init(objectId: String, spaceId: String, output: (any ObjectSettingsCoordinatorOutput)?) {
init(
objectId: String,
spaceId: String,
output: (any ObjectSettingsCoordinatorOutput)?,
@ViewBuilder label: @escaping () -> Label
) {
self._model = StateObject(wrappedValue: ObjectSettingsCoordinatorViewModel(objectId: objectId, spaceId: spaceId, output: output))
self.label = label
}

var body: some View {
ObjectSettingsMenuView(objectId: model.objectId, spaceId: model.spaceId, output: model)
ObjectSettingsMenuView(objectId: model.objectId, spaceId: model.spaceId, output: model, labelView: label)
.sheet(item: $model.coverPickerData) {
ObjectCoverPicker(data: $0)
}
Expand All @@ -31,3 +38,14 @@ struct ObjectSettingsMenuContainer: View {
}
}
}

extension ObjectSettingsMenuContainer where Label == AnyView {
init(objectId: String, spaceId: String, output: (any ObjectSettingsCoordinatorOutput)?) {
self.init(objectId: objectId, spaceId: spaceId, output: output) {
AnyView(
Image(asset: .X24.more)
.foregroundColor(.Text.primary)
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
import SwiftUI
import AnytypeCore

struct ObjectSettingsMenuView: View {
struct ObjectSettingsMenuView<LabelView: View>: View {

@State private var viewModel: ObjectSettingsMenuViewModel
private let labelView: LabelView

init(
objectId: String,
spaceId: String,
output: some ObjectSettingsModelOutput
output: some ObjectSettingsModelOutput,
@ViewBuilder labelView: () -> LabelView
) {
let settingsVM = ObjectSettingsViewModel(objectId: objectId, spaceId: spaceId, output: output)
let actionsVM = ObjectActionsViewModel(objectId: objectId, spaceId: spaceId, output: settingsVM)
self._viewModel = State(wrappedValue: ObjectSettingsMenuViewModel(settingsViewModel: settingsVM, actionsViewModel: actionsVM))
self.labelView = labelView()
}

var body: some View {
Expand All @@ -24,8 +27,7 @@ struct ObjectSettingsMenuView: View {
renderSection(section)
}
} label: {
Image(asset: .X24.more)
.foregroundColor(.Text.primary)
labelView
}
.task {
await viewModel.startTasks()
Expand Down