Added RSS Feed Implementation

master
FaizHashmiCS22 2 years ago
parent 98888a32f0
commit 1da3bcf843

@ -6,6 +6,7 @@ import 'package:queuing_system/core/config/config.dart';
import 'package:queuing_system/core/response_models/call_config_model.dart'; import 'package:queuing_system/core/response_models/call_config_model.dart';
import 'package:queuing_system/core/response_models/patient_ticket_model.dart'; import 'package:queuing_system/core/response_models/patient_ticket_model.dart';
import 'package:queuing_system/core/response_models/prayers_widget_model.dart'; import 'package:queuing_system/core/response_models/prayers_widget_model.dart';
import 'package:queuing_system/core/response_models/rss_feed_model.dart';
import 'package:queuing_system/core/response_models/weathers_widget_model.dart'; import 'package:queuing_system/core/response_models/weathers_widget_model.dart';
import 'package:queuing_system/core/response_models/widgets_config_model.dart'; import 'package:queuing_system/core/response_models/widgets_config_model.dart';
@ -14,6 +15,7 @@ const _callUpdateNotIsQueueRecordByIDAsync = "/CallRequest_QueueUpdate";
const _waitingAreaScreenConfigGet = "/WaitingAreaScreen_Config_Get"; const _waitingAreaScreenConfigGet = "/WaitingAreaScreen_Config_Get";
const _weatherForecastGetBy5Days = "/WeatherForecast_GetBy5Days"; const _weatherForecastGetBy5Days = "/WeatherForecast_GetBy5Days";
const _prayerTimeToday = "/PrayerTime_Today"; const _prayerTimeToday = "/PrayerTime_Today";
const _rssFeedGet = "/RssFeed_Get";
class MyHttpOverrides extends HttpOverrides { class MyHttpOverrides extends HttpOverrides {
@override @override
@ -135,4 +137,23 @@ class API {
onFailure: (error, status) => log("error: ${error.toString()}")); onFailure: (error, status) => log("error: ${error.toString()}"));
return currentPrayersWidgetModel; return currentPrayersWidgetModel;
} }
static Future<RssFeedModel?> getRssFeedDetailsFromServer({
required int languageId,
required Function(dynamic) onFailure,
}) async {
final body = {"languageID": languageId};
RssFeedModel rssFeedModel = RssFeedModel();
await BaseAppClient.post(_rssFeedGet,
body: body,
onSuccess: (response, status) {
if (status == 200 && response["data"] != null) {
final rssFeed = (response["data"] as List).map((e) => RssFeedModel.fromJson(e)).toList().first;
rssFeedModel = rssFeed;
}
},
onFailure: (error, status) => log("error: ${error.toString()}"));
return rssFeedModel;
}
} }

@ -0,0 +1,15 @@
class RssFeedModel {
String? rssFeed;
RssFeedModel({this.rssFeed});
RssFeedModel.fromJson(Map<String, dynamic> json) {
rssFeed = json['rssFeed'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['rssFeed'] = rssFeed;
return data;
}
}

@ -3,6 +3,7 @@ class WidgetsConfigModel {
String? waitingAreaName; String? waitingAreaName;
bool? isWeatherReq; bool? isWeatherReq;
bool? isPrayerTimeReq; bool? isPrayerTimeReq;
bool? isRssFeedReq;
int? projectID; int? projectID;
double? projectLatitude; double? projectLatitude;
double? projectLongitude; double? projectLongitude;
@ -13,6 +14,7 @@ class WidgetsConfigModel {
this.waitingAreaName, this.waitingAreaName,
this.isWeatherReq, this.isWeatherReq,
this.isPrayerTimeReq, this.isPrayerTimeReq,
this.isRssFeedReq,
this.projectID, this.projectID,
this.projectLatitude, this.projectLatitude,
this.projectLongitude, this.projectLongitude,
@ -20,11 +22,12 @@ class WidgetsConfigModel {
}); });
WidgetsConfigModel.fromJson(Map<String, dynamic> json) { WidgetsConfigModel.fromJson(Map<String, dynamic> json) {
print("jsonToConvert: $json");
waitingAreaID = json['waitingAreaID']; waitingAreaID = json['waitingAreaID'];
waitingAreaName = json['waitingAreaName']; waitingAreaName = json['waitingAreaName'];
isWeatherReq = true; isWeatherReq = true;
isPrayerTimeReq = true; isPrayerTimeReq = true;
isRssFeedReq = true;
// isRssFeedReq = json['isRssFeedReq'];
// isWeatherReq = json['isWeatherReq']; // isWeatherReq = json['isWeatherReq'];
// isPrayerTimeReq = json['isPrayerTimeReq']; // isPrayerTimeReq = json['isPrayerTimeReq'];
projectID = json['projectID']; projectID = json['projectID'];

@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:marquee/marquee.dart';
import 'package:provider/provider.dart';
import 'package:queuing_system/core/config/size_config.dart';
import 'package:queuing_system/home/app_provider.dart';
import 'package:queuing_system/utils/Utils.dart';
import 'package:queuing_system/widget/data_display/app_texts_widget.dart';
class AppFooter extends StatelessWidget {
const AppFooter({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer(builder: (BuildContext context, AppProvider appProvider, Widget? child) {
return Container(
color: Colors.grey.withOpacity(0.1),
height: Utils.getHeight() * 0.8,
width: double.infinity,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
const SizedBox(width: 20),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
InkWell(
onTap: () async {
await context.read<AppProvider>().callPatientsAPI();
},
child: AppText(
"Powered By",
fontSize: SizeConfig.getWidthMultiplier() * 2.6,
fontFamily: 'Poppins-Medium.ttf',
),
),
Text(appProvider.currentDeviceIp, style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getWidthMultiplier() * 2.2)),
],
),
const SizedBox(width: 10),
Image.asset(
"assets/images/cloud_logo.png",
height: SizeConfig.getHeightMultiplier() * 4,
),
],
),
Expanded(
child: (appProvider.currentRssFeedModel.rssFeed == null || appProvider.currentRssFeedModel.rssFeed!.isEmpty)
? const SizedBox()
: Container(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Marquee(
text: appProvider.currentRssFeedModel.rssFeed ?? "",
style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getHeightMultiplier() * 2),
scrollAxis: Axis.horizontal,
crossAxisAlignment: CrossAxisAlignment.center,
blankSpace: 20.0,
velocity: 100.0,
pauseAfterRound: const Duration(seconds: 1),
startPadding: 10.0,
accelerationDuration: const Duration(seconds: 1),
accelerationCurve: Curves.linear,
decelerationDuration: const Duration(milliseconds: 500),
decelerationCurve: Curves.easeOut,
),
),
)
],
));
});
}
}

