From 8aa1ed6b75e9e27dce02d06ef5cd2bf898c8782a Mon Sep 17 00:00:00 2001 From: fmodf Date: Thu, 4 Jul 2024 11:17:05 +0200 Subject: [PATCH] wip --- .../AttachmentMediaPickerView.swift | 52 ++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/ConversationsClassic/View/Screens/Attachments/AttachmentMediaPickerView.swift b/ConversationsClassic/View/Screens/Attachments/AttachmentMediaPickerView.swift index 7ddefde..05d1173 100644 --- a/ConversationsClassic/View/Screens/Attachments/AttachmentMediaPickerView.swift +++ b/ConversationsClassic/View/Screens/Attachments/AttachmentMediaPickerView.swift @@ -2,11 +2,16 @@ import AVFoundation import Photos import SwiftUI +struct SelectedMedia { + let path: String +} + struct AttachmentMediaPickerView: View { @State private var isCameraAccessGranted = AVCaptureDevice.authorizationStatus(for: .video) == .authorized @State private var isGalleryAccessGranted = PHPhotoLibrary.authorizationStatus() == .authorized - @State private var photos = [PhotoView]() + @State private var thumbnails = [ThumbnailView]() + @State private var selectedMedia = [SelectedMedia]() let gridSize = UIScreen.main.bounds.width / 3 @@ -55,7 +60,7 @@ struct AttachmentMediaPickerView: View { // For pictures if isGalleryAccessGranted { - ForEach(photos) { photo in + ForEach(thumbnails) { photo in photo } } else { @@ -155,7 +160,7 @@ struct AttachmentMediaPickerView: View { image?.scaleAndCropImage(toExampleSize: CGSize(width: gridSize, height: gridSize), completion: { image in if let image { DispatchQueue.main.async { - self.photos.append(PhotoView(image: image, gridSize: gridSize)) + self.thumbnails.append(ThumbnailView(image: image, gridSize: gridSize, selected: $selectedMedia)) } } }) @@ -172,7 +177,7 @@ struct AttachmentMediaPickerView: View { thumbnail.scaleAndCropImage(toExampleSize: CGSize(width: gridSize, height: gridSize), completion: { image in if let image { DispatchQueue.main.async { - self.photos.append(PhotoView(image: image, gridSize: gridSize, duration: asset.duration.minAndSec)) + self.thumbnails.append(ThumbnailView(image: image, gridSize: gridSize, selected: $selectedMedia, duration: asset.duration.minAndSec)) } } }) @@ -195,17 +200,20 @@ struct AttachmentMediaPickerView: View { } } -private struct PhotoView: Identifiable, View { +private struct ThumbnailView: Identifiable, View { let id = UUID() let gridSize: CGFloat let duration: String? @State private var image: UIImage @State private var ready = false + @State private var selected = false + @Binding var selectedMedia: [SelectedMedia] - init(image: UIImage, gridSize: CGFloat, duration: String? = nil) { + init(image: UIImage, gridSize: CGFloat, selected: Binding<[SelectedMedia]>, duration: String? = nil) { self.image = image self.gridSize = gridSize + _selectedMedia = selected self.duration = duration } @@ -230,6 +238,38 @@ private struct PhotoView: Identifiable, View { } } } + if selected { + VStack { + HStack { + Spacer() + Circle() + .frame(width: 30, height: 30) + .shadow(color: .black, radius: 2) + .foregroundColor(.Material.Shape.white) + // Circle() + // .fill(Color.Material.Shape.white) + // .frame(width: 30, height: 30) + // .shadow(color: .black, radius: 2) + .overlay { + Image(systemName: "checkmark") + .foregroundColor(.Material.Elements.active) + .font(.body3) + } + .padding(4) + } + Spacer() + } + } + } + .onTapGesture { + withAnimation { + selected.toggle() + if selected { + selectedMedia.append(SelectedMedia(path: id.uuidString)) + } else { + selectedMedia.removeAll { $0.path == id.uuidString } + } + } } } else { ZStack {