Files
tm_app/lib/views/notification/pages/m_notification_page.dart
T
2025-09-27 15:27:45 +03:30

139 lines
4.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/view_models/notification_view_model.dart';
import 'package:tm_app/views/notification/strings/notification_strings.dart';
import 'package:tm_app/views/shared/tender_app_bar.dart';
import '../../shared/main_tab_bar.dart';
import '../widgets/notification_all_tab.dart';
import '../widgets/notification_important_tab.dart';
import '../widgets/notification_unread_tab.dart';
class MobileNotificationPage extends StatefulWidget {
const MobileNotificationPage({super.key});
@override
State<MobileNotificationPage> createState() => _MobileNotificationPageState();
}
class _MobileNotificationPageState extends State<MobileNotificationPage>
with SingleTickerProviderStateMixin {
late TabController controller;
final ScrollController _scrollAll = ScrollController();
final ScrollController _scrollUnread = ScrollController();
final ScrollController _scrollImportant = ScrollController();
@override
void initState() {
super.initState();
controller = TabController(length: 3, vsync: this);
final viewModel = context.read<NotificationViewModel>();
_scrollAll.addListener(() {
if (_scrollAll.position.pixels >=
_scrollAll.position.maxScrollExtent - 100 &&
!viewModel.isLoadingAll &&
viewModel.hasMoreAll) {
viewModel.getNotifications(
page: viewModel.currentPageAll + 1,
isPagination: true,
);
}
});
_scrollUnread.addListener(() {
if (_scrollUnread.position.pixels >=
_scrollUnread.position.maxScrollExtent - 100 &&
!viewModel.isLoadingUnread &&
viewModel.hasMoreUnread) {
viewModel.getUnreadNotifications(
page: viewModel.currentPageUnread + 1,
isPagination: true,
);
}
});
_scrollImportant.addListener(() {
if (_scrollImportant.position.pixels >=
_scrollImportant.position.maxScrollExtent - 100 &&
!viewModel.isLoadingImportant &&
viewModel.hasMoreImportant) {
viewModel.getImportantNotifications(
page: viewModel.currentPageImportant + 1,
isPagination: true,
);
}
});
}
@override
void dispose() {
controller.dispose();
_scrollAll.dispose();
_scrollUnread.dispose();
_scrollImportant.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final viewModel = context.watch<NotificationViewModel>();
return Scaffold(
backgroundColor: AppColors.backgroundColor,
appBar: tenderMobileAppBar(title: NotificationStrings.notificationTitle),
body: Column(
children: [
MainTabBar(
controller: controller,
titles: [
NotificationStrings.all,
NotificationStrings.unread,
NotificationStrings.important,
],
),
SizedBox(height: 12.0.h()),
Expanded(
child: TabBarView(
controller: controller,
children: [
NotificationAllTab(scrollController: _scrollAll),
NotificationUnreadTab(scrollController: _scrollUnread),
NotificationImportantTab(scrollController: _scrollImportant),
],
),
),
if (viewModel.isMoreLoadingAll)
const Padding(
padding: EdgeInsets.symmetric(vertical: 16),
child: Center(
child: CircularProgressIndicator(color: AppColors.secondary50),
),
),
if (viewModel.isMoreLoadingUnread)
const Padding(
padding: EdgeInsets.symmetric(vertical: 16),
child: Center(
child: CircularProgressIndicator(color: AppColors.secondary50),
),
),
if (viewModel.isMoreLoadingImportant)
const Padding(
padding: EdgeInsets.symmetric(vertical: 16),
child: Center(
child: CircularProgressIndicator(color: AppColors.secondary50),
),
),
],
),
);
}
}