// // NotesPageViewController.swift // Notes // // Created by Laurent Morvillier on 16/10/2022. // import Foundation import UIKit class NotesPageViewController : UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { fileprivate var _notes: [Note] = [] fileprivate var _currentIndex: Int = 0 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)) let deleteButton = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(deleteHandler)) self.navigationItem.rightBarButtonItems = [addButton, shareButton, deleteButton] self.view.backgroundColor = UIColor(white: 0.95, alpha: 1.0) self.dataSource = self self.delegate = self self._displayLastNote() } fileprivate func _displayLastNote(animated: Bool = false) { if let note = self._notes.last { let index = self._notes.count - 1 let vc = self.viewController(note: note, index: index) self.setViewControllers([vc], direction: .forward, animated: animated) self._currentIndex = index } } fileprivate func _displayNote(note: Note, animated: Bool = false) { if let index = self._notes.firstIndex(of: note) { let vc = self.viewController(note: note, index: index) self.setViewControllers([vc], direction: .forward, animated: animated) } 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) } func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { if completed, let vc = pageViewController.viewControllers?.first as? NoteViewController { self._currentIndex = vc.index } } // MARK: - Business @objc func shareHandler() { guard let text = self._notes[self._currentIndex].content else { return } let activityViewController = UIActivityViewController(activityItems: [text], applicationActivities: nil) self.present(activityViewController, animated: true) } @objc func addHandler() { self._createNote() } @objc func deleteHandler() { let note = self._notes[self._currentIndex] guard let content = note.content else { self.showAlert(message: "Sorry!", title: "Note not found") return } areYouSure(message: "Do you want to delete this: \(content.prefix(20))...?") { AppDelegate.viewContext.delete(note) AppDelegate.shared.saveContext() self._loadNotes() self._displayLastNote(animated: true) } } fileprivate func _createNote() { let note = Note(context: AppDelegate.viewContext) self._loadNotes() self._displayNote(note: note) } }