This commit is contained in:
fmodf 2024-08-17 18:15:05 +02:00
parent 72d52f253f
commit a52b2d99b6
11 changed files with 46 additions and 32 deletions

View file

@ -4,21 +4,21 @@ import Photos
import SwiftUI
@MainActor
final class FileStore: ObservableObject {
final class AttachmentsStore: ObservableObject {
@Published var cameraAccessGranted = false
@Published var galleryAccessGranted = false
@Published var galleryItems: [GalleryItem] = []
private let client: Client
private let roster: Roster
init(roster: Roster, client: Client) {
self.client = client
self.roster = roster
}
// private let client: Client
// private let roster: Roster
//
// init(roster: Roster, client: Client) {
// self.client = client
// self.roster = roster
// }
}
extension FileStore {
extension AttachmentsStore {
func checkCameraAuthorization() async {
let status = AVCaptureDevice.authorizationStatus(for: .video)
var isAuthorized = status == .authorized

View file

@ -141,7 +141,7 @@ extension ClientsStore {
}
extension ClientsStore {
func getStores(for roster: Roster) async throws -> (ConversationStore, FileStore) {
func conversation(for roster: Roster) async throws -> ConversationStore {
while !ready {
await Task.yield()
}
@ -150,13 +150,10 @@ extension ClientsStore {
throw ClientStoreError.clientNotFound
}
let conversation = ConversationStore(roster: roster, client: client)
let fileStore = FileStore(roster: roster, client: client)
return (conversation, fileStore)
return ConversationStore(roster: roster, client: client)
}
func getStores(for chat: Chat) async throws -> (ConversationStore, FileStore) {
func conversation(for chat: Chat) async throws -> ConversationStore {
while !ready {
await Task.yield()
}
@ -166,9 +163,6 @@ extension ClientsStore {
}
let roster = try await chat.fetchRoster()
let conversation = ConversationStore(roster: roster, client: client)
let fileStore = FileStore(roster: roster, client: client)
return (conversation, fileStore)
return ConversationStore(roster: roster, client: client)
}
}

View file

@ -51,6 +51,21 @@ extension ConversationStore {
}
}
extension ConversationStore {
var attachmentsStore: AttachmentsStore {
AttachmentsStore()
}
func sendMedia(_ items: [GalleryItem]) async {
print("media!", items)
// guard !ids.isEmpty else { return }
// let items = galleryItems.filter { ids.contains($0.id) }
// for item in items {
// await client.uploadMedia(item.url)
// }
}
}
private extension ConversationStore {
func subscribe() {
messagesCancellable = ValueObservation.tracking(Message

View file

@ -60,9 +60,9 @@ private struct ChatsRow: View {
}
do {
let (conversation, fileStore) = try await clientsStore.getStores(for: chat)
let conversation = try await clientsStore.conversation(for: chat)
router.showScreen(.push) { _ in
ConversationScreen(conversation: conversation, fileStore: fileStore)
ConversationScreen(conversation: conversation)
.navigationBarHidden(true)
}
} catch {

View file

@ -158,9 +158,9 @@ private struct ContactsScreenRow: View {
}
do {
let (conversation, fileStore) = try await clientsStore.getStores(for: roster)
let conversation = try await clientsStore.conversation(for: roster)
router.showScreen(.push) { _ in
ConversationScreen(conversation: conversation, fileStore: fileStore)
ConversationScreen(conversation: conversation)
.navigationBarHidden(true)
}
} catch {

View file

@ -9,6 +9,7 @@ enum AttachmentTab: Int, CaseIterable {
struct AttachmentPickerScreen: View {
@Environment(\.router) var router
@StateObject var attachmentsStore: AttachmentsStore
@State private var selectedTab: AttachmentTab = .media
@ -35,6 +36,7 @@ struct AttachmentPickerScreen: View {
switch selectedTab {
case .media:
MediaPickerView()
.environmentObject(attachmentsStore)
case .files:
Color.blue

View file

@ -3,7 +3,7 @@ import SwiftUI
struct CameraCellPreview: View {
@Environment(\.router) var router
@EnvironmentObject var store: FileStore
@EnvironmentObject var store: AttachmentsStore
var body: some View {
Group {

View file

@ -1,7 +1,7 @@
import SwiftUI
struct GalleryView: View {
@EnvironmentObject var store: FileStore
@EnvironmentObject var store: AttachmentsStore
@Binding var selectedItems: [String]
var body: some View {

View file

@ -4,6 +4,10 @@ import Photos
import SwiftUI
struct MediaPickerView: View {
@Environment(\.router) var router
@EnvironmentObject var conversation: ConversationStore
@EnvironmentObject var store: AttachmentsStore
@State private var selectedItems: [String] = []
var body: some View {
@ -40,8 +44,11 @@ struct MediaPickerView: View {
}
.clipped()
.onTapGesture {
// store.dispatch(.sharingAction(.shareMedia(ids: selectedItems)))
// store.dispatch(.sharingAction(.showSharing(false)))
Task {
let items = store.galleryItems.filter { selectedItems.contains($0.id) }
await conversation.sendMedia(items)
}
router.dismissEnvironment()
}
}
}

View file

@ -6,7 +6,6 @@ import SwiftUI
struct ConversationScreen: View {
@Environment(\.router) var router
@StateObject var conversation: ConversationStore
@StateObject var fileStore: FileStore
@State private var autoScroll = true
@State private var firstIsVisible = true
@ -102,7 +101,6 @@ struct ConversationScreen: View {
.safeAreaInset(edge: .bottom, spacing: 0) {
ConversationTextInput(autoScroll: $autoScroll)
.environmentObject(conversation)
.environmentObject(fileStore)
}
}
}

View file

@ -4,7 +4,6 @@ import UIKit
struct ConversationTextInput: View {
@Environment(\.router) var router
@EnvironmentObject var conversation: ConversationStore
@EnvironmentObject var fileStore: FileStore
@State private var messageStr = ""
@FocusState private var isFocused: Bool
@ -52,9 +51,8 @@ struct ConversationTextInput: View {
.padding(.leading, 8)
.tappablePadding(.symmetric(8)) {
router.showScreen(.fullScreenCover) { _ in
AttachmentPickerScreen()
AttachmentPickerScreen(attachmentsStore: conversation.attachmentsStore)
.environmentObject(conversation)
.environmentObject(fileStore)
}
}
TextField("", text: $messageStr, prompt: Text(L10n.Chat.textfieldPrompt).foregroundColor(.Material.Shape.separator))