diff --git a/about_us/lib/about_us.dart b/about_us/lib/about_us.dart index 4aa6128..7885dc2 100644 --- a/about_us/lib/about_us.dart +++ b/about_us/lib/about_us.dart @@ -7,7 +7,7 @@ class AboutUsPage extends StatefulWidget { const AboutUsPage({Key? key}) : super(key: key); @override - _AboutUsPageState createState() => _AboutUsPageState(); + State createState() => _AboutUsPageState(); } class _AboutUsPageState extends State { @@ -33,7 +33,7 @@ class _AboutUsPageState extends State { alignment: Alignment.center, child: Column( children: [ - Text( + const Text( "Get To Know Us!", textAlign: TextAlign.center, style: TextStyle( @@ -41,14 +41,14 @@ class _AboutUsPageState extends State { fontSize: 30, ), ), - Text( + const Text( "Kami hadir untuk memudahkan masyarakat untuk mengumpulkan dan mengelola barang elektronik yang sudah tidak layak pakai. Melalui aplikasi ini, masyarakat dapat mendapatkan uang melalui menjual barang elektronik yang sudah tidak layak pakai, yang nantinya akan dijemput oleh kami. Selain itu, kami memberikan informasi tips dan tricks mengenai pengelolaan E Waste.", textAlign: TextAlign.justify, style: TextStyle( fontSize: 20, ), ), - Text( + const Text( "What People Say About Us?", textAlign: TextAlign.center, style: TextStyle( diff --git a/about_us/lib/page/add_feedack.dart b/about_us/lib/page/add_feedack.dart index fdecb25..ca3ddeb 100644 --- a/about_us/lib/page/add_feedack.dart +++ b/about_us/lib/page/add_feedack.dart @@ -1,6 +1,10 @@ + import 'package:flutter/material.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; import 'package:about_us/page/list_feedback.dart'; import 'package:e_waste_bank_mobile/drawer.dart'; +import 'package:provider/provider.dart'; + class AddFeedbackPage extends StatefulWidget { const AddFeedbackPage({super.key}); @@ -12,14 +16,14 @@ class AddFeedbackPage extends StatefulWidget { class _AddFeedbackPageState extends State { final _formKey = GlobalKey(); String _nama= ""; - DateTime now = DateTime.now(); String _feedback = ""; @override Widget build(BuildContext context) { + final request = context.watch(); return Scaffold( appBar: AppBar( - title: Text('Add Your Feedback'), + title: const Text('Add Your Feedback'), ), // Menambahkan drawer menu drawer: const MyDrawer(), @@ -32,17 +36,14 @@ class _AddFeedbackPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - // Menggunakan padding sebesar 8 pixels padding: const EdgeInsets.all(8.0), child: TextFormField( decoration: InputDecoration( labelText: "Nama", - // Menambahkan circular border agar lebih rapi border: OutlineInputBorder( borderRadius: BorderRadius.circular(5.0), ), ), - // Menambahkan behavior saat nama diketik onChanged: (String? value) { setState(() { _nama = value!; @@ -99,36 +100,19 @@ class _AddFeedbackPageState extends State { style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Colors.blue), ), - onPressed: () { + onPressed: () async { if (_formKey.currentState!.validate()) { - DataFeedback.listNama.add(_nama); - DataFeedback.listTanggal.add(now); - DataFeedback.listFeedback.add(_feedback); - showDialog( - context: context, - builder: (context) { - return Dialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - elevation: 15, - child: ListView( - padding: const EdgeInsets.only(top: 20, bottom: 20), - shrinkWrap: true, - children: [ - const Center(child: Text('Data Berhasil Ditambahkan')), - const SizedBox(height: 20), - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: const Text('Kembali'), - ), - ], - ), - - ); - }, + // ignore: unused_local_variable + final response = await request.post( + 'https://e-waste-bank.up.railway.app/about-us/add-feedback-flutter/', { + 'name': _nama, + 'your_feedback':_feedback + } + ); + // ignore: use_build_context_synchronously + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const ListFeedbackPage()), ); } }, diff --git a/about_us/lib/page/list_feedback.dart b/about_us/lib/page/list_feedback.dart index 2c4b941..e9f19e5 100644 --- a/about_us/lib/page/list_feedback.dart +++ b/about_us/lib/page/list_feedback.dart @@ -1,21 +1,14 @@ -import 'package:about_us/page/add_feedack.dart'; import 'package:flutter/material.dart'; import 'package:about_us/model/feedback.dart'; import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:e_waste_bank_mobile/drawer.dart'; -class DataFeedback{ - static List listNama = []; - static List listTanggal = []; - static List listFeedback = []; -} - class ListFeedbackPage extends StatefulWidget { const ListFeedbackPage({Key? key}) : super(key: key); @override - _ListFeedbackPageState createState() => _ListFeedbackPageState(); + State createState() => _ListFeedbackPageState(); } class _ListFeedbackPageState extends State { @@ -33,16 +26,17 @@ class _ListFeedbackPageState extends State { var data = jsonDecode(utf8.decode(response.bodyBytes)); // melakukan konversi data json menjadi object - List listMyWatchlist = []; + List listFeedback = []; for (var d in data) { if (d != null) { - listMyWatchlist.add(Feedbacks.fromJson(d)); + listFeedback.add(Feedbacks.fromJson(d)); } } - return listMyWatchlist; + return listFeedback; } + @override Widget build(BuildContext context) { return Scaffold( @@ -76,7 +70,7 @@ class _ListFeedbackPageState extends State { child: Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), - side: BorderSide(color: Colors.blue) + side: const BorderSide(color: Colors.blue) ), child: Container( padding: const EdgeInsets.symmetric(horizontal: 3, vertical: 3), @@ -85,12 +79,12 @@ class _ListFeedbackPageState extends State { "${snapshot.data![index].fields.yourFeedback}" ), subtitle: Padding( - padding: EdgeInsets.all(5.0), + padding: const EdgeInsets.all(5.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("${snapshot.data![index].fields.name}"), - Text("${snapshot.data![index].fields.date}"), + Text("${snapshot.data![index].fields.date}".toString().substring(0,10)), ], ), ), diff --git a/about_us/pubspec.yaml b/about_us/pubspec.yaml index 5e87bb3..af7ef87 100644 --- a/about_us/pubspec.yaml +++ b/about_us/pubspec.yaml @@ -1,6 +1,7 @@ name: about_us description: A new Flutter package project. version: 0.0.1 +publish_to: "none" homepage: environment: @@ -13,6 +14,8 @@ dependencies: e_waste_bank_mobile: path: ../. http: ^0.13.5 + pbp_django_auth: ^0.2.3 + provider: ^6.0.4 dev_dependencies: flutter_test: diff --git a/about_us/test/about_us_test.dart b/about_us/test/about_us_test.dart deleted file mode 100644 index 2d93a4d..0000000 --- a/about_us/test/about_us_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:about_us/about_us.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -} diff --git a/keuangan/lib/methods/get_admin_cashout.dart b/keuangan/lib/methods/get_admin_cashout.dart new file mode 100644 index 0000000..c26c354 --- /dev/null +++ b/keuangan/lib/methods/get_admin_cashout.dart @@ -0,0 +1,19 @@ +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; +import 'package:keuangan/models/admin_cashout_model.dart'; + +Future> fetchAdminCashout(context) async { + final requester = Provider.of(context, listen: false); + + var data = await requester + .get("https://e-waste-bank.up.railway.app/keuangan/json/admin-cashouts/"); + + List listCashouts = []; + for (var each in data) { + if (each != null) { + listCashouts.add(Cashout.fromJson(each)); + } + } + + return listCashouts; +} \ No newline at end of file diff --git a/keuangan/lib/methods/get_admin_keuangan.dart b/keuangan/lib/methods/get_admin_keuangan.dart new file mode 100644 index 0000000..2008d15 --- /dev/null +++ b/keuangan/lib/methods/get_admin_keuangan.dart @@ -0,0 +1,19 @@ +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; +import 'package:keuangan/models/admin_keuanganadmin_model.dart'; + +Future> fetchKeuanganAdmin(context) async { + final requester = Provider.of(context, listen: false); + + var data = await requester + .get("https://e-waste-bank.up.railway.app/keuangan/json/admin/"); + + List listKeuanganAdmin = []; + for (var each in data) { + if (each != null) { + listKeuanganAdmin.add(KeuanganAdmin.fromJson(each)); + } + } + + return listKeuanganAdmin; +} \ No newline at end of file diff --git a/keuangan/lib/models/admin_cashout_model.dart b/keuangan/lib/models/admin_cashout_model.dart index 34b582a..0dde6da 100644 --- a/keuangan/lib/models/admin_cashout_model.dart +++ b/keuangan/lib/models/admin_cashout_model.dart @@ -43,14 +43,14 @@ class Fields { required this.disbursed, }); - User? user; + String user; int uangModel; double amount; bool approved; bool disbursed; factory Fields.fromJson(Map json) => Fields( - user: userValues.map[json["user"]], + user: json["user"], uangModel: json["uang_model"], amount: json["amount"].toDouble(), approved: json["approved"], @@ -58,7 +58,7 @@ class Fields { ); Map toJson() => { - "user": userValues.reverse![user], + "user": user, "uang_model": uangModel, "amount": amount, "approved": approved, @@ -66,13 +66,6 @@ class Fields { }; } -enum User { PEBEPE, CBKADAL } - -final userValues = EnumValues({ - "cbkadal": User.CBKADAL, - "pebepe": User.PEBEPE -}); - enum Model { KEUANGAN_CASHOUT } final modelValues = EnumValues({ diff --git a/keuangan/lib/models/admin_keuanganadmin_model.dart b/keuangan/lib/models/admin_keuanganadmin_model.dart index 425ebb1..1ffb5f5 100644 --- a/keuangan/lib/models/admin_keuanganadmin_model.dart +++ b/keuangan/lib/models/admin_keuanganadmin_model.dart @@ -38,11 +38,11 @@ class Fields { required this.user, }); - int uangUser; + double uangUser; String user; factory Fields.fromJson(Map json) => Fields( - uangUser: json["uang_user"], + uangUser: json["uang_user"].toDouble(), user: json["user"], ); diff --git a/keuangan/lib/models/user_cashout.dart b/keuangan/lib/models/user_cashout.dart index 2106025..4ecab72 100644 --- a/keuangan/lib/models/user_cashout.dart +++ b/keuangan/lib/models/user_cashout.dart @@ -4,81 +4,82 @@ import 'dart:convert'; -List cashoutsFromJson(String str) => List.from(json.decode(str).map((x) => Cashouts.fromJson(x))); +List cashoutsFromJson(String str) => + List.from(json.decode(str).map((x) => Cashouts.fromJson(x))); -String cashoutsToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); +String cashoutsToJson(List data) => + json.encode(List.from(data.map((x) => x.toJson()))); class Cashouts { - Cashouts({ - required this.model, - required this.pk, - required this.fields, - }); + Cashouts({ + required this.model, + required this.pk, + required this.fields, + }); - Model? model; - int pk; - Fields fields; + Model? model; + int pk; + Fields fields; - factory Cashouts.fromJson(Map json) => Cashouts( + factory Cashouts.fromJson(Map json) => Cashouts( model: modelValues.map[json["model"]], pk: json["pk"], fields: Fields.fromJson(json["fields"]), - ); + ); - Map toJson() => { + Map toJson() => { "model": modelValues.reverse![model], "pk": pk, "fields": fields.toJson(), - }; + }; } class Fields { - Fields({ - required this.user, - required this.uangModel, - required this.amount, - required this.approved, - required this.disbursed, - }); - - int user; - int uangModel; - double amount; - bool approved; - bool disbursed; - - factory Fields.fromJson(Map json) => Fields( + Fields({ + required this.user, + required this.uangModel, + required this.amount, + required this.approved, + required this.disbursed, + }); + + int user; + int uangModel; + double amount; + bool approved; + bool disbursed; + + factory Fields.fromJson(Map json) => Fields( user: json["user"], uangModel: json["uang_model"], amount: json["amount"].toDouble(), approved: json["approved"], disbursed: json["disbursed"], - ); + ); - Map toJson() => { + Map toJson() => { "user": user, "uang_model": uangModel, "amount": amount, "approved": approved, "disbursed": disbursed, - }; + }; } // ignore: constant_identifier_names enum Model { KEUANGAN_CASHOUT } -final modelValues = EnumValues({ - "keuangan.cashout": Model.KEUANGAN_CASHOUT -}); +final modelValues = EnumValues({"keuangan.cashout": Model.KEUANGAN_CASHOUT}); class EnumValues { - Map map; - Map? reverseMap; + Map map; + Map? reverseMap; - EnumValues(this.map); + EnumValues(this.map); - Map? get reverse { - reverseMap ??= map.map((k, v) => MapEntry(v, k)); - return reverseMap; - } + Map? get reverse { + reverseMap ??= map.map((k, v) => MapEntry(v, k)); + return reverseMap; + } } + diff --git a/keuangan/lib/providers/user_keuanganadmin_provider.dart b/keuangan/lib/providers/user_keuanganadmin_provider.dart new file mode 100644 index 0000000..08d9b05 --- /dev/null +++ b/keuangan/lib/providers/user_keuanganadmin_provider.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; +import 'package:provider/provider.dart'; + +class UserKeuanganAdminProvider with ChangeNotifier { + String _username = ""; + double _balance = 0; + + String getUsername() => _username; + double getBalance() => _balance; + + void login(String username, String role) { + _username = username; + notifyListeners(); + } + + void logout() { + _username = ""; + _balance = 0; + notifyListeners(); + } + + void updateBalance(double newBalance) { + _balance = newBalance; + notifyListeners(); + } + + Future fetchBalance(BuildContext context) async { + final requester = Provider.of(context, listen: false); + var data = await requester + .get("https://e-waste-bank.up.railway.app/keuangan/json/user-api/"); + + _balance = data[0]['fields']['uang_user']; + notifyListeners(); + } +} diff --git a/keuangan/lib/widgets/admin_list_cashouts.dart b/keuangan/lib/widgets/admin_list_cashouts.dart new file mode 100644 index 0000000..0324a4a --- /dev/null +++ b/keuangan/lib/widgets/admin_list_cashouts.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; +import 'package:e_waste_bank_mobile/drawer.dart'; +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; +import 'package:keuangan/methods/get_admin_cashout.dart'; +import 'package:keuangan/models/admin_cashout_model.dart'; + +import 'admin_list_keuangan.dart'; + +class AdminListCashoutsPage extends StatefulWidget { + const AdminListCashoutsPage({Key? key}) : super(key: key); + + @override + State createState() => _AdminListCashoutsPageState(); +} + +class _AdminListCashoutsPageState extends State { + late Future> fetchedCashouts; + final _formKey = GlobalKey(); + bool? checkboxValue; + + @override + void initState() { + super.initState(); + fetchedCashouts = fetchAdminCashout(context); + } + + @override + Widget build(BuildContext context) { + CookieRequest requester = context.watch(); + + return Scaffold( + appBar: AppBar( + title: const Text('User Cashouts'), + ), + drawer: const MyDrawer(), + body: FutureBuilder( + future: fetchedCashouts, + builder: (context, AsyncSnapshot snapshot) { + if (snapshot.data == null) { + return const Center(child: CircularProgressIndicator()); + } else { + if (!snapshot.hasData) { + return Column( + children: const [ + Text( + "Tidak ada data cashout", + style: TextStyle(color: Color(0xff59A5D8), fontSize: 20), + ), + SizedBox(height: 8), + ], + ); + } else { + return ListView.builder( + itemCount: snapshot.data!.length, + itemBuilder: (_, index) => Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, vertical: 12), + padding: const EdgeInsets.all(20.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.0), + boxShadow: [ + BoxShadow( + color: snapshot.data![index].fields.approved + ? Colors.blue + : Colors.red, + blurRadius: 5.0) + ]), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + title: Text( + "${snapshot.data![index].pk}. ${snapshot.data![index].fields.user}", + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + "Nominal: Rp.${snapshot.data![index].fields.amount}", + style: const TextStyle( + fontSize: 14, + ), + ), + // trailing: , + onTap: () { + checkboxValue = snapshot.data![index] + .fields.approved; + showDialog( + context: context, + builder: (_) { + return AlertDialog( + title: const Text('Cashout Approval'), + content: SingleChildScrollView( + child: FormField( + key: _formKey, + builder: (state) { + return Column( + children: [ + Row( + children: [ + Checkbox( + value: checkboxValue, + onChanged: (value) { + setState(() { + checkboxValue = value; + state.didChange(value); + }); + }), + const Text('Setujui request?'), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + onPressed: () => + Navigator.pop(context), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () async{ + // ignore: unused_local_variable + final response = + await requester + .post( + "https://e-waste-bank.up.railway.app/keuangan/edit-cashout-api/${snapshot + .data![index] + .pk}/", + { + 'approved': checkboxValue + .toString() + }); + // ignore: use_build_context_synchronously + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AdminListCashoutsPage(), + )).then((value) { + setState(() {}); + }); + }, + child: const Text('Send'), + ), + ], + ), + ], + ); + }, + ), + ), + ); + }, + ); + }, + ), + ], + ), + )); + } + } + }), + floatingActionButton: FloatingActionButton.extended( + label: const Text('Keuangan'), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AdminListKeuanganPage(), + )); + }, + ), + ); + } +} diff --git a/keuangan/lib/widgets/admin_list_keuangan.dart b/keuangan/lib/widgets/admin_list_keuangan.dart new file mode 100644 index 0000000..b5b836a --- /dev/null +++ b/keuangan/lib/widgets/admin_list_keuangan.dart @@ -0,0 +1,228 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; +import 'package:keuangan/methods/get_admin_keuangan.dart'; +import 'package:keuangan/models/admin_keuanganadmin_model.dart'; +import 'package:e_waste_bank_mobile/drawer.dart'; + +import 'admin_list_cashouts.dart'; + +class AdminListKeuanganPage extends StatefulWidget { + const AdminListKeuanganPage({Key? key}) : super(key: key); + + @override + State createState() => _AdminListKeuanganPageState(); +} + +class _AdminListKeuanganPageState extends State { + late Future> fetchedKeuangan; + final _formKey = GlobalKey(); + double? amount; + + @override + void initState() { + super.initState(); + fetchedKeuangan = fetchKeuanganAdmin(context); + } + + @override + Widget build(BuildContext context) { + CookieRequest requester = context.watch(); + + return Scaffold( + appBar: AppBar( + title: const Text('Data Keuangan User'), + ), + drawer: const MyDrawer(), + body: FutureBuilder( + future: fetchedKeuangan, + builder: (context, AsyncSnapshot snapshot) { + if (snapshot.data == null) { + return const Center(child: CircularProgressIndicator()); + } else { + if (!snapshot.hasData) { + return Column( + children: const [ + Text( + "Tidak ada data keuangan", + style: TextStyle(color: Color(0xff59A5D8), fontSize: 20), + ), + SizedBox(height: 8), + ], + ); + } else { + return ListView.builder( + itemCount: snapshot.data!.length, + itemBuilder: (_, index) => Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, vertical: 12), + padding: const EdgeInsets.all(20.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.0), + boxShadow: const [ + BoxShadow(color: Colors.grey, blurRadius: 5.0) + ]), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + title: Text( + "User: ${snapshot.data![index].fields.user}", + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + "Nominal: Rp.${snapshot.data![index].fields.uangUser}", + style: const TextStyle( + fontSize: 14, + ), + ), + // trailing: , + onTap: () { + showDialog( + context: context, + builder: (_) { + return AlertDialog( + title: const Text('Add Amount'), + content: SingleChildScrollView( + child: Form( + key: _formKey, + child: Column(children: [ + Padding( + // Menggunakan padding sebesar 8 pixels + padding: + const EdgeInsets.all( + 8.0), + child: TextFormField( + keyboardType: + TextInputType + .number, + inputFormatters: < + TextInputFormatter>[ + FilteringTextInputFormatter + .allow(RegExp( + r'^\d+\.?\d{0,2}')) + ], + decoration: + InputDecoration( + hintText: + "Contoh: 1000", + labelText: "Nominal", + // Menambahkan circular border agar lebih rapi + border: + OutlineInputBorder( + borderRadius: + BorderRadius + .circular( + 5.0), + ), + ), + // Menambahkan behavior saat nama diketik + onChanged: + (String? value) { + setState(() { + amount = + double.parse( + value!); + }); + }, + // Menambahkan behavior saat data disimpan + onSaved: + (String? value) { + setState(() { + amount = + double.parse( + value!); + }); + }, + // Validator sebagai validasi form + validator: + (String? value) { + if (value == null || + value.isEmpty) { + return 'Nominal tidak boleh kosong!'; + } else if (int.parse( + value) < + 0) { + return 'Nominal tidak boleh negatif!'; + } else if (((double.parse( + value) / + 0.01) % + 1) != + 0) { + return 'Nominal hanya boleh mengandung dua angka di belakang koma!'; + } + return null; + }, + )), + Row( + crossAxisAlignment: + CrossAxisAlignment + .center, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + TextButton( + onPressed: () => + Navigator.pop( + context), + child: const Text( + 'Cancel'), + ), + TextButton( + onPressed: () async { + // ignore: unused_local_variable + final response = + await requester.post( + "https://e-waste-bank.up.railway.app/keuangan/edit-uang-user-api/${snapshot.data![index].pk}/", + { + 'uang_user': amount + .toString() + }); + // ignore: use_build_context_synchronously + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => + const AdminListKeuanganPage(), + )).then((value) { + setState(() {}); + }); + }, + child: + const Text('Send'), + ), + ], + ), + ]))), + ); + }, + ); + }, + ), + ], + ), + )); + } + } + }), + floatingActionButton: FloatingActionButton.extended( + label: const Text('Cashouts'), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AdminListCashoutsPage(), + )); + }, + ), + ); + } +} diff --git a/keuangan/lib/widgets/user_cashouts_create.dart b/keuangan/lib/widgets/user_cashouts_create.dart new file mode 100644 index 0000000..e835d6d --- /dev/null +++ b/keuangan/lib/widgets/user_cashouts_create.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:keuangan/providers/user_keuanganadmin_provider.dart'; +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; + + +class UserCreateCashoutsPage extends StatefulWidget { + const UserCreateCashoutsPage({Key? key}) : super(key: key); + + @override + State createState() => _UserCreateCashoutsPageState(); +} + +class _UserCreateCashoutsPageState extends State { + final _userCreateCashoutsPageKey = GlobalKey(); + + double _nominalPenarikan = 0.0; + + @override + Widget build(BuildContext context) { + CookieRequest requester = Provider.of(context, listen: false); + + return Scaffold( + appBar: AppBar( + title: const Text('Buat Penarikan Baru'), + ), + body: Form( + key: _userCreateCashoutsPageKey, + child: SingleChildScrollView( + child: Container( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Consumer( + builder: (context, value, child) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + enabled: false, + initialValue: value.getBalance().toString(), + decoration: InputDecoration( + labelText: "Uang Tersedia", + icon: const Icon(Icons.monetization_on), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0)), + ), + ), + ); + }, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + keyboardType: const TextInputType.numberWithOptions( + signed: false, decimal: true), + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp(r'^\d+\.?\d{0,2}')) + ], + decoration: InputDecoration( + hintText: "Contoh: 25000.25", + labelText: "Jumlah Penarikan", + icon: const Icon(Icons.money), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0)), + ), + onChanged: (String? value) { + setState(() { + double? newNominal = double.tryParse(value!); + + if (!(newNominal == null)) { + _nominalPenarikan = newNominal; + } + }); + }, + onSaved: (String? value) { + setState(() { + _nominalPenarikan = double.parse(value!); + }); + }, + validator: (String? value) { + if (value == null || value.isEmpty) { + return 'Nominal tidak boleh kosong!'; + } else if (double.tryParse(value) == null) { + return 'Nominal tidak valid!'; + } else if (((double.parse(value) / 0.01) % 1) != 0) { // TODO handler floating point menyebalkan + return 'Nominal hanya boleh mengandung dua angka di belakang koma!'; + } + return null; + }, + ), + ), + TextButton( + onPressed: () async { + if (_userCreateCashoutsPageKey.currentState!.validate()) { + final response = await requester.post( + "https://e-waste-bank.up.railway.app/keuangan/user/create-cashout-api/", + {'amount': _nominalPenarikan.toString()}); + + if (response['status']) { + showDialog( + context: context, + builder: ((context) { + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + elevation: 15, + child: ListView( + padding: const EdgeInsets.only( + top: 20, bottom: 20), + shrinkWrap: true, + children: [ + const Center( + child: Text( + "Request penarikan berhasil!", + style: TextStyle( + fontWeight: FontWeight.bold), + ), + ), + const SizedBox(height: 30), + TextButton( + onPressed: () { + // pop untuk menutup dialog box + Navigator.pop(context); + Navigator.pop(context); + }, + child: const Text( + 'OK', + style: TextStyle(color: Colors.blue), + ), + ), + ], + ), + ); + } + ) + ); + } else { + showDialog( + context: context, + builder: ((context) { + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + elevation: 15, + child: ListView( + padding: const EdgeInsets.only( + top: 20, bottom: 20), + shrinkWrap: true, + children: [ + Center( + child: Text( + "Request penarikan gagal: ${response['message']}", + style: const TextStyle( + fontWeight: FontWeight.bold), + ), + ), + const SizedBox(height: 30), + TextButton( + onPressed: () { + // pop untuk menutup dialog box + Navigator.pop(context); + }, + child: const Text( + 'OK', + style: TextStyle(color: Colors.blue), + ), + ), + ], + ), + ); + } + ) + ); + } + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.blue), + ), + child: const Text( + "Request", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/keuangan/lib/widgets/user_cashouts_detail.dart b/keuangan/lib/widgets/user_cashouts_detail.dart new file mode 100644 index 0000000..0a01a7b --- /dev/null +++ b/keuangan/lib/widgets/user_cashouts_detail.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import 'package:keuangan/models/user_cashout.dart'; + +class CashoutDetailPage extends StatelessWidget { + const CashoutDetailPage({super.key, required this.cashouts}); + + final Cashouts cashouts; + + @override + Widget build(BuildContext context) { + var numberFormatter = NumberFormat.decimalPattern("id"); + + return Scaffold( + appBar: AppBar( + title: const Text('Detail'), + ), + body: Container( + margin: const EdgeInsets.all(7.5), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: Text( + "Penarikan (ID: ${cashouts.pk})", + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 32, fontWeight: FontWeight.bold), + ), + ), + ], + ), + const SizedBox(height: 50), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("Nominal: ", + style: + TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), + Expanded( + child: Text( + "Rp. ${numberFormatter.format(cashouts.fields.amount)}", + style: const TextStyle(fontSize: 22), + ), + ) + ], + ), + // const SizedBox(height: smallHeight), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("Disetujui: ", + style: + TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), + Expanded( + child: Text( + cashouts.fields.approved ? "Sudah" : "Belum", + style: const TextStyle(fontSize: 22), + ), + ) + ], + ), + const Spacer( + flex: 2, + ), + Container( + margin: + const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: SizedBox( + width: double.infinity, + child: TextButton( + onPressed: () { + Navigator.pop(context); + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.blue), + ), + child: const Text( + 'Back', + style: TextStyle(color: Colors.white), + ), + ), + )) + ], + ), + ), + ); + } +} diff --git a/keuangan/lib/widgets/user_list_cashouts.dart b/keuangan/lib/widgets/user_list_cashouts.dart new file mode 100644 index 0000000..6ffe0d9 --- /dev/null +++ b/keuangan/lib/widgets/user_list_cashouts.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:keuangan/providers/user_keuanganadmin_provider.dart'; +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; +import 'package:keuangan/models/user_cashout.dart'; + +import 'package:keuangan/widgets/user_cashouts_detail.dart'; +import 'package:keuangan/widgets/user_cashouts_create.dart'; +import 'package:e_waste_bank_mobile/drawer.dart'; + +class UserListCashoutsPage extends StatefulWidget { + const UserListCashoutsPage({Key? key}) : super(key: key); + + @override + State createState() => _UserListCashoutsPageState(); +} + +class _UserListCashoutsPageState extends State { + late Future> fetchedCashouts; + + Future> fetchCashouts() async { + final requester = Provider.of(context, listen: false); + var data = await requester.get( + "https://e-waste-bank.up.railway.app/keuangan/json/user-cashouts-api/"); + + List listCashouts = []; + for (var each in data) { + if (each != null) { + listCashouts.add(Cashouts.fromJson(each)); + } + } + + return listCashouts; + } + + @override + void initState() { + super.initState(); + fetchedCashouts = fetchCashouts(); + Provider.of(context, listen: false) + .fetchBalance(context); + } + + @override + Widget build(BuildContext context) { + var numberFormatter = NumberFormat.decimalPattern("id"); + return Scaffold( + appBar: AppBar( + title: const Text('Daftar Penarikan Uang'), + ), + drawer: const MyDrawer(), + body: FutureBuilder( + future: fetchedCashouts, + builder: (context, snapshot) { + if (snapshot.data == null) { + return const Center(child: CircularProgressIndicator()); + } else if (!snapshot.hasData) { + return Column( + children: const [ + Text( + "Belum ada penarikan yang anda buat.", + style: TextStyle(color: Color(0xff59A5D8), fontSize: 20), + ), + SizedBox(height: 8), + ], + ); + } else { + return ListView.builder( + itemCount: snapshot.data!.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) { + return CashoutDetailPage( + cashouts: snapshot.data![index]); + }, + )); + }, + child: Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, vertical: 10), + padding: const EdgeInsets.all(15.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.0), + boxShadow: [ + BoxShadow(color: snapshot.data![index].fields.approved + ? Colors.green + : Colors.red, + blurRadius: 5) + ]), + child: Column( + // mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Text( + "Rp. ${numberFormatter.format(snapshot.data![index].fields.amount)}", + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + Row( + children: [ + Expanded( + child: Text( + "ID Penarikan: ${snapshot.data![index].pk}", + style: const TextStyle( + fontSize: 14, + ), + ), + ), + ], + ), + ], + ), + ), + ); + }, + ); + } + }, + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: ((context) => const UserCreateCashoutsPage()))) + .then((_) { + setState(() { + fetchedCashouts = fetchCashouts(); + Provider.of(context, listen: false) + .fetchBalance(context); + }); + }); + }, + tooltip: "Buat Penarikan Baru", + child: const Icon(Icons.add), + ), + ); + } +} diff --git a/keuangan/pubspec.yaml b/keuangan/pubspec.yaml index 87edb1b..828a77e 100644 --- a/keuangan/pubspec.yaml +++ b/keuangan/pubspec.yaml @@ -17,6 +17,9 @@ dependencies: e_waste_bank_mobile: path: ../. http: ^0.13.5 + pbp_django_auth: ^0.2.3 + provider: ^6.0.4 + intl: ^0.17.0 dev_dependencies: flutter_test: diff --git a/keuangan/test/keuangan_test.dart b/keuangan/test/keuangan_test.dart deleted file mode 100644 index 9f35fd8..0000000 --- a/keuangan/test/keuangan_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:keuangan/keuangan.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -} diff --git a/lib/authentication/login_page.dart b/lib/authentication/login_page.dart index 54a6f35..2d6d7c2 100644 --- a/lib/authentication/login_page.dart +++ b/lib/authentication/login_page.dart @@ -1,11 +1,11 @@ +import 'package:about_us/about_us.dart'; import 'package:e_waste_bank_mobile/authentication/user_provider.dart'; import 'package:flutter/material.dart'; -import 'package:keuangan/models/admin_cashout_model.dart'; +import 'package:keuangan/providers/user_keuanganadmin_provider.dart'; import 'package:pbp_django_auth/pbp_django_auth.dart'; import 'package:provider/provider.dart'; import 'package:e_waste_bank_mobile/drawer.dart'; -import 'package:e_waste_bank_mobile/main.dart'; class LoginPage extends StatefulWidget { const LoginPage({Key? key}) : super(key: key); @@ -29,8 +29,12 @@ class _LoginPageState extends State { @override Widget build(BuildContext context) { - CookieRequest requester = context.watch(); - UserProvider userProvider = context.watch(); + CookieRequest requester = + Provider.of(context, listen: false); + UserProvider userProvider = + Provider.of(context, listen: false); + UserKeuanganAdminProvider userKeuanganAdminProvider = + Provider.of(context, listen: false); return Scaffold( appBar: AppBar( @@ -118,8 +122,8 @@ class _LoginPageState extends State { onPressed: () async { if (_loginPageFormKey.currentState!.validate()) { // TODO CircularProgessIndicator - final response = await requester - .login("https://e-waste-bank.up.railway.app/auth/login/", { + final response = await requester.login( + "https://e-waste-bank.up.railway.app/auth/login/", { 'username': username, 'password': password, }); @@ -127,6 +131,13 @@ class _LoginPageState extends State { // TODO text formatting di dialog berhasil dan gagal if (requester.loggedIn) { userProvider.login(username, response['role']); + userKeuanganAdminProvider.login( + username, response['role']); + // ignore: use_build_context_synchronously + if (response['role'] == "user") { + // ignore: use_build_context_synchronously + userKeuanganAdminProvider.fetchBalance(context); + } showDialog( context: context, builder: ((context) { @@ -156,7 +167,7 @@ class _LoginPageState extends State { context, MaterialPageRoute( builder: (context) => - const MyHomePage())); + const AboutUsPage())); }, child: const Text( 'OK', diff --git a/lib/authentication/register.page.dart b/lib/authentication/register.page.dart deleted file mode 100644 index 0e55fe1..0000000 --- a/lib/authentication/register.page.dart +++ /dev/null @@ -1,258 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:pbp_django_auth/pbp_django_auth.dart'; - -import 'package:e_waste_bank_mobile/drawer.dart'; -import 'package:e_waste_bank_mobile/main.dart'; -import 'package:e_waste_bank_mobile/authentication/login_page.dart'; - -class RegisterPage extends StatefulWidget { - const RegisterPage({Key? key}) : super(key: key); - - @override - State createState() => _RegisterPageState(); -} - -class _RegisterPageState extends State { - final _registerPageFormKey = GlobalKey(); - - String username = ""; - String password = ""; - String passwordConfirmation = ""; - var _isObscuredPassword; - var _isObscuredConfirmation; - - @override - void initState() { - super.initState(); - _isObscuredPassword = true; - _isObscuredConfirmation = true; - } - - @override - Widget build(BuildContext context) { - final requester = context.watch(); - return Scaffold( - appBar: AppBar( - title: Text("Formulir Registrasi"), - ), - drawer: const MyDrawer(), - body: Form( - key: _registerPageFormKey, - child: SingleChildScrollView( - child: Container( - padding: const EdgeInsets.all(20.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: TextFormField( - decoration: InputDecoration( - hintText: "Username anda", - labelText: "Username", - icon: const Icon(Icons.people), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5.0))), - onChanged: (String? value) { - setState(() { - username = value!; - }); - }, - onSaved: (String? value) { - setState(() { - username = value!; - }); - }, - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextFormField( - decoration: InputDecoration( - hintText: "Password anda", - labelText: "Password", - icon: const Icon(Icons.people), - suffixIcon: IconButton( - padding: const EdgeInsetsDirectional.only( - end: 12.0), - icon: _isObscuredPassword - ? const Icon(Icons.visibility) - : const Icon(Icons.visibility_off), - onPressed: () { - setState(() { - _isObscuredPassword = - !_isObscuredPassword; - }); - }, - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5.0))), - obscureText: _isObscuredPassword, - onChanged: (String? value) { - setState(() { - password = value!; - }); - }, - onSaved: (String? value) { - setState(() { - password = value!; - }); - }, - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextFormField( - decoration: InputDecoration( - hintText: "Password", - labelText: "Ketik ulang password", - icon: const Icon(Icons.people), - suffixIcon: IconButton( - padding: const EdgeInsetsDirectional.only( - end: 12.0), - icon: _isObscuredConfirmation - ? const Icon(Icons.visibility) - : const Icon(Icons.visibility_off), - onPressed: () { - setState(() { - _isObscuredConfirmation = - !_isObscuredConfirmation; - }); - }, - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(5.0))), - obscureText: _isObscuredConfirmation, - onChanged: (String? value) { - setState(() { - passwordConfirmation = value!; - }); - }, - onSaved: (String? value) { - setState(() { - passwordConfirmation = value!; - }); - }, - validator: (String? value) { - if (value == null || value.isEmpty) { - return "Empty password"; - } else if (value != password) { - return "Password tidak cocok"; - } - return null; - }, - ), - ), - // const Spacer(), - - TextButton( - onPressed: () async { - if (_registerPageFormKey.currentState!.validate()) { - final response = await requester.post( - "http://e-waste-bank.up.railway.app/auth/register/", - { - // TODO ganti ke url local masing2 buat develop and debug - 'username': username, - 'password1': password, - 'password2': passwordConfirmation, - }); - - showDialog( - context: context, - builder: ((context) { - return Dialog( - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(10), - ), - elevation: 15, - child: ListView( - padding: const EdgeInsets.only( - top: 20, bottom: 20), - shrinkWrap: true, - children: [ - const Center( - child: Text( - "Register berhasil!", - style: TextStyle( - fontWeight: - FontWeight.bold), - ), - ), - const SizedBox(height: 30), - TextButton( - onPressed: () { - // pop untuk menutup dialog box - Navigator.pop(context); - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => - const MyHomePage())); - }, - child: const Text( - 'OK', - style: TextStyle( - color: Colors.blue), - ), - ), - ], - ), - ); - })); - } else { - showDialog( - context: context, - builder: ((context) { - return Dialog( - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(10), - ), - elevation: 15, - child: ListView( - padding: const EdgeInsets.only( - top: 20, bottom: 20), - shrinkWrap: true, - children: [ - const Center( - child: Text( - "Register gagal", - style: TextStyle( - fontWeight: - FontWeight.bold), - ), - ), - const SizedBox(height: 30), - TextButton( - onPressed: () { - // pop untuk menutup dialog box - Navigator.pop(context); - }, - child: const Text( - 'OK', - style: TextStyle( - color: Colors.blue), - ), - ), - ], - ), - ); - })); - } - }, - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(Colors.blue), - ), - child: const Text( - "Register", - style: TextStyle(color: Colors.white), - ), - ), - ])))), - ); - } -} diff --git a/lib/drawer.dart b/lib/drawer.dart index 30682cf..b19fe34 100644 --- a/lib/drawer.dart +++ b/lib/drawer.dart @@ -1,15 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:keuangan/providers/user_keuanganadmin_provider.dart'; import 'package:pbp_django_auth/pbp_django_auth.dart'; import 'package:penjemputan/page/list_penjemputan.dart'; +import 'package:penjemputan/page/add_penjemputan.dart'; import 'package:provider/provider.dart'; import 'package:e_waste_bank_mobile/authentication/user_provider.dart'; -import 'package:e_waste_bank_mobile/main.dart'; import 'package:e_waste_bank_mobile/authentication/login_page.dart'; -import 'package:e_waste_bank_mobile/authentication/register.page.dart'; import 'package:tips_and_tricks/page/list_tips_and_trick.dart'; import 'package:tips_and_tricks/page/add_tips_and_trick.dart'; +import 'package:keuangan/widgets/admin_list_keuangan.dart'; import 'package:about_us/about_us.dart'; // import 'package:penjemputan/page/list_penjemputan.dart'; +import 'package:keuangan/widgets/user_list_cashouts.dart'; class MyDrawer extends StatefulWidget { const MyDrawer({super.key}); @@ -24,15 +27,21 @@ class _MyDrawerState extends State { final requester = context.watch(); UserProvider userProvider = context.watch(); + UserKeuanganAdminProvider userKeuanganAdminProvider = + Provider.of(context, listen: false); + + var numberFormatter = NumberFormat.decimalPattern("id"); return Drawer( child: Column(children: [ - ListTile( - title: const Text('Halaman Utama'), - onTap: () { - Navigator.pushReplacement(context, - MaterialPageRoute(builder: (context) => const MyHomePage())); - }), + userProvider.isAuthenticated() + ? UserAccountsDrawerHeader( + accountName: Text(userProvider.getUsername()), + accountEmail: userProvider.isAdmin() + ? const Text("Anda login sebagai admin.") + : Text( + "Rp. ${numberFormatter.format(userKeuanganAdminProvider.getBalance())}")) + : const SizedBox.shrink(), ListTile( title: const Text('About Us'), onTap: () { @@ -52,8 +61,21 @@ class _MyDrawerState extends State { child: ListTile( title: const Text('penjemputan'), onTap: () { - Navigator.pushReplacement(context, - MaterialPageRoute(builder: (context) => const PenjemputanPage())); + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => const PenjemputanPage())); + }), + ), + Visibility( + visible: userProvider.isAuthenticated() && !userProvider.isAdmin(), + child: ListTile( + title: const Text('Add Penjemputan'), + onTap: () { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => const AddPenjemputan())); }), ), Visibility( @@ -68,23 +90,34 @@ class _MyDrawerState extends State { }), ), Visibility( - visible: !userProvider.isAuthenticated(), + visible: userProvider.isAuthenticated() && !userProvider.isAdmin(), child: ListTile( - title: const Text('Login COBA'), + title: const Text('Keuangan'), onTap: () { - Navigator.pushReplacement(context, - MaterialPageRoute(builder: (context) => const LoginPage())); + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => const UserListCashoutsPage())); }), ), Visibility( - visible: !userProvider.isAuthenticated(), + visible: userProvider.isAdmin(), child: ListTile( - title: const Text('Register'), + title: const Text('Keuangan'), onTap: () { Navigator.pushReplacement( context, MaterialPageRoute( - builder: (context) => const RegisterPage())); + builder: (context) => const AdminListKeuanganPage())); + }), + ), + Visibility( + visible: !userProvider.isAuthenticated(), + child: ListTile( + title: const Text('Login'), + onTap: () { + Navigator.pushReplacement(context, + MaterialPageRoute(builder: (context) => const LoginPage())); }), ), Visibility( @@ -98,9 +131,13 @@ class _MyDrawerState extends State { // ignore: use_build_context_synchronously Provider.of(context, listen: false).logout(); + // ignore: use_build_context_synchronously + Provider.of(context, listen: false) + .logout(); + // ignore: use_build_context_synchronously Navigator.pushReplacement(context, - MaterialPageRoute(builder: (context) => const MyHomePage())); + MaterialPageRoute(builder: (context) => const AboutUsPage())); }), ), ])); diff --git a/lib/main.dart b/lib/main.dart index fad1450..0aab764 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,15 +2,20 @@ import 'package:flutter/material.dart'; import 'package:pbp_django_auth/pbp_django_auth.dart'; import 'package:provider/provider.dart'; +import 'package:about_us/about_us.dart'; import 'package:e_waste_bank_mobile/authentication/user_provider.dart'; -import 'package:e_waste_bank_mobile/drawer.dart'; + +import 'package:keuangan/providers/user_keuanganadmin_provider.dart'; void main() { runApp(MultiProvider( providers: [ ChangeNotifierProvider( create: (_) => UserProvider(), - ) + ), + ChangeNotifierProvider( + create: (_) => UserKeuanganAdminProvider(), + ), ], child: const MyApp(), )); @@ -27,60 +32,12 @@ class MyApp extends StatelessWidget { return request; }), child: MaterialApp( - title: 'Flutter Demo', + title: 'E-Waste-Bank', theme: ThemeData( primarySwatch: Colors.blue, ), - home: const MyHomePage(), + home: const AboutUsPage(), ), ); } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key}); - - final String title = "E-Waste Bank"; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - drawer: const MyDrawer(), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headline4, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), - ); - } -} +} \ No newline at end of file diff --git a/penjemputan/lib/main.dart b/penjemputan/lib/main.dart deleted file mode 100644 index e69de29..0000000 diff --git a/penjemputan/lib/model/penjemputan_item.dart b/penjemputan/lib/model/penjemputan_item.dart index 0fbbb47..205de6e 100644 --- a/penjemputan/lib/model/penjemputan_item.dart +++ b/penjemputan/lib/model/penjemputan_item.dart @@ -11,39 +11,34 @@ String penjemputanItemToJson(List data) => json.encode(List json) => PenjemputanItem( - id: json["pk"], alamat: json["fields"]["alamat"], tanggalJemput: json["fields"]["tanggal_jemput"], waktuJemput: json["fields"]["waktu_jemput"], - waktuSekarang: json["fields"]["waktu_sekarang"], jenisSampah: json["fields"]["jenis_sampah"], beratSampah: json["fields"]["berat_sampah"], + isDone: json["fields"]["is_finished"], ); Map toJson() => { - "id": id, "alamat": alamat, "tanggal_jemput": tanggalJemput, "waktu_jemput": waktuJemput, - "waktu_sekarang": waktuSekarang, "jenis_sampah": jenisSampah, "berat_sampah": beratSampah, }; diff --git a/penjemputan/lib/page/add_penjemputan.dart b/penjemputan/lib/page/add_penjemputan.dart index fa01a9d..f780edd 100644 --- a/penjemputan/lib/page/add_penjemputan.dart +++ b/penjemputan/lib/page/add_penjemputan.dart @@ -1,339 +1,253 @@ -import 'package:tips_and_tricks/util/add_tips_and_trick.dart'; import 'package:flutter/material.dart'; -import 'package:tips_and_tricks/model/TipsAndTrick.dart'; import 'package:e_waste_bank_mobile/drawer.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:e_waste_bank_mobile/authentication/user_provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; -class AddTipsAndTrickPage extends StatefulWidget { - const AddTipsAndTrickPage({super.key}); +class AddPenjemputan extends StatefulWidget { + const AddPenjemputan({super.key}); @override - State createState() => _AddTipsAndTrickPage(); + State createState() => _AddPenjemputan(); } -class _AddTipsAndTrickPage extends State { +class _AddPenjemputan extends State { final _formKey = GlobalKey(); - final _clearTitle = TextEditingController(); - final _clearSource = TextEditingController(); - final _clearImageUrl = TextEditingController(); - final _clearArticleUrl = TextEditingController(); - final _clearBriefDescription = TextEditingController(); - String title = ""; - String source = ""; - // ignore: non_constant_identifier_names - DateTime? _publised_date; - // ignore: non_constant_identifier_names - String image_url = ""; - // ignore: non_constant_identifier_names - String article_url = ""; - // ignore: non_constant_identifier_names - String brief_description = ""; + final _clearJenisSampah = TextEditingController(); + final _clearAlamat = TextEditingController(); + final _clearBeratSampah = TextEditingController(); + String jenisSampah = ""; + String alamat = ""; + String beratSampah = ""; + DateTime? tanggalJemput; + TimeOfDay? waktuJemput; @override Widget build(BuildContext context) { + CookieRequest requester = context.watch(); return Scaffold( - appBar: AppBar( - title: const Text('Add Tips & Tricks Article'), + appBar: AppBar( + title: const Text('Add penjemputan'), + ), + drawer: const MyDrawer(), + body: SingleChildScrollView( + child: Form( + key: _formKey, + child: Container( + padding: const EdgeInsets.all(20.0), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextFormField( + decoration: InputDecoration( + hintText: "Sampah Rumah Tangga", + labelText: "Jenis Sampah", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0), + ), + ), + controller: _clearJenisSampah, + onChanged: (String? value) { + setState(() { + jenisSampah = value!; + }); + }, + onSaved: (String? value) { + setState(() { + jenisSampah = value!; + }); + }, + validator: (String? value) { + if (value == null || value.isEmpty) { + return 'Jenis sampah tidak boleh kosong!'; + } + return null; + }), + const SizedBox( + height: 10, + ), + TextFormField( + decoration: InputDecoration( + hintText: "Fasilkom Gedung Baru", + labelText: "Alamat", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0), + ), + ), + controller: _clearAlamat, + onChanged: (String? value) { + setState(() { + alamat = value!; + }); + }, + onSaved: (String? value) { + setState(() { + alamat = value!; + }); + }, + validator: (String? value) { + if (value == null || value.isEmpty) { + return 'Alamat tidak boleh kosong!'; + } + return null; + }), + const SizedBox( + height: 10, + ), + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration( + hintText: "Contoh: 10", + labelText: "Berat Sampah", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0), + ), + ), + controller: _clearBeratSampah, + onChanged: (String? value) { + setState(() { + beratSampah = value!; + }); + }, + onSaved: (String? value) { + setState(() { + beratSampah = value!; + }); + }, + validator: (String? value) { + if (value == null || value.isEmpty) { + return 'Berat sampah tidak boleh kosong!'; + } + if (int.tryParse(value) == null) { + return 'Berat sampah harus berupa angka!'; + } + return null; + }), + const SizedBox( + height: 10, + ), + TextButton( + child: Text(tanggalJemput == null + ? "pilih tanggal jemput" + : "${tanggalJemput!.day}/${tanggalJemput!.month}/${tanggalJemput!.year}"), + // Event Handling for Button + onPressed: () { + showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2000), + lastDate: DateTime(2099), + ).then((date) { + // Tambahkan setState dan panggil variabel _dateTime. + setState(() { + tanggalJemput = date; + }); + }); + }, + ), + TextButton( + child: Text(waktuJemput == null + ? "pilih waktu jemput" + : "${waktuJemput!.hour}:${waktuJemput!.minute}"), + // Event Handling for Button + onPressed: () { + showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ).then((time) { + // Tambahkan setState dan panggil variabel _dateTime. + setState(() { + waktuJemput = time; + }); + }); + }, + ), + TextButton( + onPressed: () async { + if (_formKey.currentState!.validate()) { + final response = await requester.post( + "https://e-waste-bank.up.railway.app/penjemputan/add-mobile/", + { + "jenis_sampah": jenisSampah, + "alamat": alamat, + "berat_sampah": beratSampah, + "tanggal_jemput": tanggalJemput!.toString(), + "waktu_jemput": + waktuJemput!.toString().substring(10, 15), + }, + ); + if (response['status']) { + // ignore: use_build_context_synchronously + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar( + backgroundColor: Colors.green, + // ignore: prefer_const_constructors + content: Text( + "${response['message']}", + style: const TextStyle(color: Colors.white), + ), + action: SnackBarAction( + label: 'Close', + textColor: Colors.white, + onPressed: () { + ScaffoldMessenger.of(context) + .hideCurrentSnackBar(); + }, + ), + )); + _clearJenisSampah.clear(); + _clearAlamat.clear(); + _clearBeratSampah.clear(); + setState(() { + jenisSampah = ""; + alamat = ""; + beratSampah = ""; + tanggalJemput = null; + waktuJemput = null; + }); + } else { + // ignore: use_build_context_synchronously + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.red, + // ignore: prefer_const_constructors + content: Text( + "${response['message']}", + style: const TextStyle(color: Colors.red), + ), + action: SnackBarAction( + label: 'Close', + textColor: Colors.white, + onPressed: () { + ScaffoldMessenger.of(context) + .hideCurrentSnackBar(); + }, + ), + ), + ); + } + } + }, + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.blue), + ), + child: const Text( + "submit", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), + ], + ), + ), ), - drawer: const MyDrawer(), - body: SingleChildScrollView( - child: Form( - key: _formKey, - child: Container( - padding: const EdgeInsets.all(20.0), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextFormField( - decoration: InputDecoration( - hintText: "Contoh: Kelebihan dari memakai totebag", - labelText: "Title", - border: OutlineInputBorder( - borderRadius: BorderRadius.circular( - 5.0), - ), - ), - - controller: _clearTitle, - - onChanged: (String? value) { - setState(() { - title = value!; - }); - }, - - onSaved: (String? value) { - setState(() { - title = value!; - }); - }, - - validator: (String? value) { - if (value == null || value.isEmpty) { - return 'Judul Article tidak boleh kosong!'; - } - return null; - } - ), - - const SizedBox(height: 10,), - - TextFormField( - decoration: InputDecoration( - hintText: "Contoh: Maya", - labelText: "Article Source/Author", - border: OutlineInputBorder( - borderRadius: BorderRadius.circular( - 5.0), - ), - ), - - controller: _clearSource, - - onChanged: (String? value) { - setState(() { - source = value!; - }); - }, - - onSaved: (String? value) { - setState(() { - source = value!; - }); - }, - - validator: (String? value) { - if (value == null || value.isEmpty) { - return 'Article Source/Author tidak boleh kosong!'; - } - return null; - } - ), - - const SizedBox(height: 10,), - - TextButton( - child: Text(_publised_date == null - ? "Pick a date" - : "${_publised_date! - .day}/${_publised_date! - .month}/${_publised_date!.year}"), - // Event Handling for Button - onPressed: () { - showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: DateTime(2000), - lastDate: DateTime(2099), - ).then((date) { - // Tambahkan setState dan panggil variabel _dateTime. - setState(() { - _publised_date = date; - }); - }); - }, - ), - - const SizedBox(height: 10,), - - TextFormField( - decoration: InputDecoration( - hintText: "Contoh: https://www.genevaenvironmentnetwork.org/wp-content/uploads/2020/09/ewaste-aspect-ratio-2000-1200-1024x614.jpg", - labelText: "Image URL", - // icon: const Icon(Icons.add_circle), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular( - 5.0), - ), - ), - - controller: _clearImageUrl, - - onChanged: (String? value) { - setState(() { - image_url = value!; - }); - }, - - onSaved: (String? value) { - setState(() { - image_url = value!; - }); - }, - - validator: (String? value) { - if (value == null || value.isEmpty) { - return 'Image URL tidak boleh kosong!'; - } - return null; - } - ), - - const SizedBox(height: 10,), - - TextFormField( - decoration: InputDecoration( - hintText: "Contoh: https://www.theartofsimple.net/10-ways-to-recycle-your-technology-and-manage-e-waste/", - labelText: "Article URL", - // icon: const Icon(Icons.add_circle), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular( - 5.0), - ), - ), - - controller: _clearArticleUrl, - - onChanged: (String? value) { - setState(() { - article_url = value!; - }); - }, - - onSaved: (String? value) { - setState(() { - article_url = value!; - }); - }, - - validator: (String? value) { - if (value == null || value.isEmpty) { - return 'Article URL tidak boleh kosong!'; - } - return null; - } - ), - - const SizedBox(height: 10,), - - TextFormField( - decoration: InputDecoration( - hintText: "Contoh: Let's managing e-waste", - labelText: "Article Brief Description", - // icon: const Icon(Icons.add_circle), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular( - 5.0), - ), - ), - - controller: _clearBriefDescription, - - onChanged: (String? value) { - setState(() { - brief_description = value!; - }); - }, - - onSaved: (String? value) { - setState(() { - brief_description = value!; - }); - }, - - validator: (String? value) { - if (value == null || value.isEmpty) { - return 'Article Brief Description tidak boleh kosong!'; - } - return null; - } - ), - - // const Spacer(), - const SizedBox(height: 30,), - - Align( - alignment: Alignment.bottomCenter, - child: TextButton( - // ignore: sort_child_properties_last - child: const Text("Submit", - style: TextStyle( - color: Colors.white),), - style: ButtonStyle( - backgroundColor: MaterialStateProperty - .all(Colors.blue), - ), - onPressed: () { - final username = context.watch().getUsername(); - if (_formKey.currentState! - .validate() && - _publised_date != null) { - String publisedDate = _publised_date - .toString().substring(0, 10); - // ignore: unnecessary_new - TipsAndTrick tipsAndTrick = new TipsAndTrick( - user: username, - title: title, - source: source, - published_date: publisedDate, - brief_description: brief_description, - image_url: image_url, - article_url: article_url); - addTipsAndTrick(tipsAndTrick); - ScaffoldMessenger.of(context) - .showSnackBar( - SnackBar( - backgroundColor: Colors.green, - // ignore: prefer_const_constructors - content: Text( - "Data berhasil ditambahkan!"), - action: SnackBarAction( - label: 'Close', - textColor: Colors.white, - onPressed: () { - ScaffoldMessenger.of( - context) - .hideCurrentSnackBar(); - }, - ), - ) - ); - _clearTitle.clear(); - _clearSource.clear(); - _clearImageUrl.clear(); - _clearArticleUrl.clear(); - _clearBriefDescription.clear(); - - setState(() { - _publised_date = null; - }); - } else { - ScaffoldMessenger.of(context) - .showSnackBar( - SnackBar( - backgroundColor: Colors.red, - // ignore: prefer_const_constructors - content: Text( - "Mohon isi data dengan lengkap!"), - action: SnackBarAction( - label: 'Close', - textColor: Colors.white, - onPressed: () { - ScaffoldMessenger.of( - context) - .hideCurrentSnackBar(); - }, - ), - ) - ); - } - }, - ), - ), - ] - ) - ) - ] - ) - ) - ) - ) + ), ); } -} \ No newline at end of file +} diff --git a/penjemputan/lib/page/list_penjemputan.dart b/penjemputan/lib/page/list_penjemputan.dart index 743f249..00d96b6 100644 --- a/penjemputan/lib/page/list_penjemputan.dart +++ b/penjemputan/lib/page/list_penjemputan.dart @@ -19,7 +19,7 @@ class _PenjemputanPage extends State { ), drawer: const MyDrawer(), body: FutureBuilder( - future: fetchPenjemputanItem(), + future: fetchPenjemputanItem(context), builder: (context, AsyncSnapshot snapshot) { if (snapshot.data == null) { return const Center(child: CircularProgressIndicator()); diff --git a/penjemputan/lib/penjemputan.dart b/penjemputan/lib/penjemputan.dart new file mode 100644 index 0000000..a263464 --- /dev/null +++ b/penjemputan/lib/penjemputan.dart @@ -0,0 +1,7 @@ +library penjemputan; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/penjemputan/lib/util/function_add_penjemputan.dart b/penjemputan/lib/util/function_add_penjemputan.dart deleted file mode 100644 index dcb7ec6..0000000 --- a/penjemputan/lib/util/function_add_penjemputan.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'dart:convert'; -import 'package:http/http.dart' as http; -import 'package:penjemputan/model/penjemputan_item.dart'; - -Future addTipsAndTrick(PenjemputanItem penjemputanItem) async { - var url = Uri.parse('https://e-waste-bank.up.railway.app/penjemputan/add/'); - var response = await http.post( - url, - headers: { - "Access-Control_Allow_Origin": "*", - "Content-Type": "application/json; charset=utf-8", - }, - body:jsonEncode(penjemputanItem) - ); -} \ No newline at end of file diff --git a/penjemputan/lib/util/function_fetch_penjemputan.dart b/penjemputan/lib/util/function_fetch_penjemputan.dart index 0cdca8b..162ffbd 100644 --- a/penjemputan/lib/util/function_fetch_penjemputan.dart +++ b/penjemputan/lib/util/function_fetch_penjemputan.dart @@ -1,24 +1,16 @@ -import 'package:http/http.dart' as http; -import 'dart:convert'; import 'package:penjemputan/model/penjemputan_item.dart'; - +import 'package:provider/provider.dart'; +import 'package:pbp_django_auth/pbp_django_auth.dart'; // Menerapkan pemanggilan asynchronous ke Web Service Django -Future> fetchPenjemputanItem() async { - var url = Uri.parse('https://e-waste-bank.up.railway.app/penjemputan/json/'); - var response = await http.get( - url, - headers: { - "Access-Control-Allow-Origin": "*", - "Content-Type": "application/json", - }, - ); +Future> fetchPenjemputanItem(context) async { + final requester = Provider.of(context, listen: false); - // print(response.body); - var data = jsonDecode(utf8.decode(response.bodyBytes)); + var data = await requester + .get("https://e-waste-bank.up.railway.app/penjemputan/json/"); List listPenjemputanItem = []; - for (var d in data){ - if (d != null){ - listPenjemputanItem.add(PenjemputanItem.fromJson(d)); + for (var each in data) { + if (each != null) { + listPenjemputanItem.add(PenjemputanItem.fromJson(each)); } } diff --git a/penjemputan/pubspec.yaml b/penjemputan/pubspec.yaml index a16e7db..59b5b9c 100644 --- a/penjemputan/pubspec.yaml +++ b/penjemputan/pubspec.yaml @@ -1,6 +1,7 @@ name: penjemputan description: A new Flutter package project. version: 0.0.1 +publish_to: "none" homepage: environment: @@ -13,6 +14,9 @@ dependencies: e_waste_bank_mobile: path: ../. + provider: ^6.0.4 + http: ^0.13.5 + pbp_django_auth: ^0.2.3 dev_dependencies: flutter_test: diff --git a/penjemputan/test/penjemputan_test.dart b/penjemputan/test/penjemputan_test.dart deleted file mode 100644 index 34fcfb7..0000000 --- a/penjemputan/test/penjemputan_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:penjemputan/penjemputan.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -} diff --git a/pubspec.yaml b/pubspec.yaml index 3f9af4f..bbe4612 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 +version: 2.0.0+1 environment: sdk: '>=2.18.4 <3.0.0' diff --git a/tips_and_tricks/lib/model/TipsAndTrick.dart b/tips_and_tricks/lib/model/TipsAndTrick.dart index 2c06c4d..a57edfb 100644 --- a/tips_and_tricks/lib/model/TipsAndTrick.dart +++ b/tips_and_tricks/lib/model/TipsAndTrick.dart @@ -1,3 +1,5 @@ +// ignore_for_file: non_constant_identifier_names, file_names + import 'dart:convert'; List tipsAndTrickFromJson(String str) => List.from(json.decode(str).map((x) => TipsAndTrick.fromJson(x))); diff --git a/tips_and_tricks/lib/page/add_tips_and_trick.dart b/tips_and_tricks/lib/page/add_tips_and_trick.dart index 5d47915..d1280eb 100644 --- a/tips_and_tricks/lib/page/add_tips_and_trick.dart +++ b/tips_and_tricks/lib/page/add_tips_and_trick.dart @@ -2,7 +2,6 @@ import 'package:tips_and_tricks/util/add_tips_and_trick.dart'; import 'package:flutter/material.dart'; import 'package:tips_and_tricks/model/TipsAndTrick.dart'; import 'package:e_waste_bank_mobile/drawer.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:e_waste_bank_mobile/authentication/user_provider.dart'; diff --git a/tips_and_tricks/lib/util/add_tips_and_trick.dart b/tips_and_tricks/lib/util/add_tips_and_trick.dart index 4db2672..825432b 100644 --- a/tips_and_tricks/lib/util/add_tips_and_trick.dart +++ b/tips_and_tricks/lib/util/add_tips_and_trick.dart @@ -4,6 +4,7 @@ import 'package:tips_and_tricks/model/TipsAndTrick.dart'; Future addTipsAndTrick(TipsAndTrick tipsAndTrick) async { var url = Uri.parse('https://e-waste-bank.up.railway.app/tips-and-tricks/add-mobile'); + // ignore: unused_local_variable var response = await http.post( url, headers: { diff --git a/tips_and_tricks/pubspec.yaml b/tips_and_tricks/pubspec.yaml index 20da4a7..236e448 100644 --- a/tips_and_tricks/pubspec.yaml +++ b/tips_and_tricks/pubspec.yaml @@ -1,6 +1,8 @@ name: tips_and_tricks description: A new Flutter package project. version: 0.0.1 +publish_to: "none" + homepage: environment: @@ -17,7 +19,8 @@ dependencies: intl: ^0.17.0 http: ^0.13.5 url_launcher: ^6.1.7 - + pbp_django_auth: ^0.2.3 + provider: ^6.0.4 dev_dependencies: flutter_test: diff --git a/tips_and_tricks/test/tips_and_tricks_test.dart b/tips_and_tricks/test/tips_and_tricks_test.dart deleted file mode 100644 index 3517cee..0000000 --- a/tips_and_tricks/test/tips_and_tricks_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:tips_and_tricks/tips_and_tricks.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -}