diff --git a/SodaLive/Sources/App/AppDeepLinkHandler.swift b/SodaLive/Sources/App/AppDeepLinkHandler.swift index c16644db..50b6386c 100644 --- a/SodaLive/Sources/App/AppDeepLinkHandler.swift +++ b/SodaLive/Sources/App/AppDeepLinkHandler.swift @@ -200,6 +200,13 @@ enum AppDeepLinkHandler { } return .series(seriesId: seriesId) + case "gift-detail": + guard let applicationNo = identifier?.trimmingCharacters(in: .whitespacesAndNewlines), + !applicationNo.isEmpty else { + return nil + } + return .giftDetail(applicationNo: applicationNo) + case "community": let postId = communityPostId(queryItems: components?.queryItems) diff --git a/work/tests/AppDeepLinkGiftDetailCheck.swift b/work/tests/AppDeepLinkGiftDetailCheck.swift index 2372e610..86d00d2a 100644 --- a/work/tests/AppDeepLinkGiftDetailCheck.swift +++ b/work/tests/AppDeepLinkGiftDetailCheck.swift @@ -50,6 +50,16 @@ enum GiftDetailDeepLinkCheck { settle() check(AppState.shared.appliedStep == .giftDetail(applicationNo: "GIFT-2026-001"), "decoded identifier routes to gift detail") + for url in [ + "voiceon://gift-detail/A-1002609300001", + "voiceon-test://gift-detail/A-1002609300001" + ] { + AppState.shared.appliedStep = nil + check(AppDeepLinkHandler.handle(urlString: url), "path gift detail accepted for \(url)") + settle() + check(AppState.shared.appliedStep == .giftDetail(applicationNo: "A-1002609300001"), "path identifier routes to gift detail") + } + AppState.shared.appliedStep = nil check(AppDeepLinkHandler.handle(urlString: "voiceon://?deepLinkValue=%20GIFT_DETAIL%20&deepLinkId=%20GIFT-2026-002%20"), "trimmed semantic values accepted") settle() @@ -60,6 +70,7 @@ enum GiftDetailDeepLinkCheck { "voiceon://?deepLinkId=GIFT-2026-003", "voiceon://?deepLinkValue=GIFT_DETAIL&deepLinkId=%20%20", "voiceon://?deepLinkValue=OTHER&deepLinkId=GIFT-2026-004", + "voiceon://gift-detail/", "http://?deepLinkValue=GIFT_DETAIL&deepLinkId=GIFT-2026-005" ] { check(!AppDeepLinkHandler.handle(urlString: url), "rejects invalid or unsupported \(url)") @@ -77,6 +88,16 @@ enum GiftDetailDeepLinkCheck { } check(AppState.shared.appliedStep == nil, "splash does not apply gift action") + AppState.shared.pendingDeepLinkAction = nil + check(AppDeepLinkHandler.handle(urlString: "voiceon-test://gift-detail/A-1002609300001"), "splash accepts path gift detail") + settle() + if case .giftDetail(let applicationNo)? = AppState.shared.pendingDeepLinkAction { + check(applicationNo == "A-1002609300001", "splash stores path gift action") + } else { + check(false, "splash stores path gift action") + } + check(AppState.shared.appliedStep == nil, "splash does not apply path gift action") + AppState.shared.rootStep = .main AppState.shared.appliedStep = nil AppState.shared.pendingDeepLinkAction = nil