/
Ru5Kasper
/
Trackly
Обзор
Документация
Войти
/
Ru5Kasper
/
Trackly
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
frontend/lib/widgets/sync_status_chip.dart
112 строк
4 KB
DORANDKOR
feat(frontend): implement sync for habits, keep user session when offline
21 май 2026, 14:38
21 май 2026, 14:38
951c1e9
Код
Авторство
О чём код?
import 'package:flutter/material.dart'; import '../services/habit_sync_service.dart'; class SyncStatusChip extends StatelessWidget { final VoidCallback? onTap; const SyncStatusChip({super.key, this.onTap}); @override Widget build(BuildContext context) { return ValueListenableBuilder<bool>( valueListenable: HabitSyncService.instance.isSyncingNotifier, builder: (context, isSyncing, _) { return ValueListenableBuilder<int>( valueListenable: HabitSyncService .instance.pendingActionsCountNotifier, builder: (context, pendingCount, __) { return ValueListenableBuilder<DateTime?>( valueListenable: HabitSyncService.instance.lastSyncedAtNotifier, builder: (context, lastSyncedAt, ___) { final status = _statusText( isSyncing: isSyncing, pendingCount: pendingCount, lastSyncedAt: lastSyncedAt, ); final color = _statusColor( context, isSyncing: isSyncing, pendingCount: pendingCount, ); return InkWell( borderRadius: BorderRadius.circular(999), onTap: onTap, child: Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 6, ), decoration: BoxDecoration( color: color.withAlpha((255 * 0.14).round()), borderRadius: BorderRadius.circular(999), border: Border.all( color: color.withAlpha((255 * 0.35).round()), ), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon( isSyncing ? Icons.sync : pendingCount > 0 ? Icons.cloud_upload_outlined : Icons.cloud_done_outlined, size: 16, color: color, ), const SizedBox(width: 6), Text( status, style: TextStyle( fontSize: 12, fontWeight: FontWeight.w700, color: color, ), ), ], ), ), ); }, ); }, ); }, ); } String _statusText({ required bool isSyncing, required int pendingCount, required DateTime? lastSyncedAt, }) { if (isSyncing) { return 'Синхронизация...'; } if (pendingCount > 0) { return 'Ожидают отправки: $pendingCount'; } if (lastSyncedAt == null) { return 'Нет синхронизации'; } return 'Синхронизировано'; } Color _statusColor( BuildContext context, { required bool isSyncing, required int pendingCount, }) { if (isSyncing) { return Theme.of(context).colorScheme.primary; } if (pendingCount > 0) { return Colors.orange; } return Colors.green; } }