Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions GovUK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,11 @@
4E00EEF72CCB0788007B61E8 /* TopicOnboardingCardModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E00EEF62CCB0788007B61E8 /* TopicOnboardingCardModel.swift */; };
4E00EEF92CCB0859007B61E8 /* TopicOnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E00EEF82CCB0859007B61E8 /* TopicOnboardingViewController.swift */; };
4E00EF072CCB12CD007B61E8 /* BaseTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E00EF062CCB12CD007B61E8 /* BaseTabBarController.swift */; };
4E19C85E2E65109900D56C33 /* ChatWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E19C85D2E65109900D56C33 /* ChatWidgetView.swift */; };
4E1534032E398073002DEDB9 /* TopicsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1534022E398073002DEDB9 /* TopicsView.swift */; };
4E1534032E398073002DEDB9 /* TopicsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1534022E398073002DEDB9 /* TopicsWidget.swift */; };
4E1534052E3982E7002DEDB9 /* TopicCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1534042E3982E7002DEDB9 /* TopicCard.swift */; };
4E15340B2E398647002DEDB9 /* HomeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E15340A2E398647002DEDB9 /* HomeContentView.swift */; };
4E15340D2E3A248E002DEDB9 /* TopicsWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E15340C2E3A248E002DEDB9 /* TopicsWidgetModel.swift */; };
4E19C85E2E65109900D56C33 /* ChatWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E19C85D2E65109900D56C33 /* ChatWidgetView.swift */; };
4E265D2A2DB0E6510089CF9E /* Authority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E265D252DB0E6510089CF9E /* Authority.swift */; };
4E265D2D2DB0E6510089CF9E /* LocalAuthorityAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E265D282DB0E6510089CF9E /* LocalAuthorityAddress.swift */; };
4E2A875D2D48FC41002A01D7 /* UIApplication+Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2A875C2D48FC40002A01D7 /* UIApplication+Window.swift */; };
Expand Down Expand Up @@ -130,7 +130,7 @@
4EBE646B2D15AAD6007A6E97 /* MinimumLengthValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBE646A2D15AAD6007A6E97 /* MinimumLengthValidator.swift */; };
4EBE646D2D15AB05007A6E97 /* CharValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBE646C2D15AB05007A6E97 /* CharValidator.swift */; };
4EE44BAD2E70332C0093D380 /* NonTappableCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE44BAC2E70332C0093D380 /* NonTappableCardView.swift */; };
4EE5F3E52DAFD36B008C60ED /* LocalAuthorityWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE5F3E42DAFD36B008C60ED /* LocalAuthorityWidgetView.swift */; };
4EE5F3E52DAFD36B008C60ED /* LocalAuthorityWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE5F3E42DAFD36B008C60ED /* LocalAuthorityWidget.swift */; };
4EE5F3E72DAFD42A008C60ED /* LocalAuthorityExplainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE5F3E62DAFD42A008C60ED /* LocalAuthorityExplainerView.swift */; };
4EE5F3E92DAFD463008C60ED /* LocalAuthorityPostcodeEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE5F3E82DAFD463008C60ED /* LocalAuthorityPostcodeEntryView.swift */; };
4EE5F3F02DAFDB80008C60ED /* LocalAuthority.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 4EE5F3EF2DAFDB80008C60ED /* LocalAuthority.xcstrings */; };
Expand Down Expand Up @@ -519,11 +519,11 @@
4E00EEF62CCB0788007B61E8 /* TopicOnboardingCardModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicOnboardingCardModel.swift; sourceTree = "<group>"; };
4E00EEF82CCB0859007B61E8 /* TopicOnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicOnboardingViewController.swift; sourceTree = "<group>"; };
4E00EF062CCB12CD007B61E8 /* BaseTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTabBarController.swift; sourceTree = "<group>"; };
4E19C85D2E65109900D56C33 /* ChatWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatWidgetView.swift; sourceTree = "<group>"; };
4E1534022E398073002DEDB9 /* TopicsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicsView.swift; sourceTree = "<group>"; };
4E1534022E398073002DEDB9 /* TopicsWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicsWidget.swift; sourceTree = "<group>"; };
4E1534042E3982E7002DEDB9 /* TopicCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicCard.swift; sourceTree = "<group>"; };
4E15340A2E398647002DEDB9 /* HomeContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeContentView.swift; sourceTree = "<group>"; };
4E15340C2E3A248E002DEDB9 /* TopicsWidgetModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicsWidgetModel.swift; sourceTree = "<group>"; };
4E19C85D2E65109900D56C33 /* ChatWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatWidgetView.swift; sourceTree = "<group>"; };
4E265D252DB0E6510089CF9E /* Authority.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authority.swift; sourceTree = "<group>"; };
4E265D282DB0E6510089CF9E /* LocalAuthorityAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthorityAddress.swift; sourceTree = "<group>"; };
4E2A875C2D48FC40002A01D7 /* UIApplication+Window.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Window.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -557,7 +557,7 @@
4EBE646A2D15AAD6007A6E97 /* MinimumLengthValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MinimumLengthValidator.swift; sourceTree = "<group>"; };
4EBE646C2D15AB05007A6E97 /* CharValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharValidator.swift; sourceTree = "<group>"; };
4EE44BAC2E70332C0093D380 /* NonTappableCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonTappableCardView.swift; sourceTree = "<group>"; };
4EE5F3E42DAFD36B008C60ED /* LocalAuthorityWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthorityWidgetView.swift; sourceTree = "<group>"; };
4EE5F3E42DAFD36B008C60ED /* LocalAuthorityWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthorityWidget.swift; sourceTree = "<group>"; };
4EE5F3E62DAFD42A008C60ED /* LocalAuthorityExplainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthorityExplainerView.swift; sourceTree = "<group>"; };
4EE5F3E82DAFD463008C60ED /* LocalAuthorityPostcodeEntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthorityPostcodeEntryView.swift; sourceTree = "<group>"; };
4EE5F3EF2DAFDB80008C60ED /* LocalAuthority.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = LocalAuthority.xcstrings; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1236,7 +1236,7 @@
4EE5F3E32DAFD350008C60ED /* LocalAuthority */ = {
isa = PBXGroup;
children = (
4EE5F3E42DAFD36B008C60ED /* LocalAuthorityWidgetView.swift */,
4EE5F3E42DAFD36B008C60ED /* LocalAuthorityWidget.swift */,
4EE5F3E62DAFD42A008C60ED /* LocalAuthorityExplainerView.swift */,
4EE5F3E82DAFD463008C60ED /* LocalAuthorityPostcodeEntryView.swift */,
4EEC0F312DBB7C6E00D745F2 /* StoredLocalAuthorityWidgetView.swift */,
Expand Down Expand Up @@ -1967,7 +1967,7 @@
isa = PBXGroup;
children = (
4E1534042E3982E7002DEDB9 /* TopicCard.swift */,
4E1534022E398073002DEDB9 /* TopicsView.swift */,
4E1534022E398073002DEDB9 /* TopicsWidget.swift */,
);
path = Topics;
sourceTree = "<group>";
Expand Down Expand Up @@ -2361,7 +2361,7 @@
5DFB488D2DE9F7F600B41CDA /* AppForcedUpdateCoordinator.swift in Sources */,
5DFB488E2DE9F7F600B41CDA /* ReLaunchCoordinator.swift in Sources */,
5DFB488F2DE9F7F600B41CDA /* PeriAuthCoordinator.swift in Sources */,
4E1534032E398073002DEDB9 /* TopicsView.swift in Sources */,
4E1534032E398073002DEDB9 /* TopicsWidget.swift in Sources */,
5DFB48902DE9F7F600B41CDA /* AuthenticationCoordinator.swift in Sources */,
5DFB48912DE9F7F600B41CDA /* TopicOnboardingCoordinator.swift in Sources */,
5DFB48922DE9F7F600B41CDA /* PostAuthCoordinator.swift in Sources */,
Expand Down Expand Up @@ -2546,7 +2546,7 @@
4EFE22A52D0CD0D500136D56 /* RegexRedactor.swift in Sources */,
169842DA2DB0004800E3EA66 /* LocalAuthenticationOnboardingViewModel.swift in Sources */,
D028CCF62CB9619B00742620 /* Topic.swift in Sources */,
4EE5F3E52DAFD36B008C60ED /* LocalAuthorityWidgetView.swift in Sources */,
4EE5F3E52DAFD36B008C60ED /* LocalAuthorityWidget.swift in Sources */,
4EE44BAD2E70332C0093D380 /* NonTappableCardView.swift in Sources */,
5D7D255F2D141CEC00BDC217 /* Redactor+Convenience.swift in Sources */,
5D4F97EB2BFF7725002CBDDE /* CoordinatorBuilder.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,17 @@
}
}
},
"localAuthorityEditButtonTitle" : {
"extractionState" : "manual",
"localizations" : {
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Edit"
}
}
}
},
"localAuthorityEmptyTextField" : {
"extractionState" : "manual",
"localizations" : {
Expand Down Expand Up @@ -351,7 +362,7 @@
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enter your postcode to see services for your area"
"value" : "Add a link to your local councils website"
}
}
}
Expand Down
10 changes: 3 additions & 7 deletions Production/govuk_ios/SwiftUIViews/NonTappableCardView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,18 @@ struct NonTappableCardView: View {
var body: some View {
VStack {
HStack {
if verticalSizeClass != .compact {
Spacer()
}
Text(text)
.font(Font.govUK.body)
.multilineTextAlignment(.leading)
.foregroundColor(
Color(UIColor.govUK.text.secondary)
)
Spacer()
}
}.padding()
.background(
}.padding()
}
.background(
Color(uiColor: UIColor.govUK.fills.surfaceCardNonTappable)
)
.roundedBorder(borderColor: .clear)
.padding([.horizontal])
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class HomeViewController: BaseViewController {

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewModel.fetchWidgets()
navigationController?.setNavigationBarHidden(true, animated: animated)
}

Expand Down
50 changes: 46 additions & 4 deletions Production/govuk_ios/ViewModels/HomeViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class HomeViewModel: ObservableObject {
let activityService: ActivityServiceInterface
let localAuthorityService: LocalAuthorityServiceInterface
@Published var homeContentScrollToTop: Bool = false
@Published var widgets: [HomepageWidget] = []

init(analyticsService: AnalyticsServiceInterface,
configService: AppConfigServiceInterface,
Expand Down Expand Up @@ -52,22 +53,48 @@ class HomeViewModel: ObservableObject {
self.searchService = searchService
self.activityService = activityService
self.localAuthorityService = localAuthorityService
fetchWidgets()
}
var widgets: [HomepageWidget] {
let array = [topicsView, recentActivityWidget].compactMap { $0 }
return array

func fetchWidgets() {
let array = [
topicsView,
localServicesWidget,
storedLocalAuthorityWidget,
recentActivityWidget
].compactMap { $0 }
widgets = array
}

var topicsView: HomepageWidget? {
guard featureEnabled(.topics)
else { return nil }
return HomepageWidget(
content: TopicsView(
content: TopicsWidget(
viewModel: self.topicsWidgetViewModel
)
)
}

private var storedLocalAuthorityWidget: HomepageWidget? {
guard featureEnabled(.localServices) else { return nil }
let localAuthorities = localAuthorityService.fetchSavedLocalAuthority()
guard localAuthorities.count > 0 else { return nil }

let viewModel = StoredLocalAuthorityWidgetViewModel(
analyticsService: analyticsService,
localAuthorities: localAuthorities,
openURLAction: openURLAction,
openEditViewAction: editLocalAuthorityAction
)
let view = StoredLocalAuthorityWidgetView(
viewModel: viewModel
)
return HomepageWidget(
content: view
)
}

var recentActivityWidget: HomepageWidget? {
guard featureEnabled(.topics)
else { return nil }
Expand All @@ -85,6 +112,21 @@ class HomeViewModel: ObservableObject {
)
}

var localServicesWidget: HomepageWidget? {
guard featureEnabled(.localServices),
localAuthorityService.fetchSavedLocalAuthority().first == nil
else { return nil }
let viewModel = LocalAuthorityWidgetViewModel { [weak self] in
self?.localAuthorityAction()
}
let view = LocalAuthorityWidget(
viewModel: viewModel
)
return HomepageWidget(
content: view
)
}

lazy var searchEnabled = featureEnabled(.search)
lazy var searchViewModel: SearchViewModel = SearchViewModel(
analyticsService: analyticsService,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import Foundation

struct LocalAuthorityWidgetViewModel {
let titleOne: String = String.localAuthority.localized(
"localAuthorityWidgetViewTitle"
)
let titleTwo: String = String.localAuthority.localized(
let title: String = String.localAuthority.localized(
"localServicesTitle"
)
let description: String = String.localAuthority.localized(
Expand Down
2 changes: 2 additions & 0 deletions Production/govuk_ios/Views/Home/HomeContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct HomeContentView: View {
.id(topID)
ForEach(viewModel.widgets) { widget in
widget
.padding(12)
}
}
.onChange(of: viewModel.homeContentScrollToTop) { shouldScroll in
Expand All @@ -27,6 +28,7 @@ struct HomeContentView: View {
}
}
}.onAppear {
viewModel.fetchWidgets()
viewModel.trackScreen(screen: self)
}
.background(Color(uiColor: UIColor.govUK.fills.surfaceBackground))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import SwiftUI
import Foundation
import UIComponents

struct LocalAuthorityWidget: View {
private var viewModel: LocalAuthorityWidgetViewModel

init(viewModel: LocalAuthorityWidgetViewModel) {
self.viewModel = viewModel
}

var body: some View {
Button {
viewModel.tapAction()
} label: {
VStack {
HStack {
Text(viewModel.title)
.font(Font.govUK.title3Semibold)
.foregroundColor(Color(UIColor.govUK.text.primary))
Spacer()
}
.padding(.bottom, 12)
HStack(alignment: .center) {
Spacer()
VStack(alignment: .center) {
Spacer()
Image(systemName: "plus.circle")
.foregroundColor(
Color(
UIColor.govUK.text.iconTertiary
)
)
.padding(.bottom, 6)
.font(.title)
Text(viewModel.description)
.multilineTextAlignment(.center)
.font(Font.govUK.body)
.foregroundColor(Color(UIColor.govUK.text.primary))
Spacer()
}
.padding()
Spacer()
}
.background {
Color(uiColor: UIColor.govUK.fills.surfaceList)
}
.roundedBorder(borderColor: .clear)
.shadow(
color: Color(
uiColor: UIColor.govUK.strokes.cardDefault
), radius: 0, x: 0, y: 3
)
}
}
}
}

This file was deleted.

Loading