NEW: MIH Calculator Provider Setup

This commit is contained in:
2025-10-08 15:06:04 +02:00
parent a1b7a3ef28
commit bbadc58ab8
5 changed files with 174 additions and 170 deletions

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -77,6 +78,9 @@ class _MzansiInnovationHubState extends State<MzansiInnovationHub> {
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => MihBannerAdProvider(), create: (context) => MihBannerAdProvider(),
), ),
ChangeNotifierProvider(
create: (context) => MihCalculatorProvider(),
),
], ],
child: MaterialApp.router( child: MaterialApp.router(
title: getTitle(), title: getTitle(),

View File

@@ -0,0 +1,21 @@
import 'package:flutter/foundation.dart';
class MihCalculatorProvider extends ChangeNotifier {
List<String> availableCurrencies;
int toolIndex;
MihCalculatorProvider({
this.availableCurrencies = const [],
this.toolIndex = 0,
});
void setToolIndex(int index) {
toolIndex = index;
notifyListeners();
}
void setAvailableCurrencies({required List<String> currencies}) async {
availableCurrencies = currencies;
notifyListeners();
}
}

View File

@@ -3,10 +3,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/currency_exchange_rate.dart'; import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/currency_exchange_rate.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/simple_calc.dart'; import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/simple_calc.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/tip_calc.dart'; import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/tip_calc.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_currency_exchange_rate_services.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class MIHCalculator extends StatefulWidget { class MIHCalculator extends StatefulWidget {
@@ -21,13 +23,16 @@ class MIHCalculator extends StatefulWidget {
} }
class _MIHCalculatorState extends State<MIHCalculator> { class _MIHCalculatorState extends State<MIHCalculator> {
int _selectedIndex = 0; Future<void> getCurrencyCodeList() async {
await MihCurrencyExchangeRateServices.getCurrencyCodeList(context);
}
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
context.read<MihBannerAdProvider>().loadBannerAd(); context.read<MihBannerAdProvider>().loadBannerAd();
await getCurrencyCodeList();
}); });
} }
@@ -38,12 +43,9 @@ class _MIHCalculatorState extends State<MIHCalculator> {
appTools: getTools(), appTools: getTools(),
appBody: getToolBody(), appBody: getToolBody(),
appToolTitles: getToolTitle(), appToolTitles: getToolTitle(),
selectedbodyIndex: _selectedIndex, selectedbodyIndex: context.watch<MihCalculatorProvider>().toolIndex,
onIndexChange: (newValue) { onIndexChange: (newIndex) {
setState(() { context.read<MihCalculatorProvider>().setToolIndex(newIndex);
_selectedIndex = newValue;
});
print("Index: $_selectedIndex");
}, },
); );
} }
@@ -65,23 +67,17 @@ class _MIHCalculatorState extends State<MIHCalculator> {
MihPackageTools getTools() { MihPackageTools getTools() {
Map<Widget, void Function()?> temp = {}; Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.calculate)] = () { temp[const Icon(Icons.calculate)] = () {
setState(() { context.read<MihCalculatorProvider>().setToolIndex(0);
_selectedIndex = 0;
});
}; };
temp[const Icon(Icons.money)] = () { temp[const Icon(Icons.money)] = () {
setState(() { context.read<MihCalculatorProvider>().setToolIndex(1);
_selectedIndex = 1;
});
}; };
temp[const Icon(Icons.currency_exchange)] = () { temp[const Icon(Icons.currency_exchange)] = () {
setState(() { context.read<MihCalculatorProvider>().setToolIndex(2);
_selectedIndex = 2;
});
}; };
return MihPackageTools( return MihPackageTools(
tools: temp, tools: temp,
selcetedIndex: _selectedIndex, selcetedIndex: context.watch<MihCalculatorProvider>().toolIndex,
); );
} }

View File

