Advertisement
mrblab

upload_item.dart

Feb 26th, 2023
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 9.62 KB | None | 0 0
  1. import 'package:admin/blocs/admin_bloc.dart';
  2. import 'package:admin/configs/config.dart';
  3. import 'package:admin/services/firebase_service.dart';
  4. import 'package:admin/utils/content_preview.dart';
  5. import 'package:admin/utils/dialog.dart';
  6. import 'package:cloud_firestore/cloud_firestore.dart';
  7. import 'package:firebase_storage/firebase_storage.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:flutter/services.dart';
  10. import 'package:image_picker/image_picker.dart';
  11. import 'package:intl/intl.dart';
  12. import 'package:provider/provider.dart';
  13. import '../models/category.dart';
  14.  
  15. class UploadItem extends StatefulWidget {
  16.   const UploadItem({Key? key}) : super(key: key);
  17.  
  18.   @override
  19.   State<UploadItem> createState() => _UploadItemState();
  20. }
  21.  
  22. class _UploadItemState extends State<UploadItem> {
  23.   var formKey = GlobalKey<FormState>();
  24.   var imageUrlCtrl = TextEditingController();
  25.   var scaffoldKey = GlobalKey<ScaffoldState>();
  26.   final FirebaseFirestore firestore = FirebaseFirestore.instance;
  27.  
  28.   String? date;
  29.   int? loves;
  30.   String? _selectedCategory;
  31.   bool uploadStarted = false;
  32.   late Future _categories;
  33.   String? _selectedImagePath;
  34.  
  35.   Future _pickImage() async {
  36.     final ImagePicker picker = ImagePicker();
  37.     XFile? image = await picker.pickImage(
  38.         source: ImageSource.gallery);
  39.     if (image != null) {
  40.       setState(() {
  41.         _selectedImagePath = image.path;
  42.         imageUrlCtrl.text = image.path;
  43.       });
  44.     }
  45.   }
  46.  
  47.   Future<String?> _uploadToFirebaseHosting() async {
  48.     //return download link
  49.     String? imageUrl;
  50.     Uint8List imageData = await XFile(_selectedImagePath!).readAsBytes();
  51.     final Reference storageReference = FirebaseStorage.instance
  52.         .ref()
  53.         .child('images/${_selectedImagePath.hashCode}.png');
  54.     final SettableMetadata metadata =
  55.         SettableMetadata(contentType: 'image/png');
  56.     final UploadTask uploadTask = storageReference.putData(imageData, metadata);
  57.     await uploadTask.whenComplete(() async {
  58.       imageUrl = await storageReference.getDownloadURL();
  59.     });
  60.     return imageUrl;
  61.   }
  62.  
  63.   @override
  64.   void initState() {
  65.     _categories = FirebaseService().getCategories();
  66.     super.initState();
  67.   }
  68.  
  69.   void handleSubmit() async {
  70.     String? userRole = context.read<AdminBloc>().userRole;
  71.     final bool hasAccess = userRole != null && userRole == 'admin';
  72.  
  73.     if (_selectedCategory == null) {
  74.       openDialog(context, 'Select Category First', '');
  75.     } else {
  76.       if (formKey.currentState!.validate()) {
  77.         formKey.currentState!.save();
  78.         if (!hasAccess) {
  79.           openDialog(context, Config.testingDialog, '');
  80.         } else {
  81.           if (_selectedImagePath != null) {
  82.             //local image
  83.             setState(() => uploadStarted = true);
  84.             await _uploadToFirebaseHosting().then((String? imageUrl) {
  85.               if (imageUrl != null) {
  86.                 setState(() => imageUrlCtrl.text = imageUrl);
  87.                 _uploadProcedure();
  88.               } else {
  89.                 setState(() {
  90.                   _selectedImagePath = null;
  91.                   imageUrlCtrl.clear();
  92.                   uploadStarted = false;
  93.                 });
  94.               }
  95.             });
  96.           } else {
  97.             //network image
  98.             setState(() => uploadStarted = true);
  99.             _uploadProcedure();
  100.           }
  101.         }
  102.       }
  103.     }
  104.   }
  105.  
  106.   Future _uploadProcedure() async {
  107.     await saveToDatabase().then((value) =>
  108.         FirebaseService().increaseCount('contents_count').then((value) {
  109.           setState(() => uploadStarted = false);
  110.           openDialog(context, 'Uploaded Successfully', '');
  111.           clearTextFeilds();
  112.         }));
  113.   }
  114.  
  115.  
  116.   Future saveToDatabase() async {
  117.     DateTime now = DateTime.now();
  118.     final String timestamp = DateFormat('yyyyMMddHHmmss').format(now);
  119.     final DocumentReference ref = firestore.collection('contents').doc(timestamp);
  120.     await ref.set({
  121.       'image url': imageUrlCtrl.text,
  122.       'loves': 0,
  123.       'category': _selectedCategory,
  124.       'timestamp': timestamp,
  125.     });
  126.   }
  127.  
  128.   clearTextFeilds() {
  129.     imageUrlCtrl.clear();
  130.     FocusScope.of(context).unfocus();
  131.   }
  132.  
  133.   handlePreview() async {
  134.     if (formKey.currentState!.validate()) {
  135.       formKey.currentState!.save();
  136.       await showContentPreview(context, imageUrlCtrl.text);
  137.     }
  138.   }
  139.  
  140.   @override
  141.   Widget build(BuildContext context) {
  142.     return Form(
  143.         key: formKey,
  144.         child: Column(
  145.           crossAxisAlignment: CrossAxisAlignment.start,
  146.           children: <Widget>[
  147.             SizedBox(
  148.               height: MediaQuery.of(context).size.height * 0.05,
  149.             ),
  150.             const Text(
  151.               'Content Details',
  152.               style: TextStyle(fontSize: 30, fontWeight: FontWeight.w800),
  153.             ),
  154.             Container(
  155.               margin: const EdgeInsets.only(top: 5, bottom: 10),
  156.               height: 3,
  157.               width: 150,
  158.               decoration: BoxDecoration(
  159.                   color: Colors.indigoAccent,
  160.                   borderRadius: BorderRadius.circular(15)),
  161.             ),
  162.             const SizedBox(
  163.               height: 40,
  164.             ),
  165.             FutureBuilder(
  166.               future: _categories,
  167.               builder: (BuildContext context, AsyncSnapshot snapshot) {
  168.                 if (snapshot.hasData) {
  169.                   List<Category> categories = snapshot.data;
  170.                   return categoryDropdown(categories);
  171.                 }
  172.  
  173.                 return const Center(child: CircularProgressIndicator());
  174.               },
  175.             ),
  176.             const SizedBox(
  177.               height: 25,
  178.             ),
  179.             TextFormField(
  180.               controller: imageUrlCtrl,
  181.               validator: (value) {
  182.                 if (value!.isEmpty) return 'Value is empty';
  183.                 return null;
  184.               },
  185.               decoration: InputDecoration(
  186.                 border:
  187.                     OutlineInputBorder(borderRadius: BorderRadius.circular(5)),
  188.                 hintText: 'Enter Image Url or Select Image',
  189.                 suffixIcon: Row(
  190.                   mainAxisAlignment: MainAxisAlignment.spaceBetween,
  191.                   mainAxisSize: MainAxisSize.min,
  192.                   children: [
  193.                     IconButton(
  194.                       icon: const Icon(Icons.close),
  195.                       onPressed: () {
  196.                         imageUrlCtrl.clear();
  197.                         setState(() {
  198.                           _selectedImagePath = null;
  199.                         });
  200.                       },
  201.                     ),
  202.                     IconButton(
  203.                       tooltip: 'Select Image',
  204.                       icon: const Icon(Icons.image_outlined),
  205.                       onPressed: () => _pickImage(),
  206.                     ),
  207.                   ],
  208.                 ),
  209.               ),
  210.             ),
  211.             const SizedBox(
  212.               height: 100,
  213.             ),
  214.             Row(
  215.               mainAxisAlignment: MainAxisAlignment.end,
  216.               children: <Widget>[
  217.                 TextButton.icon(
  218.                     icon: const Icon(
  219.                       Icons.remove_red_eye,
  220.                       size: 25,
  221.                       color: Colors.blueAccent,
  222.                     ),
  223.                     label: const Text(
  224.                       'Preview',
  225.                       style: TextStyle(
  226.                           fontWeight: FontWeight.w400, color: Colors.black),
  227.                     ),
  228.                     onPressed: () {
  229.                       handlePreview();
  230.                     })
  231.               ],
  232.             ),
  233.             const SizedBox(
  234.               height: 10,
  235.             ),
  236.             Container(
  237.                 color: Colors.deepPurpleAccent,
  238.                 height: 45,
  239.                 width: double.infinity,
  240.                 child: uploadStarted == true
  241.                     ? const Center(
  242.                         child: SizedBox(
  243.                             height: 30,
  244.                             width: 30,
  245.                             child: CircularProgressIndicator()),
  246.                       )
  247.                     : TextButton(
  248.                         child: const Text(
  249.                           'Upload Content',
  250.                           style: TextStyle(
  251.                               color: Colors.white,
  252.                               fontSize: 16,
  253.                               fontWeight: FontWeight.w600),
  254.                         ),
  255.                         onPressed: () async {
  256.                           handleSubmit();
  257.                         })),
  258.             const SizedBox(
  259.               height: 200,
  260.             ),
  261.           ],
  262.         ));
  263.   }
  264.  
  265.   Widget categoryDropdown(List<Category> categories) {
  266.     return Container(
  267.         height: 50,
  268.         padding: const EdgeInsets.only(left: 15, right: 15),
  269.         decoration: BoxDecoration(
  270.             color: Colors.grey[200],
  271.             border: Border.all(color: Colors.grey[300]!),
  272.             borderRadius: BorderRadius.circular(30)),
  273.         child: DropdownButtonFormField(
  274.             itemHeight: 50,
  275.             decoration: const InputDecoration(border: InputBorder.none),
  276.             onChanged: (dynamic value) {
  277.               setState(() {
  278.                 _selectedCategory = value;
  279.               });
  280.             },
  281.             value: _selectedCategory,
  282.             hint: const Text('Select Category'),
  283.             items: categories.map((f) {
  284.               return DropdownMenuItem(
  285.                 value: f.name,
  286.                 child: Text(f.name!),
  287.               );
  288.             }).toList()));
  289.   }
  290. }
  291.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement