From 510529d84d6663f48b8ccf284899874c181665bc Mon Sep 17 00:00:00 2001 From: Vaibhav Date: Wed, 7 Aug 2024 15:59:22 +0530 Subject: [PATCH] integrate api for the notification and link with the push notifocation --- lib/provider/login_provider.dart | 11 +- lib/screens/notification_screen.dart | 217 +++++++++---------- lib/screens/rejected_application_screen.dart | 109 ++++------ lib/services/api_urls.dart | 2 + 4 files changed, 152 insertions(+), 187 deletions(-) diff --git a/lib/provider/login_provider.dart b/lib/provider/login_provider.dart index d6410e0..602ac6b 100644 --- a/lib/provider/login_provider.dart +++ b/lib/provider/login_provider.dart @@ -4,6 +4,8 @@ import 'package:cheminova/services/secure__storage_service.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import '../notification_services.dart'; + class LoginProvider extends ChangeNotifier { final _storageService = SecureStorageService(); @@ -23,12 +25,17 @@ class LoginProvider extends ChangeNotifier { Future<(bool, String)> login() async { setLoading(true); try { - Response response = await _apiClient.post(ApiUrls.loginUrl, - data: {'email': emailController.text.trim(), 'password': passwordController.text.trim()}); + Response response = await _apiClient.post(ApiUrls.loginUrl, data: { + 'email': emailController.text.trim(), + 'password': passwordController.text.trim() + }); setLoading(false); if (response.statusCode == 200) { await _storageService.write( key: 'access_token', value: response.data['token']); + final fcmToken = await NotificationServices().getDeviceToken(); + print('fcmToken: $fcmToken'); + await _apiClient.post(ApiUrls.fcmUrl, data: {'fcmToken': fcmToken}); return (true, response.data['message'].toString()); } else { return (false, response.data['message'].toString()); diff --git a/lib/screens/notification_screen.dart b/lib/screens/notification_screen.dart index 1bdb703..fd8a550 100644 --- a/lib/screens/notification_screen.dart +++ b/lib/screens/notification_screen.dart @@ -1,8 +1,13 @@ -import 'package:cheminova/widgets/common_background.dart'; +import 'package:cheminova/models/rejected_applicaton_response.dart'; import 'package:flutter/material.dart'; -import '../widgets/common_app_bar.dart'; -import '../widgets/common_elevated_button.dart'; -import '../widgets/common_text_form_field.dart'; +import 'package:cheminova/widgets/common_background.dart'; +import 'package:cheminova/widgets/common_drawer.dart'; +import 'package:cheminova/widgets/common_app_bar.dart'; +import 'package:cheminova/widgets/common_elevated_button.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; + +import '../provider/rejected_provider.dart'; class NotificationScreen extends StatefulWidget { const NotificationScreen({super.key}); @@ -12,123 +17,101 @@ class NotificationScreen extends StatefulWidget { } class NotificationScreenState extends State { + late RejectedProvider _rejectedProvider; + + @override + void initState() { + _rejectedProvider = RejectedProvider(); + super.initState(); + } + @override Widget build(BuildContext context) { - - return CommonBackground( - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: CommonAppBar( - actions: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Image.asset('assets/Back_attendance.png'), - padding: const EdgeInsets.only(right: 20), - ), - ], - title: const Text('Notifications', - style: TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.w400, - fontFamily: 'Anek')), - backgroundColor: Colors.transparent, - elevation: 0, - ), - body: SingleChildScrollView( - child: Column( - children: [ - Container( - padding: const EdgeInsets.all(20.0).copyWith(top: 20, bottom: 30), - margin: const EdgeInsets.symmetric(horizontal: 20.0), - decoration: BoxDecoration( - border: Border.all(color: Colors.white), - color: const Color(0xffB4D1E5).withOpacity(0.9), - borderRadius: BorderRadius.circular(26.0), + return ChangeNotifierProvider( + create: (context) => _rejectedProvider, + child: CommonBackground( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: CommonAppBar( + actions: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: Image.asset('assets/Back_attendance.png'), + padding: const EdgeInsets.only(right: 20), ), - child: const Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Notifications', - style: TextStyle( - fontSize: 30, - color: Colors.black, - fontWeight: FontWeight.w500, - fontFamily: 'Anek', - )), - SizedBox( - height: 10, - ), - SizedBox(height:15 ), - CommonTextFormField( - title: ' Notification Type:Alert', - ), - SizedBox(height: 20,), - - ]) - ), - const SizedBox(height: 20,), - Container( - padding: const EdgeInsets.all(20.0).copyWith(top: 20, bottom: 30), - margin: const EdgeInsets.symmetric(horizontal: 20.0), - decoration: BoxDecoration( - border: Border.all(color: Colors.white), - color: const Color(0xffB4D1E5).withOpacity(0.9), - borderRadius: BorderRadius.circular(26.0), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - const Text('Notifications List', - style: TextStyle( - fontSize: 30, - color: Colors.black, - fontWeight: FontWeight.w500, - fontFamily: 'Anek', - )), - const SizedBox(height: 10), - const CommonTextFormField( - title: 'Task: Review Sales Data by EOD\nDate: 10-06-2024',), - const SizedBox(height: 20,), - Align( - alignment: Alignment.center, - child: CommonElevatedButton( - borderRadius: 30, - width: double.infinity, - height: kToolbarHeight - 10, - text: 'VIEW DETAILS', - backgroundColor: const Color(0xff004791), - onPressed: () { - }, - ), - ), - const SizedBox(height: 20,), - const CommonTextFormField( - title: 'Alert: New Dealer Assigned\nDate: 10-06-2024',), - const SizedBox(height: 15), - Align( - alignment: Alignment.center, - child: CommonElevatedButton( - borderRadius: 30, - width: double.infinity, - height: kToolbarHeight - 10, - text: 'VIEW DETAILS', - backgroundColor: const Color(0xff004791), - onPressed: () { - - }, - ), - ), ], + title: const Text('Notification', + style: TextStyle( + fontSize: 20, + color: Colors.black, + fontWeight: FontWeight.w400, + fontFamily: 'Anek')), + backgroundColor: Colors.transparent, + elevation: 0, + ), + drawer: const CommonDrawer(), + body: Consumer( + builder: (context, value, child) => value.isLoading + ? const Center(child: CircularProgressIndicator()) + : MyListView(value: value), + ), ), - ), - ]), - ))); + )); + } +} + +Widget buildProductButton(String productName) { + return Padding( + padding: const EdgeInsets.only(bottom: 15), + child: CommonElevatedButton( + borderRadius: 30, + width: double.infinity, + height: kToolbarHeight - 10, + text: productName, + backgroundColor: const Color(0xff004791), + onPressed: () { + // Handle product button press + debugPrint('$productName pressed'); + }, + ), + ); +} + +class MyListView extends StatelessWidget { + final RejectedProvider value; + + const MyListView({super.key, required this.value}); + + @override + Widget build(BuildContext context) { + return ListView.builder( + padding: const EdgeInsets.only(top: 15), + itemCount: value.rejectedApplicationList.length, + itemBuilder: (context, index) { + RejectedApplicationResponse item = value.rejectedApplicationList[index]; + return Padding( + padding: const EdgeInsets.only(bottom: 10, left: 10, right: 10), + child: ExpansionTile( + collapsedBackgroundColor: Colors.white, + backgroundColor: Colors.white, + title: Text( + item.tradeName ?? '', + style: const TextStyle(fontSize: 17, fontWeight: FontWeight.w500), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text((DateFormat("dd/MM/yyyy") + .format(DateTime.parse(item.createdAt ?? '')))), + Text(item.sId ?? ''), + for (var note in item.notes!) Text(note.message ?? ''), + ], + ), + ), + ); + }, + ); } } diff --git a/lib/screens/rejected_application_screen.dart b/lib/screens/rejected_application_screen.dart index db7c8f5..bdf1c33 100644 --- a/lib/screens/rejected_application_screen.dart +++ b/lib/screens/rejected_application_screen.dart @@ -13,7 +13,8 @@ class RejectedApplicationScreen extends StatefulWidget { const RejectedApplicationScreen({super.key}); @override - State createState() => _RejectedApplicationScreenState(); + State createState() => + _RejectedApplicationScreenState(); } class _RejectedApplicationScreenState extends State { @@ -56,66 +57,33 @@ class _RejectedApplicationScreenState extends State { builder: (context, value, child) => value.isLoading ? const Center(child: CircularProgressIndicator()) : MyListView(value: value), - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: SingleChildScrollView( - // physics: const BouncingScrollPhysics(), - // child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // const SizedBox(height: 16), - // Container( - // padding: const EdgeInsets.all(20.0).copyWith( - // top: 30, bottom: 30), - // decoration: BoxDecoration( - // border: Border.all(color: Colors.white), - // color: const Color(0xffB4D1E5).withOpacity(0.9), - // borderRadius: BorderRadius.circular(26.0), - // ), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // _buildProductButton('Trade Name 1'), - // _buildProductButton('Trade Name 2'), - // _buildProductButton('Trade Name 3'), - // // _buildProductButton('Product 4'), - // // _buildProductButton('Product 5'), - // // _buildProductButton('Product 6'), - // // _buildProductButton('Product 7'), - // ], - // ), - // ), - // ], - // ), - // ), - // ), ), ), - ) - ); + )); } } - Widget _buildProductButton(String productName) { - return Padding( - padding: const EdgeInsets.only(bottom: 15), - child: CommonElevatedButton( - borderRadius: 30, - width: double.infinity, - height: kToolbarHeight - 10, - text: productName, - backgroundColor: const Color(0xff004791), - onPressed: () { - // Handle product button press - debugPrint('$productName pressed'); - }, - ), - ); - } + +Widget buildProductButton(String productName) { + return Padding( + padding: const EdgeInsets.only(bottom: 15), + child: CommonElevatedButton( + borderRadius: 30, + width: double.infinity, + height: kToolbarHeight - 10, + text: productName, + backgroundColor: const Color(0xff004791), + onPressed: () { + // Handle product button press + debugPrint('$productName pressed'); + }, + ), + ); +} class MyListView extends StatelessWidget { final RejectedProvider value; - const MyListView( {super.key, required this.value}); + + const MyListView({super.key, required this.value}); @override Widget build(BuildContext context) { @@ -123,21 +91,23 @@ class MyListView extends StatelessWidget { padding: const EdgeInsets.only(top: 15), itemCount: value.rejectedApplicationList.length, itemBuilder: (context, index) { - RejectedApplicationResponse item = value.rejectedApplicationList[index]; + RejectedApplicationResponse item = value.rejectedApplicationList[index]; return Padding( - padding: const EdgeInsets.only(bottom: 10,left: 10,right: 10), + padding: const EdgeInsets.only(bottom: 10, left: 10, right: 10), child: ExpansionTile( - collapsedBackgroundColor: Colors.white, backgroundColor: Colors.white, - - title: Text(item.tradeName ?? '',style: const TextStyle(fontSize: 17,fontWeight:FontWeight.w500),), + title: Text( + item.tradeName ?? '', + style: const TextStyle(fontSize: 17, fontWeight: FontWeight.w500), + ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text((DateFormat("dd/MM/yyyy") .format(DateTime.parse(item.createdAt ?? '')))), Text(item.sId ?? ''), + for (var note in item.notes!) Text(note.message ?? ''), ], ), children: [ @@ -160,31 +130,35 @@ class MyListView extends StatelessWidget { title: Text('Status: ${item.status ?? ''}'), ), ListTile( - title: Text('Principal Distributor: ${item.principalDistributer!.name ?? ''}'), + title: Text( + 'Principal Distributor: ${item.principalDistributer!.name ?? ''}'), ), ListTile( title: Text('PAN Number: ${item.panNumber ?? ''}'), ), - Image.network(item.panImg!.url ?? '',height: 250,width: 250), + Image.network(item.panImg!.url ?? '', height: 250, width: 250), ListTile( - title: Text('Aadhar Number: ${item.aadharNumber?? ''}'), + title: Text('Aadhar Number: ${item.aadharNumber ?? ''}'), ), - Image.network(item.aadharImg?.url ?? '',height: 250,width: 250), + Image.network(item.aadharImg?.url ?? '', height: 250, width: 250), ListTile( title: Text('GST Number: ${item.gstNumber ?? ''}'), ), - Image.network(item.gstImg!.url ?? '',height: 250,width: 250),const ListTile( + Image.network(item.gstImg!.url ?? '', height: 250, width: 250), + const ListTile( title: Text('Pesticide License: '), ), if (item.pesticideLicenseImg != null) - Image.network(item.pesticideLicenseImg!.url ?? '',height: 250,width: 250), + Image.network(item.pesticideLicenseImg!.url ?? '', + height: 250, width: 250), // if (item['fertilizer_license_img'] != null) // Image.network(item['fertilizer_license_img']['url'] ?? ''), const ListTile( title: Text('selfieEntranceImg: '), ), - Image.network(item.selfieEntranceImg!.url ?? '',height: 250,width: 250), + Image.network(item.selfieEntranceImg!.url ?? '', + height: 250, width: 250), const ListTile( title: Text('Notes:'), ), @@ -194,11 +168,10 @@ class MyListView extends StatelessWidget { contentPadding: const EdgeInsets.only(left: 20), title: Text(note.message ?? ''), ), - ], ), ); }, ); } -} \ No newline at end of file +} diff --git a/lib/services/api_urls.dart b/lib/services/api_urls.dart index 41c6cb5..bd6e6e5 100644 --- a/lib/services/api_urls.dart +++ b/lib/services/api_urls.dart @@ -11,4 +11,6 @@ class ApiUrls { static const String leaveAttendance = '${baseUrl}v1/markleave/salescoordinator'; static const String logOutUrl = '${baseUrl}salescoordinator/logout'; static const String rejectedApplication = '${baseUrl}kyc/getAllrejected'; + static const String notificationUrl = '$baseUrl/api/get-notification-sc'; + static const String fcmUrl = '${baseUrl}kyc/save-fcm-sc'; }