163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:easy_localization/easy_localization.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:island/models/bot.dart';
 | |
| import 'package:island/screens/developers/bot_keys.dart';
 | |
| import 'package:island/screens/developers/edit_bot.dart';
 | |
| import 'package:island/widgets/app_scaffold.dart';
 | |
| import 'package:island/widgets/content/cloud_files.dart';
 | |
| import 'package:island/widgets/response.dart';
 | |
| import 'package:material_symbols_icons/symbols.dart';
 | |
| import 'package:go_router/go_router.dart';
 | |
| import 'package:styled_widget/styled_widget.dart';
 | |
| 
 | |
| class BotDetailScreen extends HookConsumerWidget {
 | |
|   final String publisherName;
 | |
|   final String projectId;
 | |
|   final String botId;
 | |
| 
 | |
|   const BotDetailScreen({
 | |
|     super.key,
 | |
|     required this.publisherName,
 | |
|     required this.projectId,
 | |
|     required this.botId,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context, WidgetRef ref) {
 | |
|     final tabController = useTabController(initialLength: 2);
 | |
|     final botData = ref.watch(botProvider(publisherName, projectId, botId));
 | |
| 
 | |
|     return AppScaffold(
 | |
|       isNoBackground: false,
 | |
|       appBar: AppBar(
 | |
|         title: Text(botData.value?.account.nick ?? 'botDetails'.tr()),
 | |
|         actions: [
 | |
|           IconButton(
 | |
|             icon: const Icon(Symbols.edit),
 | |
|             onPressed:
 | |
|                 botData.value == null
 | |
|                     ? null
 | |
|                     : () {
 | |
|                       context.pushNamed(
 | |
|                         'developerBotEdit',
 | |
|                         pathParameters: {
 | |
|                           'name': publisherName,
 | |
|                           'projectId': projectId,
 | |
|                           'id': botId,
 | |
|                         },
 | |
|                       );
 | |
|                     },
 | |
|           ),
 | |
|         ],
 | |
|         bottom: TabBar(
 | |
|           controller: tabController,
 | |
|           tabs: [
 | |
|             Tab(
 | |
|               child: Text(
 | |
|                 'overview'.tr(),
 | |
|                 textAlign: TextAlign.center,
 | |
|                 style: TextStyle(
 | |
|                   color: Theme.of(context).appBarTheme.foregroundColor!,
 | |
|                 ),
 | |
|               ),
 | |
|             ),
 | |
|             Tab(
 | |
|               child: Text(
 | |
|                 'keys'.tr(),
 | |
|                 textAlign: TextAlign.center,
 | |
|                 style: TextStyle(
 | |
|                   color: Theme.of(context).appBarTheme.foregroundColor!,
 | |
|                 ),
 | |
|               ),
 | |
|             ),
 | |
|           ],
 | |
|         ),
 | |
|       ),
 | |
|       body: botData.when(
 | |
|         data: (bot) {
 | |
|           if (bot == null) {
 | |
|             return Center(child: Text('botNotFound'.tr()));
 | |
|           }
 | |
|           return TabBarView(
 | |
|             controller: tabController,
 | |
|             physics: const NeverScrollableScrollPhysics(),
 | |
|             children: [
 | |
|               _BotOverview(bot: bot),
 | |
|               BotKeysScreen(
 | |
|                 publisherName: publisherName,
 | |
|                 projectId: projectId,
 | |
|                 botId: botId,
 | |
|               ),
 | |
|             ],
 | |
|           );
 | |
|         },
 | |
|         loading: () => const Center(child: CircularProgressIndicator()),
 | |
|         error:
 | |
|             (err, stack) => ResponseErrorWidget(
 | |
|               error: err,
 | |
|               onRetry:
 | |
|                   () => ref.invalidate(
 | |
|                     botProvider(publisherName, projectId, botId),
 | |
|                   ),
 | |
|             ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 | |
| 
 | |
| class _BotOverview extends StatelessWidget {
 | |
|   final Bot bot;
 | |
|   const _BotOverview({required this.bot});
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return SingleChildScrollView(
 | |
|       child: Column(
 | |
|         children: [
 | |
|           AspectRatio(
 | |
|             aspectRatio: 16 / 7,
 | |
|             child: Stack(
 | |
|               clipBehavior: Clip.none,
 | |
|               fit: StackFit.expand,
 | |
|               children: [
 | |
|                 Container(
 | |
|                   color: Theme.of(context).colorScheme.surfaceContainer,
 | |
|                   child:
 | |
|                       bot.account.profile.background != null
 | |
|                           ? CloudFileWidget(
 | |
|                             item: bot.account.profile.background!,
 | |
|                             fit: BoxFit.cover,
 | |
|                           )
 | |
|                           : const SizedBox.shrink(),
 | |
|                 ),
 | |
|                 Positioned(
 | |
|                   left: 20,
 | |
|                   bottom: -32,
 | |
|                   child: ProfilePictureWidget(
 | |
|                     fileId: bot.account.profile.picture?.id,
 | |
|                     radius: 40,
 | |
|                     fallbackIcon: Symbols.smart_toy,
 | |
|                   ),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|           ).padding(bottom: 32),
 | |
|           ListTile(title: Text('name'.tr()), subtitle: Text(bot.account.name)),
 | |
|           ListTile(
 | |
|             title: Text('nickname'.tr()),
 | |
|             subtitle: Text(bot.account.nick),
 | |
|           ),
 | |
|           ListTile(title: Text('slug'.tr()), subtitle: Text(bot.slug)),
 | |
|           if (bot.account.profile.bio.isNotEmpty)
 | |
|             ListTile(
 | |
|               title: Text('bio'.tr()),
 | |
|               subtitle: Text(bot.account.profile.bio),
 | |
|             ),
 | |
|         ],
 | |
|       ).padding(bottom: 24),
 | |
|     );
 | |
|   }
 | |
| }
 |