Skip to content

Commit c45d738

Browse files
committed
Article bookmark button functional
1 parent be6952f commit c45d738

3 files changed

Lines changed: 55 additions & 3 deletions

File tree

BoxFeed/Screens/Article/ArticleView.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ struct ArticleView: View {
1212
@Environment(\.dismiss) var dismiss
1313
@StateObject var viewModel: ArticleViewModel
1414

15+
// CoreData
16+
@Environment(\.managedObjectContext) var moc
17+
@FetchRequest(fetchRequest: ArticleCD.getAllArticles()) var articles: FetchedResults<ArticleCD>
18+
19+
1520
var body: some View {
1621
NavigationView {
1722
ScrollView(.vertical, showsIndicators: false) {
@@ -82,8 +87,9 @@ extension ArticleView {
8287

8388
VStack(spacing: 0) {
8489
HStack(alignment: .center) {
85-
Button(action: { }) {
86-
Image.bookmark_filled.resizable()
90+
Button(action: { viewModel.bookmarkArticle(articles, moc) }) {
91+
(viewModel.isBookmarked(articles) ? Image.bookmark_filled : Image.bookmark)
92+
.resizable()
8793
.renderingMode(.template)
8894
.foregroundColor(.white)
8995
.frame(width: 20, height: 20)

BoxFeed/Screens/Article/ArticleViewModel.swift

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
// Created by Sameer Nawaz on 18/09/21.
66
//
77

8-
import Foundation
8+
import SwiftUI
9+
import CoreData
910

1011
class ArticleViewModel: ObservableObject {
1112

@@ -14,4 +15,49 @@ class ArticleViewModel: ObservableObject {
1415
init(model: NewsModel) {
1516
self.model = model
1617
}
18+
19+
func isBookmarked(_ articles: FetchedResults<ArticleCD>) -> Bool {
20+
for article in articles {
21+
if article.url == model.url?.absoluteString {
22+
return true
23+
}
24+
}
25+
return false
26+
}
27+
28+
func bookmarkArticle(
29+
_ articles: FetchedResults<ArticleCD>,
30+
_ moc: NSManagedObjectContext
31+
) {
32+
for article in articles {
33+
if article.url == model.url?.absoluteString {
34+
removeBookmark(article, moc)
35+
return
36+
}
37+
}
38+
addBookmark(moc)
39+
}
40+
41+
private func addBookmark(_ moc: NSManagedObjectContext) {
42+
let articleObj = ArticleCD(context: moc)
43+
articleObj.id = UUID()
44+
articleObj.createdAt = Date()
45+
articleObj.sourceId = model.id?.rawValue
46+
articleObj.author = model.author
47+
articleObj.content = model.content
48+
articleObj.desc = model.description
49+
articleObj.publishedAt = model.publishedAt
50+
articleObj.title = model.title
51+
articleObj.url = model.url?.absoluteString
52+
articleObj.urlToImage = model.urlToImage?.absoluteString
53+
do { try moc.save() }
54+
catch { print(error.localizedDescription) }
55+
}
56+
57+
private func removeBookmark(_ article: ArticleCD, _ moc: NSManagedObjectContext) {
58+
moc.delete(article)
59+
do {
60+
try moc.save()
61+
} catch { print(error.localizedDescription) }
62+
}
1763
}

0 commit comments

Comments
 (0)