@ -11,6 +11,7 @@ import 'package:queuing_system/core/api.dart';
import 'package:queuing_system/core/response_models/call_config_model.dart'; import 'package:queuing_system/core/response_models/call_config_model.dart';
import 'package:queuing_system/core/response_models/patient_ticket_model.dart'; import 'package:queuing_system/core/response_models/patient_ticket_model.dart';
import 'package:queuing_system/core/response_models/prayers_widget_model.dart'; import 'package:queuing_system/core/response_models/prayers_widget_model.dart';
import 'package:queuing_system/core/response_models/rss_feed_model.dart';
import 'package:queuing_system/core/response_models/weathers_widget_model.dart'; import 'package:queuing_system/core/response_models/weathers_widget_model.dart';
import 'package:queuing_system/core/response_models/widgets_config_model.dart'; import 'package:queuing_system/core/response_models/widgets_config_model.dart';
import 'package:queuing_system/utils/call_by_voice.dart'; import 'package:queuing_system/utils/call_by_voice.dart';
@ -103,7 +104,7 @@ class AppProvider extends ChangeNotifier {
String nextPrayerToShowWithTime = ''; String nextPrayerToShowWithTime = '';
void getNextPrayerToShow() { void getNextPrayerToShow() {
log("Checking Namaz time!"); log("Checking Namaz time Locally!");
final current = DateTime.now(); final current = DateTime.now();
if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!).isAfter(current)) { if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!).isAfter(current)) {
final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!)); final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!));
@ -153,6 +154,18 @@ class AppProvider extends ChangeNotifier {
} }
} }
RssFeedModel currentRssFeedModel = RssFeedModel();
Future<void> getRssFeedDetailsFromServer() async {
RssFeedModel? rssFeedModel = await API.getRssFeedDetailsFromServer(languageId: 0, onFailure: (error) => log("Api call failed with this error: ${error.toString()}"));
if (rssFeedModel != null) {
currentRssFeedModel = rssFeedModel;
log("I got this data from RssFeed: ${currentRssFeedModel.rssFeed}");
notifyListeners();
}
}
Future<void> getInfoWidgetsDetailsFromServer() async { Future<void> getInfoWidgetsDetailsFromServer() async {
if (currentWidgetsConfigModel == null) return; if (currentWidgetsConfigModel == null) return;
@ -163,6 +176,9 @@ class AppProvider extends ChangeNotifier {
if (currentWidgetsConfigModel!.isPrayerTimeReq!) { if (currentWidgetsConfigModel!.isPrayerTimeReq!) {
await getPrayerDetailsFromServer(); await getPrayerDetailsFromServer();
} }
if (currentWidgetsConfigModel!.isRssFeedReq!) {
await getRssFeedDetailsFromServer();
}
}); });
int currentDate = DateTime.now().millisecondsSinceEpoch; int currentDate = DateTime.now().millisecondsSinceEpoch;
@ -171,7 +187,7 @@ class AppProvider extends ChangeNotifier {
Future<void> getTheWidgetsConfigurationsEveryMidnight() async { Future<void> getTheWidgetsConfigurationsEveryMidnight() async {
if (currentWidgetsConfigModel == null) return; if (currentWidgetsConfigModel == null) return;
if (!currentWidgetsConfigModel!.isWeatherReq! && !currentWidgetsConfigModel!.isPrayerTimeReq!) { if (!currentWidgetsConfigModel!.isWeatherReq! && !currentWidgetsConfigModel!.isPrayerTimeReq! && !currentWidgetsConfigModel!.isRssFeedReq!) {
return; return;
} }
@ -181,6 +197,11 @@ class AppProvider extends ChangeNotifier {
return current; return current;
}); });
Stream timerForRssFeed = Stream.periodic(const Duration(hours: 1), (i) {
current = current.add(const Duration(hours: 1));
return current;
});
timer.listen((data) async { timer.listen((data) async {
DateTime dateTime = DateTime.parse(data.toString()); DateTime dateTime = DateTime.parse(data.toString());
@ -195,8 +216,20 @@ class AppProvider extends ChangeNotifier {
await getPrayerDetailsFromServer(); await getPrayerDetailsFromServer();
} }
} }
if (currentWidgetsConfigModel!.isRssFeedReq!) {
if (dateTime.day > currentLastTimeUpdated.day) {
await getRssFeedDetailsFromServer();
}
}
getNextPrayerToShow(); getNextPrayerToShow();
}); });
timerForRssFeed.listen((data) async {
if (currentWidgetsConfigModel!.isRssFeedReq!) {
await getRssFeedDetailsFromServer();
}
});
} }
Future<void> startSignalHubConnection() async { Future<void> startSignalHubConnection() async {

@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
import 'package:queuing_system/core/base/app_scaffold_widget.dart'; import 'package:queuing_system/core/base/app_scaffold_widget.dart';
import 'package:queuing_system/core/config/config.dart'; import 'package:queuing_system/core/config/config.dart';
import 'package:queuing_system/core/config/size_config.dart'; import 'package:queuing_system/core/config/size_config.dart';
import 'package:queuing_system/footer/app_footer.dart';
import 'package:queuing_system/header/app_header.dart'; import 'package:queuing_system/header/app_header.dart';
import 'package:queuing_system/home/app_provider.dart'; import 'package:queuing_system/home/app_provider.dart';
import 'package:queuing_system/home/priority_calls_components.dart'; import 'package:queuing_system/home/priority_calls_components.dart';
@ -128,29 +129,6 @@ class MyHomePage extends StatelessWidget {
); );
} }
Widget getRSSFeedWidget() {
return Container(
// height: 35,
// decoration: const BoxDecoration(
// color: Color(0x3A1E2326),
// ),
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Marquee(
text: 'Nullam porta dui nec lectus rhoncus sagittis. Cras vitae elit quam. Donec pretium tortor urna, sed fermentum dolor scelerisque vel. Vivamus pretium ut leo eget fermentum.',
style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getHeightMultiplier() * 2),
scrollAxis: Axis.horizontal,
crossAxisAlignment: CrossAxisAlignment.center,
blankSpace: 20.0,
velocity: 100.0,
pauseAfterRound: const Duration(seconds: 1),
startPadding: 10.0,
accelerationDuration: const Duration(seconds: 1),
accelerationCurve: Curves.linear,
decelerationDuration: const Duration(milliseconds: 500),
decelerationCurve: Curves.easeOut,
),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -160,43 +138,7 @@ class MyHomePage extends StatelessWidget {
appProvider: appProvider, appProvider: appProvider,
appBar: const AppHeader(), appBar: const AppHeader(),
body: getBody(appProvider), body: getBody(appProvider),
bottomNavigationBar: Container( bottomNavigationBar: const AppFooter(),
color: Colors.grey.withOpacity(0.1),
height: Utils.getHeight() * 0.8,
width: double.infinity,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
const SizedBox(width: 20),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
InkWell(
onTap: () async {
await context.read<AppProvider>().callPatientsAPI();
},
child: AppText(
"Powered By",
fontSize: SizeConfig.getWidthMultiplier() * 2.6,
fontFamily: 'Poppins-Medium.ttf',
),
),
Text(appProvider.currentDeviceIp, style: TextStyle(fontWeight: FontWeight.w500, fontSize: SizeConfig.getWidthMultiplier() * 2.2)),
],
),
const SizedBox(width: 10),
Image.asset(
"assets/images/cloud_logo.png",
height: SizeConfig.getHeightMultiplier() * 4,
),
],
),
Expanded(child: getRSSFeedWidget())
],
)),
); );
} }

Loading…
Cancel
Save