notification_button.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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:flowy_infra_ui/widget/flowy_tooltip.dart';
  12. import 'package:flutter/material.dart';
  13. import 'package:flutter_bloc/flutter_bloc.dart';
  14. class NotificationButton extends StatelessWidget {
  15. const NotificationButton({super.key, required this.views});
  16. final List<ViewPB> views;
  17. @override
  18. Widget build(BuildContext context) {
  19. final mutex = PopoverMutex();
  20. return BlocProvider<ReminderBloc>.value(
  21. value: getIt<ReminderBloc>(),
  22. child: BlocBuilder<ReminderBloc, ReminderState>(
  23. builder: (context, state) => FlowyTooltip(
  24. message: LocaleKeys.notificationHub_title.tr(),
  25. child: MouseRegion(
  26. cursor: SystemMouseCursors.click,
  27. child: AppFlowyPopover(
  28. mutex: mutex,
  29. direction: PopoverDirection.bottomWithLeftAligned,
  30. constraints: const BoxConstraints(maxHeight: 250, maxWidth: 350),
  31. popupBuilder: (_) =>
  32. NotificationDialog(views: views, mutex: mutex),
  33. child: _buildNotificationIcon(context, state.hasUnreads),
  34. ),
  35. ),
  36. ),
  37. ),
  38. );
  39. }
  40. Widget _buildNotificationIcon(BuildContext context, bool hasUnreads) {
  41. return Stack(
  42. children: [
  43. FlowySvg(
  44. FlowySvgs.clock_alarm_s,
  45. size: const Size.square(24),
  46. color: Theme.of(context).colorScheme.tertiary,
  47. ),
  48. if (hasUnreads)
  49. Positioned(
  50. bottom: 2,
  51. right: 2,
  52. child: DecoratedBox(
  53. decoration: BoxDecoration(
  54. shape: BoxShape.circle,
  55. color: AFThemeExtension.of(context).warning,
  56. ),
  57. child: const SizedBox(height: 8, width: 8),
  58. ),
  59. ),
  60. ],
  61. );
  62. }
  63. }