@@ -9,8 +9,8 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_currency_exchange_rate_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_currency_exchange_rate_services.dart';
@@ -30,7 +30,6 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
final TextEditingController _toCurrencyController = TextEditingController(); final TextEditingController _toCurrencyController = TextEditingController();
final TextEditingController _fromAmountController = TextEditingController(); final TextEditingController _fromAmountController = TextEditingController();
final TextEditingController _toAmountController = TextEditingController(); final TextEditingController _toAmountController = TextEditingController();
late Future<List<String>> availableCurrencies;
Future<void> submitForm() async { Future<void> submitForm() async {
String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0]; String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0];
@@ -276,7 +275,6 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
availableCurrencies = MihCurrencyExchangeRateServices.getCurrencyCodeList();
} }
@override @override
@@ -290,16 +288,12 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
} }
Widget getBody(double width) { Widget getBody(double width) {
return FutureBuilder( return Consumer<MihCalculatorProvider>(
future: availableCurrencies, builder: (context, calculatorProvider, child) {
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Mihloadingcircle();
} else if (snapshot.connectionState == ConnectionState.done) {
return MihSingleChildScroll( return MihSingleChildScroll(
child: Padding( child: Padding(
padding: MzansiInnovationHub.of(context)!.theme.screenType == padding:
"desktop" MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.2) ? EdgeInsets.symmetric(horizontal: width * 0.2)
: EdgeInsets.symmetric(horizontal: width * 0.075), : EdgeInsets.symmetric(horizontal: width * 0.075),
child: Column( child: Column(
@@ -327,7 +321,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
MihDropdownField( MihDropdownField(
controller: _fromCurrencyController, controller: _fromCurrencyController,
hintText: "From", hintText: "From",
dropdownOptions: snapshot.data!, dropdownOptions: calculatorProvider.availableCurrencies,
editable: true, editable: true,
enableSearch: true, enableSearch: true,
validator: (value) { validator: (value) {
@@ -339,7 +333,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
MihDropdownField( MihDropdownField(
controller: _toCurrencyController, controller: _toCurrencyController,
hintText: "To", hintText: "To",
dropdownOptions: snapshot.data!, dropdownOptions: calculatorProvider.availableCurrencies,
editable: true, editable: true,
enableSearch: true, enableSearch: true,
validator: (value) { validator: (value) {
@@ -359,16 +353,13 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
), ),
children: [ children: [
const TextSpan( const TextSpan(
text: text: "* Experimental Feature: Please review "),
"* Experimental Feature: Please review "),
TextSpan( TextSpan(
text: "Diclaimer", text: "Diclaimer",
style: TextStyle( style: TextStyle(
decoration: TextDecoration.underline, decoration: TextDecoration.underline,
color: MihColors.getSecondaryColor( color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark"), "Dark"),
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
@@ -399,9 +390,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
} }
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark"), "Dark"),
width: 300, width: 300,
child: Text( child: Text(
@@ -422,9 +411,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
clearInput(); clearInput();
}, },
buttonColor: MihColors.getRedColor( buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark"), "Dark"),
width: 300, width: 300,
child: Text( child: Text(
@@ -449,18 +436,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
), ),
), ),
); );
} else { },
return Center(
child: Text(
"Error pulling Currency Exchange Data.",
style: TextStyle(
fontSize: 25,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark")),
textAlign: TextAlign.center,
),
); );
} }
});
}
} }

View File

@@ -1,6 +1,9 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/currency.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/currency.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
class MihCurrencyExchangeRateServices { class MihCurrencyExchangeRateServices {
@@ -21,7 +24,7 @@ class MihCurrencyExchangeRateServices {
} }
} }
static Future<List<String>> getCurrencyCodeList() async { static Future<void> getCurrencyCodeList(BuildContext context) async {
final response = await http.get(Uri.parse( final response = await http.get(Uri.parse(
"https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies.min.json")); "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies.min.json"));
if (response.statusCode == 200) { if (response.statusCode == 200) {
@@ -32,7 +35,11 @@ class MihCurrencyExchangeRateServices {
currencies.add("$code - $name"); currencies.add("$code - $name");
}); });
currencies.sort(); currencies.sort();
return currencies; if (response.statusCode == 200) {
context
.read<MihCalculatorProvider>()
.setAvailableCurrencies(currencies: currencies);
}
} else { } else {
throw Exception('failed to fatch currencies'); throw Exception('failed to fatch currencies');
} }