Skip to content

[iOS][Stela Migration] Navigation calls update — Private Files - #573

Merged
luciancerbu-vsp merged 4 commits into
Developmentfrom
feature/VSP-1777-iOS-Stela-Migration-Navigation-calls-update-Private-Files
Jul 21, 2026
Merged

[iOS][Stela Migration] Navigation calls update — Private Files#573
luciancerbu-vsp merged 4 commits into
Developmentfrom
feature/VSP-1777-iOS-Stela-Migration-Navigation-calls-update-Private-Files

Conversation

@luciancerbu-vsp

Copy link
Copy Markdown
Contributor

Files nav + record read/write/publish to Stela V2

luciancerbu-vsp and others added 4 commits July 1, 2026 22:33
Behind the use_stela_navigation flag (default OFF) with V1 as an automatic
failsafe — no production change until flipped. Covers folder nav/listing,
record detail read, name/description/location edit (single + batch),
publish/copy, and non-My-Files/batch reads. 132 unit tests pass.
Co-Authored-By: Claude Opus 4.8
Follow-up work on the VSP-1777 branch after the Stela V2 migration commit:
an app-wide bug-scan hardening pass, the cross-process upload-queue fix,
and the fixes from a full new-user E2E exploration. No production behavior
change until the Stela flag is flipped. Full unit suite green (2767/0);
every fix confirmed against the code and adversarially reviewed.

App-wide bug scan (all 4 targets):
- Data-loss/correctness: download cache keyed by record identity (was
  colliding on same-named files), 24h capture-filename timestamps,
  Int->Double lat/long bridge.
- Uploads: ShareExtension<->app queue moved to an NSFileCoordinator
  App-Group file store (was a non-atomic UserDefaults read-modify-write
  race across processes); BaseOperation state lock; Phase-3/completed
  marker lock; cancel temp-file cleanup; stale-restart gated on
  background duration; clear queue only after successful persist.
- Networking: off-main JSON decode with deliver-on-main; CDNSession
  delegate leak; error-only logging with a 10KB body cap.
- Session/auth: no-archive session decode; sign-out ordering; MFA
  completion; multipart error surfacing; biometrics main-thread hop;
  single session-expiry alert.
- Shares/onboarding/deep links: deny/revoke feedback, invite-accept
  alert, storage-quota error, share-link expiry display, SideMenu
  observer leak + safe row mutation, truncated /p universal-link guard.

New-user exploration fixes:
- F1 (HIGH, onboarding lockout): invited users whose archives are all
  accepted can proceed again — enable Next and adopt the first accepted
  archive; mixed accepted+pending is left to the Accept button.
- F2 (date): shared DateUtils.displayDate / date(fromISO:) — "Mar. 30,
  2018" per Figma, robust to full-ISO and Postgres timestamps; fixes the
  raw-ISO share sheet and the blank detail Date field.
- F2b (size): Int64.readableFileSize — always a period, never a locale
  comma; matches the design and the Storage screen; routed through every
  file-size site.
- F3: one-shot retry on foreign public-archive load.

Test infra: V1<->V2 parity harness — a DEBUG launch-arg flag toggle, a
nav-source signal, and the first parity XCUITest.

Staging config: Permanent-Staging.entitlements gains the shared App Group
so the ShareExtension and app share the upload queue on staging.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add `force: true` to all three adhoc match calls (app + Push + Share
extensions) in the update_devices lane. `force_for_new_devices: true`
alone only regenerates when it detects a device-count change, which
silently no-ops with App Store Connect API-key auth — so newly
registered tester devices were not picked up (a device registered
weeks before a build still got no Firebase App Distribution install
button). `force: true` unconditionally recreates the profiles from the
current portal device list on every run, which is the intended behavior
for this manual, refresh-only lane.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Nav supersede/completion: getFolderChildrenV2 now ALWAYS completes exactly
  once via a new ChildrenFetchOutcome enum (.committed/.superseded/.failed).
  A superseded fetch previously dropped its completion, leaving the tap's
  spinner hanging ("content doesn't load"). navigateV2 applies the policy:
  forward-superseded retries once so a racing background refresh can't eat
  the tap; back/refresh completes quietly; a superseded fetch never runs the
  V1 failsafe (its out-of-order response could overwrite the newer listing).
  Adds a childrenFetchV2Request injection seam to test this without network.
- HEIC white square: drop thumbnailUrls.256 (the Archivematica access-copy —
  a 48x48 that comes back blank for HEIC) from resolvedThumb256 in both
  FolderChildV2Data and RecordV2Data; fall through to the .thumb.wNNN
  renditions instead.
- Full-res "small then zoom": swap the full-res image and recompute its
  fitted geometry atomically before the blur fades, and raise
  maximumZoomScale to max(1, minScale) so sub-screen originals fill the
  width instead of clamping to native size. Guard setZoomScale against a
  zero/partial layout.
- Thumbnail failure no longer paints the failure card: thumbnailLoadDidFail
  downgrades to the loading state while the full-res pipeline is still in
  flight, so a transient blip doesn't flash "Couldn't load image."
- .retryFailed on SDWebImage loads so one transient CDN failure doesn't
  blacklist the URL for the session.
Adds unit tests for the supersede policy, thumbnail-failure states, and the
fitted-geometry invariant.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@luciancerbu-vsp
luciancerbu-vsp merged commit 38d9622 into Development Jul 21, 2026
2 checks passed
@luciancerbu-vsp
luciancerbu-vsp deleted the feature/VSP-1777-iOS-Stela-Migration-Navigation-calls-update-Private-Files branch July 21, 2026 10:17
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.

2 participants