-
Notifications
You must be signed in to change notification settings - Fork 80
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PIA-886: Dashboard selected region and Quick Connect sections (#54)
* PIA-886: Selected region dashboard section (UI) * PIA-886: Quick connect dashboard section (UI)
- Loading branch information
1 parent
da934a7
commit 14d53bc
Showing
23 changed files
with
745 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
31 changes: 31 additions & 0 deletions
31
PIA VPN-tvOS/Dashboard/Presentation/QuickConnectButtonViewModel.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
|
||
import Foundation | ||
|
||
protocol QuickConnectButtonViewModelDelegate: AnyObject { | ||
func quickConnectButtonViewModel(didSelect server: ServerType) | ||
} | ||
|
||
class QuickConnectButtonViewModel: ObservableObject { | ||
|
||
private let server: ServerType | ||
|
||
@Published var flagName = "" | ||
|
||
weak var delegate: QuickConnectButtonViewModelDelegate? | ||
|
||
init(server: ServerType, delegate: QuickConnectButtonViewModelDelegate?) { | ||
self.server = server | ||
self.delegate = delegate | ||
updateStatus() | ||
} | ||
|
||
func connectButtonDidTap() { | ||
delegate?.quickConnectButtonViewModel(didSelect: server) | ||
} | ||
|
||
private func updateStatus() { | ||
flagName = "flag-\(server.country.lowercased())" | ||
} | ||
|
||
|
||
} |
33 changes: 33 additions & 0 deletions
33
PIA VPN-tvOS/Dashboard/Presentation/QuickConnectViewModel.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
|
||
import Foundation | ||
|
||
class QuickConnectViewModel: ObservableObject { | ||
|
||
@Published private (set) var servers: [ServerType] = [] | ||
|
||
private let connectUseCase: VpnConnectionUseCaseType | ||
private let selectedServerUseCase: SelectedServerUseCaseType | ||
|
||
|
||
init(connectUseCase: VpnConnectionUseCaseType, | ||
selectedServerUseCase: SelectedServerUseCaseType) { | ||
self.connectUseCase = connectUseCase | ||
self.selectedServerUseCase = selectedServerUseCase | ||
|
||
updateStatus() | ||
} | ||
|
||
func updateStatus() { | ||
servers = selectedServerUseCase.getHistoricalServers() | ||
} | ||
|
||
} | ||
|
||
extension QuickConnectViewModel: QuickConnectButtonViewModelDelegate { | ||
|
||
func quickConnectButtonViewModel(didSelect server: ServerType) { | ||
connectUseCase.connect(to: server) | ||
} | ||
|
||
} | ||
|
20 changes: 20 additions & 0 deletions
20
PIA VPN-tvOS/Dashboard/Presentation/SelectedServerViewModel.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
|
||
import Foundation | ||
|
||
|
||
class SelectedServerViewModel: ObservableObject { | ||
let selectedSeverSectionTitle = L10n.Localizable.Tiles.Region.title.uppercased() | ||
@Published var serverName: String = "" | ||
|
||
let useCase: SelectedServerUseCaseType | ||
|
||
init(useCase: SelectedServerUseCaseType) { | ||
self.useCase = useCase | ||
updateState() | ||
} | ||
|
||
private func updateState() { | ||
serverName = useCase.getSelectedServer().name | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// | ||
// QuickConnectButton.swift | ||
// PIA VPN-tvOS | ||
// | ||
// Created by Laura S on 12/26/23. | ||
// Copyright © 2023 Private Internet Access Inc. All rights reserved. | ||
// | ||
|
||
import SwiftUI | ||
|
||
struct QuickConnectButton: View { | ||
@ObservedObject var viewModel: QuickConnectButtonViewModel | ||
|
||
var size: CGFloat = 65 | ||
|
||
var body: some View { | ||
Button { | ||
viewModel.connectButtonDidTap() | ||
} label: { | ||
Image(viewModel.flagName) | ||
.resizable() | ||
.frame(width: size, height: size*0.75) | ||
} | ||
.buttonStyle(.card) | ||
.buttonBorderShape(.roundedRectangle(radius: 2)) | ||
|
||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
|
||
import SwiftUI | ||
|
||
struct QuickConnectView: View { | ||
@ObservedObject var viewModel: QuickConnectViewModel | ||
|
||
let rows = [ GridItem(.adaptive(minimum: 80)) ] | ||
var body: some View { | ||
ScrollView(.horizontal) { | ||
LazyHGrid(rows: rows) { | ||
ForEach(viewModel.servers, id: \.regionIdentifier) { item in | ||
DashboardFactory.makeQuickConnectButton(for: item, delegate: viewModel) | ||
} | ||
} | ||
} | ||
|
||
} | ||
} | ||
|
||
#Preview { | ||
QuickConnectView(viewModel: DashboardFactory.makeQuickConnectViewModel()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
|
||
import SwiftUI | ||
|
||
struct SelectedServerView: View { | ||
@Environment(\.colorScheme) var colorScheme | ||
|
||
@ObservedObject var viewModel: SelectedServerViewModel | ||
|
||
var body: some View { | ||
|
||
HStack(alignment: .top) { | ||
VStack(alignment: .leading) { | ||
Text(viewModel.selectedSeverSectionTitle) | ||
.font(.callout) | ||
Text(viewModel.serverName) | ||
.font(.caption) | ||
} | ||
|
||
Spacer() | ||
|
||
HStack(alignment: .center) { | ||
if colorScheme == .light { | ||
Image.map | ||
} else { | ||
Image.map | ||
.blendMode(.hardLight) | ||
} | ||
|
||
Image(systemName: "chevron.forward") | ||
.foregroundStyle(Color.gray) | ||
.frame(width: 50) | ||
|
||
} | ||
|
||
} | ||
} | ||
} | ||
|
67 changes: 67 additions & 0 deletions
67
PIA VPN-tvOS/Dashboard/UseCases/SelectedServerUseCase.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
|
||
import Foundation | ||
import PIALibrary | ||
|
||
protocol SelectedServerUseCaseType { | ||
func getSelectedServer() -> ServerType | ||
func getHistoricalServers() -> [ServerType] | ||
} | ||
|
||
class SelectedServerUseCase: SelectedServerUseCaseType { | ||
|
||
let serverProvider: ServerProviderType | ||
|
||
init(serverProvider: ServerProviderType) { | ||
self.serverProvider = serverProvider | ||
} | ||
|
||
func getSelectedServer() -> ServerType { | ||
// TODO: get real selected server | ||
return automaticServer() | ||
} | ||
|
||
func getHistoricalServers() -> [ServerType] { | ||
// TODO: Remove this `guard` statement when we get | ||
// the real historical servers | ||
guard !serverProvider.historicalServers.isEmpty else { | ||
return Self.generateDemoServers() | ||
} | ||
return serverProvider.historicalServers | ||
} | ||
|
||
private func automaticServer() -> ServerType { | ||
Server( | ||
serial: "", | ||
name: L10n.Localizable.Global.automatic, | ||
country: "universal", | ||
hostname: "auto.bogus.domain", | ||
pingAddress: nil, | ||
regionIdentifier: "auto" | ||
) | ||
} | ||
} | ||
|
||
// TODO: Remove this extension when we have implemented | ||
// getting the real historical servers (for QuickConnect) | ||
extension SelectedServerUseCase { | ||
private static func generateDemoServers() -> [ServerType] { | ||
var servers: [ServerType] = [] | ||
func createDemoServer(name: String, country: String, regionIdentifier: String) -> ServerType { | ||
Server(serial: "", name: name, country: country, hostname: "auto.bogus.domain", pingAddress: nil, regionIdentifier: regionIdentifier) | ||
} | ||
|
||
servers.append(createDemoServer(name: "Spain", country: "ES", regionIdentifier: "Spain")) | ||
servers.append(createDemoServer(name: "France", country: "FR", regionIdentifier: "France")) | ||
servers.append(createDemoServer(name: "Germany", country: "DE", regionIdentifier: "Germany")) | ||
servers.append(createDemoServer(name: "Netherlands", country: "NL", regionIdentifier: "Netherlands")) | ||
servers.append(createDemoServer(name: "Australia", country: "AU", regionIdentifier: "Australia")) | ||
servers.append(createDemoServer(name: "Portugal", country: "PT", regionIdentifier: "Portugal")) | ||
servers.append(createDemoServer(name: "Ireland", country: "IR", regionIdentifier: "Ireland")) | ||
servers.append(createDemoServer(name: "Italy", country: "IT", regionIdentifier: "Italy")) | ||
servers.append(createDemoServer(name: "Canada", country: "CA", regionIdentifier: "Canada")) | ||
|
||
|
||
return servers | ||
|
||
} | ||
} |
Oops, something went wrong.