Announcement api integrated
This commit is contained in:
parent
86a594d01e
commit
2f461768fb
@ -1,8 +1,3 @@
|
|||||||
buildscript {
|
|
||||||
dependencies {
|
|
||||||
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
|
31
lib/controller/announcement_controller.dart
Normal file
31
lib/controller/announcement_controller.dart
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import 'package:get/get.dart';
|
||||||
|
import '../models/announcement_response.dart';
|
||||||
|
import '../services/api_service.dart';
|
||||||
|
import '../utils/api_urls.dart';
|
||||||
|
|
||||||
|
class AnnouncementController extends GetxController {
|
||||||
|
final ApiService _apiClient = ApiService();
|
||||||
|
RxList<AnnouncementResponse> announcementsList = <AnnouncementResponse>[].obs;
|
||||||
|
RxBool isLoading = false.obs;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
getAnnouncements();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> getAnnouncements() async {
|
||||||
|
isLoading.value = true;
|
||||||
|
try {
|
||||||
|
final response = await _apiClient.get(ApiUrls.announcementUrl);
|
||||||
|
isLoading.value = false;
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
final List<dynamic> data = response.data;
|
||||||
|
announcementsList.value = data.map((item) => AnnouncementResponse.fromJson(item)).toList();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
isLoading.value = false;
|
||||||
|
Get.snackbar('Error', 'Failed to fetch announcements');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
43
lib/models/announcement_response.dart
Normal file
43
lib/models/announcement_response.dart
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
class AnnouncementResponse {
|
||||||
|
String? id;
|
||||||
|
String? uniqueId;
|
||||||
|
List<String>? sentTo;
|
||||||
|
String? message;
|
||||||
|
DateTime? createdAt;
|
||||||
|
DateTime? updatedAt;
|
||||||
|
int? v;
|
||||||
|
|
||||||
|
AnnouncementResponse({
|
||||||
|
this.id,
|
||||||
|
this.uniqueId,
|
||||||
|
this.sentTo,
|
||||||
|
this.message,
|
||||||
|
this.createdAt,
|
||||||
|
this.updatedAt,
|
||||||
|
this.v,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory AnnouncementResponse.fromJson(Map<String, dynamic> json) {
|
||||||
|
return AnnouncementResponse(
|
||||||
|
id: json['_id'],
|
||||||
|
uniqueId: json['uniqueId'],
|
||||||
|
sentTo: json['sentTo'] != null ? List<String>.from(json['sentTo']) : null,
|
||||||
|
message: json['message'],
|
||||||
|
createdAt: json['createdAt'] != null ? DateTime.parse(json['createdAt']) : null,
|
||||||
|
updatedAt: json['updatedAt'] != null ? DateTime.parse(json['updatedAt']) : null,
|
||||||
|
v: json['__v'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'_id': id,
|
||||||
|
'uniqueId': uniqueId,
|
||||||
|
'sentTo': sentTo,
|
||||||
|
'message': message,
|
||||||
|
'createdAt': createdAt?.toIso8601String(),
|
||||||
|
'updatedAt': updatedAt?.toIso8601String(),
|
||||||
|
'__v': v,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
131
lib/screens/announment/announment_screen.dart
Normal file
131
lib/screens/announment/announment_screen.dart
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
import 'package:cheminova/widgets/my_drawer.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import '../../controller/announcement_controller.dart';
|
||||||
|
import '../../models/announcement_response.dart';
|
||||||
|
import '../../widgets/comman_background.dart';
|
||||||
|
import '../../widgets/common_appbar.dart';
|
||||||
|
import '../../widgets/common_elevated_button.dart';
|
||||||
|
|
||||||
|
class AnnouncementScreen extends StatelessWidget {
|
||||||
|
final AnnouncementController controller = Get.put(AnnouncementController());
|
||||||
|
|
||||||
|
AnnouncementScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return CommonBackground(
|
||||||
|
child: Scaffold(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
appBar: CommonAppBar(
|
||||||
|
title: const Text('Announcements',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
fontFamily: 'Anek')),
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
elevation: 0,
|
||||||
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
icon: SvgPicture.asset('assets/svg/back_arrow.svg'),
|
||||||
|
padding: const EdgeInsets.only(right: 20))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
drawer: const MyDrawer(),
|
||||||
|
body: Obx(() => controller.isLoading.value
|
||||||
|
? const Center(child: CircularProgressIndicator())
|
||||||
|
: MyListView(announcementList: controller.announcementsList)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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: () {
|
||||||
|
debugPrint('$productName pressed');
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyListView extends StatelessWidget {
|
||||||
|
final List<AnnouncementResponse> announcementList;
|
||||||
|
|
||||||
|
const MyListView({super.key, required this.announcementList});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
Map<String, List<AnnouncementResponse>> groupedAnnouncements = {};
|
||||||
|
|
||||||
|
for (var announcement in announcementList) {
|
||||||
|
String date = DateFormat("dd MMM yyyy").format(announcement.createdAt ?? DateTime.now());
|
||||||
|
if (!groupedAnnouncements.containsKey(date)) {
|
||||||
|
groupedAnnouncements[date] = [];
|
||||||
|
}
|
||||||
|
groupedAnnouncements[date]!.add(announcement);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.only(top: 15),
|
||||||
|
itemCount: groupedAnnouncements.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
String date = groupedAnnouncements.keys.elementAt(index);
|
||||||
|
List<AnnouncementResponse> announcementsForDate = groupedAnnouncements[date]!;
|
||||||
|
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 10, left: 10, right: 10),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8.0),
|
||||||
|
child: Text(
|
||||||
|
date,
|
||||||
|
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
...announcementsForDate.map((item) => Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 10),
|
||||||
|
child: ExpansionTile(
|
||||||
|
collapsedBackgroundColor: Colors.white,
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
trailing: const SizedBox.shrink(),
|
||||||
|
title: const Text(
|
||||||
|
'New Announcement',
|
||||||
|
style: TextStyle(fontSize: 17, fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
subtitle: Text(item.message ?? ''),
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text('Sent to: ${item.sentTo?.join(", ")}'),
|
||||||
|
const SizedBox(height: 8),
|
||||||
|
Text('Unique ID: ${item.uniqueId}'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
import 'package:cheminova/controller/home_controller.dart';
|
import 'package:cheminova/controller/home_controller.dart';
|
||||||
|
import 'package:cheminova/screens/announment/announment_screen.dart';
|
||||||
import 'package:cheminova/screens/inventory/inventory_management_screen.dart';
|
import 'package:cheminova/screens/inventory/inventory_management_screen.dart';
|
||||||
import 'package:cheminova/screens/order/order_tracking_screen.dart';
|
import 'package:cheminova/screens/order/order_tracking_screen.dart';
|
||||||
import 'package:cheminova/screens/order_management/order_management_screen.dart';
|
import 'package:cheminova/screens/order_management/order_management_screen.dart';
|
||||||
import 'package:cheminova/screens/product/product_catalog_screen.dart';
|
import 'package:cheminova/screens/product/product_catalog_screen.dart';
|
||||||
import 'package:cheminova/screens/report/notification_screen.dart';
|
import 'package:cheminova/screens/report/notification_screen.dart';
|
||||||
import 'package:cheminova/screens/retail/retail_distributer_on_boarding_screen.dart';
|
|
||||||
import 'package:cheminova/widgets/home_card.dart';
|
import 'package:cheminova/widgets/home_card.dart';
|
||||||
import 'package:cheminova/widgets/my_drawer.dart';
|
import 'package:cheminova/widgets/my_drawer.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -150,8 +150,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
|||||||
HomeCard(
|
HomeCard(
|
||||||
title: 'Announcement',
|
title: 'Announcement',
|
||||||
onTap: () => Get.to(
|
onTap: () => Get.to(
|
||||||
() =>
|
() => AnnouncementScreen(), // Navigates to RetailDistributerOnBoardingScreen.
|
||||||
const RetailDistributerOnBoardingScreen(), // Navigates to RetailDistributerOnBoardingScreen.
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -15,5 +15,6 @@ class ApiUrls {
|
|||||||
static const String getSinglePlacedOrderUrl ='/api/get-single-placed-order-pd';
|
static const String getSinglePlacedOrderUrl ='/api/get-single-placed-order-pd';
|
||||||
static const String placedOrderUrl ='${baseUrl}/api/order-place';
|
static const String placedOrderUrl ='${baseUrl}/api/order-place';
|
||||||
static const String inventoryManangementOrdersStock ='${baseUrl}/api/stock';
|
static const String inventoryManangementOrdersStock ='${baseUrl}/api/stock';
|
||||||
|
static const String announcementUrl ='${baseUrl}/api/announcement/RDs';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user