diff --git a/NYTimes Screenshots/add-search-bar-After.png b/NYTimes Screenshots/add-search-bar-After.png new file mode 100644 index 0000000..e188f08 Binary files /dev/null and b/NYTimes Screenshots/add-search-bar-After.png differ diff --git a/NYTimes Screenshots/add-search-bar-Before.png b/NYTimes Screenshots/add-search-bar-Before.png new file mode 100644 index 0000000..1e58e8c Binary files /dev/null and b/NYTimes Screenshots/add-search-bar-Before.png differ diff --git a/NYTimes.xcodeproj/project.xcworkspace/xcuserdata/NGA252.xcuserdatad/UserInterfaceState.xcuserstate b/NYTimes.xcodeproj/project.xcworkspace/xcuserdata/NGA252.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..5e49fdc Binary files /dev/null and b/NYTimes.xcodeproj/project.xcworkspace/xcuserdata/NGA252.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/NYTimes/ViewModel/ArticleViewModel.swift b/NYTimes/ViewModel/ArticleViewModel.swift index 151b44d..8c9808e 100644 --- a/NYTimes/ViewModel/ArticleViewModel.swift +++ b/NYTimes/ViewModel/ArticleViewModel.swift @@ -15,8 +15,16 @@ class ArticleViewModel: ObservableObject { @Published var articles = [Article]() @Published var isArticlesLoading = false + @Published var searchText = "" var cancellableTask: AnyCancellable? = nil + var searchResults : [Article] { + if searchText.isEmpty { + return articles + } else { + return articles.filter { $0.title.lowercased().contains(searchText.lowercased()) || $0.subtitle.lowercased().contains(searchText.lowercased()) || $0.author.lowercased().contains(searchText.lowercased()) } + } + } func loadArticles(for category: Category) { guard let url = URL(string: category.url) else { return } diff --git a/NYTimes/Views/RootView.swift b/NYTimes/Views/RootView.swift index f538b34..5416981 100644 --- a/NYTimes/Views/RootView.swift +++ b/NYTimes/Views/RootView.swift @@ -14,7 +14,7 @@ struct RootView: View { @Environment(\.managedObjectContext) var managedObjectContext @State var categories: [Category] = Category.allCases - + var initialCategory: Int @ObservedObject var articlesViewModel = ArticleViewModel() @@ -33,6 +33,7 @@ struct RootView: View { var body: some View { NavigationView { if networkReachability.isNetworkConnected { + ArticleView() .edgesIgnoringSafeArea(.all) .navigationViewStyle(StackNavigationViewStyle()) @@ -87,8 +88,11 @@ struct RootView: View { fileprivate func ArticleView() -> some View { return VStack { + NavigationLink(destination: BookmarksView(), isActive: $shouldShowBookmarks) {} NavigationLink(destination: CategoriesView(viewModel: CategoriesViewModel(updateCategories)), isActive: $openCategories) {} + + if articlesViewModel.isArticlesLoading { VStack{ Spacer() @@ -98,9 +102,23 @@ struct RootView: View { Spacer() } } else { + ArticleListView(articlesViewModel: articlesViewModel, bookmarkViewModel: bookmarkViewModel) } Spacer() + + HStack { + Image(systemName: "magnifyingglass") + .foregroundColor(.gray) + .frame(width: 10, alignment: .leading) + .padding(.leading, 8) + + TextField("Search title, subtitle, or author", text: $articlesViewModel.searchText) + .padding(7) + .cornerRadius(8) + + } + CategorySelector( categories: categories, articleViewModel: articlesViewModel, @@ -118,7 +136,9 @@ struct ArticleListView: View { @ObservedObject var bookmarkViewModel: BookmarkViewModel var body: some View { - List(articlesViewModel.articles, id: \.id){ article in + + List(articlesViewModel.searchResults, id: \.id){ article in + NavigationLink(destination: WebViewHolder(url: URL(string: article.url)!, article: article)){ NewsFeedView(article: article) .contextMenu(menuItems: { diff --git a/README.md b/README.md index 2a71fed..17c8ec8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +## Adding SearchBar + ![](https://raw.githubusercontent.com/TheCodeMonks/NYTimes-iOS/master/NYTimes%20Screenshots/Banner%400.25x.png) ![SwiftUI](https://img.shields.io/badge/Interface-SwfitUI-red) ![Architecture](https://img.shields.io/badge/Architecture-MVVM-green)