Add App Store screenshot harness + listing metadata
DEBUG-only screenshot support (seeded sample data via ScreenshotSeed, per-screen launch args, screenshot roots for both apps) so iPhone + Apple Watch App Store shots can be captured deterministically from the simulator — all excluded from release builds. Also seed ExerciseView's set-grid progress in init so it renders correctly on the first frame. Adds Scripts/metadata/ as the listing source of truth (copy, URLs, review notes, and the captured screenshots). Claude-Session: https://claude.ai/code/session_018gg69MaUetDNzWzBXisfMV
This commit is contained in:
@@ -35,17 +35,22 @@ struct ExerciseProgressView: View {
|
||||
@State private var showingCancelConfirm = false
|
||||
@State private var didRestorePage = false
|
||||
|
||||
init(doc: Binding<WorkoutDocument>, logID: String, onChange: @escaping () -> Void) {
|
||||
/// Forces the starting page (used only by the DEBUG screenshot host to land on a
|
||||
/// rest page). Always nil in normal use.
|
||||
private let debugInitialPage: Int?
|
||||
|
||||
init(doc: Binding<WorkoutDocument>, logID: String, onChange: @escaping () -> Void, debugInitialPage: Int? = nil) {
|
||||
self._doc = doc
|
||||
self.logID = logID
|
||||
self.onChange = onChange
|
||||
self.debugInitialPage = debugInitialPage
|
||||
|
||||
let log = doc.wrappedValue.logs.first { $0.id == logID }
|
||||
let sets = max(1, log?.sets ?? 1)
|
||||
_setCount = State(initialValue: sets)
|
||||
// Resume on the first unfinished set's work page (clamped to the last set).
|
||||
let completed = min(max(0, log?.currentStateIndex ?? 0), sets - 1)
|
||||
_currentPage = State(initialValue: completed * 2)
|
||||
_currentPage = State(initialValue: debugInitialPage ?? (completed * 2))
|
||||
}
|
||||
|
||||
private var log: WorkoutLogDocument? {
|
||||
@@ -96,11 +101,14 @@ struct ExerciseProgressView: View {
|
||||
}
|
||||
.onAppear {
|
||||
// Jump to the first unfinished set. A paged TabView can settle on page 0 on
|
||||
// first layout, so re-assert once more after this run loop.
|
||||
// first layout, so re-assert once more after this run loop. (The screenshot
|
||||
// host pins an explicit page, so skip the resume jump there.)
|
||||
guard !didRestorePage else { return }
|
||||
didRestorePage = true
|
||||
jumpToResumePage()
|
||||
Task { @MainActor in jumpToResumePage() }
|
||||
if debugInitialPage == nil {
|
||||
jumpToResumePage()
|
||||
Task { @MainActor in jumpToResumePage() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user