219 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:island/widgets/account/account_name.dart';
 | 
						|
import 'package:material_symbols_icons/symbols.dart';
 | 
						|
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
						|
import 'package:island/screens/account/profile.dart';
 | 
						|
import 'package:island/widgets/content/cloud_files.dart';
 | 
						|
import 'package:styled_widget/styled_widget.dart';
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
 | 
						|
class AccountNameplate extends HookConsumerWidget {
 | 
						|
  final String name;
 | 
						|
  final bool isOutlined;
 | 
						|
  final EdgeInsetsGeometry padding;
 | 
						|
 | 
						|
  const AccountNameplate({
 | 
						|
    super.key,
 | 
						|
    required this.name,
 | 
						|
    this.isOutlined = true,
 | 
						|
    this.padding = const EdgeInsets.all(16),
 | 
						|
  });
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context, WidgetRef ref) {
 | 
						|
    final user = ref.watch(accountProvider(name));
 | 
						|
 | 
						|
    return Container(
 | 
						|
      decoration:
 | 
						|
          isOutlined
 | 
						|
              ? BoxDecoration(
 | 
						|
                border: Border.all(
 | 
						|
                  width: 1 / MediaQuery.of(context).devicePixelRatio,
 | 
						|
                  color: Theme.of(context).dividerColor,
 | 
						|
                ),
 | 
						|
                borderRadius: const BorderRadius.all(Radius.circular(8)),
 | 
						|
              )
 | 
						|
              : null,
 | 
						|
      margin: padding,
 | 
						|
      child: Card(
 | 
						|
        margin: EdgeInsets.zero,
 | 
						|
        elevation: 0,
 | 
						|
        color: Colors.transparent,
 | 
						|
        child: user.when(
 | 
						|
          data:
 | 
						|
              (account) =>
 | 
						|
                  account.profile.background != null
 | 
						|
                      ? AspectRatio(
 | 
						|
                        aspectRatio: 16 / 9,
 | 
						|
                        child: Stack(
 | 
						|
                          children: [
 | 
						|
                            // Background image
 | 
						|
                            Positioned.fill(
 | 
						|
                              child: ClipRRect(
 | 
						|
                                borderRadius: BorderRadius.circular(8),
 | 
						|
                                child: CloudFileWidget(
 | 
						|
                                  item: account.profile.background!,
 | 
						|
                                  fit: BoxFit.cover,
 | 
						|
                                ),
 | 
						|
                              ),
 | 
						|
                            ),
 | 
						|
                            // Gradient overlay for text readability
 | 
						|
                            Positioned.fill(
 | 
						|
                              child: Container(
 | 
						|
                                decoration: BoxDecoration(
 | 
						|
                                  borderRadius: BorderRadius.circular(8),
 | 
						|
                                  gradient: LinearGradient(
 | 
						|
                                    begin: Alignment.bottomCenter,
 | 
						|
                                    end: Alignment.topCenter,
 | 
						|
                                    colors: [
 | 
						|
                                      Colors.black.withOpacity(0.8),
 | 
						|
                                      Colors.black.withOpacity(0.1),
 | 
						|
                                      Colors.transparent,
 | 
						|
                                    ],
 | 
						|
                                  ),
 | 
						|
                                ),
 | 
						|
                              ),
 | 
						|
                            ),
 | 
						|
                            // Content positioned at the bottom
 | 
						|
                            Positioned(
 | 
						|
                              left: 0,
 | 
						|
                              right: 0,
 | 
						|
                              bottom: 0,
 | 
						|
                              child: Padding(
 | 
						|
                                padding: const EdgeInsets.symmetric(
 | 
						|
                                  horizontal: 16.0,
 | 
						|
                                  vertical: 8.0,
 | 
						|
                                ),
 | 
						|
                                child: Row(
 | 
						|
                                  children: [
 | 
						|
                                    // Profile picture (equivalent to leading)
 | 
						|
                                    ProfilePictureWidget(
 | 
						|
                                      fileId: account.profile.picture?.id,
 | 
						|
                                    ),
 | 
						|
                                    const SizedBox(width: 16),
 | 
						|
                                    // Text content (equivalent to title and subtitle)
 | 
						|
                                    Expanded(
 | 
						|
                                      child: Column(
 | 
						|
                                        crossAxisAlignment:
 | 
						|
                                            CrossAxisAlignment.start,
 | 
						|
                                        mainAxisSize: MainAxisSize.min,
 | 
						|
                                        children: [
 | 
						|
                                          AccountName(
 | 
						|
                                            account: account,
 | 
						|
                                            style: TextStyle(
 | 
						|
                                              fontWeight: FontWeight.bold,
 | 
						|
                                              color: Colors.white,
 | 
						|
                                            ),
 | 
						|
                                          ),
 | 
						|
                                          Text(
 | 
						|
                                            '@${account.name}',
 | 
						|
                                          ).textColor(Colors.white70),
 | 
						|
                                        ],
 | 
						|
                                      ),
 | 
						|
                                    ),
 | 
						|
                                  ],
 | 
						|
                                ),
 | 
						|
                              ),
 | 
						|
                            ),
 | 
						|
                          ],
 | 
						|
                        ),
 | 
						|
                      )
 | 
						|
                      : Container(
 | 
						|
                        padding: const EdgeInsets.symmetric(
 | 
						|
                          horizontal: 16.0,
 | 
						|
                          vertical: 8.0,
 | 
						|
                        ),
 | 
						|
                        decoration:
 | 
						|
                            isOutlined
 | 
						|
                                ? BoxDecoration(
 | 
						|
                                  border: Border.all(
 | 
						|
                                    color:
 | 
						|
                                        Theme.of(context).colorScheme.outline,
 | 
						|
                                  ),
 | 
						|
                                  borderRadius: BorderRadius.circular(12),
 | 
						|
                                )
 | 
						|
                                : null,
 | 
						|
                        child: Row(
 | 
						|
                          children: [
 | 
						|
                            // Profile picture (equivalent to leading)
 | 
						|
                            ProfilePictureWidget(
 | 
						|
                              fileId: account.profile.picture?.id,
 | 
						|
                            ),
 | 
						|
                            const SizedBox(width: 16),
 | 
						|
                            // Text content (equivalent to title and subtitle)
 | 
						|
                            Expanded(
 | 
						|
                              child: Column(
 | 
						|
                                crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                                mainAxisSize: MainAxisSize.min,
 | 
						|
                                children: [
 | 
						|
                                  AccountName(
 | 
						|
                                    account: account,
 | 
						|
                                    style: TextStyle(
 | 
						|
                                      fontWeight: FontWeight.bold,
 | 
						|
                                    ),
 | 
						|
                                  ),
 | 
						|
                                  Text('@${account.name}'),
 | 
						|
                                ],
 | 
						|
                              ),
 | 
						|
                            ),
 | 
						|
                          ],
 | 
						|
                        ),
 | 
						|
                      ),
 | 
						|
          loading:
 | 
						|
              () => Padding(
 | 
						|
                padding: const EdgeInsets.symmetric(
 | 
						|
                  horizontal: 16.0,
 | 
						|
                  vertical: 8.0,
 | 
						|
                ),
 | 
						|
                child: Row(
 | 
						|
                  children: [
 | 
						|
                    // Loading indicator (equivalent to leading)
 | 
						|
                    const CircularProgressIndicator(),
 | 
						|
                    const SizedBox(width: 16),
 | 
						|
                    // Loading text content (equivalent to title and subtitle)
 | 
						|
                    Expanded(
 | 
						|
                      child: Column(
 | 
						|
                        crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                        mainAxisSize: MainAxisSize.min,
 | 
						|
                        children: [
 | 
						|
                          const Text('loading').bold().tr(),
 | 
						|
                          const SizedBox(height: 4),
 | 
						|
                          const Text('...'),
 | 
						|
                        ],
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ],
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
          error:
 | 
						|
              (error, stackTrace) => Padding(
 | 
						|
                padding: const EdgeInsets.symmetric(
 | 
						|
                  horizontal: 16.0,
 | 
						|
                  vertical: 8.0,
 | 
						|
                ),
 | 
						|
                child: Row(
 | 
						|
                  children: [
 | 
						|
                    // Error icon (equivalent to leading)
 | 
						|
                    const Icon(Symbols.error),
 | 
						|
                    const SizedBox(width: 16),
 | 
						|
                    // Error text content (equivalent to title and subtitle)
 | 
						|
                    Expanded(
 | 
						|
                      child: Column(
 | 
						|
                        crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                        mainAxisSize: MainAxisSize.min,
 | 
						|
                        children: [
 | 
						|
                          Text('somethingWentWrong').tr().bold(),
 | 
						|
                          const SizedBox(height: 4),
 | 
						|
                          Text(error.toString()),
 | 
						|
                        ],
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ],
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |