bottomSheetStatusMenu static method
Default status menu showing modal bottom sheet with standard items.
Shows connection status, sync actions, and sign out option.
Implementation
static StatusMenuCallback bottomSheetStatusMenu({
required Auth auth,
}) {
return (
BuildContext context, {
required LocordaStatusState state,
required VoidCallback onTriggerSync,
required VoidCallback onTriggerDisconnect,
}) {
final l10n = LocordaUILocalizations.of(context)!;
// Build menu items
final menuItems = <Widget>[
// Status header
ListTile(
leading: Icon(
state.isAuthenticated ? Icons.cloud_done : Icons.cloud_off,
color: state.isAuthenticated ? Colors.green : Colors.grey,
),
title:
Text(state.isAuthenticated ? l10n.connected : l10n.notConnected),
subtitle:
auth.userDisplayName != null ? Text(auth.userDisplayName!) : null,
),
const Divider(),
// Error display if present
if (state.hasError) ...[
ListTile(
leading: const Icon(Icons.error_outline, color: Colors.red),
title: Text(l10n.syncError),
subtitle: Text(
state.errorMessage ?? l10n.syncError,
style: const TextStyle(fontSize: 12),
),
),
const Divider(),
],
// Sync action (Retry or Sync Now depending on state)
if (state.hasError)
ListTile(
leading: const Icon(Icons.refresh),
title: Text(l10n.retrySync),
enabled: !state.isSyncing,
onTap: state.isSyncing
? null
: () {
Navigator.pop(context);
onTriggerSync();
},
)
else
ListTile(
leading: const Icon(Icons.sync),
title: Text(l10n.syncNow),
enabled: !state.isSyncing,
onTap: state.isSyncing
? null
: () {
Navigator.pop(context);
onTriggerSync();
},
),
const Divider(),
// Sign out
ListTile(
leading: const Icon(Icons.logout),
title: Text(l10n.signOut),
onTap: () {
Navigator.pop(context);
onTriggerDisconnect();
},
),
];
showModalBottomSheet(
context: context,
builder: (context) => Container(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisSize: MainAxisSize.min,
children: menuItems,
),
),
);
};
}