Skip to content

Commit

Permalink
Merge pull request #1551 from HedvigInsurance/feature/tiers/GEN-2703-…
Browse files Browse the repository at this point in the history
…moving-flow-update

GEN-2703: moving flow update
  • Loading branch information
sladan-hedvig authored Oct 10, 2024
2 parents 35460b8 + b4a4c0c commit 5401991
Show file tree
Hide file tree
Showing 32 changed files with 607 additions and 242 deletions.
7 changes: 2 additions & 5 deletions Projects/App/Sources/Journeys/LoggedInNavigation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -650,12 +650,9 @@ class LoggedInNavigationViewModel: ObservableObject {
let contractStore: ContractStore = globalPresentableStoreContainer.get()
if let contractId, let contract: Contracts.Contract = contractStore.state.contractForId(contractId) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
let changeTierContact: ChangeTierContract = .init(
contractId: contractId,
contractDisplayName: contract.currentAgreement?.productVariant.displayName ?? "",
contractExposureName: contract.exposureDisplayName
self?.isChangeTierPresented = .contractWithSource(
data: .init(source: .changeTier, contractId: contractId)
)
self?.isChangeTierPresented = .init(source: .changeTier, contractId: contractId)
}
}
}
Expand Down
57 changes: 52 additions & 5 deletions Projects/ChangeTier/Sources/Models/ChangeTierIntentModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,69 @@ import hGraphQL
public struct ChangeTierIntentModel: Codable, Equatable, Hashable {
let activationDate: Date
let tiers: [Tier]
let currentPremium: MonetaryAmount
let currentPremium: MonetaryAmount?
let currentTier: Tier?
let currentDeductible: Deductible?
let selectedTier: Tier?
let selectedDeductible: Deductible?
let canEditTier: Bool
let typeOfContract: TypeOfContract
public init(
activationDate: Date,
tiers: [Tier],
currentPremium: MonetaryAmount?,
currentTier: Tier?,
currentDeductible: Deductible?,
selectedTier: Tier?,
selectedDeductible: Deductible?,
canEditTier: Bool,
typeOfContract: TypeOfContract
) {
self.activationDate = activationDate
self.tiers = tiers
self.currentPremium = currentPremium
self.currentTier = currentTier
self.currentDeductible = currentDeductible
self.selectedTier = selectedTier
self.selectedDeductible = selectedDeductible
self.canEditTier = canEditTier
self.typeOfContract = typeOfContract
}
}

