Skip to content

Commit

Permalink
PIA-1003: Sort and filter servers list by favorite and recommended
Browse files Browse the repository at this point in the history
  • Loading branch information
kp-laura-sempere committed Feb 1, 2024
1 parent a46bb33 commit e916d98
Show file tree
Hide file tree
Showing 37 changed files with 1,437 additions and 127 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "favourite.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "heart.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}
Binary file not shown.
4 changes: 4 additions & 0 deletions PIA VPN-tvOS/PIA VPN-tvOS.entitlements
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,9 @@
<array>
<string>group.com.privateinternetaccess</string>
</array>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)group.com.privateinternetaccess</string>
</array>
</dict>
</plist>
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,44 @@ class RegionsSelectionFactory {
return RegionsContainerViewModel(onSearchSelectedAction: .navigate(router: AppRouterFactory.makeAppRouter(), destination: RegionSelectionDestinations.search))
}

static func makeRegionsListViewModel() -> RegionsListViewModel {
return RegionsListViewModel(useCase: makeRegionsListUseCase(), onServerSelectedRouterAction: .goBackToRoot(router: AppRouterFactory.makeAppRouter()))

static func makeRegionsListViewModel(with filter: RegionsListViewModel.Filter) -> RegionsListViewModel {
return RegionsListViewModel(filter: filter, listUseCase: makeRegionsListUseCase(),
favoriteUseCase: makeFavoriteRegionUseCase(),
onServerSelectedRouterAction: .goBackToRoot(router: AppRouterFactory.makeAppRouter()), previouslySearchedRegions: makeSearchedRegionsAvailability())
}

static func makeSearchedRegionsAvailability() -> SearchedRegionsAvailabilityType {
return SearchedRegionsAvailability(userDefaults: UserDefaults.standard)
}

static func makeAllRegionsListView() -> RegionsListView {
return RegionsListView(viewModel: makeRegionsListViewModel(with: .all))
}

static func makeFavoriteRegionsListView() -> RegionsListView {
return RegionsListView(viewModel: makeRegionsListViewModel(with: .favorites))
}

static func makeRegionsListView() -> RegionsListView {
return RegionsListView(viewModel: makeRegionsListViewModel())
static func makeSearchRegionsListView() -> RegionsListView {
return RegionsListView(viewModel: makeRegionsListViewModel(with: .searchResults))
}

static func makeRecommendedRegionsListView() -> RegionsListView {
return RegionsListView(viewModel: makeRegionsListViewModel(with: .recommended))
}

static func makePreviouslySearchedRegionsListView() -> RegionsListView {
return RegionsListView(viewModel: makeRegionsListViewModel(with: .previouslySearched))
}


static func makeRegionsListUseCase() -> RegionsListUseCaseType {
return RegionsListUseCase(serverProvider: DashboardFactory.makeServerProvider(), clientPreferences: Client.preferences)
}

static func makeFavoriteRegionUseCase() -> FavoriteRegionUseCaseType {
return FavoriteRegionUseCase(keychain: KeychainFactory.makeKeychain())
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// SearchedRegionsAvailability.swift
// PIA VPN-tvOS
//
// Created by Laura S on 1/30/24.
// Copyright © 2024 Private Internet Access Inc. All rights reserved.
//

import Foundation

protocol SearchedRegionsAvailabilityType {
func get() -> [String]
func set(value: [String])
}


class SearchedRegionsAvailability: SearchedRegionsAvailabilityType {
private let userDefaults: UserDefaults

init(userDefaults: UserDefaults) {
self.userDefaults = userDefaults
}

func get() -> [String] {
return userDefaults.array(forKey: .kSearchedRegionsIdentifiers) as? [String] ?? []
}

func set(value: [String]) {
userDefaults.set(value, forKey: .kSearchedRegionsIdentifiers)
}
}


extension String {
static let kSearchedRegionsIdentifiers = "kSearchedRegionsIdentifiers"
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import Foundation
import SwiftUI

class RegionsContainerViewModel: ObservableObject {
enum RegionSelectionSideMenuItems: CaseIterable, Identifiable {
enum RegionsNavigationItems: CaseIterable, Identifiable {
case all
case search
case favourites
case favorites

var id: Self {
return self
Expand All @@ -22,30 +22,38 @@ class RegionsContainerViewModel: ObservableObject {
var text: String {
switch self {
case .all:
return L10n.Localizable.RegionsView.SplitMenu.AllItem.title
return L10n.Localizable.Regions.Filter.All.title
case .search:
return L10n.Localizable.RegionsView.SplitMenu.SearchItem.title
case .favourites:
return L10n.Localizable.RegionsView.SplitMenu.FavoritesItem.title
return L10n.Localizable.Regions.Filter.Search.title
case .favorites:
return L10n.Localizable.Regions.Filter.Favorites.title
}
}
}

@Published var sideMenuItems: [RegionSelectionSideMenuItems] = RegionSelectionSideMenuItems.allCases
@Published var sideMenuItems: [RegionsNavigationItems] = RegionsNavigationItems.allCases

@Published private(set) var selectedSideMenuItem: RegionSelectionSideMenuItems = .all
@Published var selectedSection: RegionsNavigationItems = .all

var searchButtonTitle: String {
L10n.Localizable.Region.Search.placeholder
}

var searchFieldPrompt: String {
L10n.Localizable.Regions.Search.InputField.placeholder
}

private let onSearchSelectedAction: AppRouter.Actions

init(onSearchSelectedAction: AppRouter.Actions) {
self.onSearchSelectedAction = onSearchSelectedAction
}

func navigate(to route: RegionSelectionSideMenuItems) {
func navigate(to route: RegionsNavigationItems) {
selectedSection = route

if route == .search {
onSearchSelectedAction.execute()
} else {
selectedSideMenuItem = route
}

}
Expand Down
Loading

0 comments on commit e916d98

Please sign in to comment.