カレンダーイベント管理アプリの最初のプロジェクト構成と基本実装
- .gitignore や project.yml、Makefile などによる基本的なプロジェクト構成ファイルを追加 - macOSカレンダーイベントを表示するSwiftUIアプリの主要コンポーネント(イベント取得・リスト・カレンダー設定画面など)を実装 - カレンダーの表示期間や「今日へスクロール」「設定画面」遷移などの基本動作に対応
This commit is contained in:
70
Sources/CalendarService.swift
Normal file
70
Sources/CalendarService.swift
Normal file
@@ -0,0 +1,70 @@
|
||||
import EventKit
|
||||
import Foundation
|
||||
|
||||
class CalendarService: ObservableObject {
|
||||
private let eventStore = EKEventStore()
|
||||
@Published var events: [EKEvent] = []
|
||||
@Published var selectedCalendars: Set<String> = []
|
||||
@Published var availableCalendars: [EKCalendar] = []
|
||||
@Published var hasAccess = false
|
||||
|
||||
init() {
|
||||
Task {
|
||||
await requestAccess()
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func requestAccess() async {
|
||||
do {
|
||||
let granted = try await eventStore.requestFullAccessToEvents()
|
||||
hasAccess = granted
|
||||
if granted {
|
||||
loadCalendars()
|
||||
loadDefaultSelectedCalendars()
|
||||
loadEvents()
|
||||
}
|
||||
} catch {
|
||||
print("Calendar access error: \(error)")
|
||||
hasAccess = false
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func loadCalendars() {
|
||||
availableCalendars = eventStore.calendars(for: .event)
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func loadDefaultSelectedCalendars() {
|
||||
if let savedCalendars = UserDefaults.standard.array(forKey: "selectedCalendars") as? [String] {
|
||||
selectedCalendars = Set(savedCalendars)
|
||||
} else {
|
||||
selectedCalendars = Set(availableCalendars.map { $0.calendarIdentifier })
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func saveSelectedCalendars() {
|
||||
UserDefaults.standard.set(Array(selectedCalendars), forKey: "selectedCalendars")
|
||||
loadEvents()
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func loadEvents() {
|
||||
let calendar = Calendar.current
|
||||
let today = calendar.startOfDay(for: Date())
|
||||
|
||||
guard let startDate = calendar.date(byAdding: .day, value: -14, to: today),
|
||||
let endDate = calendar.date(byAdding: .day, value: 14, to: today) else {
|
||||
return
|
||||
}
|
||||
|
||||
let calendars = availableCalendars.filter { selectedCalendars.contains($0.calendarIdentifier) }
|
||||
|
||||
let predicate = eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: calendars)
|
||||
let fetchedEvents = eventStore.events(matching: predicate)
|
||||
|
||||
events = fetchedEvents.sorted { $0.startDate < $1.startDate }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user