// // NotesPageViewController.swift // Notes // // Created by Laurent Morvillier on 16/10/2022. // import Foundation import UIKit class NotesPageViewController : UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { fileprivate var _notes: [Note] = [] override func viewDidLoad() { super.viewDidLoad() self._loadNotes() let shareButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareHandler)) let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addHandler)) self.navigationItem.rightBarButtonItems = [addButton, shareButton] self.dataSource = self self.delegate = self if let note = self._notes.last { let vc = self.viewController(note: note, index: self._notes.count - 1) self.setViewControllers([vc], direction: .forward, animated: false) } } fileprivate func _displayNote(note: Note) { if let index = self._notes.firstIndex(of: note) { let vc = self.viewController(note: note, index: index) self.setViewControllers([vc], direction: .forward, animated: false) } else { print("note not found") } } fileprivate func viewController(note: Note, index: Int) -> NoteViewController { if let vc = self.storyboard?.instantiateViewController(withIdentifier: "note") as? NoteViewController { vc.note = note vc.index = index return vc } else { fatalError("error with storyboard") } } fileprivate func _loadNotes() { do { self._notes = try Note.fetchByDate() if self._notes.isEmpty { self._createNote() self._loadNotes() } } catch { print("error = \(error)") } } // MARK: - UIPageViewControllerDataSource func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { guard let vc = viewController as? NoteViewController else { return nil } let previousIndex = vc.index - 1 if previousIndex < 0 { return nil } let note = self._notes[previousIndex] return self.viewController(note: note, index: previousIndex) } func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { guard let vc = viewController as? NoteViewController else { return nil } let nextIndex = vc.index + 1 if nextIndex == self._notes.count { return nil } let note = self._notes[nextIndex] return self.viewController(note: note, index: nextIndex) } // MARK: - Business @objc func shareHandler() { guard let vc = self.presentedViewController as? NoteViewController, let text = vc.note?.content else { return } let activityViewController = UIActivityViewController(activityItems: [text], applicationActivities: nil) self.present(activityViewController, animated: true) } @objc func addHandler() { self._createNote() } fileprivate func _createNote() { let note = Note(context: AppDelegate.viewContext) self._loadNotes() self._displayNote(note: note) } }