Untitled
unknown
plain_text
a year ago
48 kB
5
Indexable
import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:get/get.dart'; import 'package:get/state_manager.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; import 'package:the_citizen_app/src/components/video_view_component.dart'; import 'package:the_citizen_app/src/config/base.dart'; import 'package:the_citizen_app/src/helpers/global_helper.dart'; import 'package:the_citizen_app/src/helpers/hex_color.dart'; import 'package:the_citizen_app/src/helpers/k_text.dart'; import 'package:the_citizen_app/src/helpers/render_svg.dart'; import 'package:the_citizen_app/src/hive_models/offline_shout.dart'; import 'package:the_citizen_app/src/models/process_shout.dart'; import 'package:the_citizen_app/src/pages/process_shout_page.dart'; import 'package:the_citizen_app/src/widgets/custom_review_widget.dart'; import '../config/app_theme.dart'; import '../helpers/route.dart'; import '../utility/utility.dart'; // ignore: must_be_immutable class ReportDetailsPage extends StatelessWidget with Base { ProcessShout? myReport; ReportDetailsPage({this.myReport}); @override Widget build(BuildContext context) { final CarouselController _controller = CarouselController(); return Scaffold( appBar: AppBar( centerTitle: true, backgroundColor: AppTheme.backgroundColor, iconTheme: IconThemeData( color: AppTheme.textColor6, ), leading: GestureDetector( onTap: () { shoutC.currentIndex.value = 0; shoutC.reportDetailsCurrentIndex.value = 0; back(); }, child: Icon(Icons.arrow_back)), title: Text( 'Report Details', style: TextStyle( fontFamily: 'Manrope', fontSize: 18.0, color: AppTheme.appBarTextColor, fontWeight: FontWeight.bold, ), ), actions: [ ReviewIconWidget(screenCode: '0056', screenTitle: 'Report Details'), ], ), body: SingleChildScrollView( child: Padding( padding: EdgeInsets.only(top: 10, left: 15, right: 15, bottom: 5), child: Obx( () => Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Container( child: Column(children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ RichText( text: TextSpan( children: <TextSpan>[ TextSpan( text: '${myReport!.categoryName} >', style: TextStyle( fontWeight: FontWeight.bold, color: AppTheme.textColor, fontSize: 14, fontFamily: 'Manrope Bold')), TextSpan( text: myReport!.subcategoryName, style: TextStyle(color: AppTheme.textColor, fontSize: 14, fontFamily: 'Manrope Regular')), ], ), ), SizedBox( height: 10, ), Container( decoration: BoxDecoration( color: hexToColor('#F6FAFC'), borderRadius: BorderRadius.circular(5), border: Border.all(color: hexToColor('#64788250'), width: 1), boxShadow: [ BoxShadow( color: Colors.blueGrey, spreadRadius: 1, blurRadius: 1, ), ], ), child: Column( children: [ SizedBox( height: 200, child: myReportsC.files.isNotEmpty ? Container( padding: EdgeInsets.all(3), decoration: BoxDecoration( borderRadius: BorderRadius.circular(5), ), child: CarouselSlider( carouselController: _controller, items: myReportsC.files .map( (item) => GestureDetector( onTap: () { if (myReport!.evidenceType == "IMAGE") { Get.to( () => GestureDetector( onTap: () => back(), child: Container( width: Get.width, child: PhotoView( // minScale: .8, imageProvider: MemoryImage( Utility.convertImg(item!), ), ), decoration: BoxDecoration( color: Colors.white70, ), ), ), fullscreenDialog: true, opaque: false, ); } }, child: AspectRatio( aspectRatio: 16 / 9, child: myReport!.evidenceType == "IMAGE" ? ClipRRect( borderRadius: BorderRadius.circular(10), child: PhotoView( imageProvider: MemoryImage(item!), backgroundDecoration: BoxDecoration( color: Colors.white70, ), )) : myReport!.evidenceType == "VIDEO" ? VideoViewComponent(bytes: item!.toList()) : SizedBox(), ), ), ) .toList(), options: CarouselOptions( aspectRatio: 16 / 9, // pageSnapping: false, // height: 180, autoPlay: false, viewportFraction: 1.0, autoPlayCurve: Curves.fastOutSlowIn, enlargeCenterPage: false, scrollDirection: Axis.horizontal, onPageChanged: (index, reason) { shoutC.reportDetailsCurrentIndex.value = index; }), )) : Container( padding: EdgeInsets.all(3), child: ClipRRect( borderRadius: BorderRadius.circular(5), child: Image.asset( 'assets/images/no_image.png', fit: BoxFit.cover, // width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width - 20, ), ), ), ), SizedBox( height: 40, width: MediaQuery.of(context).size.width, child: myReportsC.files.length != 0 ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ListView.builder( scrollDirection: Axis.horizontal, shrinkWrap: true, itemCount: myReportsC.files.length, itemBuilder: (BuildContext context, int index) { return Obx( () => Container( // padding: EdgeInsets.symmetric(horizontal: 5), padding: EdgeInsets.only(left: 5, right: 5), child: CircleAvatar( radius: 10, backgroundColor: index == shoutC.reportDetailsCurrentIndex.value ? hexToColor('#F2BA14') : hexToColor('#C8E0EA'), child: Text( (index + 1).toString(), style: TextStyle( fontFamily: 'Manrope', color: hexToColor('#000000'), fontSize: 13, fontWeight: FontWeight.w700, ), ), ), ), ); }, ), ], ) : Center( child: Text( 'No Evidence Available', style: TextStyle( fontFamily: 'Manrope', color: hexToColor('#000000'), fontSize: 15, fontWeight: FontWeight.w500, ), ), ), ), ], ), ) ], ), ])), SizedBox( height: 10, ), Row( children: [ KText( text: 'Date', fontSize: 15.0, color: AppTheme.appBarTextColor, ), Spacer(), KText( text: 'Urgency', fontSize: 15.0, color: AppTheme.appBarTextColor, ) ], ), Row( children: [ KText( text: formatDate(date: myReport!.reportDate!), fontSize: 14, color: AppTheme.appBarTextColor, bold: true, ), Spacer(), KText( text: myReport!.urgencyLevel, fontSize: 14, color: AppTheme.appBarTextColor, bold: true, ) ], ), Divider( thickness: 1, ), SizedBox( height: 8, ), if (myReport!.remarks != null && myReport!.remarks != '') Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ KText( text: 'Remarks:', fontSize: 14, color: AppTheme.appBarTextColor, ), KText( text: myReport!.remarks, fontSize: 14, bold: true, color: AppTheme.appBarTextColor, ), Divider( thickness: 1, ), ], ), SizedBox( height: 8, ), Row( children: [ KText( text: 'Status: ', fontSize: 14, color: AppTheme.appBarTextColor, ), KText( text: myReport!.fulfillmentStatus, fontSize: 14, color: AppTheme.appBarTextColor, bold: true, ) ], ), SizedBox( height: 8, ), Row(children: <Widget>[ Expanded( child: Divider( thickness: 1, )), SizedBox( width: 5, ), KText( text: "Responding Party", fontSize: 14, color: AppTheme.appBarTextColor, ), // Text("Responding Party"), SizedBox( width: 5, ), Expanded( child: Divider( thickness: 1, )), ]), SizedBox( height: 10, ), if (myReport!.agencyName == null) KText( text: "Your shout has been assigned to the right person. But it has to be validated by an officer. Therefore, it is not shown here yet. However, the person's details will appear here once it is validated.", textAlign: TextAlign.justify, maxLines: 4, ), if (myReport!.agencyName != null) Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( onTap: () async { await myReportsC.personImage(name: myReport!.officerUsername!); await myReportsC.userModal(userInfo: myReport); await teamLocationC.getUserImageFromAPI(username: myReport!.officerUsername!); }, child: KText( text: myReport!.officerFullname != null ? myReport!.officerFullname : '', fontSize: 14, bold: true, color: AppTheme.appBarTextColor, ), ), KText( text: myReport!.agencyName != null ? myReport!.agencyName : '', fontSize: 14, color: AppTheme.appBarTextColor, maxLines: 4, ), ], ), ), if (myReport!.officerUsername != null) InkWell( onTap: () { if (socketC.getUser(myReport!.officerUsername!)?.sid != null) { callC.getUserRoom( myReport!.officerUsername!, '${socketC.getUser(myReport!.officerUsername!)?.sid}', '${socketC.getUser(myReport!.officerUsername!)!.name}', ); } else { Get.snackbar( 'Attention!!', 'Uers Offline', colorText: AppTheme.black, backgroundColor: AppTheme.appHomePageColor, snackPosition: SnackPosition.BOTTOM, maxWidth: 190, ); } }, child: RenderSvg( path: 'call_button', height: 24, width: 24, ), ), ], ), SizedBox( height: 8, ), if (myReportsC.closureFiles.length != 0) Container( decoration: BoxDecoration( color: hexToColor('#F6FAFC'), borderRadius: BorderRadius.circular(5), border: Border.all(color: hexToColor('#64788250'), width: 1), boxShadow: [ BoxShadow( color: Colors.grey, spreadRadius: 1, blurRadius: 1, ), ], ), child: Column( children: [ SizedBox( height: 200, child: myReportsC.closureFiles.isNotEmpty ? Container( padding: EdgeInsets.all(3), decoration: BoxDecoration( borderRadius: BorderRadius.circular(5), ), child: PhotoViewGallery.builder( itemCount: myReportsC.closureFiles.length, builder: (BuildContext context, int index) { return PhotoViewGalleryPageOptions( imageProvider: MemoryImage(myReportsC.closureFiles[index]!), // maxScale: PhotoViewComputedScale.covered, // minScale: PhotoViewComputedScale.covered, // tightMode: true, ); }, scrollPhysics: BouncingScrollPhysics(), backgroundDecoration: BoxDecoration( color: Theme.of(context).canvasColor, // color: Colors.transparent, borderRadius: BorderRadius.circular(5)), onPageChanged: (int index) { shoutC.currentIndex.value = index; }, ), ) : Container( padding: EdgeInsets.all(3), child: ClipRRect( borderRadius: BorderRadius.circular(5), child: Image.asset( 'assets/images/no_image.png', fit: BoxFit.cover, // width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width - 20, ), ), ), ), SizedBox( height: 40, width: MediaQuery.of(context).size.width, child: myReportsC.closureFiles.length != 0 ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ListView.builder( scrollDirection: Axis.horizontal, shrinkWrap: true, itemCount: myReportsC.closureFiles.length, itemBuilder: (BuildContext context, int index) { return Obx( () => Container( // padding: EdgeInsets.symmetric(horizontal: 5), padding: EdgeInsets.only(left: 5, right: 5), child: CircleAvatar( radius: 10, backgroundColor: index == shoutC.currentIndex.value ? hexToColor('#F2BA14') : hexToColor('#C8E0EA'), child: Text( (index + 1).toString(), style: TextStyle( fontFamily: 'Manrope', color: hexToColor('#000000'), fontSize: 13, fontWeight: FontWeight.w700, ), ), ), ), ); }, ), ], ) : Center( child: Text( 'No Evidence Available', style: TextStyle( fontFamily: 'Manrope', color: hexToColor('#000000'), fontSize: 15, fontWeight: FontWeight.w500, ), ), ), ), ], ), ), SizedBox( height: 5, ), if (myReport!.stratedComment != null && myReport!.stratedComment != '') Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ KText(text: 'Starting Remarks'), KText( text: myReport!.stratedComment, bold: true, ), ], ), SizedBox( height: 5, ), if (myReport!.comletedOrDroppedComment != null && myReport!.comletedOrDroppedComment != '') Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ KText(text: 'Finishing Remarks'), KText( text: myReport!.comletedOrDroppedComment, bold: true, ), ], ), SizedBox( height: 5, ), if (myReport!.ratingDone == true && myReport?.rating != null) Row( children: [ KText(text: 'Rating: '), RatingBar.builder( initialRating: myReport!.rating!.toDouble(), // Initial rating value // Minimum rating value direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, // Number of rating stars itemSize: 30, ignoreGestures: true, // Size of each rating star itemBuilder: (context, _) => Icon( Icons.star, color: Colors.amber, ), onRatingUpdate: (rating) { // Handle the rating update print(rating); }, ) // KText( // text: myReport!.rating.toString(), // bold: true, // ), ], ), if (myReport!.comletedOrDroppedComment != null) Divider( thickness: 1, ), ], ), ), ), ), bottomNavigationBar: Container( height: 55, width: double.infinity, color: Colors.transparent, child: Column(children: [ myReport!.fulfillmentStatus == 'VERIFIED' || myReport!.fulfillmentStatus == 'STARTED' ? Center( child: ElevatedButton( onPressed: () { back(); // push(MainPage()); }, child: KText( text: 'OK', fontSize: 16, bold: true, color: Colors.white, ), style: ElevatedButton.styleFrom( backgroundColor: hexToColor('#78909C'), fixedSize: Size(110, 40), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0))), ), ) : Row( mainAxisAlignment: MainAxisAlignment.center, children: [ if (myReport!.fulfillmentStatus == 'UNASSIGNED' || myReport!.fulfillmentStatus == 'ASSIGNED') ElevatedButton( onPressed: () async { Global.confirmDialog(onConfirmed: () async { myReportsC.reportList.removeWhere((element) => element!.id == myReport!.id); await myReportsC.shoutIncidentDeletePost(myReport!.id!); }); }, child: KText( text: 'Delete', fontSize: 16, bold: true, color: Colors.white, ), style: ElevatedButton.styleFrom( backgroundColor: hexToColor('#EF4A37'), fixedSize: Size(110, 40), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0))), ), SizedBox( width: 10, ), if ((myReport!.fulfillmentStatus == 'COMPLETED' || myReport!.fulfillmentStatus == 'Closed By Shouter') && myReport!.ratingDone == false) ElevatedButton( onPressed: () { back(); // push(RateShoutClosurePage()); push(ProcessShoutPage( processShoutInfo: myReport, title: 'rateShout', )); }, child: KText( text: 'Rate', fontSize: 16, bold: true, color: Colors.white, ), style: ElevatedButton.styleFrom( backgroundColor: hexToColor('#F2BB3C'), fixedSize: Size(100, 35), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0))), ), SizedBox( width: 15, ), ElevatedButton( onPressed: () { back(); // push(MainPage()); }, child: KText( text: 'OK', fontSize: 16, bold: true, color: Colors.white, ), style: ElevatedButton.styleFrom( backgroundColor: hexToColor('#78909C'), fixedSize: Size(100, 35), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0))), ), ], ), ]), ), ); } } //offline shout details class OfflineReportDetailsPage extends StatelessWidget with Base { final OfflineShoutModel item; OfflineReportDetailsPage({required this.item}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: true, backgroundColor: AppTheme.backgroundColor, iconTheme: IconThemeData( color: AppTheme.textColor6, ), leading: GestureDetector( onTap: () { back(); }, child: Icon(Icons.arrow_back)), title: Text( 'Report Details', style: TextStyle( fontFamily: 'Manrope', fontSize: 18.0, color: AppTheme.appBarTextColor, fontWeight: FontWeight.bold, ), ), actions: [ ReviewIconWidget(screenCode: '0056', screenTitle: 'Report Details'), ], ), body: SingleChildScrollView( child: Padding( padding: EdgeInsets.only(top: 10, left: 15, right: 15, bottom: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Container( child: Column(children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ RichText( text: TextSpan( children: <TextSpan>[ TextSpan( text: '${item.categoryName} > ', style: TextStyle( fontWeight: FontWeight.bold, color: AppTheme.textColor, fontSize: 14, fontFamily: 'Manrope Bold')), TextSpan( text: '${item.subcategoryName}', style: TextStyle(color: AppTheme.textColor, fontSize: 14, fontFamily: 'Manrope Regular')), ], ), ), SizedBox( height: 10, ), Container( decoration: BoxDecoration( color: hexToColor('#F6FAFC'), borderRadius: BorderRadius.circular(5), border: Border.all(color: hexToColor('#64788250'), width: 1), boxShadow: [ BoxShadow( color: Colors.blueGrey, spreadRadius: 1, blurRadius: 1, ), ], ), child: Column( children: [ SizedBox( height: 200, child: item.files!.isEmpty ? Container( padding: EdgeInsets.all(3), child: ClipRRect( borderRadius: BorderRadius.circular(5), child: Image.asset( 'assets/images/no_image.png', fit: BoxFit.cover, // width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width - 20, ), ), ) : Container( padding: EdgeInsets.all(3), decoration: BoxDecoration( borderRadius: BorderRadius.circular(5), ), child: PageView.builder( onPageChanged: shoutC.offlineCurrentIndex, physics: BouncingScrollPhysics(), scrollDirection: Axis.horizontal, itemCount: item.files!.length, itemBuilder: (BuildContext context, int index) { final img = item.files![index]; return InkWell( onTap: () { Get.to( () => GestureDetector( onTap: () => back(), child: Container( width: Get.width, child: PhotoView( minScale: .8, imageProvider: MemoryImage(img), ), decoration: BoxDecoration( color: Colors.white70, ), ), ), fullscreenDialog: true, opaque: false, ); }, child: AspectRatio( aspectRatio: 16 / 9, child: ClipRRect( borderRadius: BorderRadius.circular(10), child: PhotoView( imageProvider: MemoryImage(img), backgroundDecoration: BoxDecoration( color: Colors.white70, ), ), ), ), ); }, ))), SizedBox( height: 40, width: Get.width, child: item.files != 0 ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ListView.builder( scrollDirection: Axis.horizontal, shrinkWrap: true, itemCount: item.files!.length, itemBuilder: (BuildContext context, int index) { return Obx( () => Container( // padding: EdgeInsets.symmetric(horizontal: 5), padding: EdgeInsets.only(left: 5, right: 5), child: CircleAvatar( radius: 10, backgroundColor: index == shoutC.offlineCurrentIndex.value ? hexToColor('#F2BA14') : hexToColor('#C8E0EA'), child: Text( (index + 1).toString(), style: TextStyle( fontFamily: 'Manrope', color: hexToColor('#000000'), fontSize: 13, fontWeight: FontWeight.w700, ), ), ), ), ); }, ), ], ) : Center( child: Text( 'No Evidence Available', style: TextStyle( fontFamily: 'Manrope', color: hexToColor('#000000'), fontSize: 15, fontWeight: FontWeight.w500, ), ), ), ), ], ), ) ], ), ]), ), SizedBox( height: 10, ), Row( children: [ KText( text: 'Date', fontSize: 15.0, color: AppTheme.appBarTextColor, ), Spacer(), KText( text: 'Urgency', fontSize: 15.0, color: AppTheme.appBarTextColor, ) ], ), Row( children: [ KText( text: '${formatDate(date: item.reportedAt!)}', fontSize: 14, color: AppTheme.appBarTextColor, bold: true, ), Spacer(), KText( text: '${item.urgencyLevel}', fontSize: 14, color: AppTheme.appBarTextColor, bold: true, ) ], ), Divider( thickness: 1, ), SizedBox( height: 8, ), if ('${item.remarks}' != '') Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ KText( text: 'Remarks:', fontSize: 14, color: AppTheme.appBarTextColor, ), KText( text: '${item.remarks}', fontSize: 14, bold: true, color: AppTheme.appBarTextColor, ), Divider( thickness: 1, ), ], ), SizedBox( height: 10, ), Row(children: <Widget>[ Expanded( child: Divider( thickness: 1, )), SizedBox( width: 5, ), KText( text: "Responding Party", fontSize: 14, color: AppTheme.appBarTextColor, ), // Text("Responding Party"), SizedBox( width: 5, ), Expanded( child: Divider( thickness: 1, )), ]), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ KText( text: 'Agency Name', fontSize: 14, color: AppTheme.appBarTextColor, ), SizedBox( height: 5, ), KText( text: '${item.agencyName}', fontSize: 14, color: AppTheme.appBarTextColor, bold: true, maxLines: 4, ), ], ), ), ], ), ], ), ), ), bottomNavigationBar: Container( height: 55, width: double.infinity, color: Colors.transparent, child: Column(children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: () async { Global.confirmDialog(onConfirmed: () { shoutC.deleteOfflineShout(item); back(); }); }, child: KText( text: 'Delete', fontSize: 16, bold: true, color: Colors.white, ), style: ElevatedButton.styleFrom( backgroundColor: hexToColor('#EF4A37'), fixedSize: Size(110, 40), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0))), ), SizedBox( width: 15, ), ElevatedButton( onPressed: () { back(); }, child: KText( text: 'OK', fontSize: 16, bold: true, color: Colors.white, ), style: ElevatedButton.styleFrom( backgroundColor: hexToColor('#78909C'), fixedSize: Size(100, 35), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0))), ), ], ), ]), ), ); } }
Editor is loading...
Leave a Comment