notification_button.dart 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import 'package:appflowy/generated/flowy_svgs.g.dart';
  2. import 'package:appflowy/generated/locale_keys.g.dart';
  3. import 'package:appflowy/startup/startup.dart';
  4. import 'package:appflowy/user/application/reminder/reminder_bloc.dart';
  5. import 'package:appflowy/workspace/presentation/notifications/notification_dialog.dart';
  6. import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
  7. import 'package:appflowy_popover/appflowy_popover.dart';
  8. import 'package:easy_localization/easy_localization.dart';
  9. import 'package:flowy_infra/theme_extension.dart';
  10. import 'package:flowy_infra_ui/flowy_infra_ui.dart';
  11. import 'package:flutter/material.dart';
  12. import 'package:flutter_bloc/flutter_bloc.dart';
  13. class NotificationButton extends StatelessWidget {
  14. const NotificationButton({super.key, required this.views});
  15. final List<ViewPB> views;
  16. @override
  17. Widget build(BuildContext context) {
  18. final mutex = PopoverMutex();
  19. return BlocProvider<ReminderBloc>.value(
  20. value: getIt<ReminderBloc>(),
  21. child: BlocBuilder<ReminderBloc, ReminderState>(
  22. builder: (context, state) => Tooltip(
  23. message: LocaleKeys.notificationHub_title.tr(),
  24. child: MouseRegion(
  25. cursor: SystemMouseCursors.click,
  26. child: AppFlowyPopover(
  27. mutex: mutex,
  28. direction: PopoverDirection.bottomWithLeftAligned,
  29. constraints: const BoxConstraints(maxHeight: 250, maxWidth: 300),
  30. popupBuilder: (_) =>
  31. NotificationDialog(views: views, mutex: mutex),
  32. child: _buildNotificationIcon(context, state.hasUnreads),
  33. ),
  34. ),
  35. ),
  36. ),
  37. );
  38. }
  39. Widget _buildNotificationIcon(BuildContext context, bool hasUnreads) {
  40. return Stack(
  41. children: [
  42. FlowySvg(
  43. FlowySvgs.clock_alarm_s,
  44. size: const Size.square(24),
  45. color: Theme.of(context).colorScheme.tertiary,
  46. ),
  47. if (hasUnreads)
  48. Positioned(
  49. bottom: 2,
  50. right: 2,
  51. child: DecoratedBox(
  52. decoration: BoxDecoration(
  53. shape: BoxShape.circle,
  54. color: AFThemeExtension.of(context).warning,
  55. ),
  56. child: const SizedBox(height: 8, width: 8),
  57. ),
  58. ),
  59. ],
  60. );
  61. }
  62. }