You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.9 KiB
156 lines
4.9 KiB
//
|
|
// 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)
|
|
}
|
|
|
|
}
|
|
|