💄 Optimize profile page
This commit is contained in:
		@@ -54,56 +54,134 @@ class _AccountBasicInfo extends StatelessWidget {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return Padding(
 | 
					    return Card(
 | 
				
			||||||
      padding: const EdgeInsets.fromLTRB(24, 24, 24, 8),
 | 
					      child: Builder(
 | 
				
			||||||
      child: Row(
 | 
					        builder: (context) {
 | 
				
			||||||
        crossAxisAlignment: CrossAxisAlignment.start,
 | 
					          final hasBackground = data.profile.background?.id != null;
 | 
				
			||||||
        children: [
 | 
					          return Column(
 | 
				
			||||||
          ProfilePictureWidget(file: data.profile.picture, radius: 32),
 | 
					            crossAxisAlignment: CrossAxisAlignment.start,
 | 
				
			||||||
          const Gap(20),
 | 
					            children: [
 | 
				
			||||||
          Expanded(
 | 
					              if (isWideScreen(context) && hasBackground)
 | 
				
			||||||
            child: Column(
 | 
					                Stack(
 | 
				
			||||||
              crossAxisAlignment: CrossAxisAlignment.stretch,
 | 
					                  clipBehavior: Clip.none,
 | 
				
			||||||
              children: [
 | 
					 | 
				
			||||||
                Row(
 | 
					 | 
				
			||||||
                  children: [
 | 
					                  children: [
 | 
				
			||||||
                    AccountName(account: data, style: TextStyle(fontSize: 20)),
 | 
					                    ClipRRect(
 | 
				
			||||||
                    const Gap(6),
 | 
					                      borderRadius: BorderRadius.only(
 | 
				
			||||||
                    Flexible(
 | 
					                        topLeft: Radius.circular(8),
 | 
				
			||||||
                      child: Text(
 | 
					                        topRight: Radius.circular(8),
 | 
				
			||||||
                        '@${data.name}',
 | 
					                      ),
 | 
				
			||||||
                        maxLines: 1,
 | 
					                      child: AspectRatio(
 | 
				
			||||||
                        overflow: TextOverflow.ellipsis,
 | 
					                        aspectRatio: 16 / 7,
 | 
				
			||||||
                      ).fontSize(14).opacity(0.85),
 | 
					                        child: CloudImageWidget(
 | 
				
			||||||
 | 
					                          file: data.profile.background,
 | 
				
			||||||
 | 
					                          fit: BoxFit.cover,
 | 
				
			||||||
 | 
					                        ),
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                    Positioned(
 | 
				
			||||||
 | 
					                      bottom: -24,
 | 
				
			||||||
 | 
					                      left: 16,
 | 
				
			||||||
 | 
					                      child: ProfilePictureWidget(
 | 
				
			||||||
 | 
					                        file: data.profile.picture,
 | 
				
			||||||
 | 
					                        radius: 32,
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                  ],
 | 
					                  ],
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                if (accountDeveloper.value != null)
 | 
					              Builder(
 | 
				
			||||||
                  Row(
 | 
					                builder: (context) {
 | 
				
			||||||
                    spacing: 7,
 | 
					                  final showBackground = isWideScreen(context) && hasBackground;
 | 
				
			||||||
 | 
					                  return Row(
 | 
				
			||||||
 | 
					                    crossAxisAlignment: CrossAxisAlignment.start,
 | 
				
			||||||
 | 
					                    spacing: showBackground ? 0 : 20,
 | 
				
			||||||
                    children: [
 | 
					                    children: [
 | 
				
			||||||
                      const Icon(Symbols.smart_toy, size: 18),
 | 
					                      if (!showBackground)
 | 
				
			||||||
                      Text(
 | 
					                        ProfilePictureWidget(
 | 
				
			||||||
                        'botAutomatedBy'.tr(
 | 
					                          file: data.profile.picture,
 | 
				
			||||||
                          args: [accountDeveloper.value!.publisher!.nick],
 | 
					                          radius: 32,
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                      ).fontSize(13),
 | 
					                      Expanded(
 | 
				
			||||||
 | 
					                        child: Column(
 | 
				
			||||||
 | 
					                          crossAxisAlignment: CrossAxisAlignment.start,
 | 
				
			||||||
 | 
					                          children: [
 | 
				
			||||||
 | 
					                            Row(
 | 
				
			||||||
 | 
					                              spacing: 4,
 | 
				
			||||||
 | 
					                              crossAxisAlignment: CrossAxisAlignment.end,
 | 
				
			||||||
 | 
					                              children: [
 | 
				
			||||||
 | 
					                                Flexible(
 | 
				
			||||||
 | 
					                                  child: AccountName(
 | 
				
			||||||
 | 
					                                    account: data,
 | 
				
			||||||
 | 
					                                    style: TextStyle(
 | 
				
			||||||
 | 
					                                      fontSize: 16,
 | 
				
			||||||
 | 
					                                      fontWeight: FontWeight.bold,
 | 
				
			||||||
 | 
					                                    ),
 | 
				
			||||||
 | 
					                                  ),
 | 
				
			||||||
 | 
					                                ),
 | 
				
			||||||
 | 
					                                if (isWideScreen(context))
 | 
				
			||||||
 | 
					                                  Flexible(
 | 
				
			||||||
 | 
					                                    child: Text(
 | 
				
			||||||
 | 
					                                      '@${data.name}',
 | 
				
			||||||
 | 
					                                    ).fontSize(11).padding(bottom: 2.5),
 | 
				
			||||||
 | 
					                                  ),
 | 
				
			||||||
 | 
					                              ],
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                            if (!isWideScreen(context))
 | 
				
			||||||
 | 
					                              Text(
 | 
				
			||||||
 | 
					                                '@${data.name}',
 | 
				
			||||||
 | 
					                              ).fontSize(11).padding(bottom: 2.5),
 | 
				
			||||||
 | 
					                            Text(
 | 
				
			||||||
 | 
					                              (data.profile.bio.isNotEmpty)
 | 
				
			||||||
 | 
					                                  ? data.profile.bio
 | 
				
			||||||
 | 
					                                  : 'descriptionNone'.tr(),
 | 
				
			||||||
 | 
					                              maxLines: 1,
 | 
				
			||||||
 | 
					                              overflow: TextOverflow.ellipsis,
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                            if (accountDeveloper.value != null)
 | 
				
			||||||
 | 
					                              Row(
 | 
				
			||||||
 | 
					                                spacing: 7,
 | 
				
			||||||
 | 
					                                children: [
 | 
				
			||||||
 | 
					                                  const Icon(Symbols.smart_toy, size: 18),
 | 
				
			||||||
 | 
					                                  Text(
 | 
				
			||||||
 | 
					                                    'botAutomatedBy'.tr(
 | 
				
			||||||
 | 
					                                      args: [
 | 
				
			||||||
 | 
					                                        accountDeveloper.value!.publisher!.nick,
 | 
				
			||||||
 | 
					                                      ],
 | 
				
			||||||
 | 
					                                    ),
 | 
				
			||||||
 | 
					                                  ).fontSize(13),
 | 
				
			||||||
 | 
					                                ],
 | 
				
			||||||
 | 
					                              ).opacity(0.75).padding(top: 4),
 | 
				
			||||||
 | 
					                            const Gap(4),
 | 
				
			||||||
 | 
					                            AccountStatusWidget(
 | 
				
			||||||
 | 
					                              uname: uname,
 | 
				
			||||||
 | 
					                              padding: EdgeInsets.zero,
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                            const Gap(8),
 | 
				
			||||||
 | 
					                          ],
 | 
				
			||||||
 | 
					                        ),
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                      IconButton(
 | 
				
			||||||
 | 
					                        onPressed: () {
 | 
				
			||||||
 | 
					                          SharePlus.instance.share(
 | 
				
			||||||
 | 
					                            ShareParams(
 | 
				
			||||||
 | 
					                              uri: Uri.parse(
 | 
				
			||||||
 | 
					                                'https://solian.app/@${data.name}',
 | 
				
			||||||
 | 
					                              ),
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                          );
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        icon: const Icon(Symbols.share),
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                  ).opacity(0.75),
 | 
					                  ).padding(
 | 
				
			||||||
                const Gap(4),
 | 
					                    left: 16,
 | 
				
			||||||
                AccountStatusWidget(uname: uname, padding: EdgeInsets.zero),
 | 
					                    right: 16,
 | 
				
			||||||
              ],
 | 
					                    top: 16 + (showBackground ? 16 : 0),
 | 
				
			||||||
            ),
 | 
					                  );
 | 
				
			||||||
          ),
 | 
					                },
 | 
				
			||||||
          IconButton(
 | 
					              ),
 | 
				
			||||||
            onPressed: () {
 | 
					            ],
 | 
				
			||||||
              SharePlus.instance.share(
 | 
					          );
 | 
				
			||||||
                ShareParams(uri: Uri.parse('https://solian.app/@${data.name}')),
 | 
					        },
 | 
				
			||||||
              );
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            icon: const Icon(Symbols.share),
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -764,33 +842,14 @@ class AccountProfileScreen extends HookConsumerWidget {
 | 
				
			|||||||
                      color: appbarColor.value,
 | 
					                      color: appbarColor.value,
 | 
				
			||||||
                      shadows: [appbarShadow],
 | 
					                      shadows: [appbarShadow],
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                    flexibleSpace: Stack(
 | 
					                    title: Text(
 | 
				
			||||||
                      children: [
 | 
					                      data.nick,
 | 
				
			||||||
                        Positioned.fill(
 | 
					                      style: TextStyle(
 | 
				
			||||||
                          child:
 | 
					                        color:
 | 
				
			||||||
                              data.profile.background?.id != null
 | 
					                            appbarColor.value ??
 | 
				
			||||||
                                  ? CloudImageWidget(
 | 
					                            Theme.of(context).appBarTheme.foregroundColor,
 | 
				
			||||||
                                    file: data.profile.background,
 | 
					                        shadows: [appbarShadow],
 | 
				
			||||||
                                  )
 | 
					                      ),
 | 
				
			||||||
                                  : Container(
 | 
					 | 
				
			||||||
                                    color:
 | 
					 | 
				
			||||||
                                        Theme.of(
 | 
					 | 
				
			||||||
                                          context,
 | 
					 | 
				
			||||||
                                        ).appBarTheme.backgroundColor,
 | 
					 | 
				
			||||||
                                  ),
 | 
					 | 
				
			||||||
                        ),
 | 
					 | 
				
			||||||
                        FlexibleSpaceBar(
 | 
					 | 
				
			||||||
                          title: Text(
 | 
					 | 
				
			||||||
                            data.nick,
 | 
					 | 
				
			||||||
                            style: TextStyle(
 | 
					 | 
				
			||||||
                              color:
 | 
					 | 
				
			||||||
                                  appbarColor.value ??
 | 
					 | 
				
			||||||
                                  Theme.of(context).appBarTheme.foregroundColor,
 | 
					 | 
				
			||||||
                              shadows: [appbarShadow],
 | 
					 | 
				
			||||||
                            ),
 | 
					 | 
				
			||||||
                          ),
 | 
					 | 
				
			||||||
                        ),
 | 
					 | 
				
			||||||
                      ],
 | 
					 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                  )
 | 
					                  )
 | 
				
			||||||
                  : null,
 | 
					                  : null,
 | 
				
			||||||
@@ -806,7 +865,7 @@ class AccountProfileScreen extends HookConsumerWidget {
 | 
				
			|||||||
                                data: data,
 | 
					                                data: data,
 | 
				
			||||||
                                uname: name,
 | 
					                                uname: name,
 | 
				
			||||||
                                accountDeveloper: accountDeveloper,
 | 
					                                accountDeveloper: accountDeveloper,
 | 
				
			||||||
                              ),
 | 
					                              ).padding(horizontal: 4, top: 20),
 | 
				
			||||||
                            ),
 | 
					                            ),
 | 
				
			||||||
                            if (data.badges.isNotEmpty)
 | 
					                            if (data.badges.isNotEmpty)
 | 
				
			||||||
                              SliverToBoxAdapter(
 | 
					                              SliverToBoxAdapter(
 | 
				
			||||||
@@ -857,7 +916,12 @@ class AccountProfileScreen extends HookConsumerWidget {
 | 
				
			|||||||
                      Flexible(
 | 
					                      Flexible(
 | 
				
			||||||
                        child: CustomScrollView(
 | 
					                        child: CustomScrollView(
 | 
				
			||||||
                          slivers: [
 | 
					                          slivers: [
 | 
				
			||||||
                            SliverGap(24),
 | 
					                            SliverGap(18),
 | 
				
			||||||
 | 
					                            SliverToBoxAdapter(
 | 
				
			||||||
 | 
					                              child: ActivityPresenceWidget(
 | 
				
			||||||
 | 
					                                uname: name,
 | 
				
			||||||
 | 
					                              ).padding(horizontal: 4, top: 4, bottom: 4),
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
                            SliverToBoxAdapter(
 | 
					                            SliverToBoxAdapter(
 | 
				
			||||||
                              child: _AccountPublisherList(
 | 
					                              child: _AccountPublisherList(
 | 
				
			||||||
                                publishers: accountPublishers.value ?? [],
 | 
					                                publishers: accountPublishers.value ?? [],
 | 
				
			||||||
@@ -883,11 +947,6 @@ class AccountProfileScreen extends HookConsumerWidget {
 | 
				
			|||||||
                                ),
 | 
					                                ),
 | 
				
			||||||
                              ),
 | 
					                              ),
 | 
				
			||||||
                            ),
 | 
					                            ),
 | 
				
			||||||
                            SliverToBoxAdapter(
 | 
					 | 
				
			||||||
                              child: ActivityPresenceWidget(
 | 
					 | 
				
			||||||
                                uname: name,
 | 
					 | 
				
			||||||
                              ).padding(horizontal: 4, top: 4, bottom: 8),
 | 
					 | 
				
			||||||
                            ),
 | 
					 | 
				
			||||||
                          ],
 | 
					                          ],
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                      ),
 | 
					                      ),
 | 
				
			||||||
@@ -939,7 +998,7 @@ class AccountProfileScreen extends HookConsumerWidget {
 | 
				
			|||||||
                          data: data,
 | 
					                          data: data,
 | 
				
			||||||
                          uname: name,
 | 
					                          uname: name,
 | 
				
			||||||
                          accountDeveloper: accountDeveloper,
 | 
					                          accountDeveloper: accountDeveloper,
 | 
				
			||||||
                        ),
 | 
					                        ).padding(horizontal: 4, top: 8),
 | 
				
			||||||
                      ),
 | 
					                      ),
 | 
				
			||||||
                      if (data.badges.isNotEmpty)
 | 
					                      if (data.badges.isNotEmpty)
 | 
				
			||||||
                        SliverToBoxAdapter(
 | 
					                        SliverToBoxAdapter(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -256,7 +256,7 @@ class ActivityPresenceWidget extends ConsumerWidget {
 | 
				
			|||||||
              children: [
 | 
					              children: [
 | 
				
			||||||
                Text(
 | 
					                Text(
 | 
				
			||||||
                  'activities',
 | 
					                  'activities',
 | 
				
			||||||
                ).tr().bold().padding(horizontal: 8, vertical: 4),
 | 
					                ).tr().bold().padding(horizontal: 16, vertical: 4),
 | 
				
			||||||
                if (activities.isEmpty)
 | 
					                if (activities.isEmpty)
 | 
				
			||||||
                  Row(
 | 
					                  Row(
 | 
				
			||||||
                    spacing: 4,
 | 
					                    spacing: 4,
 | 
				
			||||||
@@ -264,7 +264,7 @@ class ActivityPresenceWidget extends ConsumerWidget {
 | 
				
			|||||||
                      const Icon(Symbols.inbox, size: 16),
 | 
					                      const Icon(Symbols.inbox, size: 16),
 | 
				
			||||||
                      Text('dataEmpty').tr().fontSize(13),
 | 
					                      Text('dataEmpty').tr().fontSize(13),
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                  ).opacity(0.75).padding(horizontal: 8),
 | 
					                  ).opacity(0.75).padding(horizontal: 16, bottom: 8),
 | 
				
			||||||
                ...activities.map((activity) {
 | 
					                ...activities.map((activity) {
 | 
				
			||||||
                  final dcImages = _buildDiscordImages(ref, activity);
 | 
					                  final dcImages = _buildDiscordImages(ref, activity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user