135 lines
3.4 KiB
Swift
Raw Permalink Normal View History

//
// 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")
}
}