wip
This commit is contained in:
parent
e564ae5747
commit
ec7b075b35
|
@ -20,9 +20,6 @@ final class SharingMiddleware {
|
||||||
case .notDetermined:
|
case .notDetermined:
|
||||||
AVCaptureDevice.requestAccess(for: .video) { granted in
|
AVCaptureDevice.requestAccess(for: .video) { granted in
|
||||||
promise(.success(.sharingAction(.setCameraAccess(granted))))
|
promise(.success(.sharingAction(.setCameraAccess(granted))))
|
||||||
// DispatchQueue.main.async {
|
|
||||||
// self.isCameraAccessGranted = granted
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case .denied, .restricted:
|
case .denied, .restricted:
|
||||||
|
@ -44,12 +41,6 @@ final class SharingMiddleware {
|
||||||
case .notDetermined:
|
case .notDetermined:
|
||||||
PHPhotoLibrary.requestAuthorization { status in
|
PHPhotoLibrary.requestAuthorization { status in
|
||||||
promise(.success(.sharingAction(.setGalleryAccess(status == .authorized))))
|
promise(.success(.sharingAction(.setGalleryAccess(status == .authorized))))
|
||||||
// DispatchQueue.main.async {
|
|
||||||
// self.isGalleryAccessGranted = status == .authorized
|
|
||||||
// if self.isGalleryAccessGranted {
|
|
||||||
// self.fetchGallery()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case .denied, .restricted:
|
case .denied, .restricted:
|
||||||
|
@ -164,191 +155,3 @@ final class SharingMiddleware {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// private func fetchGallery() {
|
|
||||||
// let fetchOptions = PHFetchOptions()
|
|
||||||
// fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
|
|
||||||
// let assets = PHAsset.fetchAssets(with: fetchOptions)
|
|
||||||
//
|
|
||||||
// let manager = PHImageManager.default()
|
|
||||||
// let option = PHImageRequestOptions()
|
|
||||||
// option.isSynchronous = true
|
|
||||||
//
|
|
||||||
// assets.enumerateObjects { asset, _, _ in
|
|
||||||
// if asset.mediaType == .image {
|
|
||||||
// manager.requestImage(
|
|
||||||
// for: asset,
|
|
||||||
// targetSize: PHImageManagerMaximumSize,
|
|
||||||
// contentMode: .aspectFill,
|
|
||||||
// options: option
|
|
||||||
// ) { image, _ in
|
|
||||||
// image?.scaleAndCropImage(toExampleSize: CGSize(width: gridSize, height: gridSize), completion: { image in
|
|
||||||
// if let image {
|
|
||||||
// DispatchQueue.main.async {
|
|
||||||
// self.thumbnails.append(ThumbnailView(id: asset.localIdentifier, image: image, gridSize: gridSize, selected: $selectedMedia))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// } else if asset.mediaType == .video {
|
|
||||||
// manager.requestAVAsset(forVideo: asset, options: nil) { avAsset, _, _ in
|
|
||||||
// if let avAsset {
|
|
||||||
// let imageGenerator = AVAssetImageGenerator(asset: avAsset)
|
|
||||||
// imageGenerator.appliesPreferredTrackTransform = true
|
|
||||||
// let time = CMTimeMake(value: 1, timescale: 2)
|
|
||||||
// do {
|
|
||||||
// let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil)
|
|
||||||
// let thumbnail = UIImage(cgImage: imageRef)
|
|
||||||
// thumbnail.scaleAndCropImage(toExampleSize: CGSize(width: gridSize, height: gridSize), completion: { image in
|
|
||||||
// if let image {
|
|
||||||
// DispatchQueue.main.async {
|
|
||||||
// self.thumbnails.append(ThumbnailView(id: asset.localIdentifier, image: image, gridSize: gridSize, selected: $selectedMedia, duration: asset.duration.minAndSec))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// } catch {
|
|
||||||
// print("Failed to create thumbnail image")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// private func sendGalleryMedia(ids _: [String]) {
|
|
||||||
// var media: [AttachmentItem] = []
|
|
||||||
// let dispatchGroup = DispatchGroup()
|
|
||||||
//
|
|
||||||
// let asset = PHAsset.fetchAssets(withLocalIdentifiers: ids, options: nil)
|
|
||||||
// asset.enumerateObjects { asset, _, _ in
|
|
||||||
// dispatchGroup.enter()
|
|
||||||
// if asset.mediaType == .image {
|
|
||||||
// let manager = PHImageManager.default()
|
|
||||||
// let option = PHImageRequestOptions()
|
|
||||||
// option.isSynchronous = true
|
|
||||||
//
|
|
||||||
// manager.requestImage(
|
|
||||||
// for: asset,
|
|
||||||
// targetSize: PHImageManagerMaximumSize,
|
|
||||||
// contentMode: .aspectFill,
|
|
||||||
// options: option
|
|
||||||
// ) { image, _ in
|
|
||||||
// if let image {
|
|
||||||
// let data = image.jpegData(compressionQuality: 1.0) ?? Data()
|
|
||||||
// media.append(.init(type: .image, data: data, string: ""))
|
|
||||||
// }
|
|
||||||
// dispatchGroup.leave()
|
|
||||||
// }
|
|
||||||
// } else if asset.mediaType == .video {
|
|
||||||
// let manager = PHImageManager.default()
|
|
||||||
// let option = PHVideoRequestOptions()
|
|
||||||
// option.version = .current
|
|
||||||
// option.deliveryMode = .highQualityFormat
|
|
||||||
//
|
|
||||||
// manager.requestAVAsset(forVideo: asset, options: option) { avAsset, _, _ in
|
|
||||||
// if let avAsset {
|
|
||||||
// let url = (avAsset as? AVURLAsset)?.url
|
|
||||||
// let data = try? Data(contentsOf: url ?? URL(fileURLWithPath: ""))
|
|
||||||
// media.append(.init(type: .movie, data: data ?? Data(), string: ""))
|
|
||||||
// }
|
|
||||||
// dispatchGroup.leave()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// dispatchGroup.notify(queue: .main) {
|
|
||||||
// store.dispatch(.conversationAction(.sendAttachment(.init(
|
|
||||||
// id: UUID().uuidString,
|
|
||||||
// items: media
|
|
||||||
// ))))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private struct ThumbnailView: Identifiable, View {
|
|
||||||
// let id: String
|
|
||||||
// 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(id: String, image: UIImage, gridSize: CGFloat, selected: Binding<[SelectedMedia]>, duration: String? = nil) {
|
|
||||||
// self.id = id
|
|
||||||
// self.image = image
|
|
||||||
// self.gridSize = gridSize
|
|
||||||
// _selectedMedia = selected
|
|
||||||
// self.duration = duration
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// var body: some View {
|
|
||||||
// if ready {
|
|
||||||
// ZStack {
|
|
||||||
// Image(uiImage: image)
|
|
||||||
// .resizable()
|
|
||||||
// .aspectRatio(contentMode: .fill)
|
|
||||||
// .frame(width: gridSize, height: gridSize)
|
|
||||||
// .clipped()
|
|
||||||
// if let duration {
|
|
||||||
// VStack {
|
|
||||||
// Spacer()
|
|
||||||
// HStack {
|
|
||||||
// Spacer()
|
|
||||||
// Text(duration)
|
|
||||||
// .foregroundColor(.Material.Text.white)
|
|
||||||
// .font(.sub1)
|
|
||||||
// .shadow(color: .black, radius: 2)
|
|
||||||
// .padding(4)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if selected {
|
|
||||||
// VStack {
|
|
||||||
// HStack {
|
|
||||||
// Spacer()
|
|
||||||
// Circle()
|
|
||||||
// .frame(width: 30, height: 30)
|
|
||||||
// .shadow(color: .black, radius: 2)
|
|
||||||
// .foregroundColor(.Material.Shape.white)
|
|
||||||
// .overlay {
|
|
||||||
// Image(systemName: "checkmark")
|
|
||||||
// .foregroundColor(.Material.Elements.active)
|
|
||||||
// .font(.body3)
|
|
||||||
// }
|
|
||||||
// .padding(4)
|
|
||||||
// }
|
|
||||||
// Spacer()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// .onTapGesture {
|
|
||||||
// withAnimation {
|
|
||||||
// selected.toggle()
|
|
||||||
// if selected {
|
|
||||||
// selectedMedia.append(SelectedMedia(id: id))
|
|
||||||
// } else {
|
|
||||||
// selectedMedia.removeAll { $0.id == id }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// ZStack {
|
|
||||||
// Rectangle()
|
|
||||||
// .fill(Color.Material.Background.light)
|
|
||||||
// .overlay {
|
|
||||||
// ProgressView()
|
|
||||||
// }
|
|
||||||
// .frame(width: gridSize, height: gridSize)
|
|
||||||
// }
|
|
||||||
// .onAppear {
|
|
||||||
// image.scaleAndCropImage(toExampleSize: CGSize(width: gridSize, height: gridSize), completion: { image in
|
|
||||||
// if let image {
|
|
||||||
// self.image = image
|
|
||||||
// ready = true
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
|
@ -3,15 +3,12 @@ import MobileCoreServices
|
||||||
import Photos
|
import Photos
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct SelectedMedia {
|
|
||||||
let id: String
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AttachmentMediaPickerView: View {
|
struct AttachmentMediaPickerView: View {
|
||||||
@EnvironmentObject var store: AppStore
|
@EnvironmentObject var store: AppStore
|
||||||
|
|
||||||
@State private var selectedMedia = [SelectedMedia]()
|
|
||||||
@State private var showCameraPicker = false
|
@State private var showCameraPicker = false
|
||||||
|
@State private var cameraReady = false
|
||||||
|
|
||||||
|
@State private var selectedItems: [String] = []
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let columns = Array(repeating: GridItem(.flexible(), spacing: 0), count: 3)
|
let columns = Array(repeating: GridItem(.flexible(), spacing: 0), count: 3)
|
||||||
|
@ -22,22 +19,33 @@ struct AttachmentMediaPickerView: View {
|
||||||
LazyVGrid(columns: columns, spacing: 0) {
|
LazyVGrid(columns: columns, spacing: 0) {
|
||||||
// For camera
|
// For camera
|
||||||
if store.state.sharingState.isCameraAccessGranted {
|
if store.state.sharingState.isCameraAccessGranted {
|
||||||
ZStack {
|
if cameraReady {
|
||||||
CameraView()
|
ZStack {
|
||||||
.aspectRatio(1, contentMode: .fit)
|
CameraView()
|
||||||
|
.aspectRatio(1, contentMode: .fit)
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
Image(systemName: "camera")
|
||||||
|
.resizable()
|
||||||
|
.aspectRatio(contentMode: .fit)
|
||||||
|
.frame(width: 40, height: 40)
|
||||||
|
.foregroundColor(.white)
|
||||||
|
.padding(8)
|
||||||
|
.background(Color.black.opacity(0.5))
|
||||||
|
.clipShape(Circle())
|
||||||
|
.padding(8)
|
||||||
|
}
|
||||||
|
.onTapGesture {
|
||||||
|
showCameraPicker = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ProgressView()
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
Image(systemName: "camera")
|
.frame(height: 100)
|
||||||
.resizable()
|
.onAppear {
|
||||||
.aspectRatio(contentMode: .fit)
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
|
||||||
.frame(width: 40, height: 40)
|
cameraReady = true
|
||||||
.foregroundColor(.white)
|
}
|
||||||
.padding(8)
|
}
|
||||||
.background(Color.black.opacity(0.5))
|
|
||||||
.clipShape(Circle())
|
|
||||||
.padding(8)
|
|
||||||
}
|
|
||||||
.onTapGesture {
|
|
||||||
showCameraPicker = true
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Button {
|
Button {
|
||||||
|
@ -64,7 +72,7 @@ struct AttachmentMediaPickerView: View {
|
||||||
// For gallery
|
// For gallery
|
||||||
if store.state.sharingState.isGalleryAccessGranted {
|
if store.state.sharingState.isGalleryAccessGranted {
|
||||||
ForEach(store.state.sharingState.galleryItems) { item in
|
ForEach(store.state.sharingState.galleryItems) { item in
|
||||||
GridViewItem(item: item)
|
GridViewItem(item: item, selected: $selectedItems)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Button {
|
Button {
|
||||||
|
@ -102,7 +110,7 @@ struct AttachmentMediaPickerView: View {
|
||||||
Rectangle()
|
Rectangle()
|
||||||
.foregroundColor(.Material.Shape.black)
|
.foregroundColor(.Material.Shape.black)
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
.frame(height: self.selectedMedia.isEmpty ? 0 : 50)
|
.frame(height: self.selectedItems.isEmpty ? 0 : 50)
|
||||||
.overlay {
|
.overlay {
|
||||||
HStack {
|
HStack {
|
||||||
Text(L10n.Attachment.Send.media)
|
Text(L10n.Attachment.Send.media)
|
||||||
|
@ -117,7 +125,7 @@ struct AttachmentMediaPickerView: View {
|
||||||
}
|
}
|
||||||
.clipped()
|
.clipped()
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
let ids = selectedMedia.map { $0.id }
|
// let ids = selectedMedia.map { $0.id }
|
||||||
// sendGalleryMedia(ids: ids)
|
// sendGalleryMedia(ids: ids)
|
||||||
store.dispatch(.sharingAction(.showSharing(false)))
|
store.dispatch(.sharingAction(.showSharing(false)))
|
||||||
}
|
}
|
||||||
|
@ -125,10 +133,6 @@ struct AttachmentMediaPickerView: View {
|
||||||
.onAppear {
|
.onAppear {
|
||||||
store.dispatch(.sharingAction(.checkCameraAccess))
|
store.dispatch(.sharingAction(.checkCameraAccess))
|
||||||
store.dispatch(.sharingAction(.checkGalleryAccess))
|
store.dispatch(.sharingAction(.checkGalleryAccess))
|
||||||
// DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + 0.2) {
|
|
||||||
// checkCameraAccess()
|
|
||||||
// checkGalleryAccess()
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
.onChange(of: store.state.sharingState.isGalleryAccessGranted) { granted in
|
.onChange(of: store.state.sharingState.isGalleryAccessGranted) { granted in
|
||||||
if granted {
|
if granted {
|
||||||
|
@ -140,6 +144,8 @@ struct AttachmentMediaPickerView: View {
|
||||||
|
|
||||||
private struct GridViewItem: View {
|
private struct GridViewItem: View {
|
||||||
let item: SharingGalleryItem
|
let item: SharingGalleryItem
|
||||||
|
@Binding var selected: [String]
|
||||||
|
@State var isSelected = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if let data = item.thumbnail {
|
if let data = item.thumbnail {
|
||||||
|
@ -162,34 +168,32 @@ private struct GridViewItem: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if selected {
|
if isSelected {
|
||||||
// VStack {
|
VStack {
|
||||||
// HStack {
|
HStack {
|
||||||
// Spacer()
|
Spacer()
|
||||||
// Circle()
|
Circle()
|
||||||
// .frame(width: 30, height: 30)
|
.frame(width: 30, height: 30)
|
||||||
// .shadow(color: .black, radius: 2)
|
.shadow(color: .black, radius: 2)
|
||||||
// .foregroundColor(.Material.Shape.white)
|
.foregroundColor(.Material.Shape.white)
|
||||||
// .overlay {
|
.overlay {
|
||||||
// Image(systemName: "checkmark")
|
Image(systemName: "checkmark")
|
||||||
// .foregroundColor(.Material.Elements.active)
|
.foregroundColor(.Material.Elements.active)
|
||||||
// .font(.body3)
|
.font(.body3)
|
||||||
// }
|
}
|
||||||
// .padding(4)
|
.padding(4)
|
||||||
// }
|
}
|
||||||
// Spacer()
|
Spacer()
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
// withAnimation {
|
isSelected.toggle()
|
||||||
// selected.toggle()
|
if isSelected {
|
||||||
// if selected {
|
selected.removeAll { $0 == item.id }
|
||||||
// selectedMedia.append(SelectedMedia(id: id))
|
} else {
|
||||||
// } else {
|
selected.append(item.id)
|
||||||
// selectedMedia.removeAll { $0.id == id }
|
}
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ZStack {
|
ZStack {
|
||||||
|
|
Loading…
Reference in a new issue