74 lines
3 KiB
Swift
74 lines
3 KiB
Swift
import SwiftUI
|
|
|
|
struct EventCard: View {
|
|
let event: Event
|
|
let action: () -> Void
|
|
|
|
var body: some View {
|
|
Button(action: action) {
|
|
VStack(alignment: .center, spacing: 12) {
|
|
if let imageURL = event.imageURL {
|
|
CachedAsyncImage(url: imageURL) { image in
|
|
image
|
|
.resizable()
|
|
.aspectRatio(contentMode: .fill)
|
|
} placeholder: {
|
|
Color.gray.opacity(0.2)
|
|
}
|
|
.frame(height: 160)
|
|
.clipShape(RoundedRectangle(cornerRadius: 12))
|
|
}
|
|
|
|
VStack(alignment: .center, spacing: 8) {
|
|
Text(event.title)
|
|
.font(.headline)
|
|
.multilineTextAlignment(.center)
|
|
.fixedSize(horizontal: false, vertical: true)
|
|
|
|
HStack(spacing: 8) {
|
|
Text(event.category.rawValue)
|
|
.font(.caption)
|
|
.padding(.horizontal, 8)
|
|
.padding(.vertical, 4)
|
|
.background(Color.blue.opacity(0.1))
|
|
.clipShape(Capsule())
|
|
|
|
if event.reoccuring != .none {
|
|
Text(event.reoccuring.rawValue.replacingOccurrences(of: "_", with: " ").capitalized)
|
|
.font(.caption)
|
|
.padding(.horizontal, 8)
|
|
.padding(.vertical, 4)
|
|
.background(Color.purple.opacity(0.1))
|
|
.clipShape(Capsule())
|
|
}
|
|
}
|
|
.fixedSize(horizontal: true, vertical: false)
|
|
|
|
HStack {
|
|
Image(systemName: "calendar")
|
|
Text(event.formattedDateTime)
|
|
.multilineTextAlignment(.center)
|
|
.fixedSize(horizontal: false, vertical: true)
|
|
}
|
|
.font(.subheadline)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
.padding()
|
|
.background(Color(.systemBackground))
|
|
.clipShape(RoundedRectangle(cornerRadius: 16))
|
|
.contentShape(RoundedRectangle(cornerRadius: 16))
|
|
.shadow(color: .black.opacity(0.1), radius: 8, x: 0, y: 2)
|
|
}
|
|
.buttonStyle(PlainButtonStyle())
|
|
}
|
|
}
|
|
|
|
struct EventCardButtonStyle: ButtonStyle {
|
|
func makeBody(configuration: Configuration) -> some View {
|
|
configuration.label
|
|
.scaleEffect(configuration.isPressed ? 0.98 : 1.0)
|
|
.animation(.easeInOut(duration: 0.2), value: configuration.isPressed)
|
|
}
|
|
} |