Просмотр исходного кода

enhance(mobile): journals calendar for ios

charlie 6 месяцев назад
Родитель
Сommit
988584b2d5
1 измененных файлов с 85 добавлено и 40 удалено
  1. 85 40
      ios/App/App/UILocalPlugin.swift

+ 85 - 40
ios/App/App/UILocalPlugin.swift

@@ -9,21 +9,19 @@ import Capacitor
 import Foundation
 
 func isDarkMode() -> Bool {
-    if #available(iOS 12.0, *) {
-        return UITraitCollection.current.userInterfaceStyle == .dark
-    } else {
-        return false
-    }
+  if #available(iOS 12.0, *) {
+    return UITraitCollection.current.userInterfaceStyle == .dark
+  } else {
+    return false
+  }
 }
 
-func isOnlyDayDifferentOrSame(date1: Date, date2: Date) -> Bool {
-    let calendar = Calendar.current
-    let components1 = calendar.dateComponents([.year, .month, .day], from: date1)
-    let components2 = calendar.dateComponents([.year, .month, .day], from: date2)
-    
-    return components1.year == components2.year &&
-           components1.month == components2.month &&
-           (components1.day != components2.day || components1.day == components2.day)
+func isOnlyDayDifferentOrSame(date1: Foundation.Date, date2: Date) -> Bool {
+  let calendar = Calendar.current
+  let components1 = calendar.dateComponents([.year, .month, .day], from: date1)
+  let components2 = calendar.dateComponents([.year, .month, .day], from: date2)
+
+  return components1.year == components2.year && components1.month == components2.month && (components1.day != components2.day || components1.day == components2.day)
 }
 
 class DatePickerView: UIView {
@@ -31,12 +29,12 @@ class DatePickerView: UIView {
     super.init(frame: frame)
     isUserInteractionEnabled = true
   }
-  
+
   required init?(coder: NSCoder) {
-          super.init(coder: coder)
-          isUserInteractionEnabled = true
-      }
-  
+    super.init(coder: coder)
+    isUserInteractionEnabled = true
+  }
+
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     super.touchesBegan(touches, with: event)
   }
@@ -47,44 +45,91 @@ class DatePickerDialogViewController: UIViewController {
   private let dialogView = DatePickerView()
 
   private var lastDate: Date?
+  private var initialMonthLabel: UILabel?
+  private var currentMonthText: String?
+
   var onDateSelected: ((Date?) -> Void)?
-  
+
   override func viewDidLoad() {
     super.viewDidLoad()
     lastDate = datePicker.date
     setupImplView()
+
+    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
+      self?.settleMonthLabel()
+    }
+  }
+
+  private func settleMonthLabel() {
+    initialMonthLabel = findMonthLabel(in: datePicker)
+    if let label = initialMonthLabel {
+      currentMonthText = label.text
+      print("Initial month label: \(currentMonthText ?? "Unknown")")
+    } else {
+      print("Month label not found")
+    }
+  }
+
+  private func findMonthLabel(in view: UIView) -> UILabel? {
+    for subview in view.subviews {
+      if let label = subview as? UILabel, (label.text?.contains(" ")) == true {
+        print(label.text as Any)
+        return label
+      }
+      if let foundLabel = findMonthLabel(in: subview) {
+        return foundLabel
+      }
+    }
+    return nil
   }
 
+  private func inCalendarWheelPickerMode(in view: UIView) -> Bool? {
+    for subview in view.subviews {
+      if let label = subview as? UILabel, label.text?.contains("July") == true {
+        print(label.text as Any)
+        return true
+      }
+
+      let found: Bool? = inCalendarWheelPickerMode(in: subview)
+
+      if found == true {
+        return true
+      }
+    }
+
+    return false
+  }
+
+
   @objc private func confirmDate() {
-    if (isOnlyDayDifferentOrSame(date1: lastDate!, date2: datePicker.date)) {
+    let label = findMonthLabel(in: datePicker)
+    if isOnlyDayDifferentOrSame(date1: lastDate!, date2: datePicker.date) || (label != nil && label?.text != currentMonthText && (inCalendarWheelPickerMode(in: datePicker) != true)) {
       onDateSelected?(datePicker.date)
       dismiss(animated: false, completion: nil)
     }
-    
-    lastDate = datePicker.date
   }
 
   @objc private func dismissDialog() {
     onDateSelected?(nil)
     dismiss(animated: false, completion: nil)
   }
-  
+
   override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
-          super.traitCollectionDidChange(previousTraitCollection)
-          
-          if #available(iOS 12.0, *) {
-              if traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle {
-                  if traitCollection.userInterfaceStyle == .dark {
-                      print("switch to dark mode")
-                    dialogView.backgroundColor = .black
-                  } else {
-                      print("switch to light mode")
-                    dialogView.backgroundColor = .white
-                  }
-              }
-          }
+    super.traitCollectionDidChange(previousTraitCollection)
+
+    if #available(iOS 12.0, *) {
+      if traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle {
+        if traitCollection.userInterfaceStyle == .dark {
+          print("switch to dark mode")
+          dialogView.backgroundColor = .black
+        } else {
+          print("switch to light mode")
+          dialogView.backgroundColor = .white
+        }
       }
-  
+    }
+  }
+
   func setupImplView() {
     datePicker.datePickerMode = .date
     datePicker.preferredDatePickerStyle = .inline
@@ -96,13 +141,13 @@ class DatePickerDialogViewController: UIViewController {
 
     view.backgroundColor = .black.withAlphaComponent(0.4)
     view.isUserInteractionEnabled = true
-    
+
     if isDarkMode() {
       dialogView.backgroundColor = .black
     } else {
       dialogView.backgroundColor = .white
     }
-    
+
     dialogView.layer.cornerRadius = 10
     dialogView.clipsToBounds = true
     view.addSubview(dialogView)
@@ -137,7 +182,7 @@ class DatePickerDialogViewController: UIViewController {
 
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     super.touchesBegan(touches, with: event)
-    
+
     if let touch = touches.first {
       let location = touch.location(in: view)
       if !dialogView.frame.contains(location) {