import 'package:cupertino_lists/cupertino_lists.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:isekai_wiki/models/user.dart'; import 'package:isekai_wiki/pages/about.dart'; import 'package:isekai_wiki/styles.dart'; import '../components/dummy_icon.dart'; import '../components/follow_scale.dart'; class OwnProfileController extends GetxController { late UserController uc; var loginLoading = false.obs; @override void onInit() { super.onInit(); uc = Get.find(); } Future handleLoginClick() { handleStartAuth(); return Future.delayed(const Duration(milliseconds: 100)); } Future handleStartAuth() async { loginLoading.value = true; await uc.startAuthFlow(); loginLoading.value = false; } } class OwnProfileTab extends StatelessWidget { const OwnProfileTab({super.key}); Widget _buildUserSection() { var c = Get.find(); var uc = Get.find(); return FollowTextScale( child: Obx( () => !uc.isLoggedIn ? CupertinoListSection.insetGrouped( backgroundColor: Styles.themePageBackgroundColor, children: [ CupertinoListTile.notched( title: const Text('登录/注册', style: Styles.listTileLargeTitle), leading: const DummyIcon( color: CupertinoColors.systemGrey, icon: CupertinoIcons.person_fill, size: 56, rounded: true, ), leadingSize: 80, leadingToTitle: 4, trailing: c.loginLoading.value ? const Padding( padding: EdgeInsets.only(right: 5), child: CupertinoActivityIndicator( radius: 12, ), ) : const CupertinoListTileChevron(), onTap: c.handleLoginClick, ), ], ) : CupertinoListSection.insetGrouped( backgroundColor: Styles.themePageBackgroundColor, children: [ CupertinoListTile.notched( title: Text(uc.getDisplayName, style: Styles.listTileLargeTitle), leading: const DummyIcon( color: CupertinoColors.systemGrey, icon: CupertinoIcons.person_fill, size: 56, rounded: true, ), leadingSize: 80, leadingToTitle: 4, trailing: const CupertinoListTileChevron(), onTap: () {}, ), CupertinoListTile.notched( title: const Text('退出登录'), leading: const DummyIcon( color: CupertinoColors.systemRed, icon: CupertinoIcons.selection_pin_in_out, ), trailing: const CupertinoListTileChevron(), onTap: () {}, ), ], ), ), ); } Widget _buildArticleListsSection() { return FollowTextScale( child: CupertinoListSection.insetGrouped( backgroundColor: Styles.themePageBackgroundColor, children: [ CupertinoListTile.notched( title: const Text('收藏'), leading: const DummyIcon( color: CupertinoColors.systemYellow, icon: CupertinoIcons.star_fill, ), trailing: const CupertinoListTileChevron(), onTap: () {}, ), CupertinoListTile.notched( title: const Text('阅读历史'), leading: const DummyIcon( color: CupertinoColors.systemBlue, icon: CupertinoIcons.time_solid, ), trailing: const CupertinoListTileChevron(), onTap: () {}, ), CupertinoListTile.notched( title: const Text('贡献'), leading: const DummyIcon( color: CupertinoColors.systemOrange, icon: CupertinoIcons.create, ), trailing: const CupertinoListTileChevron(), onTap: () {}, ), ], )); } Widget _buildSettingsSection() { return FollowTextScale( child: CupertinoListSection.insetGrouped( backgroundColor: Styles.themePageBackgroundColor, children: [ CupertinoListTile.notched( title: const Text('设置'), leading: const DummyIcon( color: CupertinoColors.systemGrey, icon: CupertinoIcons.settings, ), trailing: const CupertinoListTileChevron(), onTap: () {}, ), CupertinoListTile.notched( title: const Text('关于'), leading: const DummyIcon( color: CupertinoColors.systemBlue, icon: CupertinoIcons.info, ), trailing: const CupertinoListTileChevron(), onTap: () async { await Navigator.of(Get.context!, rootNavigator: true) .push(CupertinoPageRoute(builder: (_) => const AboutPage())); }, ), ], )); } SliverChildBuilderDelegate _buildSliverChildBuilderDelegate() { return SliverChildBuilderDelegate( (context, index) { switch (index) { case 0: return _buildUserSection(); case 1: return _buildArticleListsSection(); case 2: return _buildSettingsSection(); default: // Do nothing. For now. } return null; }, ); } @override Widget build(BuildContext context) { Get.put(OwnProfileController()); return CustomScrollView( slivers: [ const CupertinoSliverNavigationBar( largeTitle: Text('设置'), ), SliverSafeArea( top: false, minimum: const EdgeInsets.only(top: 4), sliver: SliverList( delegate: _buildSliverChildBuilderDelegate(), ), ) ], ); } }