mirror of
https://github.com/block/buzz.git
synced 2026-11-02 23:41:08 +00:00
## 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 | | --- | --- | --- | |  |  |  | --------- Signed-off-by: kenny lopez <klopez4212@gmail.com> Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
81 lines
2.8 KiB
Dart
81 lines
2.8 KiB
Dart
import 'dart:math' show max;
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import '../theme/theme.dart';
|
|
import 'bee_loading_mark.dart';
|
|
|
|
/// Centers the loading mark and heading together as one block.
|
|
class OnboardingLoadingPage extends StatelessWidget {
|
|
const OnboardingLoadingPage({super.key, required this.title, this.onCancel});
|
|
final String title;
|
|
final VoidCallback? onCancel;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
final safe = MediaQuery.paddingOf(context);
|
|
return PopScope(
|
|
canPop: false,
|
|
onPopInvokedWithResult: (didPop, _) {
|
|
if (!didPop) onCancel?.call();
|
|
},
|
|
child: Theme(
|
|
data: theme,
|
|
child: Scaffold(
|
|
backgroundColor: theme.colorScheme.surface,
|
|
body: Stack(
|
|
children: [
|
|
Positioned.fill(
|
|
child: LayoutBuilder(
|
|
builder: (context, bounds) => SingleChildScrollView(
|
|
child: ConstrainedBox(
|
|
constraints: BoxConstraints(minHeight: bounds.maxHeight),
|
|
child: Padding(
|
|
padding: EdgeInsets.symmetric(
|
|
horizontal: Grid.sm,
|
|
vertical: max(safe.top, safe.bottom) + Grid.sm,
|
|
),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
const Center(child: BeeLoadingMark()),
|
|
const SizedBox(height: Grid.sm),
|
|
Semantics(
|
|
header: true,
|
|
namesRoute: true,
|
|
child: Text(
|
|
title,
|
|
textAlign: TextAlign.center,
|
|
style: OnboardingTypography.title.copyWith(
|
|
color: theme.colorScheme.onSurface,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
if (onCancel != null)
|
|
Positioned(
|
|
left: Grid.sm,
|
|
right: Grid.sm,
|
|
bottom: safe.bottom + Grid.sm,
|
|
child: TextButton(
|
|
onPressed: onCancel,
|
|
child: const Text('Cancel'),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|