expo-calendar-kit 2.1.8 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/ExpoCalendarKitView.swift +64 -42
- package/package.json +1 -1
|
@@ -3,6 +3,23 @@ import UIKit
|
|
|
3
3
|
import CalendarKit
|
|
4
4
|
import EventKit
|
|
5
5
|
|
|
6
|
+
// MARK: - UIColor Hex Extension
|
|
7
|
+
extension UIColor {
|
|
8
|
+
convenience init?(hex: String) {
|
|
9
|
+
let hexColor = hex.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
10
|
+
let scanner = Scanner(string: hexColor.hasPrefix("#") ? String(hexColor.dropFirst()) : hexColor)
|
|
11
|
+
var hexNumber: UInt64 = 0
|
|
12
|
+
|
|
13
|
+
guard scanner.scanHexInt64(&hexNumber) else { return nil }
|
|
14
|
+
|
|
15
|
+
let r = CGFloat((hexNumber & 0xff0000) >> 16) / 255
|
|
16
|
+
let g = CGFloat((hexNumber & 0x00ff00) >> 8) / 255
|
|
17
|
+
let b = CGFloat(hexNumber & 0x0000ff) / 255
|
|
18
|
+
|
|
19
|
+
self.init(red: r, green: g, blue: b, alpha: 1.0)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
6
23
|
// MARK: - MyEKWrapper (copied from CalendarApp, renamed to avoid conflicts)
|
|
7
24
|
final class MyEKWrapper: EventDescriptor {
|
|
8
25
|
public var dateInterval: DateInterval {
|
|
@@ -136,57 +153,63 @@ final class MyEKWrapper: EventDescriptor {
|
|
|
136
153
|
// MARK: - Calendar View Controller (following CalendarApp pattern)
|
|
137
154
|
final class CalendarViewController: DayViewController {
|
|
138
155
|
private var eventStore = EKEventStore() // Not used but needed for EKEvent creation
|
|
156
|
+
private var dynamicEvents: [[String: Any]] = [] // Store events from React Native
|
|
139
157
|
|
|
140
158
|
override func viewDidLoad() {
|
|
141
159
|
super.viewDidLoad()
|
|
142
160
|
print("🔥 CalendarViewController viewDidLoad called")
|
|
143
|
-
// Don't request calendar access - we'll use
|
|
161
|
+
// Don't request calendar access - we'll use events from React Native
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Function to update events from React Native
|
|
165
|
+
func updateEvents(_ events: [[String: Any]]) {
|
|
166
|
+
print("🔥 CalendarViewController updateEvents called with \(events.count) events")
|
|
167
|
+
self.dynamicEvents = events
|
|
168
|
+
self.reloadData() // Refresh the calendar view
|
|
144
169
|
}
|
|
145
170
|
|
|
146
171
|
// MARK: - DayViewDataSource
|
|
147
172
|
|
|
148
173
|
// This is the main method - following CalendarApp pattern exactly
|
|
149
174
|
override func eventsForDate(_ date: Date) -> [EventDescriptor] {
|
|
150
|
-
print("🔥 eventsForDate called for \(date)")
|
|
175
|
+
print("🔥 eventsForDate called for \(date) with \(dynamicEvents.count) dynamic events")
|
|
151
176
|
|
|
152
177
|
let calendar = Calendar.current
|
|
153
|
-
|
|
154
|
-
// Check if the requested date is today
|
|
155
|
-
guard calendar.isDate(date, inSameDayAs: Date()) else {
|
|
156
|
-
print("🔥 Not today, returning empty events")
|
|
157
|
-
return []
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
print("🔥 Creating hardcoded events for today using CalendarApp pattern")
|
|
161
|
-
|
|
162
|
-
// Create hardcoded events using EKEvent (like CalendarApp)
|
|
163
178
|
var events: [MyEKWrapper] = []
|
|
164
179
|
|
|
165
|
-
//
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
// Process dynamic events from React Native
|
|
181
|
+
for eventDict in dynamicEvents {
|
|
182
|
+
guard let title = eventDict["title"] as? String,
|
|
183
|
+
let startTimestamp = eventDict["startDate"] as? Double,
|
|
184
|
+
let endTimestamp = eventDict["endDate"] as? Double else {
|
|
185
|
+
print("🔥 Skipping event with missing data: \(eventDict)")
|
|
186
|
+
continue
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
let startDate = Date(timeIntervalSince1970: startTimestamp / 1000)
|
|
190
|
+
let endDate = Date(timeIntervalSince1970: endTimestamp / 1000)
|
|
191
|
+
|
|
192
|
+
// Check if this event is on the requested date
|
|
193
|
+
guard calendar.isDate(startDate, inSameDayAs: date) else {
|
|
194
|
+
continue
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Create EKEvent
|
|
198
|
+
let ekEvent = EKEvent(eventStore: eventStore)
|
|
199
|
+
ekEvent.title = title
|
|
200
|
+
ekEvent.startDate = startDate
|
|
201
|
+
ekEvent.endDate = endDate
|
|
202
|
+
|
|
203
|
+
// Set color from React Native or default
|
|
204
|
+
let colorString = eventDict["backgroundColor"] as? String ?? "#007AFF"
|
|
205
|
+
let color = UIColor(hex: colorString) ?? UIColor.blue
|
|
206
|
+
ekEvent.calendar = createMockCalendar(color: color)
|
|
207
|
+
|
|
208
|
+
events.append(MyEKWrapper(eventKitEvent: ekEvent))
|
|
209
|
+
print("🔥 Added event: \(title) from \(startDate) to \(endDate)")
|
|
210
|
+
}
|
|
188
211
|
|
|
189
|
-
print("🔥 Returning \(events.count)
|
|
212
|
+
print("🔥 Returning \(events.count) dynamic events for \(date)")
|
|
190
213
|
return events
|
|
191
214
|
}
|
|
192
215
|
|
|
@@ -240,9 +263,9 @@ public class ExpoCalendarKitView: UIView {
|
|
|
240
263
|
|
|
241
264
|
// MARK: - Public Methods (for React Native bridge)
|
|
242
265
|
public func setEvents(_ eventDicts: [[String: Any]]) {
|
|
243
|
-
print("🔥 setEvents called with \(eventDicts.count) events
|
|
244
|
-
//
|
|
245
|
-
calendarViewController.
|
|
266
|
+
print("🔥 setEvents called with \(eventDicts.count) events")
|
|
267
|
+
// Pass events to the calendar controller
|
|
268
|
+
calendarViewController.updateEvents(eventDicts)
|
|
246
269
|
}
|
|
247
270
|
|
|
248
271
|
public func setDate(_ timestamp: Double) {
|
|
@@ -258,8 +281,7 @@ public class ExpoCalendarKitView: UIView {
|
|
|
258
281
|
|
|
259
282
|
public func scrollToCurrentTime() {
|
|
260
283
|
print("🔥 scrollToCurrentTime called")
|
|
261
|
-
//
|
|
262
|
-
|
|
263
|
-
calendarViewController.scrollTo(hour24: Float(hour))
|
|
284
|
+
// Use the correct method from DayViewController
|
|
285
|
+
calendarViewController.dayView.scrollToFirstEventIfNeeded()
|
|
264
286
|
}
|
|
265
287
|
}
|