76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:dio/dio.dart';
 | |
| import 'package:easy_localization/easy_localization.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:gap/gap.dart';
 | |
| import 'package:material_symbols_icons/symbols.dart';
 | |
| import 'package:styled_widget/styled_widget.dart';
 | |
| 
 | |
| class ResponseErrorWidget extends StatelessWidget {
 | |
|   final dynamic error;
 | |
|   final VoidCallback onRetry;
 | |
| 
 | |
|   const ResponseErrorWidget({
 | |
|     super.key,
 | |
|     required this.error,
 | |
|     required this.onRetry,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Column(
 | |
|       mainAxisAlignment: MainAxisAlignment.center,
 | |
|       children: [
 | |
|         const Icon(Symbols.error_outline, size: 48),
 | |
|         const Gap(4),
 | |
|         if (error is DioException && error.response?.statusCode == 401)
 | |
|           ConstrainedBox(
 | |
|             constraints: const BoxConstraints(maxWidth: 320),
 | |
|             child: Column(
 | |
|               children: [
 | |
|                 Text(
 | |
|                   'unauthorized'.tr(),
 | |
|                   textAlign: TextAlign.center,
 | |
|                   style: const TextStyle(color: Color(0xFF757575)),
 | |
|                 ).bold(),
 | |
|                 Text(
 | |
|                   'unauthorizedHint'.tr(),
 | |
|                   textAlign: TextAlign.center,
 | |
|                   style: const TextStyle(color: Color(0xFF757575)),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|           ).center()
 | |
|         else if (error is DioException && error.response != null)
 | |
|           ConstrainedBox(
 | |
|             constraints: const BoxConstraints(maxWidth: 320),
 | |
|             child: Text(
 | |
|               error.response.toString(),
 | |
|               textAlign: TextAlign.center,
 | |
|               style: const TextStyle(color: Color(0xFF757575)),
 | |
|             ),
 | |
|           ).center()
 | |
|         else
 | |
|           ConstrainedBox(
 | |
|             constraints: const BoxConstraints(maxWidth: 320),
 | |
|             child: Text(
 | |
|               error.toString(),
 | |
|               textAlign: TextAlign.center,
 | |
|               style: const TextStyle(color: Color(0xFF757575)),
 | |
|             ),
 | |
|           ).center(),
 | |
|         const Gap(8),
 | |
|         TextButton(onPressed: onRetry, child: const Text('retry').tr()),
 | |
|       ],
 | |
|     );
 | |
|   }
 | |
| }
 | |
| 
 | |
| class ResponseLoadingWidget extends StatelessWidget {
 | |
|   const ResponseLoadingWidget({super.key});
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return const Center(child: CircularProgressIndicator());
 | |
|   }
 | |
| }
 |