mirror of
https://github.com/block/buzz.git
synced 2026-11-13 21:01:53 +00:00
Duo keeps conversations and Settings details open across closed, book and flat postures. Book mode splits at the fold; flattening restores the sidebar. Native rail controls, full-width navigation backdrops and sheet-local safe areas keep content aligned. Ordinary iPhones remain single-pane in portrait and landscape; tablet and Duo split layouts remain enabled. Includes the recovered preview's matching pane widths, Buzz empty-pane mark, stable Settings chevrons, Bestie pane routing and Duo-only upward New menu attachment. Current main's Activity redesign, Search content fade and unread-navigation button are retained. Menu selection checks sit beside their labels. Shared mobile changes remain in scope: the native iOS status editor, Appearance preview layout, avatar crop preservation, onboarding footer layout, profile/invite sheet geometry and nested conversation navigation. This PR is not exclusively Duo-gated. Nested navigator observers preserve recording cancellation and navigation callbacks; crop resizing preserves the selected image region. iOS 27.1 APIs remain compile-time and runtime gated. Validation on the reconciled source: Flutter analysis, Activity/Home journeys, the full mobile test suite, file-size checks and Swift package tests. The iPhone single-pane fix was also exercised on an iPhone 18 Pro simulator before reconciliation. Fresh hosted CI and physical-device confirmation of the reconciled build are separate and remain pending. --------- Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: Tom Brow <tomb@squareup.com> Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Tom Brow <tomb@block.xyz> Co-authored-by: Tom Brow <tomb@squareup.com>
83 lines
2.8 KiB
Dart
83 lines
2.8 KiB
Dart
part of '../settings_page.dart';
|
|
|
|
bool _notificationsVisible(WidgetRef ref) {
|
|
if (defaultTargetPlatform != TargetPlatform.iOS) return false;
|
|
final community = ref.watch(activeCommunityProvider).value;
|
|
if (community == null) return false;
|
|
final setup = ref.watch(buzzPushSetupStatusProvider);
|
|
final capability = ref.watch(currentRelayPushDescriptorProvider);
|
|
return (!capability.isLoading &&
|
|
!capability.hasError &&
|
|
capability.value != null) ||
|
|
community.pushNotificationsEnabled ||
|
|
community.pushSubscriptionState.pendingTombstoneGeneration != null ||
|
|
setup.hasError;
|
|
}
|
|
|
|
class _NotificationsSection extends ConsumerWidget {
|
|
const _NotificationsSection();
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
if (!_notificationsVisible(ref)) return const SizedBox.shrink();
|
|
final community = ref.watch(activeCommunityProvider).value!;
|
|
final setup = ref.watch(buzzPushSetupStatusProvider);
|
|
final capability = ref.watch(currentRelayPushDescriptorProvider);
|
|
final hasCapability =
|
|
!capability.isLoading &&
|
|
!capability.hasError &&
|
|
capability.value != null;
|
|
|
|
final canToggle = hasCapability || community.pushNotificationsEnabled;
|
|
|
|
void setEnabled(bool enabled) {
|
|
unawaited(
|
|
ref
|
|
.read(communityListProvider.notifier)
|
|
.setPushNotificationsEnabled(community.id, enabled),
|
|
);
|
|
}
|
|
|
|
return AppListCard(
|
|
verticalPadding: Grid.twelve,
|
|
children: [
|
|
if (setup.hasError)
|
|
AppListRow(
|
|
key: const ValueKey('push-setup-retry'),
|
|
title: 'Notification setup failed',
|
|
subtitle: 'You can keep using Buzz. Tap to retry notifications.',
|
|
onTap: () => retryBuzzPushSetup(ref),
|
|
),
|
|
MergeSemantics(
|
|
key: const ValueKey('push-notifications-setting'),
|
|
child: Stack(
|
|
alignment: Alignment.centerRight,
|
|
children: [
|
|
AppListRow(
|
|
key: const ValueKey('push-notifications-enabled'),
|
|
title: 'Notifications',
|
|
// Reserve horizontal room without letting the switch's 48dp
|
|
// layout height expand this single-line row.
|
|
trailing: const SizedBox(width: 60),
|
|
onTap: canToggle
|
|
? () => setEnabled(!community.pushNotificationsEnabled)
|
|
: null,
|
|
),
|
|
Positioned.fill(
|
|
right: Grid.xs,
|
|
child: Align(
|
|
alignment: Alignment.centerRight,
|
|
child: Switch.adaptive(
|
|
value: community.pushNotificationsEnabled,
|
|
onChanged: canToggle ? setEnabled : null,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|