diff --git a/Frontend/lib/main.dart b/Frontend/lib/main.dart index 4cf0b810..c3c12b52 100644 --- a/Frontend/lib/main.dart +++ b/Frontend/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.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_calculator_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:provider/provider.dart'; @@ -77,6 +78,9 @@ class _MzansiInnovationHubState extends State { ChangeNotifierProvider( create: (context) => MihBannerAdProvider(), ), + ChangeNotifierProvider( + create: (context) => MihCalculatorProvider(), + ), ], child: MaterialApp.router( title: getTitle(), diff --git a/Frontend/lib/mih_components/mih_providers/mih_calculator_provider.dart b/Frontend/lib/mih_components/mih_providers/mih_calculator_provider.dart new file mode 100644 index 00000000..e2c66757 --- /dev/null +++ b/Frontend/lib/mih_components/mih_providers/mih_calculator_provider.dart @@ -0,0 +1,21 @@ +import 'package:flutter/foundation.dart'; + +class MihCalculatorProvider extends ChangeNotifier { + List availableCurrencies; + int toolIndex; + + MihCalculatorProvider({ + this.availableCurrencies = const [], + this.toolIndex = 0, + }); + + void setToolIndex(int index) { + toolIndex = index; + notifyListeners(); + } + + void setAvailableCurrencies({required List currencies}) async { + availableCurrencies = currencies; + notifyListeners(); + } +} diff --git a/Frontend/lib/mih_packages/calculator/mih_calculator.dart b/Frontend/lib/mih_packages/calculator/mih_calculator.dart index 01a9f860..96fcbcee 100644 --- a/Frontend/lib/mih_packages/calculator/mih_calculator.dart +++ b/Frontend/lib/mih_packages/calculator/mih_calculator.dart @@ -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_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_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/simple_calc.dart'; import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/tip_calc.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_currency_exchange_rate_services.dart'; import 'package:provider/provider.dart'; class MIHCalculator extends StatefulWidget { @@ -21,13 +23,16 @@ class MIHCalculator extends StatefulWidget { } class _MIHCalculatorState extends State { - int _selectedIndex = 0; + Future getCurrencyCodeList() async { + await MihCurrencyExchangeRateServices.getCurrencyCodeList(context); + } @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { context.read().loadBannerAd(); + await getCurrencyCodeList(); }); } @@ -38,12 +43,9 @@ class _MIHCalculatorState extends State { appTools: getTools(), appBody: getToolBody(), appToolTitles: getToolTitle(), - selectedbodyIndex: _selectedIndex, - onIndexChange: (newValue) { - setState(() { - _selectedIndex = newValue; - }); - print("Index: $_selectedIndex"); + selectedbodyIndex: context.watch().toolIndex, + onIndexChange: (newIndex) { + context.read().setToolIndex(newIndex); }, ); } @@ -65,23 +67,17 @@ class _MIHCalculatorState extends State { MihPackageTools getTools() { Map temp = {}; temp[const Icon(Icons.calculate)] = () { - setState(() { - _selectedIndex = 0; - }); + context.read().setToolIndex(0); }; temp[const Icon(Icons.money)] = () { - setState(() { - _selectedIndex = 1; - }); + context.read().setToolIndex(1); }; temp[const Icon(Icons.currency_exchange)] = () { - setState(() { - _selectedIndex = 2; - }); + context.read().setToolIndex(2); }; return MihPackageTools( tools: temp, - selcetedIndex: _selectedIndex, + selcetedIndex: context.watch().toolIndex, ); } diff --git a/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart b/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart index 2cd27f3f..b0680632 100644 --- a/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart +++ b/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart @@ -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_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_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_calculator_provider.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_currency_exchange_rate_services.dart'; @@ -30,7 +30,6 @@ class _CurrencyExchangeRateState extends State { final TextEditingController _toCurrencyController = TextEditingController(); final TextEditingController _fromAmountController = TextEditingController(); final TextEditingController _toAmountController = TextEditingController(); - late Future> availableCurrencies; Future submitForm() async { String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0]; @@ -276,7 +275,6 @@ class _CurrencyExchangeRateState extends State { @override void initState() { super.initState(); - availableCurrencies = MihCurrencyExchangeRateServices.getCurrencyCodeList(); } @override @@ -290,177 +288,155 @@ class _CurrencyExchangeRateState extends State { } Widget getBody(double width) { - return FutureBuilder( - future: availableCurrencies, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == ConnectionState.done) { - return MihSingleChildScroll( - child: Padding( - padding: MzansiInnovationHub.of(context)!.theme.screenType == - "desktop" + return Consumer( + builder: (context, calculatorProvider, child) { + return MihSingleChildScroll( + child: Padding( + padding: + MzansiInnovationHub.of(context)!.theme.screenType == "desktop" ? EdgeInsets.symmetric(horizontal: width * 0.2) : EdgeInsets.symmetric(horizontal: width * 0.075), - child: Column( - children: [ - MihForm( - formKey: _formKey, - formFields: [ - MihTextFormField( - fillColor: MihColors.getSecondaryColor( + child: Column( + children: [ + MihForm( + formKey: _formKey, + formFields: [ + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: _fromAmountController, + multiLineInput: false, + requiredText: true, + hintText: "Currency Amount", + numberMode: true, + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + const SizedBox(height: 10), + MihDropdownField( + controller: _fromCurrencyController, + hintText: "From", + dropdownOptions: calculatorProvider.availableCurrencies, + editable: true, + enableSearch: true, + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + requiredText: true, + ), + const SizedBox(height: 10), + MihDropdownField( + controller: _toCurrencyController, + hintText: "To", + dropdownOptions: calculatorProvider.availableCurrencies, + editable: true, + enableSearch: true, + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + requiredText: true, + ), + const SizedBox(height: 15), + RichText( + textAlign: TextAlign.left, + text: TextSpan( + style: TextStyle( + fontSize: 15, + color: MihColors.getRedColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - controller: _fromAmountController, - multiLineInput: false, - requiredText: true, - hintText: "Currency Amount", - numberMode: true, - validator: (value) { - return MihValidationServices().isEmpty(value); - }, ), - const SizedBox(height: 10), - MihDropdownField( - controller: _fromCurrencyController, - hintText: "From", - dropdownOptions: snapshot.data!, - editable: true, - enableSearch: true, - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - requiredText: true, - ), - const SizedBox(height: 10), - MihDropdownField( - controller: _toCurrencyController, - hintText: "To", - dropdownOptions: snapshot.data!, - editable: true, - enableSearch: true, - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - requiredText: true, - ), - const SizedBox(height: 15), - RichText( - textAlign: TextAlign.left, - text: TextSpan( + children: [ + const TextSpan( + text: "* Experimental Feature: Please review "), + TextSpan( + text: "Diclaimer", style: TextStyle( - fontSize: 15, - color: MihColors.getRedColor( + decoration: TextDecoration.underline, + color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + fontWeight: FontWeight.bold, ), - children: [ - const TextSpan( - text: - "* Experimental Feature: Please review "), - TextSpan( - text: "Diclaimer", - style: TextStyle( - decoration: TextDecoration.underline, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)! - .theme - .mode == - "Dark"), - fontWeight: FontWeight.bold, - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - displayDisclaimer(); - }, - ), - const TextSpan(text: " before use."), - ], + recognizer: TapGestureRecognizer() + ..onTap = () { + displayDisclaimer(); + }, ), - ), - const SizedBox(height: 25), - Center( - child: Wrap( - spacing: 10, - runSpacing: 10, - children: [ - MihButton( - onPressed: () { - if (_formKey.currentState!.validate()) { - submitForm(); - FocusScope.of(context) - .requestFocus(FocusNode()); - } else { - MihAlertServices() - .formNotFilledCompletely(context); - } - }, - buttonColor: MihColors.getGreenColor( + const TextSpan(text: " before use."), + ], + ), + ), + const SizedBox(height: 25), + Center( + child: Wrap( + spacing: 10, + runSpacing: 10, + children: [ + MihButton( + onPressed: () { + if (_formKey.currentState!.validate()) { + submitForm(); + FocusScope.of(context) + .requestFocus(FocusNode()); + } else { + MihAlertServices() + .formNotFilledCompletely(context); + } + }, + buttonColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + width: 300, + child: Text( + "Calculate", + style: TextStyle( + color: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)! .theme .mode == "Dark"), - width: 300, - child: Text( - "Calculate", - style: TextStyle( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)! - .theme - .mode == - "Dark"), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), + fontSize: 20, + fontWeight: FontWeight.bold, ), - MihButton( - onPressed: () { - clearInput(); - }, - buttonColor: MihColors.getRedColor( + ), + ), + MihButton( + onPressed: () { + clearInput(); + }, + buttonColor: MihColors.getRedColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + width: 300, + child: Text( + "Clear", + style: TextStyle( + color: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)! .theme .mode == "Dark"), - width: 300, - child: Text( - "Clear", - style: TextStyle( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)! - .theme - .mode == - "Dark"), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), + fontSize: 20, + fontWeight: FontWeight.bold, ), - ], + ), ), - ), - ], + ], + ), ), ], ), - ), - ); - } 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, - ), - ); - } - }); + ], + ), + ), + ); + }, + ); } } diff --git a/Frontend/lib/mih_services/mih_currency_exchange_rate_services.dart b/Frontend/lib/mih_services/mih_currency_exchange_rate_services.dart index 2be8748e..02f5bd35 100644 --- a/Frontend/lib/mih_services/mih_currency_exchange_rate_services.dart +++ b/Frontend/lib/mih_services/mih_currency_exchange_rate_services.dart @@ -1,6 +1,9 @@ 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_providers/mih_calculator_provider.dart'; +import 'package:provider/provider.dart'; import 'package:supertokens_flutter/http.dart' as http; class MihCurrencyExchangeRateServices { @@ -21,7 +24,7 @@ class MihCurrencyExchangeRateServices { } } - static Future> getCurrencyCodeList() async { + static Future getCurrencyCodeList(BuildContext context) async { final response = await http.get(Uri.parse( "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies.min.json")); if (response.statusCode == 200) { @@ -32,7 +35,11 @@ class MihCurrencyExchangeRateServices { currencies.add("$code - $name"); }); currencies.sort(); - return currencies; + if (response.statusCode == 200) { + context + .read() + .setAvailableCurrencies(currencies: currencies); + } } else { throw Exception('failed to fatch currencies'); }