From 0e89909893a7a05660fa1d40646b18507f1c1b7a Mon Sep 17 00:00:00 2001 From: Syaroful Date: Wed, 16 Oct 2024 10:35:10 +0700 Subject: [PATCH] feat: add logic implementation controlling relay via API --- .../lib/data/model/switch_relay_response.dart | 18 +++++++++ .../lib/domain/service/app_service.dart | 39 ++++++++++++++++--- .../lib/features/auth/view/login_screen.dart | 18 --------- .../control/provider/control_provider.dart | 32 ++++++++++++++- .../features/control/view/control_screen.dart | 11 ++++-- 5 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 agrilink_vocpro/lib/data/model/switch_relay_response.dart diff --git a/agrilink_vocpro/lib/data/model/switch_relay_response.dart b/agrilink_vocpro/lib/data/model/switch_relay_response.dart new file mode 100644 index 0000000..b9e4c62 --- /dev/null +++ b/agrilink_vocpro/lib/data/model/switch_relay_response.dart @@ -0,0 +1,18 @@ +class SwitchRelayResponse { + bool? success; + String? message; + + SwitchRelayResponse({this.success, this.message}); + + SwitchRelayResponse.fromJson(Map json) { + success = json['success']; + message = json['message']; + } + + Map toJson() { + final Map data = {}; + data['success'] = success; + data['message'] = message; + return data; + } +} diff --git a/agrilink_vocpro/lib/domain/service/app_service.dart b/agrilink_vocpro/lib/domain/service/app_service.dart index faac3ad..1698517 100644 --- a/agrilink_vocpro/lib/domain/service/app_service.dart +++ b/agrilink_vocpro/lib/domain/service/app_service.dart @@ -9,8 +9,8 @@ import 'package:agrilink_vocpro/data/model/npk1_graphic_response.dart'; import 'package:agrilink_vocpro/data/model/npk2_graphic_response.dart'; import 'package:agrilink_vocpro/data/model/relay_response.dart'; import 'package:agrilink_vocpro/data/model/latest_data_response.dart'; +import 'package:agrilink_vocpro/data/model/switch_relay_response.dart'; import 'package:dio/dio.dart'; -import 'package:flutter/foundation.dart'; import 'package:jwt_decoder/jwt_decoder.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -70,7 +70,7 @@ class AppService { try { await Future.delayed(const Duration(seconds: 3)); final result = await _dioWithoutInterceptor.get( - 'get-relay', + '/api/get-relay', options: Options( headers: {'Authorization': auth}, ), @@ -82,10 +82,39 @@ class AppService { throw Exception('Failed to load data'); } } on DioException catch (e) { - if (kDebugMode) { - print(e); + final errorMessage = e.response?.data['message']; + throw (errorMessage); + } + } + + // switch relay + + Future switchRelay( + {required int relayNumber, required int state}) async { + final SharedPreferences pref = await SharedPreferences.getInstance(); + final String auth = 'Bearer ${pref.getString('token')}'; + + try { + final response = await _dioWithoutInterceptor.post( + '/api/set-relay', + data: { + 'id': relayNumber, + 'state': state, + }, + options: Options( + headers: {'Authorization': auth}, + ), + ); + + if (response.statusCode == 200 || response.statusCode == 201) { + final data = SwitchRelayResponse.fromJson(response.data); + return data; + } else { + throw Exception('Failed to load data'); } - rethrow; + } on DioException catch (e) { + final errorMessage = e.response?.data['message']; + throw (errorMessage); } } diff --git a/agrilink_vocpro/lib/features/auth/view/login_screen.dart b/agrilink_vocpro/lib/features/auth/view/login_screen.dart index 00f3bd2..b120235 100644 --- a/agrilink_vocpro/lib/features/auth/view/login_screen.dart +++ b/agrilink_vocpro/lib/features/auth/view/login_screen.dart @@ -83,22 +83,4 @@ class LoginScreen extends StatelessWidget { ), ); } - - void _showErrorDialog(BuildContext context, String errorMessage) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text('Error'), - content: Text(errorMessage), - actions: [ - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: const Text('OK'), - ), - ], - ), - ); - } } diff --git a/agrilink_vocpro/lib/features/control/provider/control_provider.dart b/agrilink_vocpro/lib/features/control/provider/control_provider.dart index 4109176..ef570bf 100644 --- a/agrilink_vocpro/lib/features/control/provider/control_provider.dart +++ b/agrilink_vocpro/lib/features/control/provider/control_provider.dart @@ -77,7 +77,37 @@ class ControlProvider extends ChangeNotifier { if (kDebugMode) { print(e); } - rethrow; + } + } + + Future switchRelay(int relayNumber, bool state) async { + relayState = ResultState.loading; + notifyListeners(); + + final int stateConverted; + if (state == true) { + stateConverted = 1; + } else { + stateConverted = 0; + } + try { + final result = await _appService.switchRelay( + relayNumber: relayNumber, state: stateConverted); + if (result.success == true) { + relayState = ResultState.hasData; + notifyListeners(); + print(result.message); + return true; + } else { + return false; + } + } catch (e) { + if (kDebugMode) { + print(e); + } + relayState = ResultState.error; + notifyListeners(); + return false; } } diff --git a/agrilink_vocpro/lib/features/control/view/control_screen.dart b/agrilink_vocpro/lib/features/control/view/control_screen.dart index 10b6d21..2489d8a 100644 --- a/agrilink_vocpro/lib/features/control/view/control_screen.dart +++ b/agrilink_vocpro/lib/features/control/view/control_screen.dart @@ -75,10 +75,13 @@ class ControlScreen extends StatelessWidget { title: 'Katup Air', subtitle: 'Relay 1', isActive: provider.control_1, - onTap: () { - provider.control_1 != true - ? provider.switchControl1(true) - : provider.switchControl1(false); + onTap: () async { + final result = provider.control_1 != true + ? await provider.switchRelay(1, true) + : await provider.switchRelay(1, false); + result == true + ? provider.switchControl1(!provider.control_1) + : provider.switchControl1(provider.control_1); }, ), ControlButtonWidget(