RTSDA-iOS/Views/EventCard.swift
2025-02-03 16:15:57 -05:00

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