public struct Tier: Codable, Equatable, Hashable, Identifiable {
public var id: String
let name: String
let level: Int
let deductibles: [Deductible]
public let deductibles: [Deductible]
let premium: MonetaryAmount
let displayItems: [TierDisplayItem]
let exposureName: String?
let productVariant: ProductVariant?
let FAQs: [FAQ]?

public init(
id: String,
name: String,
level: Int,
deductibles: [Deductible],
premium: MonetaryAmount,
displayItems: [TierDisplayItem],
exposureName: String?,
productVariant: ProductVariant?,
FAQs: [FAQ]?
) {
self.id = id
self.name = name
self.level = level
self.deductibles = deductibles
self.premium = premium
self.displayItems = displayItems
self.exposureName = exposureName
self.productVariant = productVariant
self.FAQs = FAQs
}

public struct TierDisplayItem: Codable, Equatable, Hashable {
public var id = UUID()

Expand All @@ -44,19 +89,21 @@ public struct Tier: Codable, Equatable, Hashable, Identifiable {
}

public struct Deductible: Codable, Hashable, Identifiable {
public var id: String = UUID().uuidString
public var id: String

let deductibleAmount: MonetaryAmount?
let deductiblePercentage: Int?
let subTitle: String?
let premium: MonetaryAmount?
let premium: MonetaryAmount

public init(
id: String,
deductibleAmount: MonetaryAmount?,
deductiblePercentage: Int?,
subTitle: String?,
premium: MonetaryAmount?
premium: MonetaryAmount
) {
self.id = id
self.deductibleAmount = deductibleAmount
self.deductiblePercentage = deductiblePercentage
self.subTitle = subTitle
Expand Down
68 changes: 49 additions & 19 deletions Projects/ChangeTier/Sources/Navigation/ChangeTierNavigation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,18 @@ public class ChangeTierNavigationViewModel: ObservableObject {
@Published public var isInsurableLimitPresented: InsurableLimits?
@Published public var document: Document?

let router = Router()
let router: Router

//make sure to set it!!!
var vm: ChangeTierViewModel!

let changeTierContractsInput: ChangeTierContractsInput?

init(
router: Router,
vm: ChangeTierViewModel
) {
self.router = router
self.vm = vm
self.changeTierContractsInput = nil
}
Expand All @@ -29,16 +32,18 @@ public class ChangeTierNavigationViewModel: ObservableObject {
) {
if changeTierContractsInput.contracts.count == 1, let first = changeTierContractsInput.contracts.first {
self.vm = .init(
changeTierInput: .init(source: changeTierContractsInput.source, contractId: first.contractId),
changeTierIntentModel: nil
changeTierInput: .contractWithSource(
data: .init(source: changeTierContractsInput.source, contractId: first.contractId)
)
)
self.changeTierContractsInput = nil
} else {
self.changeTierContractsInput = changeTierContractsInput
}
router = Router()
}

public static func getTiers(input: ChangeTierInput) async throws(ChangeTierError) -> ChangeTierIntentModel {
public static func getTiers(input: ChangeTierInputData) async throws -> ChangeTierIntentModel {
let client: ChangeTierClient = Dependencies.shared.resolve()
let data = try await client.getTier(input: input)
return data
Expand Down Expand Up @@ -71,7 +76,17 @@ extension ChangeTierRouterActionsWithoutBackButton: TrackingViewNameProtocol {
}
}

public struct ChangeTierInput: Equatable, Identifiable {
public enum ChangeTierInput: Identifiable, Equatable {
public var id: String {
return UUID().uuidString
}
public static func == (lhs: ChangeTierInput, rhs: ChangeTierInput) -> Bool {
return lhs.id != rhs.id
}
case contractWithSource(data: ChangeTierInputData)
case existingIntent(intent: ChangeTierIntentModel, onSelect: ((Tier, Deductible)) -> Void)
}
public struct ChangeTierInputData: Equatable, Identifiable {
public var id: String {
contractId
}
Expand Down Expand Up @@ -134,35 +149,37 @@ public enum ChangeTierSource {

public struct ChangeTierNavigation: View {
@ObservedObject var changeTierNavigationVm: ChangeTierNavigationViewModel

private let useOwnNavigation: Bool
public init(
input: ChangeTierInput,
existingModel: ChangeTierIntentModel? = nil
router: Router? = nil
) {
self.changeTierNavigationVm = .init(
vm: .init(changeTierInput: input, changeTierIntentModel: existingModel)
router: router ?? Router(),
vm: .init(changeTierInput: input)
)
useOwnNavigation = router == nil
}

public init(
input: ChangeTierContractsInput
) {
self.changeTierNavigationVm = .init(changeTierContractsInput: input)
useOwnNavigation = true
}

public var body: some View {
RouterHost(
router: changeTierNavigationVm.router,
options: [],
tracking: ChangeTierTrackingType.changeTierLandingScreen
) {
if let changeTierContracts = changeTierNavigationVm.changeTierContractsInput {
SelectInsuranceScreen(changeTierContractsInput: changeTierContracts)
.routerDestination(for: ChangeTierContract.self) { changeTierContract in
getScreen
}
Group {
if useOwnNavigation {
RouterHost(
router: changeTierNavigationVm.router,
options: [],
tracking: ChangeTierTrackingType.changeTierLandingScreen
) {
wrapperHost
}
} else {
getScreen
wrapperHost
}
}
.environmentObject(changeTierNavigationVm)
Expand Down Expand Up @@ -213,7 +230,20 @@ public struct ChangeTierNavigation: View {
}
}

private var wrapperHost: some View {
Group {
if let changeTierContracts = changeTierNavigationVm.changeTierContractsInput {
SelectInsuranceScreen(changeTierContractsInput: changeTierContracts)
.routerDestination(for: ChangeTierContract.self) { changeTierContract in
getScreen
}
} else {
getScreen
}
}
}
var getScreen: some View {

ChangeTierLandingScreen(vm: changeTierNavigationVm.vm)
.withDismissButton()
.routerDestination(for: ChangeTierRouterActions.self) { action in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,25 @@ import hGraphQL
public class ChangeTierClientDemo: ChangeTierClient {
public init() {}

public func getTier(input: ChangeTierInput) async throws(ChangeTierError) -> ChangeTierIntentModel {
public func getTier(input: ChangeTierInputData) async throws -> ChangeTierIntentModel {

let deductibles: [Deductible] = [
.init(
id: "id1",
deductibleAmount: .init(amount: "1000", currency: "SEK"),
deductiblePercentage: 0,
subTitle: "Endast en rörlig del om 25% av skadekostnaden.",
premium: .init(amount: "1167", currency: "SEK")
),
.init(
id: "id2",
deductibleAmount: .init(amount: "2000", currency: "SEK"),
deductiblePercentage: 25,
subTitle: "Endast en rörlig del om 25% av skadekostnaden.",
premium: .init(amount: "999", currency: "SEK")
),
.init(
id: "id3",
deductibleAmount: .init(amount: "3000", currency: "SEK"),
deductiblePercentage: 15,
subTitle: "Endast en rörlig del om 25% av skadekostnaden.",
Expand Down Expand Up @@ -205,15 +208,18 @@ public class ChangeTierClientDemo: ChangeTierClient {
]
),
currentDeductible: .init(
id: "id1",
deductibleAmount: .init(amount: "449", currency: "SEK"),
deductiblePercentage: 25,
subTitle: "Endast en rörlig del om 25% av skadekostnaden.",
premium: .init(amount: "999", currency: "SEK")
),
selectedTier: nil,
selectedDeductible: nil,
canEditTier: true,
typeOfContract: .seApartmentBrf
)
}

public func commitTier(quoteId: String) async throws(ChangeTierError) {}
public func commitTier(quoteId: String) async throws {}
}
Loading

0 comments on commit 5401991

Please sign in to comment.