Skip to content

search: tab one is functional via public itunes lookup#3

Merged
Evil0ctal merged 1 commit into
mainfrom
feat/m1-search
May 6, 2026
Merged

search: tab one is functional via public itunes lookup#3
Evil0ctal merged 1 commit into
mainfrom
feat/m1-search

Conversation

@Evil0ctal
Copy link
Copy Markdown
Owner

what

Search tab works end-to-end against the public itunes lookup/search API.
Type a term, see results, switch storefronts. No login, no stealth, no
private storefront protocol — public itunes APIs only.

why

  • gives the user a visible feature so the tipa stops being a 4-tab
    coming-soon screen
  • lets the http + endpoints + appstoreclient skeleton ship before the
    stealth machinery lands; M2 list-versions then plugs into the same
    HTTPClient/throttle pair

changes

  • HTTPClient + AsyncThrottle gate (>=500ms apart)
  • Endpoints (single edit point if Apple changes paths)
  • AppStoreClient protocol + Live impl
  • Lookup + Search using JSONDecoder against /lookup and /search
  • App domain model + private SoftwareItem raw shape
  • SearchView/SearchViewModel: debounced typing, country menu, retry,
    empty/error/loading states; ios 14 baseline (no @focusstate / .task)

test

  • xcodebuild Debug + Release archive both green
  • Scripts/build_tipa.sh produces a 2.5MB tipa with all 5 entitlements
  • Real-device test: install tipa via TrollStore, type "telegram" in
    Search, expect rows for Telegram + Telegram X with artwork.

not in this PR

  • App detail page (M2)
  • listVersions / partial-zip / download / install (M2-M4)
  • stealth login (separate PR; will plug into the same AppStoreClient
    via an Account parameter when private endpoints land)

ships the m1 search slice without waiting for stealth. uses the public
itunes.apple.com/{search,lookup} endpoints — no auth, no storefront
private api, no risk-control surface. user opens tab one, types two
characters, gets results in their picked country.

* HTTPClient + AsyncThrottle (>=500ms between calls; 1-doc §5 risk #1)
* Endpoints: single source of truth for storefront urls
* SoftwareItem: private raw shape; toApp() sanitizes to the public model
* AppStoreClient protocol + Live impl wrapping URLSession
* Lookup.byBundleID + Search.apps
* SearchView + SearchViewModel with debounced typing, retry, error states,
  country menu (12 popular regions; full table arrives with M2 storefront ids)

ios 14 baseline preserved:
* no .focused / .task(id:) / .textInputAutocapitalization
* navigation uses StackNavigationViewStyle, lists use PlainListStyle
* artwork loads via plain URLSession + onAppear/onChange

EvilStoreApp now declares conformance to SwiftUI.App explicitly so the
domain `App` model doesn't shadow the protocol.
@Evil0ctal Evil0ctal merged commit d45cf2a into main May 6, 2026
3 checks passed
@Evil0ctal Evil0ctal deleted the feat/m1-search branch May 6, 2026 00:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant