mirror of
https://github.com/block/buzz.git
synced 2026-10-31 22:41:12 +00:00
## Summary - make mobile unread state visible with bold channel names, an animated Inbox badge, and swipe-to-toggle Inbox rows - add directional transitions for top-level mobile navigation - let mobile send while media uploads, with cancellable progress UI - normalize iOS and Android video uploads, attach poster frames, and improve native video playback ## Validation - `just mobile-check` - `just mobile-test` - `cargo test -p buzz-media` - Pixel smoke test - iPhone smoke test Desktop background uploads moved to #4522 so the two platforms can be reviewed independently. --------- Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: Tom Brow <tomb@block.xyz> Co-authored-by: leader <71e9f2c44a6932b6772caaaccda1911d010463c3e2c6c40410b8329956046801@buzz.block.builderlab.xyz> Co-authored-by: Tom Brow <tomb@block.xyz>
87 lines
2.3 KiB
Dart
87 lines
2.3 KiB
Dart
part of '../channels_page.dart';
|
|
|
|
class _EphemeralBadge extends StatelessWidget {
|
|
final Channel channel;
|
|
|
|
const _EphemeralBadge({required this.channel});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final display = ephemeralChannelDisplay(channel);
|
|
if (display == null) return const SizedBox.shrink();
|
|
|
|
return Tooltip(
|
|
message: display.tooltipLabel,
|
|
child: Icon(
|
|
LucideIcons.clockFading,
|
|
key: Key('channel-ephemeral-${channel.id}'),
|
|
size: 16,
|
|
color: context.colors.onSurfaceVariant,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _ErrorView extends StatelessWidget {
|
|
final Object error;
|
|
final VoidCallback onRetry;
|
|
|
|
const _ErrorView({required this.error, required this.onRetry});
|
|
|
|
static String _userMessage(Object error) {
|
|
if (error is RelayException) {
|
|
if (error.statusCode == 401) {
|
|
return 'Not authorized. Check your API token.';
|
|
}
|
|
if (error.statusCode == 403) {
|
|
return 'Access denied.';
|
|
}
|
|
return 'Server error (${error.statusCode}). Try again later.';
|
|
}
|
|
if (error is SocketException) {
|
|
return 'Could not reach the relay server.';
|
|
}
|
|
return 'Something went wrong. Check your connection.';
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Center(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(Grid.sm),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(
|
|
LucideIcons.wifiOff,
|
|
size: Grid.xl,
|
|
color: context.colors.error,
|
|
),
|
|
const SizedBox(height: Grid.xs),
|
|
Text(
|
|
'Could not load channels',
|
|
style: context.textTheme.titleMedium,
|
|
),
|
|
const SizedBox(height: Grid.xxs),
|
|
Text(
|
|
_userMessage(error),
|
|
style: context.textTheme.bodySmall?.copyWith(
|
|
color: context.colors.onSurfaceVariant,
|
|
),
|
|
textAlign: TextAlign.center,
|
|
maxLines: 3,
|
|
overflow: TextOverflow.ellipsis,
|
|
),
|
|
const SizedBox(height: Grid.xs),
|
|
FilledButton.icon(
|
|
onPressed: onRetry,
|
|
icon: const Icon(LucideIcons.refreshCw),
|
|
label: const Text('Retry'),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|