historical_user.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import 'package:appflowy/generated/flowy_svgs.g.dart';
  2. import 'package:appflowy/generated/locale_keys.g.dart';
  3. import 'package:appflowy/user/application/historical_user_bloc.dart';
  4. import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
  5. import 'package:easy_localization/easy_localization.dart';
  6. import 'package:flowy_infra_ui/flowy_infra_ui.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter_bloc/flutter_bloc.dart';
  9. class HistoricalUserList extends StatelessWidget {
  10. final VoidCallback didOpenUser;
  11. const HistoricalUserList({required this.didOpenUser, super.key});
  12. @override
  13. Widget build(BuildContext context) {
  14. return BlocProvider(
  15. create: (context) => HistoricalUserBloc()
  16. ..add(
  17. const HistoricalUserEvent.initial(),
  18. ),
  19. child: BlocBuilder<HistoricalUserBloc, HistoricalUserState>(
  20. builder: (context, state) {
  21. if (state.historicalUsers.isEmpty) {
  22. return const SizedBox.shrink();
  23. } else {
  24. return Column(
  25. crossAxisAlignment: CrossAxisAlignment.start,
  26. children: [
  27. Opacity(
  28. opacity: 0.6,
  29. child: FlowyText.regular(
  30. LocaleKeys.settings_menu_historicalUserListTooltip.tr(),
  31. fontSize: 13,
  32. maxLines: null,
  33. ),
  34. ),
  35. const VSpace(6),
  36. Expanded(
  37. child: ListView.builder(
  38. itemBuilder: (context, index) {
  39. final user = state.historicalUsers[index];
  40. return HistoricalUserItem(
  41. key: ValueKey(user.userId),
  42. user: user,
  43. isSelected: false,
  44. didOpenUser: didOpenUser,
  45. );
  46. },
  47. itemCount: state.historicalUsers.length,
  48. ),
  49. )
  50. ],
  51. );
  52. }
  53. },
  54. ),
  55. );
  56. }
  57. }
  58. class HistoricalUserItem extends StatelessWidget {
  59. final VoidCallback didOpenUser;
  60. final bool isSelected;
  61. final HistoricalUserPB user;
  62. const HistoricalUserItem({
  63. required this.user,
  64. required this.isSelected,
  65. required this.didOpenUser,
  66. super.key,
  67. });
  68. @override
  69. Widget build(BuildContext context) {
  70. final icon = isSelected ? const FlowySvg(FlowySvgs.check_s) : null;
  71. final isDisabled = isSelected || user.authType != AuthTypePB.Local;
  72. final outputFormat = DateFormat('MM/dd/yyyy hh:mm a');
  73. final date =
  74. DateTime.fromMillisecondsSinceEpoch(user.lastTime.toInt() * 1000);
  75. final lastTime = outputFormat.format(date);
  76. final desc = "${user.userName}\t ${user.authType}\t$lastTime";
  77. final child = SizedBox(
  78. height: 30,
  79. child: FlowyButton(
  80. disable: isDisabled,
  81. text: FlowyText.medium(
  82. desc,
  83. fontSize: 12,
  84. ),
  85. rightIcon: icon,
  86. onTap: () {
  87. context
  88. .read<HistoricalUserBloc>()
  89. .add(HistoricalUserEvent.openHistoricalUser(user));
  90. didOpenUser();
  91. },
  92. ),
  93. );
  94. return child;
  95. }
  96. }