Add in-app pet purchase flow (RND-1965)#2946
Draft
hugokallstrom wants to merge 21 commits into
Draft
Conversation
Mirrors the car purchase architecture for SE_PET_DOG and SE_PET_CAT. One feature-purchase-pet module handles both species; differs from car by needing a breeds query (PriceIntentAvailableBreeds) and one species-conditional last question. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
16-task plan with TDD-style steps, full code in each step, and explicit verification commands. Mirrors the apartment/car plan structure. Includes manual emulator verification per the verifying-android-changes-in-emulator skill. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ance Pet insurance has a single web cross-sell URL slug (pet-insurance / djurforsakring) that doesn't distinguish dog vs cat — the species is chosen on the landing page. Mirror that on Android by adding a SpeciesPicker destination that runs before the form. PetPurchaseGraphDestination no longer carries productName. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- RadioGroup Labeled styles now propagate fillMaxWidth to the inner Surface, so a labeled radio container can fill its parent's width when given a fillMaxWidth modifier. - DropdownWithDialog dialog adds 4dp spacing between items for readability. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Replace gender / yes-no dropdowns with horizontal radio rows in a labeled card (using Labeled.HorizontalFlow style). - Birth-date value uses bodySmall to match HedvigTextField Medium tokens. - Custom error text on radio rows and the birth-date picker uses the same color and style as DropdownWithDialog (textSecondary, Label). - Hoist dropdown/picker fields (selectedBreed, birthDate, gender, isNeutered, speciesAnswer) into the ViewModel so they survive back-navigation from tier select. Text fields stay in local rememberSaveable to avoid cursor-jump from round-trip updates. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…se-car Captures the pre-existing UnknownIssueId/UnstableApi warnings that the hedvig.gradle.plugin emits on every module — same baseline shape as sibling modules. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
feature-purchase-petmodule that handles bothSE_PET_DOGandSE_PET_CATfrom one entry point.pet-insurance/djurforsakringland on a species picker (dog vs cat), then a form (pet name, breed, birth date, gender, neutered, dog-owner-history / outside-access, address, zip), then existing common purchase screens (tier → summary → BankID signing → success).CreatePetSessionAndPriceIntent,GetPetBreeds(newpriceIntentAvailableBreedsquery),SubmitPetFormAndGetOffers. 12 unit tests, all passing.feature-purchase-carstructure; reusespurchase-commonunchanged.RadioGroupLabeled styles now forwardfillMaxWidthto the inner Surface, andDropdownWithDialogputs 4dp between dialog items.Architecture
feature-purchase-pet->purchase-common(no feature-to-feature deps). Form state lives in the ViewModel for dropdowns/pickers (survives back navigation from tier select); text fields stay in localrememberSaveableto avoid cursor-jump from round-trip updates — same pattern as the car form.Open items
pet-insurance/djurforsakring) were derived from racoon + storefront. Verified against staging in the emulator with a real impersonated member.// TODO: Add ... to Lokalisecomments per CLAUDE.md. Strings to migrate once the Lokalise keys exist.Spec & plan
docs/superpowers/specs/2026-05-21-pet-purchase-flow-design.mddocs/superpowers/plans/2026-05-21-pet-purchase-flow.mdTest plan
./gradlew :feature-purchase-pet:test— 12/12 pass./gradlew assembleDebug— succeeds./gradlew ktlintCheck— cleanbreeds: []without backend erroruserError(e.g. underage pet) surfaces inErrorDialog🤖 Generated with Claude Code