Dashboard API's 1.1

merge-requests/1/merge
devmirza121 4 years ago
parent baa7182655
commit fb8d6c7b20

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="21.655" height="24.033" viewBox="0 0 21.655 24.033">
<path id="Path_4726" data-name="Path 4726" d="M12.03.53C9.864-.713,8.107.305,8.107,2.8V21.229c0,2.5,1.757,3.516,3.923,2.275l16.106-9.237c2.167-1.243,2.167-3.258,0-4.5Z" transform="translate(-8.107 0)" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 324 B

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="93.613" height="93.613" viewBox="0 0 93.613 93.613">
<g id="fingerprint-scan_1_" data-name="fingerprint-scan (1)" transform="translate(0 0)" opacity="0.049">
<path id="Path_4635" data-name="Path 4635" d="M243.282,223.494a2.743,2.743,0,0,0,2.743-2.742V207.5a2.743,2.743,0,1,0-5.485,0v13.255A2.743,2.743,0,0,0,243.282,223.494Z" transform="translate(-196.559 -167.317)" fill="#fff"/>
<path id="Path_4636" data-name="Path 4636" d="M167.739,215.135A2.743,2.743,0,0,0,165,217.877c0,11.945-8.538,21.664-19.032,21.664s-19.032-9.718-19.032-21.664V202.967a2.743,2.743,0,1,0-5.485,0v14.911c0,14.97,11,27.149,24.517,27.149s24.517-12.179,24.517-27.149A2.743,2.743,0,0,0,167.739,215.135Z" transform="translate(-99.243 -163.615)" fill="#fff"/>
<path id="Path_4637" data-name="Path 4637" d="M243.282,232.819c7.516,0,13.63-6.7,13.63-14.946V202.96a2.743,2.743,0,0,0-5.485,0v14.911c0,5.217-3.654,9.461-8.145,9.461a2.743,2.743,0,0,0,0,5.485Z" transform="translate(-196.559 -163.611)" fill="#fff"/>
<path id="Path_4638" data-name="Path 4638" d="M90.871,24.37H79.481a39.852,39.852,0,0,0-7.619-12.733A33.489,33.489,0,0,0,46.722,0,33.49,33.49,0,0,0,21.581,11.639a39.854,39.854,0,0,0-7.617,12.73H2.743a2.743,2.743,0,1,0,0,5.485h9.609a43.839,43.839,0,0,0-1.033,9.5V54.262A41.449,41.449,0,0,0,21.581,81.974,33.49,33.49,0,0,0,46.722,93.613,33.49,33.49,0,0,0,71.864,81.974,41.45,41.45,0,0,0,82.126,54.262V39.345a43.839,43.839,0,0,0-1.033-9.49h9.777a2.743,2.743,0,0,0,0-5.485ZM46.722,5.485c11.747,0,21.933,7.705,26.826,18.885H67.158C62.762,17.043,55.243,12.2,46.722,12.2a2.743,2.743,0,0,0,0,5.485A17.967,17.967,0,0,1,60.456,24.37H19.9C24.788,13.19,34.974,5.485,46.722,5.485ZM76.641,54.262c0,18.674-13.421,33.866-29.919,33.866S16.8,72.936,16.8,54.262V39.351a37.925,37.925,0,0,1,1.2-9.5H36.2a15.572,15.572,0,0,0-3.107,9.5V54.262a2.743,2.743,0,1,0,5.485,0V39.351c0-5.217,3.654-9.461,8.145-9.461l17.1-.035a24.013,24.013,0,0,1,1.929,9.493h0a2.743,2.743,0,0,0,5.485,0h0a29.615,29.615,0,0,0-1.549-9.492h5.752a37.927,37.927,0,0,1,1.2,9.491V54.262Z" fill="#fff"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -7,6 +7,8 @@ import 'package:http/http.dart';
import 'package:http/io_client.dart';
import 'package:mohem_flutter_app/exceptions/api_exception.dart';
import '../main.dart';
typedef FactoryConstructor<U> = U Function(dynamic);
class APIError {
@ -76,7 +78,7 @@ class ApiClient {
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
try {
if (!kReleaseMode) {
print("res: " + response.body);
logger.i("res: " + response.body);
}
var jsonData = jsonDecode(response.body);
if (jsonData["ErrorMessage"] == null) {

@ -4,6 +4,7 @@ import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/member_login_list_model.dart';
@ -17,13 +18,13 @@ class DashbaordApiClient {
factory DashbaordApiClient() => _instance;
Future<GenericResponseModel?> getAttendanceTracking() async {
Future<GetAttendanceTracking?> getAttendanceTracking() async {
String url = "${ApiConsts.erpRest}GET_Attendance_Tracking";
Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData;
return responseData.getAttendanceTrackingList;
}, url, postParams);
}

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/ui/landing/dashboard.dart';
import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart';
import 'package:mohem_flutter_app/ui/login/forgot_password_screen.dart';
import 'package:mohem_flutter_app/ui/login/login_screen.dart';
@ -28,7 +28,7 @@ class AppRoutes {
static final Map<String, WidgetBuilder> routes = {
login: (context) => LoginScreen(),
verifyLogin: (context) => VerifyLoginScreen(),
dashboard: (context) => Dashboard(),
dashboard: (context) => DashboardScreen(),
newPassword: (context) => NewPasswordScreen(),
forgotPassword: (context) => ForgotPasswordScreen(),
todayAttendance: (context) => TodayAttendanceScreen(),

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:shimmer/shimmer.dart';
extension WidgetExtensions on Widget {
Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this);
@ -8,4 +9,22 @@ extension WidgetExtensions on Widget {
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) =>
Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
Widget toShimmer() => Shimmer.fromColors(
baseColor: Color(0xffe8eff0),
highlightColor: Colors.white,
child: Container(
child: this,
color: Colors.white,
));
Widget animatedSwither() => AnimatedSwitcher(
duration: const Duration(milliseconds: 500),
// transitionBuilder: (Widget child, Animation<double> animation) {
// return ScaleTransition(scale: animation, child: child);
// },
switchInCurve: Curves.linearToEaseOut,
switchOutCurve: Curves.linearToEaseOut,
child: this,
);
}

@ -6,11 +6,22 @@ import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/config/app_provider.dart';
import 'package:mohem_flutter_app/generated/codegen_loader.g.dart';
import 'package:mohem_flutter_app/models/post_params_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/theme/app_theme.dart';
import 'package:provider/provider.dart';
import 'package:sizer/sizer.dart';
import 'package:logger/logger.dart';
import 'config/routes.dart';
var logger = Logger(
filter: null, // Use the default LogFilter (-> only log in debug mode)
printer: PrettyPrinter(), // Use the PrettyPrinter to format and print log
output: null, // U
);
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
@ -22,7 +33,12 @@ Future<void> main() async {
],
path: 'assets/langs',
assetLoader: CodegenLoader(),
child: MyApp(),
child: MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => DashboardProviderModel()),
],
child: MyApp(),
),
),
);
}

@ -1,5 +1,5 @@
class GetAttendanceTrackingList {
GetAttendanceTrackingList({
class GetAttendanceTracking {
GetAttendanceTracking({
this.pBreakHours,
this.pLateInHours,
this.pRemainingHours,
@ -25,7 +25,7 @@ class GetAttendanceTrackingList {
dynamic pSwipeIn;
dynamic pSwipeOut;
factory GetAttendanceTrackingList.fromMap(Map<String, dynamic> json) => GetAttendanceTrackingList(
factory GetAttendanceTracking.fromMap(Map<String, dynamic> json) => GetAttendanceTracking(
pBreakHours: json["P_BREAK_HOURS"] == null ? null : json["P_BREAK_HOURS"],
pLateInHours: json["P_LATE_IN_HOURS"] == null ? null : json["P_LATE_IN_HOURS"],
pRemainingHours: json["P_REMAINING_HOURS"] == null ? null : json["P_REMAINING_HOURS"],

@ -67,7 +67,7 @@ class GenericResponseModel {
List<String>? getAddressNotificationBodyList;
List<String>? getApprovesList;
List<String>? getAttachementList;
GetAttendanceTrackingList? getAttendanceTrackingList;
GetAttendanceTracking? getAttendanceTrackingList;
List<String>? getBasicDetColsStructureList;
List<String>? getBasicDetDffStructureList;
List<String>? getBasicDetNtfBodyList;
@ -567,15 +567,15 @@ class GenericResponseModel {
getAbsenceCollectionNotificationBodyList = json['GetAbsenceCollectionNotificationBodyList'];
getAbsenceDffStructureList = json['GetAbsenceDffStructureList'];
getAbsenceTransactionList = json['GetAbsenceTransactionList'];
getAccrualBalancesList:
getAccrualBalancesList=
json["GetAccrualBalancesList"] == null ? null : List<GetAccrualBalancesList>.from(json["GetAccrualBalancesList"].map((x) => GetAccrualBalancesList.fromJson(x)));
getActionHistoryList = json['GetActionHistoryList'];
getAddressDffStructureList = json['GetAddressDffStructureList'];
getAddressNotificationBodyList = json['GetAddressNotificationBodyList'];
getApprovesList = json['GetApprovesList'];
getAttachementList = json['GetAttachementList'];
getAttendanceTrackingList:
json["GetAttendanceTrackingList"] == null ? null : GetAttendanceTrackingList.fromMap(json["GetAttendanceTrackingList"]);
getAttendanceTrackingList=
json["GetAttendanceTrackingList"] == null ? null : GetAttendanceTracking.fromMap(json["GetAttendanceTrackingList"]);
getBasicDetColsStructureList = json['GetBasicDetColsStructureList'];
getBasicDetDffStructureList = json['GetBasicDetDffStructureList'];
getBasicDetNtfBodyList = json['GetBasicDetNtfBodyList'];
@ -617,8 +617,8 @@ class GenericResponseModel {
getNotificationButtonsList = json['GetNotificationButtonsList'];
getNotificationReassignModeList = json['GetNotificationReassignModeList'];
getObjectValuesList = json['GetObjectValuesList'];
getOpenMissingSwipesList: json["GetOpenMissingSwipesList"] == null ? null : GetOpenMissingSwipesList.fromJson(json["GetOpenMissingSwipesList"]);
getOpenNotificationsList:
getOpenMissingSwipesList= json["GetOpenMissingSwipesList"] == null ? null : GetOpenMissingSwipesList.fromJson(json["GetOpenMissingSwipesList"]);
getOpenNotificationsList=
json["GetOpenNotificationsList"] == null ? null : List<GetOpenNotificationsList>.from(json["GetOpenNotificationsList"].map((x) => GetOpenNotificationsList.fromMap(x)));
getOpenNotificationsNumList = json['GetOpenNotificationsNumList'];
getOpenPeriodDatesList = json['GetOpenPeriodDatesList'];

@ -0,0 +1,39 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
// ignore: prefer_mixin
class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
bool isAttendanceTrackingLoading = true;
int isTimeRemainingInSeconds = 0;
GetAttendanceTracking? attendanceTracking;
fetchAttendanceTracking() async {
try {
attendanceTracking = await DashbaordApiClient().getAttendanceTracking();
isAttendanceTrackingLoading = false;
isTimeRemainingInSeconds = calculateSeconds("00:00:30");
notifyListeners();
} catch (ex) {
Utils.handleException(ex, null);
}
}
int calculateSeconds(String time) {
int hour = int.parse(time.split(":")[0]);
int mints = int.parse(time.split(":")[1]);
int seconds = int.parse(time.split(":")[2]);
return ((hour * 60 * 60) + (mints * 60) + seconds);
}
update() {
isAttendanceTrackingLoading = !isAttendanceTrackingLoading;
attendanceTracking?.pSwipeIn = "a";
isTimeRemainingInSeconds = calculateSeconds("00:00:30");
notifyListeners();
}
}

@ -1,6 +1,7 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
@ -9,26 +10,33 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/theme/colors.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:provider/provider.dart';
import 'package:shimmer/shimmer.dart';
class Dashboard extends StatefulWidget {
Dashboard({Key? key}) : super(key: key);
class DashboardScreen extends StatefulWidget {
DashboardScreen({Key? key}) : super(key: key);
@override
_DashboardState createState() {
return _DashboardState();
_DashboardScreenState createState() {
return _DashboardScreenState();
}
}
class _DashboardState extends State<Dashboard> {
class _DashboardScreenState extends State<DashboardScreen> {
@override
void initState() {
super.initState();
DashbaordApiClient().getAttendanceTracking();
final data = Provider.of<DashboardProviderModel>(context, listen: false);
data.fetchAttendanceTracking();
}
int endTime = 0;
@override
void dispose() {
super.dispose();
@ -44,8 +52,9 @@ class _DashboardState extends State<Dashboard> {
List<String> iconT = ["assets/images/monthly_attendance.svg", "assets/images/work_from_home.svg", "assets/images/ticket_request.svg", "assets/images/work_from_home.svg"];
List<String> namesD = ["Nostalgia Perfume Perfume", "Al Nafoura", "AlJadi", "Nostalgia Perfume"];
// DashbaordApiClient().getOpenNotifications();
DashbaordApiClient().getOpenMissingSwipes();
final data = Provider.of<DashboardProviderModel>(context);
endTime=DateTime.now().millisecondsSinceEpoch + Duration(seconds: data.isTimeRemainingInSeconds).inMilliseconds;
return Scaffold(
body: Column(
children: [
@ -93,7 +102,9 @@ class _DashboardState extends State<Dashboard> {
)
],
),
)
).onPress(() {
data.update();
})
],
).paddingOnly(left: 21, right: 21, top: 48, bottom: 7),
Expanded(
@ -111,75 +122,96 @@ class _DashboardState extends State<Dashboard> {
Expanded(
child: AspectRatio(
aspectRatio: 159 / 159,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomRight, colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
]),
),
child: Stack(
alignment: Alignment.center,
children: [
// SvgPicture.asset("assets/images/"),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
child: (data.isAttendanceTrackingLoading
? GetAttendanceTrackingShimmer()
: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomRight, colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
]),
),
child: Stack(
alignment: Alignment.center,
children: [
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
9.height,
"07:55:12".toText14(color: Colors.white, isBold: true),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
const ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
child: LinearProgressIndicator(
value: 0.7,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
if (data.attendanceTracking?.pSwipeIn == null) SvgPicture.asset("assets/images/thumb.svg"),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [LocaleKeys.checkIn.tr().toText12(color: Colors.white), "09:00".toText14(color: Colors.white, isBold: true), 4.height],
).paddingOnly(left: 12),
),
Container(
width: 45,
height: 45,
padding: const EdgeInsets.only(left: 14, right: 14),
decoration: const BoxDecoration(
color: Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(15),
),
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CountdownTimer(
endTime: endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
if (data.attendanceTracking?.pSwipeIn == null) "01-02-2022".toText12(color: Colors.white),
if (data.attendanceTracking?.pSwipeIn != null)
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
9.height,
"07:55:12".toText14(color: Colors.white, isBold: true),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
const ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
child: LinearProgressIndicator(
value: 0.7,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
],
),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(data.attendanceTracking?.pSwipeIn == null ? "--:--" : "09:00").toText14(color: Colors.white, isBold: true),
4.height
],
).paddingOnly(left: 12),
),
Container(
width: 45,
height: 45,
padding: const EdgeInsets.only(left: 14, right: 14),
decoration: const BoxDecoration(
color: Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(15),
),
),
child: SvgPicture.asset(data.attendanceTracking?.pSwipeIn == null ? "assets/images/play.svg" : "assets/images/stop.svg"),
),
],
),
],
),
child: SvgPicture.asset("assets/images/stop.svg"),
),
],
),
],
),
],
),
).onPress(() {
Navigator.pushNamed(context, AppRoutes.todayAttendance);
}),
],
),
).onPress(() {
Navigator.pushNamed(context, AppRoutes.todayAttendance);
}))
.animatedSwither(),
),
),
9.width,

