From 1622082f5c36e3259b86f7b0339d79549ae12c81 Mon Sep 17 00:00:00 2001 From: Syaroful Date: Thu, 24 Oct 2024 14:09:30 +0700 Subject: [PATCH] refactor: change relay endpoint --- .../lib/core/extension/extention.dart | 4 + .../lib/data/model/relay_response.dart | 18 ++-- .../lib/domain/service/app_service.dart | 10 +-- .../lib/domain/service/firebase_api.dart | 6 -- .../control/provider/control_provider.dart | 52 +----------- .../features/control/view/control_screen.dart | 15 ++-- .../widgets/list_data_from_censor_dht.dart | 7 +- .../widgets/list_data_from_censor_npk1.dart | 83 ++++++++++--------- .../widgets/list_data_from_censor_npk2.dart | 82 +++++++++--------- 9 files changed, 116 insertions(+), 161 deletions(-) diff --git a/agrilink_vocpro/lib/core/extension/extention.dart b/agrilink_vocpro/lib/core/extension/extention.dart index a19384f..cb84c9e 100644 --- a/agrilink_vocpro/lib/core/extension/extention.dart +++ b/agrilink_vocpro/lib/core/extension/extention.dart @@ -16,6 +16,10 @@ String dateFormatterShort(String date) { return formatter.format(dateTime); } +String setTwoDigitAfterComma(double number) { + return number.toStringAsFixed(2); +} + String getGreeting(String time) { DateTime parsedTime = DateTime.parse(time); int hour = parsedTime.hour; diff --git a/agrilink_vocpro/lib/data/model/relay_response.dart b/agrilink_vocpro/lib/data/model/relay_response.dart index bdae310..a9f09e8 100644 --- a/agrilink_vocpro/lib/data/model/relay_response.dart +++ b/agrilink_vocpro/lib/data/model/relay_response.dart @@ -1,15 +1,15 @@ class RelayResponse { bool? success; - List? data; + List? data; RelayResponse({this.success, this.data}); RelayResponse.fromJson(Map json) { success = json['success']; if (json['data'] != null) { - data = []; + data = []; json['data'].forEach((v) { - data!.add(Relay.fromJson(v)); + data!.add(Data.fromJson(v)); }); } } @@ -24,32 +24,29 @@ class RelayResponse { } } -class Relay { +class Data { int? id; int? number; String? enabledAt; String? disabledAt; bool? currentStatus; String? createdAt; - String? updatedAt; - Relay( + Data( {this.id, this.number, this.enabledAt, this.disabledAt, this.currentStatus, - this.createdAt, - this.updatedAt}); + this.createdAt}); - Relay.fromJson(Map json) { + Data.fromJson(Map json) { id = json['id']; number = json['number']; enabledAt = json['enabled_at']; disabledAt = json['disabled_at']; currentStatus = json['current_status']; createdAt = json['created_at']; - updatedAt = json['updated_at']; } Map toJson() { @@ -60,7 +57,6 @@ class Relay { data['disabled_at'] = disabledAt; data['current_status'] = currentStatus; data['created_at'] = createdAt; - data['updated_at'] = updatedAt; return data; } } diff --git a/agrilink_vocpro/lib/domain/service/app_service.dart b/agrilink_vocpro/lib/domain/service/app_service.dart index 1f17a61..58a3017 100644 --- a/agrilink_vocpro/lib/domain/service/app_service.dart +++ b/agrilink_vocpro/lib/domain/service/app_service.dart @@ -107,14 +107,14 @@ class AppService { final String auth = 'Bearer ${pref.getString('token')}'; try { await Future.delayed(const Duration(seconds: 3)); - final result = await _dioWithoutInterceptor.get( - '/api/get-relay', + final response = await _dioWithoutInterceptor.get( + '/api/relay/get-relay', options: Options( headers: {'Authorization': auth}, ), ); - if (result.statusCode == 200) { - final data = RelayResponse.fromJson(result.data); + if (response.statusCode == 200) { + final data = RelayResponse.fromJson(response.data); return data; } else { throw Exception('Failed to load data'); @@ -134,7 +134,7 @@ class AppService { try { final response = await _dioWithoutInterceptor.post( - '/api/set-relay', + '/api/relay/set-relay', data: { 'id': relayNumber, 'state': state, diff --git a/agrilink_vocpro/lib/domain/service/firebase_api.dart b/agrilink_vocpro/lib/domain/service/firebase_api.dart index 024e72b..d2891bc 100644 --- a/agrilink_vocpro/lib/domain/service/firebase_api.dart +++ b/agrilink_vocpro/lib/domain/service/firebase_api.dart @@ -1,5 +1,4 @@ import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/foundation.dart'; class FirebaseApi { final _firebaseMessaging = FirebaseMessaging.instance; @@ -11,10 +10,5 @@ class FirebaseApi { provisional: false, sound: true, ); - - final fCMToken = await _firebaseMessaging.getToken(); - if (kDebugMode) { - print('FCM Token: $fCMToken'); - } } } diff --git a/agrilink_vocpro/lib/features/control/provider/control_provider.dart b/agrilink_vocpro/lib/features/control/provider/control_provider.dart index 378a2a3..9361162 100644 --- a/agrilink_vocpro/lib/features/control/provider/control_provider.dart +++ b/agrilink_vocpro/lib/features/control/provider/control_provider.dart @@ -15,39 +15,8 @@ class ControlProvider extends ChangeNotifier { getRelayStatus(); } - // ResultState mqttState = ResultState.initial; - // ResultState subscribeState = ResultState.initial; - ResultState relayState = ResultState.initial; - // Future connectMqtt() async { - // mqttState = ResultState.loading; - // subscribeState = ResultState.loading; - // notifyListeners(); - - // try { - // final result = await _mqttService.setupMqtt(); - // if (result == ResultState.hasData) { - // mqttState = result; - // final result2 = await _mqttService.subscribeToRelayStatus(); - // // if (result2 == true) { - // // subscribeState = ResultState.hasData; - // // _control_1 = true; - // // } else { - // // subscribeState = ResultState.hasData; - // // _control_1 = false; - // // } - // } else { - // mqttState = ResultState.error; - // } - // } catch (e) { - // mqttState = ResultState.error; - // print(e); - // } - - // notifyListeners(); - // } - Future getRelayStatus() async { relayState = ResultState.loading; notifyListeners(); @@ -75,7 +44,7 @@ class ControlProvider extends ChangeNotifier { relayState = ResultState.error; notifyListeners(); if (kDebugMode) { - print(e); + print('Error Getting Relay Status: $e'); } } } @@ -122,23 +91,4 @@ class ControlProvider extends ChangeNotifier { _control_2 = value; notifyListeners(); } - - // Future publishMessage(String topic, String message) async { - // try { - // final result = await _mqttService.publishMessage(topic, message); - // return result; - // } catch (e) { - // print(e); - // rethrow; - // } - // } - - // Future subscribeToTopic(String topic) async { - // try { - // await _mqttService.subscribeToTopic(topic); - // } catch (e) { - // print(e); - // rethrow; - // } - // } } diff --git a/agrilink_vocpro/lib/features/control/view/control_screen.dart b/agrilink_vocpro/lib/features/control/view/control_screen.dart index 2489d8a..e6eedbd 100644 --- a/agrilink_vocpro/lib/features/control/view/control_screen.dart +++ b/agrilink_vocpro/lib/features/control/view/control_screen.dart @@ -72,7 +72,7 @@ class ControlScreen extends StatelessWidget { ), children: [ ControlButtonWidget( - title: 'Katup Air', + title: 'Katup Nutrisi', subtitle: 'Relay 1', isActive: provider.control_1, onTap: () async { @@ -85,13 +85,16 @@ class ControlScreen extends StatelessWidget { }, ), ControlButtonWidget( - title: 'Lampu Utama', + title: 'Katup Air', subtitle: 'Relay 2', isActive: provider.control_2, - onTap: () { - provider.control_2 != true - ? provider.switchControl2(true) - : provider.switchControl2(false); + onTap: () async { + final result = provider.control_2 != true + ? await provider.switchRelay(2, true) + : await provider.switchRelay(2, false); + result == true + ? provider.switchControl2(!provider.control_2) + : provider.switchControl2(provider.control_2); }, ), ], diff --git a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart index 740b38d..b4517e7 100644 --- a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart +++ b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart @@ -1,4 +1,5 @@ import 'package:agrilink_vocpro/core/constant/app_color.dart'; +import 'package:agrilink_vocpro/core/extension/extention.dart'; import 'package:agrilink_vocpro/core/route/app_route.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; import 'package:agrilink_vocpro/features/home/provider/home_provider.dart'; @@ -50,12 +51,10 @@ class ListDataFromCensorDht extends StatelessWidget { DataDisplayerWidget( title: 'Humidity', subtitle: 'kelembaban udara', - value: provider.dhtHumidity.toString(), + value: setTwoDigitAfterComma(provider.dhtHumidity.toDouble()), unit: '%', icon: BootstrapIcons.droplet_half, - textColor: Colors.white, - color: AppColor.secondary, - iconColor: Colors.white, + color: Colors.white, censorIdentifier: 'NPK 1', onTap: () async { await context diff --git a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart index dce8afc..dc2f4d3 100644 --- a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart +++ b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart @@ -1,4 +1,5 @@ import 'package:agrilink_vocpro/core/constant/app_color.dart'; +import 'package:agrilink_vocpro/core/extension/extention.dart'; import 'package:agrilink_vocpro/core/route/app_route.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; import 'package:agrilink_vocpro/features/home/provider/home_provider.dart'; @@ -46,15 +47,55 @@ class ListDataFromCensorNpk1 extends StatelessWidget { childAspectRatio: 0.9, ), children: [ + DataDisplayerWidget( + title: 'Nitrogen', + subtitle: 'Kadar Nitrogen', + value: provider.npk1SoilNitrogen.toString(), + unit: 'mg/L', + icon: CupertinoIcons.eyedropper, + textColor: Colors.white, + color: AppColor.secondary, + iconColor: Colors.white, + onTap: () async { + await context.push( + '${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}'); + }, + ), + DataDisplayerWidget( + title: 'Phosphorus', + subtitle: 'Kadar Fosfor', + value: provider.npk1SoilPhosphorus.toString(), + unit: 'mg/L', + icon: CupertinoIcons.eyedropper, + textColor: Colors.white, + color: AppColor.secondary, + iconColor: Colors.white, + onTap: () async { + await context.push( + '${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}'); + }, + ), + DataDisplayerWidget( + title: 'Kalium', + subtitle: 'Kadar kalium', + value: provider.npk1SoilPotassium.toString(), + unit: 'mg/L', + icon: CupertinoIcons.eyedropper, + textColor: Colors.white, + color: AppColor.secondary, + iconColor: Colors.white, + onTap: () async { + await context.push( + '${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}'); + }, + ), DataDisplayerWidget( title: 'Temperature', subtitle: 'Suhu tanah', value: provider.npk1Temperature.toString(), unit: '°C', icon: BootstrapIcons.thermometer_half, - textColor: Colors.white, - color: AppColor.secondary, - iconColor: Colors.white, + color: Colors.white, censorIdentifier: censorIdentifier, onTap: () async { await context.push( @@ -100,42 +141,6 @@ class ListDataFromCensorNpk1 extends StatelessWidget { '${AppRoute.conductivity}/${provider.npk1SoilEc}/${provider.npk2SoilEc}'); }, ), - DataDisplayerWidget( - title: 'Nitrogen', - subtitle: 'Kadar Nitrogen', - value: provider.npk1SoilNitrogen.toString(), - unit: 'ppm', - icon: CupertinoIcons.eyedropper, - color: Colors.white, - onTap: () async { - await context.push( - '${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}'); - }, - ), - DataDisplayerWidget( - title: 'Potassium', - subtitle: 'Kadar kalium', - value: provider.npk1SoilPotassium.toString(), - unit: 'ppm', - icon: CupertinoIcons.eyedropper, - color: Colors.white, - onTap: () async { - await context.push( - '${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}'); - }, - ), - DataDisplayerWidget( - title: 'Phosphorus', - subtitle: 'Kadar Fosfor', - value: provider.npk1SoilPhosphorus.toString(), - unit: 'ppm', - icon: CupertinoIcons.eyedropper, - color: Colors.white, - onTap: () async { - await context.push( - '${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}'); - }, - ), ], ); case ResultState.noData: diff --git a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart index eae8708..5905e9e 100644 --- a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart +++ b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart @@ -46,15 +46,55 @@ class ListDataFromCensorNpk2 extends StatelessWidget { childAspectRatio: 0.9, ), children: [ + DataDisplayerWidget( + title: 'Nitrogen', + subtitle: 'Kadar Nitrogen', + value: provider.npk2SoilNitrogen.toString(), + unit: 'mg/L', + icon: CupertinoIcons.eyedropper, + textColor: Colors.white, + color: AppColor.secondary, + iconColor: Colors.white, + onTap: () async { + await context.push( + '${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}'); + }, + ), + DataDisplayerWidget( + title: 'Phosphorus', + subtitle: 'Kadar Fosfor', + value: provider.npk2SoilPhosphorus.toString(), + unit: 'mg/L', + icon: CupertinoIcons.eyedropper, + textColor: Colors.white, + color: AppColor.secondary, + iconColor: Colors.white, + onTap: () async { + await context.push( + '${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}'); + }, + ), + DataDisplayerWidget( + title: 'Kalium', + subtitle: 'Kadar kalium', + value: provider.npk2SoilPotassium.toString(), + unit: 'mg/L', + icon: CupertinoIcons.eyedropper, + textColor: Colors.white, + color: AppColor.secondary, + iconColor: Colors.white, + onTap: () async { + await context.push( + '${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}'); + }, + ), DataDisplayerWidget( title: 'Temperature', subtitle: 'Suhu tanah', value: provider.npk2Temperature.toString(), unit: '°C', icon: BootstrapIcons.thermometer_half, - textColor: Colors.white, - color: AppColor.secondary, - iconColor: Colors.white, + color: Colors.white, censorIdentifier: censorIdentifier, onTap: () async { await context.push( @@ -100,42 +140,6 @@ class ListDataFromCensorNpk2 extends StatelessWidget { '${AppRoute.conductivity}/${provider.npk1SoilEc}/${provider.npk2SoilEc}'); }, ), - DataDisplayerWidget( - title: 'Nitrogen', - subtitle: 'Kadar Nitrogen', - value: provider.npk2SoilNitrogen.toString(), - unit: 'ppm', - icon: CupertinoIcons.eyedropper, - color: Colors.white, - onTap: () async { - await context.push( - '${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}'); - }, - ), - DataDisplayerWidget( - title: 'Potassium', - subtitle: 'Kadar kalium', - value: provider.npk2SoilPotassium.toString(), - unit: 'ppm', - icon: CupertinoIcons.eyedropper, - color: Colors.white, - onTap: () async { - await context.push( - '${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}'); - }, - ), - DataDisplayerWidget( - title: 'Phosphorus', - subtitle: 'Kadar Fosfor', - value: provider.npk2SoilPhosphorus.toString(), - unit: 'ppm', - icon: CupertinoIcons.eyedropper, - color: Colors.white, - onTap: () async { - await context.push( - '${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}'); - }, - ), ], ); case ResultState.noData: