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.
@@ -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 hardcoded events
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
- // Event 1: Meeting
166
- let meetingEvent = EKEvent(eventStore: eventStore)
167
- meetingEvent.title = "🔥 HARDCODED Meeting"
168
- meetingEvent.startDate = calendar.date(bySettingHour: 10, minute: 0, second: 0, of: Date()) ?? Date()
169
- meetingEvent.endDate = calendar.date(bySettingHour: 11, minute: 0, second: 0, of: Date()) ?? Date()
170
- meetingEvent.calendar = createMockCalendar(color: UIColor.red)
171
- events.append(MyEKWrapper(eventKitEvent: meetingEvent))
172
-
173
- // Event 2: Lunch
174
- let lunchEvent = EKEvent(eventStore: eventStore)
175
- lunchEvent.title = "🔥 HARDCODED Lunch"
176
- lunchEvent.startDate = calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date()) ?? Date()
177
- lunchEvent.endDate = calendar.date(bySettingHour: 13, minute: 0, second: 0, of: Date()) ?? Date()
178
- lunchEvent.calendar = createMockCalendar(color: UIColor.green)
179
- events.append(MyEKWrapper(eventKitEvent: lunchEvent))
180
-
181
- // Event 3: Review
182
- let reviewEvent = EKEvent(eventStore: eventStore)
183
- reviewEvent.title = "🔥 HARDCODED Review"
184
- reviewEvent.startDate = calendar.date(bySettingHour: 14, minute: 0, second: 0, of: Date()) ?? Date()
185
- reviewEvent.endDate = calendar.date(bySettingHour: 15, minute: 0, second: 0, of: Date()) ?? Date()
186
- reviewEvent.calendar = createMockCalendar(color: UIColor.blue)
187
- events.append(MyEKWrapper(eventKitEvent: reviewEvent))
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) hardcoded events")
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 (ignored - using hardcoded)")
244
- // For now, ignore and use hardcoded events
245
- calendarViewController.reloadData()
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
- // Scroll to current time - method name was wrong
262
- let hour = Calendar.current.component(.hour, from: Date())
263
- calendarViewController.scrollTo(hour24: Float(hour))
284
+ // Use the correct method from DayViewController
285
+ calendarViewController.dayView.scrollToFirstEventIfNeeded()
264
286
  }
265
287
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-calendar-kit",
3
- "version": "2.1.8",
3
+ "version": "2.2.0",
4
4
  "description": "Expo module wrapping the native Swift CalendarKit library for React Native apps",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",