73 lines
2.5 KiB
Swift
73 lines
2.5 KiB
Swift
import SwiftUI
|
|
|
|
struct TodoItemView: View {
|
|
let todo: Todo
|
|
let onToggle: () -> Void
|
|
let onTap: () -> Void
|
|
|
|
var body: some View {
|
|
Button(action: onTap) {
|
|
HStack(spacing: 12) {
|
|
// Checkbox toggle
|
|
Button(action: onToggle) {
|
|
Image(systemName: todo.completed ? "checkmark.circle.fill" : "circle")
|
|
.font(.title2)
|
|
.foregroundStyle(todo.completed ? Color.accentColor : Color(.systemGray3))
|
|
}
|
|
.buttonStyle(.plain)
|
|
|
|
// Title and metadata
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text(todo.title)
|
|
.font(.body)
|
|
.strikethrough(todo.completed)
|
|
.foregroundStyle(todo.completed ? .secondary : .primary)
|
|
.lineLimit(2)
|
|
.multilineTextAlignment(.leading)
|
|
|
|
HStack(spacing: 8) {
|
|
// Category tag
|
|
Text(todo.category)
|
|
.font(.caption)
|
|
.padding(.horizontal, 8)
|
|
.padding(.vertical, 3)
|
|
.background(
|
|
Capsule()
|
|
.fill(Color(.systemGray5))
|
|
)
|
|
.foregroundStyle(.secondary)
|
|
|
|
// Priority dot and label
|
|
HStack(spacing: 4) {
|
|
Circle()
|
|
.fill(priorityColor(todo.priority))
|
|
.frame(width: 8, height: 8)
|
|
Text(todo.priority.displayName)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
}
|
|
|
|
Spacer()
|
|
|
|
Image(systemName: "chevron.right")
|
|
.font(.caption)
|
|
.foregroundStyle(Color(.systemGray3))
|
|
}
|
|
.padding(.vertical, 8)
|
|
.padding(.horizontal, 16)
|
|
.contentShape(Rectangle())
|
|
}
|
|
.buttonStyle(.plain)
|
|
}
|
|
|
|
private func priorityColor(_ priority: Priority) -> Color {
|
|
switch priority {
|
|
case .low: return .green
|
|
case .medium: return .orange
|
|
case .high: return .red
|
|
}
|
|
}
|
|
}
|