Skip to content

Commit

Permalink
Merge pull request #296 from kvyatkovskys/feature/v_0.6.12
Browse files Browse the repository at this point in the history
Bugs fixes and improvements ver. 0.6.12
  • Loading branch information
kvyatkovskys committed Dec 26, 2022
2 parents 72ad36a + fcd105c commit c718f05
Show file tree
Hide file tree
Showing 46 changed files with 1,334 additions and 716 deletions.
78 changes: 78 additions & 0 deletions Example/Example For SwiftUI/CalendarView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
//
// ContentView.swift
// KVKCalendar_Example
//
// Created by Sergei Kviatkovskii on 4/16/22.
// Copyright © 2022 CocoaPods. All rights reserved.
//

import SwiftUI
import KVKCalendar

@available(iOS 14.0, *)
struct CalendarView: View {

@State private var typeCalendar = CalendarType.day
@State private var events: [Event] = []
@State private var updatedDate: Date?
@State private var orientation: UIInterfaceOrientation = .unknown
@ObservedObject private var viewModel = CalendarViewModel()

var body: some View {
kvkHandleNavigationView(calendarView)
}

private var calendarView: some View {
CalendarViewDisplayable(events: $events,
type: $typeCalendar,
updatedDate: $updatedDate,
orientation: $orientation)
.kvkOnRotate(action: { (newOrientation) in
orientation = newOrientation
})
.onAppear {
viewModel.loadEvents { (items) in
events = items
}
}
.navigationBarTitle("KVKCalendar", displayMode: .inline)
.edgesIgnoringSafeArea(.bottom)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
HStack {
ItemsMenu<CalendarType>(type: $typeCalendar,
items: CalendarType.allCases,
showCheckmark: true,
showDropDownIcon: true)

Button {
updatedDate = Date()
} label: {
Text("Today")
.font(.headline)
.foregroundColor(.red)
}
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button {
if let event = viewModel.addNewEvent() {
events.append(event)
}
} label: {
Image(systemName: "plus")
.foregroundColor(.red)
}

}
}
}

}

@available(iOS 14.0, *)
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
CalendarView()
}
}
107 changes: 67 additions & 40 deletions Example/Example For SwiftUI/CalendarViewDisplayable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,88 +10,106 @@ import SwiftUI
import KVKCalendar
import EventKit

