failed_backup_status_page.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import 'package:auto_route/auto_route.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:hooks_riverpod/hooks_riverpod.dart';
  4. import 'package:immich_mobile/modules/backup/providers/error_backup_list.provider.dart';
  5. import 'package:intl/intl.dart';
  6. import 'package:photo_manager/photo_manager.dart';
  7. class FailedBackupStatusPage extends HookConsumerWidget {
  8. const FailedBackupStatusPage({Key? key}) : super(key: key);
  9. @override
  10. Widget build(BuildContext context, WidgetRef ref) {
  11. final errorBackupList = ref.watch(errorBackupListProvider);
  12. return Scaffold(
  13. appBar: AppBar(
  14. elevation: 0,
  15. title: Text(
  16. "Failed Backup (${errorBackupList.length})",
  17. style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
  18. ),
  19. leading: IconButton(
  20. onPressed: () {
  21. AutoRouter.of(context).pop(true);
  22. },
  23. splashRadius: 24,
  24. icon: const Icon(
  25. Icons.arrow_back_ios_rounded,
  26. ),
  27. ),
  28. ),
  29. body: ListView.builder(
  30. shrinkWrap: true,
  31. itemCount: errorBackupList.length,
  32. itemBuilder: ((context, index) {
  33. var errorAsset = errorBackupList.elementAt(index);
  34. return Padding(
  35. padding: const EdgeInsets.symmetric(
  36. horizontal: 12.0,
  37. vertical: 4,
  38. ),
  39. child: Card(
  40. shape: RoundedRectangleBorder(
  41. borderRadius: BorderRadius.circular(15), // if you need this
  42. side: const BorderSide(
  43. color: Colors.black12,
  44. width: 1,
  45. ),
  46. ),
  47. elevation: 0,
  48. child: Row(
  49. crossAxisAlignment: CrossAxisAlignment.center,
  50. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  51. children: [
  52. ConstrainedBox(
  53. constraints: const BoxConstraints(
  54. minWidth: 100,
  55. minHeight: 150,
  56. maxWidth: 100,
  57. maxHeight: 200,
  58. ),
  59. child: ClipRRect(
  60. borderRadius: const BorderRadius.only(
  61. bottomLeft: Radius.circular(15),
  62. topLeft: Radius.circular(15),
  63. ),
  64. clipBehavior: Clip.hardEdge,
  65. child: Image(
  66. fit: BoxFit.cover,
  67. image: AssetEntityImageProvider(
  68. errorAsset.asset,
  69. isOriginal: false,
  70. thumbnailSize: const ThumbnailSize.square(512),
  71. thumbnailFormat: ThumbnailFormat.jpeg,
  72. ),
  73. ),
  74. ),
  75. ),
  76. Expanded(
  77. child: Padding(
  78. padding: const EdgeInsets.all(16.0),
  79. child: Column(
  80. crossAxisAlignment: CrossAxisAlignment.start,
  81. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  82. children: [
  83. Row(
  84. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  85. children: [
  86. Text(
  87. DateFormat.yMMMMd().format(
  88. DateTime.parse(
  89. errorAsset.fileCreatedAt.toString(),
  90. ).toLocal(),
  91. ),
  92. style: TextStyle(
  93. fontSize: 12,
  94. fontWeight: FontWeight.w600,
  95. color: Colors.grey[700],
  96. ),
  97. ),
  98. Icon(
  99. Icons.error,
  100. color: Colors.red.withAlpha(200),
  101. size: 18,
  102. ),
  103. ],
  104. ),
  105. Padding(
  106. padding: const EdgeInsets.symmetric(vertical: 8.0),
  107. child: Text(
  108. errorAsset.fileName,
  109. maxLines: 1,
  110. overflow: TextOverflow.ellipsis,
  111. style: TextStyle(
  112. fontWeight: FontWeight.bold,
  113. fontSize: 12,
  114. color: Theme.of(context).primaryColor,
  115. ),
  116. ),
  117. ),
  118. Text(
  119. errorAsset.errorMessage,
  120. style: TextStyle(
  121. fontSize: 12,
  122. fontWeight: FontWeight.w500,
  123. color: Colors.grey[800],
  124. ),
  125. ),
  126. ],
  127. ),
  128. ),
  129. ),
  130. ],
  131. ),
  132. ),
  133. );
  134. }),
  135. ),
  136. );
  137. }
  138. }