From 5bac96ac2671870be915a467820b342a48385461 Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Thu, 30 Jun 2022 12:10:43 +0200 Subject: [PATCH] Add "Mark as watched" video context menu item (#193) --- Model/Watch.swift | 26 +++++++++++++++++++++++++ Shared/Views/VideoContextMenuView.swift | 16 +++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/Model/Watch.swift b/Model/Watch.swift index 45c456cc..2864a057 100644 --- a/Model/Watch.swift +++ b/Model/Watch.swift @@ -14,6 +14,32 @@ extension Watch { NSFetchRequest(entityName: "Watch") } + @nonobjc class func markAsWatched(videoID: String, duration: Double, context: NSManagedObjectContext) { + let watchFetchRequest = Watch.fetchRequest() + watchFetchRequest.predicate = NSPredicate(format: "videoID = %@", videoID as String) + + let results = try? context.fetch(watchFetchRequest) + + context.perform { + let watch: Watch? + + if results?.isEmpty ?? true { + watch = Watch(context: context) + watch?.videoID = videoID + } else { + watch = results?.first + } + + guard let watch = watch else { return } + + watch.videoDuration = duration + watch.stoppedAt = duration + watch.watchedAt = Date() + + try? context.save() + } + } + @NSManaged var videoID: String @NSManaged var videoDuration: Double diff --git a/Shared/Views/VideoContextMenuView.swift b/Shared/Views/VideoContextMenuView.swift index 7708bab5..b3ca3836 100644 --- a/Shared/Views/VideoContextMenuView.swift +++ b/Shared/Views/VideoContextMenuView.swift @@ -22,6 +22,7 @@ struct VideoContextMenuView: View { @Default(.saveHistory) private var saveHistory + private var backgroundContext = PersistenceController.shared.container.newBackgroundContext() private var viewContext: NSManagedObjectContext = PersistenceController.shared.container.viewContext init(video: Video) { @@ -46,6 +47,10 @@ struct VideoContextMenuView: View { continueButton } + if !(watch?.finished ?? false) { + markAsWatchedButton + } + if !watch.isNil, !watchingNow { removeFromHistoryButton } @@ -113,6 +118,9 @@ struct VideoContextMenuView: View { } if let watch = watch, let watchedAtString = watch.watchedAtString { + if watchedAtString == "in 0 seconds" { + return "Just watched" + } return "Watched \(watchedAtString)" } @@ -127,6 +135,14 @@ struct VideoContextMenuView: View { } } + var markAsWatchedButton: some View { + Button { + Watch.markAsWatched(videoID: video.videoID, duration: video.length, context: backgroundContext) + } label: { + Label("Mark as watched", systemImage: "checkmark.circle.fill") + } + } + var removeFromHistoryButton: some View { Button { guard let watch = watch else {