Files
buzz/mobile/lib/features/pairing/add_community_page.dart
klopez4212 f3a7bab098 Clarify mobile community onboarding and saved identity selection (#8729)
## Summary

Make community onboarding easier to scan: shorten hosted hostname
fallbacks, clarify Add Community instructions, and replace raw saved-key
buttons with identity cards. Use white pages, grey cards, ghost
secondary actions, standard page transitions, and a “Getting ready”
screen during joining. Native profile setup keeps a horizontal modal
transition. Identity cards load signed name/avatar metadata from saved
communities without switching accounts; unavailable profiles use a
neutral fallback. Cards show only the avatar, a 16px medium-weight name,
and muted npub; community lists are omitted. Retiring profile setup
closes its avatar editor too.

### Related issue

Follow-up to #8687 and #8599; no duplicate PR found.

### Testing

- Formatting and analysis passed. Full suite with hosted-auth defines:
4,019 passed, 5 skipped; includes profile-fetch and cancellation
regressions.
- Prior iOS device preview and native profile tests passed; hosted CI
native Swift checks passed on the preceding head. Latest Dart fixes are
not yet reinstalled on the phone.
- Simulator walkthrough and owner-tested iPhone preview use sample
identities and simulated admission.

Sample-data previews; the identity snapshot shows the
unavailable-profile fallback rendered by Flutter. Media is attached here
only.

| Community picker | Add Community | Saved identity |
| --- | --- | --- |
| ![Shortened community
name](https://github.com/user-attachments/assets/cf0af6aa-3a3d-4ffe-b469-e26f9bb92c30)
| ![White Add Community
page](https://github.com/user-attachments/assets/b2f71c77-1aa0-465a-b302-7eb5f1e92819)
| ![Saved identity card and ghost import
action](https://github.com/user-attachments/assets/47f20f34-f047-4ce5-befa-f56834096e95)
|

---------

Signed-off-by: kenny lopez <klopez4212@gmail.com>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
2026-10-30 19:00:42 +00:00

101 lines
3.1 KiB
Dart

import 'package:flutter/gestures.dart';
import 'community_link_focus.dart';
import '../../shared/widgets/ios_community_link_input.dart';
import 'package:flutter/material.dart';
import '../../shared/widgets/onboarding_route.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import '../../shared/deeplink/community_link_input.dart';
import '../../shared/theme/theme.dart';
import '../../shared/widgets/onboarding_step_page.dart';
part 'add_community_page/add_community_form.dart';
part 'add_community_page/add_community_connection.dart';
part 'add_community_page/pairing_reveal_surface.dart';
/// Fullscreen Add Community presentation; connection operations belong to callers.
class AddCommunityPage extends StatelessWidget {
const AddCommunityPage({
super.key,
required this.onBack,
required this.onCommunityLink,
required this.onPairing,
required this.onScan,
required this.onOpenCommunity,
required this.onSubmitPairing,
this.enteringCommunityLink = false,
this.existingUser = false,
this.scannerProgress = 0,
this.busy = false,
this.canSubmit = true,
this.errorMessage,
this.accountStatus,
this.onInputChanged,
});
final VoidCallback onBack;
final VoidCallback? onCommunityLink;
final VoidCallback? onPairing;
final VoidCallback? onScan;
final ValueChanged<Uri> onOpenCommunity;
final ValueChanged<String> onSubmitPairing;
final bool enteringCommunityLink;
final bool existingUser;
final double scannerProgress;
final bool busy;
final bool canSubmit;
final String? errorMessage;
final String? accountStatus;
final VoidCallback? onInputChanged;
@override
Widget build(BuildContext context) {
final step = enteringCommunityLink
? 'link'
: existingUser
? 'pair'
: 'options';
final page = step == 'options' || step == 'link'
? _AddCommunityConnection(
key: const ValueKey('add-community-connection'),
enteringLink: enteringCommunityLink,
scannerProgress: scannerProgress,
accountStatus: accountStatus,
onBack: onBack,
onCommunityLink: onCommunityLink,
onPairing: onPairing,
onScan: onScan,
onOpenCommunity: onOpenCommunity,
busy: busy,
canSubmit: canSubmit,
errorMessage: errorMessage,
onInputChanged: onInputChanged,
)
: _AddCommunityForm(
key: ValueKey(step),
onBack: onBack,
onSubmitPairing: onSubmitPairing,
busy: busy,
canSubmit: canSubmit,
errorMessage: errorMessage,
onInputChanged: onInputChanged,
);
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, _) {
if (!didPop) onBack();
},
child: Navigator(
onDidRemovePage: (_) {},
pages: [
OnboardingPage<void>(
key: ValueKey(step == 'pair' ? 'pair' : 'connection'),
child: page,
),
],
),
);
}
}