diff --git a/Anytype.xcodeproj/project.pbxproj b/Anytype.xcodeproj/project.pbxproj index 3625519ee4..d57dbb69cd 100644 --- a/Anytype.xcodeproj/project.pbxproj +++ b/Anytype.xcodeproj/project.pbxproj @@ -336,6 +336,9 @@ 2A1F94932979579B00E25782 /* CommonWidgetModuleOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1F94922979579B00E25782 /* CommonWidgetModuleOutput.swift */; }; 2A1F949929795FEB00E25782 /* FavoriteSubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1F949829795FEB00E25782 /* FavoriteSubscriptionService.swift */; }; 2A20B9192AFBC26C001D0014 /* AnytypeRelativeDateTimeFormatterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A20B9182AFBC26C001D0014 /* AnytypeRelativeDateTimeFormatterTests.swift */; }; + 2A21A4002C45798F006D320E /* DiscussionCoordinatorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A21A3FF2C45798F006D320E /* DiscussionCoordinatorViewModel.swift */; }; + 2A21A4022C457B89006D320E /* DiscussionModuleOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A21A4012C457B89006D320E /* DiscussionModuleOutput.swift */; }; + 2A21A4042C457BDB006D320E /* DiscussionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A21A4032C457BDB006D320E /* DiscussionViewModel.swift */; }; 2A25D15D29F2ED5000AB5D9E /* StandardPlainButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A25D15C29F2ED5000AB5D9E /* StandardPlainButtonStyle.swift */; }; 2A26982A2B3C2E4000A9C08D /* NodeUsageInfo+Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2698292B3C2E4000A9C08D /* NodeUsageInfo+Placeholder.swift */; }; 2A27F9B82B8DDB1F00BA1303 /* AsyncThrowsTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A27F9B72B8DDB1F00BA1303 /* AsyncThrowsTask.swift */; }; @@ -2150,6 +2153,9 @@ 2A1F949829795FEB00E25782 /* FavoriteSubscriptionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteSubscriptionService.swift; sourceTree = ""; }; 2A20B9182AFBC26C001D0014 /* AnytypeRelativeDateTimeFormatterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AnytypeRelativeDateTimeFormatterTests.swift; path = AnyTypeTests/Formatters/AnytypeRelativeDateTimeFormatterTests.swift; sourceTree = SOURCE_ROOT; }; 2A20B91A2AFBCBB3001D0014 /* AnytypeTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = AnytypeTests.xctestplan; sourceTree = ""; }; + 2A21A3FF2C45798F006D320E /* DiscussionCoordinatorViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscussionCoordinatorViewModel.swift; sourceTree = ""; }; + 2A21A4012C457B89006D320E /* DiscussionModuleOutput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscussionModuleOutput.swift; sourceTree = ""; }; + 2A21A4032C457BDB006D320E /* DiscussionViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscussionViewModel.swift; sourceTree = ""; }; 2A25D15C29F2ED5000AB5D9E /* StandardPlainButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardPlainButtonStyle.swift; sourceTree = ""; }; 2A2698292B3C2E4000A9C08D /* NodeUsageInfo+Placeholder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NodeUsageInfo+Placeholder.swift"; sourceTree = ""; }; 2A27F9B72B8DDB1F00BA1303 /* AsyncThrowsTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncThrowsTask.swift; sourceTree = ""; }; @@ -5701,6 +5707,8 @@ 2ABC49E32C3EE81B00227F09 /* Container */, 2A4191E42C36924E00117FB8 /* Input */, 2A4191DF2C368FB700117FB8 /* DiscussionView.swift */, + 2A21A4012C457B89006D320E /* DiscussionModuleOutput.swift */, + 2A21A4032C457BDB006D320E /* DiscussionViewModel.swift */, ); path = Discussion; sourceTree = ""; @@ -5709,6 +5717,7 @@ isa = PBXGroup; children = ( 2A4191E22C368FD800117FB8 /* DiscussionCoordinatorView.swift */, + 2A21A3FF2C45798F006D320E /* DiscussionCoordinatorViewModel.swift */, ); path = DiscussionCoordinator; sourceTree = ""; @@ -11250,6 +11259,7 @@ 2ABBAEDD2BF4EEBC00EBA8FA /* WidgetObjectListFilesView.swift in Sources */, 2ABF214929B2052900E872D9 /* DashboardClearCacheAlertModel.swift in Sources */, 3D1CEC2227F38871000D36BA /* DashboardAccountDeletionAlert.swift in Sources */, + 2A21A4022C457B89006D320E /* DiscussionModuleOutput.swift in Sources */, 2A28D03D297E8C4C00E55E15 /* SetsSubscriptionService.swift in Sources */, 3DE5121626728C0F00153962 /* BaseDocumentProtocol.swift in Sources */, 2ABBAEF32BFB8FCF00EBA8FA /* CollectionsCommonListWidgetSubmoduleView.swift in Sources */, @@ -11555,6 +11565,7 @@ 2ACDC9C82B5676820063BFBD /* ShareSelectionRow.swift in Sources */, 2EC669212A166FD1001F71BC /* JoinFlowStepOutput.swift in Sources */, 0AD7695925D5908E00669F8C /* FileActionsService.swift in Sources */, + 2A21A4002C45798F006D320E /* DiscussionCoordinatorViewModel.swift in Sources */, 125B6EC226F235F400BCD7D6 /* CursorModeAccessoryViewDelegate.swift in Sources */, 2ABBAEED2BFB893600EBA8FA /* FavoriteTreeWidgetsubmoduleView.swift in Sources */, 2AA4C26F2A70287100C2EC66 /* WorkspacesSubscriptionBuilder.swift in Sources */, @@ -12587,6 +12598,7 @@ 868572512AE6A4CD00F0A747 /* SpaceSearchViewModel.swift in Sources */, 3DD5A5FB2BE4EC0B00F1EE69 /* MembershipOwnerInfoSheetViewModel.swift in Sources */, 2AAEAB5F2BD93CF200E88767 /* ForceDeleteAlertModel.swift in Sources */, + 2A21A4042C457BDB006D320E /* DiscussionViewModel.swift in Sources */, 12928C8C27BD3C0B00CE94C3 /* IntrinsicPopupLayout.swift in Sources */, 538F1728272C126F009528E7 /* SearchViewModelProtocol.swift in Sources */, 2E2D256428880C8D00E3DFD1 /* SetFiltersSelectionHeaderViewModel.swift in Sources */, diff --git a/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorView.swift index e13354340e..f3617986e1 100644 --- a/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorView.swift +++ b/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorView.swift @@ -1,11 +1,21 @@ import SwiftUI struct DiscussionCoordinatorView: View { + + @StateObject private var model: DiscussionCoordinatorViewModel + + init(data: EditorDiscussionObject) { + self._model = StateObject(wrappedValue: DiscussionCoordinatorViewModel(data: data)) + } + var body: some View { - DiscussionView() + DiscussionView(spaceId: model.spaceId, output: model) + .sheet(item: $model.objectToMessageSearchData) { + BlockObjectSearchView(data: $0) + } } } #Preview { - DiscussionCoordinatorView() + DiscussionCoordinatorView(data: EditorDiscussionObject(spaceId: "")) } diff --git a/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorViewModel.swift new file mode 100644 index 0000000000..c3beb748d9 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Flows/DiscussionCoordinator/DiscussionCoordinatorViewModel.swift @@ -0,0 +1,15 @@ +import Foundation + +final class DiscussionCoordinatorViewModel: ObservableObject, DiscussionModuleOutput { + + let spaceId: String + @Published var objectToMessageSearchData: BlockObjectSearchData? + + init(data: EditorDiscussionObject) { + self.spaceId = data.spaceId + } + + func onLinkObjectSelected(data: BlockObjectSearchData) { + objectToMessageSearchData = data + } +} diff --git a/Anytype/Sources/PresentationLayer/Flows/EditorFlow/EditorCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Flows/EditorFlow/EditorCoordinatorView.swift index 282bdbd87c..65ebce2a36 100644 --- a/Anytype/Sources/PresentationLayer/Flows/EditorFlow/EditorCoordinatorView.swift +++ b/Anytype/Sources/PresentationLayer/Flows/EditorFlow/EditorCoordinatorView.swift @@ -36,8 +36,8 @@ struct EditorCoordinatorView: View { EditorPageCoordinatorView(data: data, showHeader: true, setupEditorInput: { _, _ in }) case .set(let data): EditorSetCoordinatorView(data: data) - case .discussion: - DiscussionCoordinatorView() + case .discussion(let data): + DiscussionCoordinatorView(data: data) } } } diff --git a/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionModuleOutput.swift b/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionModuleOutput.swift new file mode 100644 index 0000000000..ef582f659a --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionModuleOutput.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol DiscussionModuleOutput: AnyObject { + func onLinkObjectSelected(data: BlockObjectSearchData) +} diff --git a/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionView.swift b/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionView.swift index cc365a34eb..3d35268b30 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionView.swift @@ -2,6 +2,12 @@ import SwiftUI struct DiscussionView: View { + @StateObject private var model: DiscussionViewModel + + init(spaceId: String, output: DiscussionModuleOutput?) { + self._model = StateObject(wrappedValue: DiscussionViewModel(spaceId: spaceId, output: output)) + } + var body: some View { DiscussionSpacingContainer { ScrollView { @@ -27,7 +33,9 @@ struct DiscussionView: View { } } .safeAreaInset(edge: .bottom, spacing: 0) { - DiscusionInput() + DiscusionInput { + model.onTapAddObjectToMessage() + } } } } @@ -42,5 +50,5 @@ struct DiscussionView: View { } #Preview { - DiscussionView() + DiscussionView(spaceId: "", output: nil) } diff --git a/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionViewModel.swift new file mode 100644 index 0000000000..6bc05ab142 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/Discussion/DiscussionViewModel.swift @@ -0,0 +1,26 @@ +import Foundation + +@MainActor +final class DiscussionViewModel: ObservableObject { + + private let spaceId: String + private weak var output: DiscussionModuleOutput? + + init(spaceId: String, output: DiscussionModuleOutput?) { + self.spaceId = spaceId + self.output = output + } + + func onTapAddObjectToMessage() { + let data = BlockObjectSearchData( + title: Loc.linkTo, + spaceId: spaceId, + excludedObjectIds: [], + excludedLayouts: [], + onSelect: { details in + // TODO: Handle Selected object + } + ) + output?.onLinkObjectSelected(data: data) + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/Discussion/Input/DiscusionInput.swift b/Anytype/Sources/PresentationLayer/Modules/Discussion/Input/DiscusionInput.swift index c1ff555a1e..5ec745ee15 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Discussion/Input/DiscusionInput.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Discussion/Input/DiscusionInput.swift @@ -3,13 +3,15 @@ import SwiftUI struct DiscusionInput: View { @State private var editing: Bool = false + let onTapAddObject: () -> Void var body: some View { HStack { - Image(asset: .X32.plus) - .onTapGesture { - editing = false - } + Button { + onTapAddObject() + } label: { + Image(asset: .X32.plus) + } DiscussionTextView(editing: $editing, minHeight: 56, maxHeight: 212) } .overlay(alignment: .top) { @@ -20,5 +22,5 @@ struct DiscusionInput: View { } #Preview { - DiscusionInput() + DiscusionInput(onTapAddObject: {}) } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift index cb6ea9c3c4..5db4e0f3ea 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift @@ -112,7 +112,7 @@ final class HomeWidgetsViewModel: ObservableObject { } func onTapDiscussion() { - output?.onObjectSelected(screenData: .discussion) + output?.onObjectSelected(screenData: .discussion(EditorDiscussionObject(spaceId: spaceId))) } // MARK: - Private diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Assembly/EditorScreenData.swift b/Anytype/Sources/PresentationLayer/TextEditor/Assembly/EditorScreenData.swift index 653992e614..01089f74a1 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Assembly/EditorScreenData.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Assembly/EditorScreenData.swift @@ -10,7 +10,7 @@ enum EditorScreenData: Hashable, Codable { case bin case page(EditorPageObject) case set(EditorSetObject) - case discussion + case discussion(EditorDiscussionObject) } struct EditorPageObject: Hashable, Codable { @@ -54,6 +54,10 @@ struct EditorSetObject: Hashable, Codable { } } +struct EditorDiscussionObject: Hashable, Codable { + let spaceId: String +} + struct EditorInlineSetObject: Hashable, Codable { let blockId: String let targetObjectID: String