-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathTodoListRow.swift
110 lines (102 loc) · 3.3 KB
/
TodoListRow.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import SwiftUI
struct TodoListRow: View {
let todo: Todo
let isCameraAvailable: Bool
let completeTapped: () -> Void
let deletePhotoTapped: () -> Void
let capturePhotoTapped: () -> Void
let selectPhotoTapped: () -> Void
@State private var image: UIImage? = nil
var body: some View {
HStack {
Text(todo.description)
Group {
if let image = image {
Image(uiImage: image)
.resizable()
.scaledToFit()
} else if todo.photoUri != nil {
// Show progress while loading the image
ProgressView()
.onAppear {
loadImage()
}
} else if todo.photoId != nil {
// Show progres, wait for a URI to be present
ProgressView()
} else {
EmptyView()
}
}
Spacer()
VStack {
if todo.photoId == nil {
HStack {
if isCameraAvailable {
Button {
capturePhotoTapped()
} label: {
Image(systemName: "camera.fill")
}
.buttonStyle(.plain)
}
Button {
selectPhotoTapped()
} label: {
Image(systemName: "photo.on.rectangle")
}
.buttonStyle(.plain)
}
} else {
Button {
deletePhotoTapped()
} label: {
Image(systemName: "trash.fill")
}
.buttonStyle(.plain)
}
Spacer()
Button {
completeTapped()
} label: {
Image(systemName: todo.isComplete ? "checkmark.circle.fill" : "circle")
}
.buttonStyle(.plain)
}.onChange(of: todo.photoId) { _, newPhotoId in
if newPhotoId == nil {
// Clear the image when photoId becomes nil
image = nil
}
}
}
}
private func loadImage() {
guard let urlString = todo.photoUri else {
return
}
if let imageData = try? Data(contentsOf: URL(fileURLWithPath: urlString)),
let loadedImage = UIImage(data: imageData)
{
image = loadedImage
}
}
}
#Preview {
TodoListRow(
todo: .init(
id: UUID().uuidString.lowercased(),
listId: UUID().uuidString.lowercased(),
photoId: nil,
description: "description",
isComplete: false,
createdAt: "",
completedAt: nil,
createdBy: UUID().uuidString.lowercased(),
completedBy: nil,
),
isCameraAvailable: true,
completeTapped: {},
deletePhotoTapped: {},
capturePhotoTapped: {}
) {}
}