You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
6.4 KiB
Dart

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<UserController>();
}
Future<void> handleLoginClick() {
handleStartAuth();
return Future.delayed(const Duration(milliseconds: 100));
}
Future<void> 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<OwnProfileController>();
var uc = Get.find<UserController>();
return FollowTextScale(
child: Obx(
() => !uc.isLoggedIn
? CupertinoListSection.insetGrouped(
backgroundColor: Styles.themePageBackgroundColor,
children: <CupertinoListTile>[
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>[
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>[
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>[
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: <Widget>[
const CupertinoSliverNavigationBar(
largeTitle: Text('设置'),
),
SliverSafeArea(
top: false,
minimum: const EdgeInsets.only(top: 4),
sliver: SliverList(
delegate: _buildSliverChildBuilderDelegate(),
),
)
],
);
}
}