RTSDA-iOS/Views/BulletinsView.swift
RTSDA 00679f927c docs: Update README for v2.0 release and fix git remote URL
- Comprehensive README update documenting v2.0 architectural changes
- Updated git remote to ssh://rockvilleav@git.rockvilletollandsda.church:10443/RTSDA/RTSDA-iOS.git
- Documented unified ChurchService and 60% code reduction
- Added new features: Home Feed, responsive reading, enhanced UI
- Corrected license information (GPL v3 with church content copyright)
- Updated build instructions and technical stack details
2025-08-16 18:41:51 -04:00

207 lines
8.3 KiB
Swift

import SwiftUI
struct BulletinsView: View {
@Environment(ChurchDataService.self) private var dataService
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
var body: some View {
List {
if dataService.isLoading {
HStack {
Spacer()
VStack {
ProgressView("Loading bulletins...")
Text("Fetching church bulletins")
.font(.caption)
.foregroundColor(.secondary)
.padding(.top, 8)
}
Spacer()
}
.listRowSeparator(.hidden)
} else if dataService.bulletins.isEmpty {
HStack {
Spacer()
VStack(spacing: 16) {
Image(systemName: "newspaper.badge.exclamationmark")
.font(.system(size: 50))
.foregroundColor(.secondary)
Text("No Bulletins Available")
.font(.headline)
.foregroundColor(.secondary)
Text("Check back later for weekly church bulletins and announcements.")
.font(.subheadline)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal)
}
.padding()
Spacer()
}
.listRowSeparator(.hidden)
} else {
ForEach(dataService.bulletins) { bulletin in
NavigationLink {
BulletinDetailView(bulletin: bulletin)
} label: {
BulletinRowView(bulletin: bulletin)
}
}
}
}
.refreshable {
await dataService.loadAllBulletins()
}
.navigationTitle("Bulletins")
.navigationBarTitleDisplayMode(.large)
.task {
await dataService.loadAllBulletins()
}
}
}
struct BulletinRowView: View {
let bulletin: ChurchBulletin
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
var body: some View {
if horizontalSizeClass == .regular {
// iPad: Enhanced layout with more information
HStack(spacing: 20) {
// Bulletin icon
Image(systemName: "newspaper.fill")
.font(.title)
.foregroundColor(Color(hex: "fb8b23"))
.frame(width: 50, height: 50)
.background(Color(hex: "fb8b23").opacity(0.1), in: RoundedRectangle(cornerRadius: 12))
VStack(alignment: .leading, spacing: 8) {
HStack {
Spacer()
Text(bulletin.formattedDate)
.font(.subheadline)
.foregroundColor(.secondary)
.fontWeight(.medium)
if bulletin.pdfPath != nil {
Image(systemName: "arrow.down.circle.fill")
.font(.title3)
.foregroundColor(.green)
}
}
Text(bulletin.title)
.font(.system(size: 20, weight: .semibold))
.lineLimit(2)
.multilineTextAlignment(.leading)
// Service details in grid layout for iPad
HStack(spacing: 40) {
VStack(alignment: .leading, spacing: 4) {
Text("Sabbath School")
.font(.caption2)
.fontWeight(.medium)
.foregroundColor(.secondary)
.textCase(.uppercase)
Text(bulletin.sabbathSchool)
.font(.subheadline)
.lineLimit(2)
}
.frame(maxWidth: .infinity, alignment: .leading)
VStack(alignment: .leading, spacing: 4) {
Text("Divine Worship")
.font(.caption2)
.fontWeight(.medium)
.foregroundColor(.secondary)
.textCase(.uppercase)
Text(bulletin.divineWorship)
.font(.subheadline)
.lineLimit(2)
}
.frame(maxWidth: .infinity, alignment: .leading)
VStack(alignment: .leading, spacing: 4) {
Text("Scripture Reading")
.font(.caption2)
.fontWeight(.medium)
.foregroundColor(.secondary)
.textCase(.uppercase)
Text(bulletin.scriptureReading)
.font(.subheadline)
.lineLimit(2)
}
.frame(maxWidth: .infinity, alignment: .leading)
}
}
Image(systemName: "chevron.right")
.font(.caption)
.foregroundColor(.secondary)
}
.padding(.vertical, 16)
} else {
// iPhone: Compact layout (current design)
HStack(spacing: 12) {
// Bulletin icon
Image(systemName: "newspaper.fill")
.font(.title2)
.foregroundColor(Color(hex: "fb8b23"))
.frame(width: 40, height: 40)
.background(Color(hex: "fb8b23").opacity(0.1), in: Circle())
VStack(alignment: .leading, spacing: 6) {
HStack {
Spacer()
if bulletin.pdfPath != nil {
Image(systemName: "arrow.down.circle.fill")
.font(.title3)
.foregroundColor(.green)
}
}
Text(bulletin.title)
.font(.system(size: 16, weight: .semibold))
.lineLimit(2)
.multilineTextAlignment(.leading)
Text(bulletin.formattedDate)
.font(.system(size: 13))
.foregroundColor(.secondary)
// Service preview
HStack {
VStack(alignment: .leading, spacing: 2) {
Text("Sabbath School:")
.font(.caption2)
.foregroundColor(.secondary)
Text(bulletin.sabbathSchool)
.font(.caption)
.lineLimit(1)
}
Spacer()
VStack(alignment: .leading, spacing: 2) {
Text("Divine Worship:")
.font(.caption2)
.foregroundColor(.secondary)
Text(bulletin.divineWorship)
.font(.caption)
.lineLimit(1)
}
}
.padding(.top, 4)
}
Spacer()
}
.padding(.vertical, 8)
}
}
}