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.
208 lines
6.5 KiB
Dart
208 lines
6.5 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),
|
|
padding: const EdgeInsets.only(
|
|
left: 6, right: 14, top: 0, bottom: 0),
|
|
leading: const DummyIcon(
|
|
color: CupertinoColors.systemGrey,
|
|
icon: CupertinoIcons.person_fill,
|
|
size: 60,
|
|
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(),
|
|
),
|
|
)
|
|
],
|
|
);
|
|
}
|
|
}
|