Merge to main #1

Merged
agrilink merged 19 commits from develop-gitea into main 2024-12-30 04:37:02 +00:00
14 changed files with 111 additions and 88 deletions
Showing only changes of commit dcef0cf99d - Show all commits

View File

@ -0,0 +1,30 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class ErrorDataStateWidget extends StatelessWidget {
const ErrorDataStateWidget({
super.key,
});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
BootstrapIcons.exclamation_circle,
color: Colors.grey.shade400,
),
SizedBox(height: 8.h),
Text(
'Terjadi Kesalahan',
style: AppTheme.labelSmall,
),
],
),
);
}
}

View File

@ -3,10 +3,10 @@ import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class GraphicErrorWidget extends StatelessWidget {
const GraphicErrorWidget({super.key, required this.message});
final String message;
class NoDataStateWidget extends StatelessWidget {
const NoDataStateWidget({
super.key,
});
@override
Widget build(BuildContext context) {
@ -14,9 +14,15 @@ class GraphicErrorWidget extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(BootstrapIcons.exclamation_circle, color: Colors.grey.shade400),
Icon(
BootstrapIcons.database_fill_x,
color: Colors.grey.shade400,
),
SizedBox(height: 8.h),
Text(message, style: AppTheme.labelSmall),
Text(
'Tidak Ada Data',
style: AppTheme.labelSmall,
),
],
),
);

View File

@ -1,11 +1,11 @@
import 'dart:convert';
// import 'dart:convert';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/domain/service/app_service.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:http/http.dart' as http;
// import 'package:flutter/services.dart';
// import 'package:googleapis_auth/auth_io.dart';
// import 'package:http/http.dart' as http;
class AuthProvider extends ChangeNotifier {
TextEditingController emailController = TextEditingController();
@ -80,30 +80,30 @@ class AuthProvider extends ChangeNotifier {
return true;
}
Future<void> getAccessToken() async {
try {
final serviceAccountJson = await rootBundle.loadString(
'assets/json/agrilink-vocpro-b37f9-firebase-adminsdk-a4f6g-e6565344e3.json',
);
// Future<void> getAccessToken() async {
// try {
// final serviceAccountJson = await rootBundle.loadString(
// 'assets/json/agrilink-vocpro-b37f9-firebase-adminsdk-a4f6g-e6565344e3.json',
// );
final accountCredentials = ServiceAccountCredentials.fromJson(
json.decode(serviceAccountJson),
);
// final accountCredentials = ServiceAccountCredentials.fromJson(
// json.decode(serviceAccountJson),
// );
const scope = ['https://www.googleapis.com/auth/firebase.messaging'];
// const scope = ['https://www.googleapis.com/auth/firebase.messaging'];
final client = http.Client();
// final client = http.Client();
try {
final accessCredential = await obtainAccessCredentialsViaServiceAccount(
accountCredentials, scope, client);
final accessToken = accessCredential.accessToken.data;
print('Access Token: $accessToken');
} catch (e) {
print('Error: $e');
}
} catch (e) {
print('Error 2: $e');
}
}
// try {
// final accessCredential = await obtainAccessCredentialsViaServiceAccount(
// accountCredentials, scope, client);
// final accessToken = accessCredential.accessToken.data;
// print('Access Token: $accessToken');
// } catch (e) {
// print('Error: $e');
// }
// } catch (e) {
// print('Error 2: $e');
// }
// }
}

View File

@ -1,7 +1,8 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/conductivity/provider/conductivity_provider.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -146,9 +147,9 @@ class ConductivityScreen extends StatelessWidget {
maxValue: 1,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,7 +1,8 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/nitrogen/provider/nitrogen_provider.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -146,9 +147,9 @@ class NitrogenScreen extends StatelessWidget {
maxValue: 1,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,8 +1,9 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/ph/provider/ph_provider.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/ph/widget/ph_bar_pointer.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -137,9 +138,9 @@ class PhScreen extends StatelessWidget {
maxValue: 14,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,7 +1,8 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/phosphorus/provider/phosporus_provider.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -146,9 +147,9 @@ class PhosphorusScreen extends StatelessWidget {
maxValue: 10,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,7 +1,8 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/potassium/provider/potassium_provider.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -146,9 +147,9 @@ class PotassiumScreen extends StatelessWidget {
maxValue: 1,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,7 +1,8 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/soil_moisture/provider/soil_moisture_provider.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -176,9 +177,9 @@ class SoilMoistureScreen extends StatelessWidget {
maxValue: 1,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,4 +1,5 @@
import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:flutter/material.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
@ -226,9 +227,9 @@ class SoilTemperatureScreen extends StatelessWidget {
maxValue: 70,
);
case ResultState.error:
return const GraphicErrorWidget(message: 'Terjadi Kesalahan');
return const ErrorDataStateWidget();
case ResultState.noData:
return const GraphicErrorWidget(message: 'Tidak Ada Data');
return const NoDataStateWidget();
case ResultState.initial:
default:
return const SizedBox.shrink();

View File

@ -1,5 +1,7 @@
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
import 'package:agrilink_vocpro/core/state/result_state.dart';
import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart';
import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart';
import 'package:agrilink_vocpro/features/home/detail_pages/temperature/provider/temp_provider.dart';
import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
@ -30,7 +32,7 @@ class TemperatureScreen extends StatelessWidget {
padding: EdgeInsets.only(right: 16),
child: Icon(
BootstrapIcons.thermometer_half,
color: Colors.red,
color: Colors.orange,
),
)
],
@ -228,39 +230,9 @@ class TemperatureScreen extends StatelessWidget {
0),
);
case ResultState.error:
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
BootstrapIcons.exclamation_circle,
color: Colors.grey.shade400,
),
SizedBox(height: 8.h),
Text(
'Terjadi Kesalahan',
style: AppTheme.labelSmall,
),
],
),
);
return ErrorDataStateWidget();
case ResultState.noData:
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
BootstrapIcons.database_fill_x,
color: Colors.grey.shade400,
),
SizedBox(height: 8.h),
Text(
'Tidak Ada Data',
style: AppTheme.labelSmall,
),
],
),
);
return NoDataStateWidget();
case ResultState.initial:
return const SizedBox.shrink();
default:

View File

@ -54,7 +54,7 @@ class ListDataFromCensorDht extends StatelessWidget {
unit: '%',
icon: BootstrapIcons.droplet_half,
color: Colors.white,
censorIdentifier: 'NPK 1',
censorIdentifier: 'DHT',
onTap: () async {
await context
.push('${AppRoute.humidity}/${provider.dhtHumidity}');
@ -67,6 +67,7 @@ class ListDataFromCensorDht extends StatelessWidget {
unit: '°C',
icon: BootstrapIcons.thermometer_half,
color: Colors.white,
censorIdentifier: 'DHT',
onTap: () async {
await context.push(
'${AppRoute.temperature}/${provider.dhtTemperature}');
@ -79,6 +80,7 @@ class ListDataFromCensorDht extends StatelessWidget {
unit: 'lux',
icon: BootstrapIcons.sun,
color: Colors.white,
censorIdentifier: 'DHT',
onTap: () async {
await context
.push('${AppRoute.light}/${provider.dhtLuminosity}');

View File

@ -55,6 +55,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget {
textColor: Colors.white,
color: AppColor.secondary,
iconColor: Colors.white,
censorIdentifier: censorIdentifier,
onTap: () async {
await context.push(
'${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}');
@ -69,6 +70,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget {
textColor: Colors.white,
color: AppColor.secondary,
iconColor: Colors.white,
censorIdentifier: censorIdentifier,
onTap: () async {
await context.push(
'${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}');
@ -83,6 +85,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget {
textColor: Colors.white,
color: AppColor.secondary,
iconColor: Colors.white,
censorIdentifier: censorIdentifier,
onTap: () async {
await context.push(
'${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}');

View File

@ -18,7 +18,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
const String censorIdentifier = 'NPK 1';
const String censorIdentifier = 'NPK 2';
return Consumer<HomeProvider>(builder: (context, provider, child) {
switch (provider.dataState) {
case ResultState.loading:
@ -54,6 +54,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget {
icon: CupertinoIcons.eyedropper,
textColor: Colors.white,
color: AppColor.secondary,
censorIdentifier: censorIdentifier,
iconColor: Colors.white,
onTap: () async {
await context.push(
@ -69,6 +70,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget {
textColor: Colors.white,
color: AppColor.secondary,
iconColor: Colors.white,
censorIdentifier: censorIdentifier,
onTap: () async {
await context.push(
'${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}');
@ -83,6 +85,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget {
textColor: Colors.white,
color: AppColor.secondary,
iconColor: Colors.white,
censorIdentifier: censorIdentifier,
onTap: () async {
await context.push(
'${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}');