@available(iOS 13.0, *)
struct CalendarDisplayView: UIViewRepresentable, KVKCalendarSettings {

struct CalendarViewDisplayable: UIViewRepresentable, KVKCalendarSettings, KVKCalendarDataModel {

@Binding var events: [Event]
@Binding var type: CalendarType
@Binding var updatedDate: Date?
@Binding var orientation: UIInterfaceOrientation

var style: Style {
createCalendarStyle()
}
var selectDate = Date()
var eventViewer = EventViewer()

private var calendar = CalendarView(frame: .zero)
private var calendar = KVKCalendarView(frame: .zero)

func makeUIView(context: UIViewRepresentableContext<CalendarDisplayView>) -> CalendarView {
func makeUIView(context: UIViewRepresentableContext<CalendarViewDisplayable>) -> KVKCalendarView {
calendar.dataSource = context.coordinator
calendar.delegate = context.coordinator
return calendar
}

func updateUIView(_ uiView: CalendarView, context: UIViewRepresentableContext<CalendarDisplayView>) {
func updateUIView(_ uiView: KVKCalendarView, context: UIViewRepresentableContext<CalendarViewDisplayable>) {
context.coordinator.events = events
context.coordinator.type = type
context.coordinator.updatedDate = updatedDate
context.coordinator.orientation = orientation
}

func makeCoordinator() -> CalendarDisplayView.Coordinator {
func makeCoordinator() -> CalendarViewDisplayable.Coordinator {
Coordinator(self)
}

public init(events: Binding<[Event]>, type: Binding<CalendarType>, updatedDate: Binding<Date?>) {
self._events = events
self._type = type
self._updatedDate = updatedDate
public init(events: Binding<[Event]>,
type: Binding<CalendarType>,
updatedDate: Binding<Date?>,
orientation: Binding<UIInterfaceOrientation>) {
_events = events
_type = type
_updatedDate = updatedDate
_orientation = orientation
selectDate = defaultDate

var frame = UIScreen.main.bounds
frame.origin.y = 0
frame.size.height -= topOffset
calendar = CalendarView(frame: frame, date: selectDate, style: style)
var frame: CGRect
#if targetEnvironment(macCatalyst)
frame = CGRect(origin: .zero, size: UIApplication.shared.windowSize)
#else
let offset = UIApplication.shared.screenOffset
frame = UIScreen.main.bounds
frame.size.height -= (offset.top + offset.bottom)
frame.size.width -= (offset.right + offset.left)
#endif
calendar = KVKCalendarView(frame: frame, date: selectDate, style: style)
}

// MARK: Calendar DataSource and Delegate
class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {
private var view: CalendarDisplayView
final class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {

private var view: CalendarViewDisplayable
private var eventViewer: EventViewer?

var events: [Event] = [] {
didSet {
view.events = events
view.calendar.reloadData()
}
}

var type: CalendarType = .day {
didSet {
guard oldValue != type else { return }
view.calendar.set(type: type, date: view.selectDate)
view.calendar.reloadData()
}
}

var updatedDate: Date? {
didSet {
if let date = updatedDate {
if let date = updatedDate, oldValue != date {
view.calendar.scrollTo(date, animated: true)
view.selectDate = date
view.calendar.reloadData()
}
}
}

init(_ view: CalendarDisplayView) {
var orientation: UIInterfaceOrientation = .unknown {
didSet {
guard oldValue != orientation else { return }

let offset = UIApplication.shared.screenOffset
var frame = UIScreen.main.bounds
frame.origin.y = 0
frame.size.height -= (offset.top + offset.bottom)
frame.size.width -= (offset.left + offset.right)
view.calendar.reloadFrame(frame)
}
}

init(_ view: CalendarViewDisplayable) {
self.view = view
super.init()
NotificationCenter.default.addObserver(self,
selector: #selector(changedOerintation),
name: UIDevice.orientationDidChangeNotification,
object: nil)

DispatchQueue.main.asyncAfter(wallDeadline: .now() + 3) {
self.view.loadEvents(dateFormat: view.style.timeSystem.format) { [weak self] (events) in
self?.view.events = events
}
}
}

func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
Expand All @@ -103,9 +121,12 @@ struct CalendarDisplayView: UIViewRepresentable, KVKCalendarSettings {
}

func willDisplayEventViewer(date: Date, frame: CGRect) -> UIView? {
view.eventViewer.frame = frame
view.eventViewer.reloadFrame(frame: frame)
return view.eventViewer
if eventViewer == nil {
eventViewer = EventViewer(frame: frame)
} else {
eventViewer?.frame = frame
}
return eventViewer
}

func didChangeEvent(_ event: Event, start: Date?, end: Date?) {
Expand All @@ -115,7 +136,7 @@ struct CalendarDisplayView: UIViewRepresentable, KVKCalendarSettings {
}

func didChangeViewerFrame(_ frame: CGRect) {
view.eventViewer.reloadFrame(frame: frame)
eventViewer?.reloadFrame(frame: frame)
}

func didAddNewEvent(_ event: Event, _ date: Date?) {
Expand All @@ -128,13 +149,19 @@ struct CalendarDisplayView: UIViewRepresentable, KVKCalendarSettings {
updatedDate = dates.first ?? Date()
}

// MARK: Private
@available(iOS 14.0, *)
func willDisplayEventOptionMenu(_ event: Event, type: CalendarType) -> (menu: UIMenu, customButton: UIButton?)? {
view.handleOptionMenu(type: type)
}

@objc private func changedOerintation() {
var frame = UIScreen.main.bounds
frame.origin.y = 0
frame.size.height -= (view.topOffset + view.bottomOffset)
view.calendar.reloadFrame(frame)
func didSelectEvent(_ event: Event, type: CalendarType, frame: CGRect?) {
print(type, event)
switch type {
case .day:
eventViewer?.text = event.title.timeline
default:
break
}
}

}
Expand Down
32 changes: 32 additions & 0 deletions Example/Example For SwiftUI/CalendarViewModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// CalendarViewModel.swift
// KVKCalendar
//
// Created by Sergei Kviatkovskii on 11/17/22.
// Copyright © 2022 CocoaPods. All rights reserved.
//

import Foundation
import KVKCalendar

final class CalendarViewModel: ObservableObject, KVKCalendarSettings, KVKCalendarDataModel {

// 🤔👹🍻😬🥸
// only for example
var events: [Event] = []

var style: KVKCalendar.Style {
createCalendarStyle()
}

func loadEvents(completion: @escaping ([Event]) -> Void) {
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 3) {
self.loadEvents(dateFormat: self.style.timeSystem.format, completion: completion)
}
}

func addNewEvent() -> Event? {
handleNewEvent(Event(ID: "-1"), date: Date())
}

}
57 changes: 0 additions & 57 deletions Example/Example For SwiftUI/ContentView.swift

This file was deleted.

Loading

0 comments on commit c718f05

Please sign in to comment.