Polish mobile onboarding and profile setup (#8438)

Originally stacked on #8375, now merged. Rebased onto main.

Polishes the onboarding landing page, community-link entry, and recovery
sheets. Profile setup uses a consistent sheet with a larger avatar,
inline display name, and draft photo/emoji/animated editing; iOS uses
native controls and coordinated avatar/sheet transitions.

Validation: mobile analysis, full tests, and normal pre-push checks
passed after rebase. Prior iOS build and device walkthrough passed;
native validation was not repeated after this rebase. Snapshots omitted
as requested.

---------

Signed-off-by: kenny lopez <klopez4212@gmail.com>
Signed-off-by: Tom Brow <tomb@block.xyz>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
Co-authored-by: Tom Brow <tomb@block.xyz>
This commit is contained in:
klopez4212
2026-10-22 10:27:38 -07:00
committed by GitHub
parent 8260b6ef4c
commit f7708d0694
45 changed files with 3749 additions and 172 deletions

View File

@@ -158,6 +158,48 @@ void main() {
},
);
test(
'profile draft retries without completing and skip does not prepare media',
() async {
var prepares = 0;
var attempts = 0;
final pending = f.flow.requestProfile(
(_) async {},
saveDraft: (name, prepare) async {
await prepare?.call();
if (++attempts == 1) throw StateError('offline');
writes.add(name);
},
);
final save = f.flow.saveProfileDraft!;
Future<String> prepare() async {
prepares++;
return 'https://media.example/photo';
}
await expectLater(save('Name', prepare), throwsStateError);
expect(f.flow.stage, HostedFlowStage.profile);
await save('Name', prepare);
await pending;
expect(writes, ['Name']);
expect(prepares, 2);
final skipped = f.flow.requestProfile(
(_) async {},
saveDraft: (_, prepare) async {
await prepare?.call();
},
);
final stale = f.flow.saveProfileDraft!;
f.flow.finishProfile();
await skipped;
await expectLater(
stale('Old', prepare),
throwsA(AccountFailure.unavailable),
);
expect(prepares, 2);
},
);
for (final cancelAdmission in [false, true]) {
test(
'leave rejects captured save (cancel admission: $cancelAdmission)',