another.im-ios/ConversationsClassic/View/Screens/Attachments/AttachmentMediaPickerView.swift
2024-07-03 12:47:59 +02:00

142 lines
4.3 KiB
Swift

import SwiftUI
struct AttachmentMediaPickerView: View {
@StateObject private var mediaManager = MediaManager()
var body: some View {
ScrollView {
LazyVGrid(columns: Array(repeating: .init(.flexible()), count: 3)) {
ForEach(elements) { element in
element
}
}
.padding(.horizontal, 8)
}
.padding(.vertical, 8)
}
private var elements: [GridElement] {
print("Creating elements")
var result: [GridElement] = []
// camera
if let feed = mediaManager.cameraFeed, mediaManager.cameraAccessLevel == .authorized {
result.append(GridElement(id: UUID(), type: .cameraFeed, content: feed) {
print("Go to capture???")
})
print("Added camera feed")
} else if mediaManager.cameraAccessLevel == .restricted {
result.append(GridElement(id: UUID(), type: .cameraRestricted, content: nil) {
print("Show alert")
})
print("Added camera restricted")
} else {
result.append(GridElement(id: UUID(), type: .cameraAskButton, content: nil) {
mediaManager.openAppSettings()
})
print("Added camera ask button")
}
// photos
// if mediaManager.galleryAccessLevel == .restricted {
// result.append(GridElement(id: UUID(), type: .photoRestricted, content: nil))
// } else {
// for photo in mediaManager.photos {
// result.append(GridElement(id: UUID(), type: .photo, content: photo))
// }
// if mediaManager.galleryAccessLevel != .authorized {
// result.append(GridElement(id: UUID(), type: .photoAskButton, content: nil))
// }
// }
return result
}
}
private enum GridElementType {
case cameraFeed
case cameraAskButton
case cameraRestricted
case photo
case photoAskButton
case photoRestricted
}
private struct GridElement: View, Identifiable {
let id: UUID
let type: GridElementType
let content: UIImage?
let action: () -> Void
var body: some View {
switch type {
case .cameraFeed:
image
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.clipped()
case .cameraAskButton:
Button {
action()
} label: {
RoundedRectangle(cornerRadius: 5)
.stroke(Color.Main.backgroundDark, lineWidth: 2)
.overlay {
Image(systemName: "camera")
.foregroundColor(.Material.tortoiseLight300)
.font(.system(size: 40))
}
.frame(height: 100)
// .resizable()
// .aspectRatio(contentMode: .fill)
// .frame(width: 100, height: 100)
// .clipped()
}
case .photo:
image
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.clipped()
case .photoAskButton:
Button {
action()
} label: {
Image(systemName: "photo.badge.plus")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.clipped()
}
case .photoRestricted, .cameraRestricted:
Button {
action()
} label: {
Image(systemName: "cross")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.clipped()
}
}
}
private var image: Image {
guard let content = content else {
return Image(systemName: "questionmark.square.dashed")
}
return Image(uiImage: content)
}
}
struct AttachmentMediaPickerView_Previews: PreviewProvider {
static var previews: some View {
AttachmentMediaPickerView()
}
}