@ -0,0 +1,82 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:shimmer/shimmer.dart';
class GetAttendanceTrackingShimmer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: double.infinity,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
),
child: Stack(
alignment: Alignment.center,
children: [
// SvgPicture.asset("assets/images/"),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true).toShimmer(),
16.height,
"07:55:12".toText10(color: Colors.white, isBold: true).toShimmer(),
3.height,
LocaleKeys.timeLeftToday.tr().toText10(color: Colors.white).toShimmer(),
9.height,
const ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
child: LinearProgressIndicator(
value: 0.7,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
).toShimmer(),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [LocaleKeys.checkIn.tr().toText12(color: Colors.white).toShimmer(),],
).paddingOnly(left: 12),
),
Container(
width: 45,
height: 45,
// color: Colors.blue,
padding: const EdgeInsets.only(left: 14, right: 14),
).toShimmer(),
],
),
],
),
],
),
);
}
}

@ -104,6 +104,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_countdown_timer:
dependency: "direct main"
description:
name: flutter_countdown_timer
url: "https://pub.dartlang.org"
source: hosted
version: "4.1.0"
flutter_lints:
dependency: "direct dev"
description:
@ -196,6 +203,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.9"
logger:
dependency: "direct main"
description:
name: logger
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
matcher:
dependency: transitive
description:

@ -45,6 +45,8 @@ dependencies:
local_auth: ^1.1.9
fluttertoast: ^8.0.8
shimmer: ^2.0.0
logger: ^1.1.0
flutter_countdown_timer: ^4.1.0
dev_dependencies:

Loading…
Cancel
Save