// // DocumentItem.swift // Browse // // Created by Javier Cicchelli on 03/12/2022. // Copyright © 2022 Röck+Cöde. All rights reserved. // import DataModels import SwiftUI struct DocumentItem: View { // MARK: Properties let item: any FileSystemItem let select: ActionClosure let download: ActionClosure let delete: ActionClosure private let dateAdapter = DateAdapter() private let sizeAdapter = SizeAdapter() // MARK: Body var body: some View { Button { select() } label: { HStack(spacing: 16) { Image.document .icon(size: 32) .foregroundColor(.red) VStack(spacing: 8) { Text(item.name) .itemName() HStack { Text(dateAdapter(value: document?.lastModifiedAt)) Spacer() Text(sizeAdapter(value: document?.size)) } .font(.subheadline) .foregroundColor(.secondary) } } .padding(.vertical, 4) } .swipeActions( edge: .trailing, allowsFullSwipe: true ) { Button { delete() } label: { Label { Text( "browse.swipe_action.delete_item.text", bundle: .module ) } icon: { Image.trash } } .tint(.red) Button { download() } label: { Label { Text( "browse.swipe_action.download_item.text", bundle: .module ) } icon: { Image.download } } .tint(.orange) } } } // MARK: - Helpers private extension DocumentItem { var document: Document? { item as? Document } } // MARK: - Image+Constants private extension Image { static let document = Image(systemName: "doc.fill") } // MARK: - Previews struct DocumentItem_Previews: PreviewProvider { static var previews: some View { DocumentItem(item: Document( id: "1234567890", name: "Some document name goes in here...", contentType: "some content type", size: .random(in: 1 ... 100), lastModifiedAt: .now )) { // select closure. } download: { // download closure. } delete: { // delete closure. } .previewDisplayName("Document item") DocumentItem(item: Document( id: "1234567890", name: "Some very, extremely long document name goes in here...", contentType: "some content type", size: .random(in: 1 ... 100), lastModifiedAt: .now )) { // select closure. } download: { // download closure. } delete: { // delete closure. } .previewDisplayName("Document item with long name") } }