booleanbites / houzi-support

Support forum repo for issues & bugs reported for Houzi Flutter App.
4 stars 0 forks source link

App icon not change #22

Closed saharukkarim closed 1 year ago

saharukkarim commented 1 year ago

I will add my icon in mindmap floder in menully but when i build apk app icon is not changes

AdilSoomro commented 1 year ago

Hello, we also use adaptive icons. Either you can provide your own adaptive icon or remove those icons. If you want to add your own adaptive icons, replace these files with your own:

If you want to remove adaptive icon, remove these files:

If you want to know more about adaptive icons, read more here: Adaptive Icons

saharukkarim commented 1 year ago

Ok i will try now but if not working plz help me after

saharukkarim commented 1 year ago

Screenshot_20230110-175233 Property features show dobule dobule

saharukkarim commented 1 year ago

Property features show dobule dobule

saharukkarim commented 1 year ago

![Uploading Screenshot_20230110-175233.jpg…]()

AdilSoomro commented 1 year ago

Hello, Thanks for reporting this issue. Team will look into it and update solution here.

saharukkarim commented 1 year ago

Hello

Hassan6197 commented 1 year ago

Hi @saharukkarim, Thank you for reporting this issue. To fix this, go to packages/houzi_package/lib/pages/property_details_related_pages/features_list.dart and look for initState() method. Replace this method with the following piece of code:

@override
void initState() {
  super.initState();
  featuresList = widget.featuresList;
  featuresList = featuresList.toSet().toList();
}
saharukkarim commented 1 year ago
image
saharukkarim commented 1 year ago

Replace this code?

AdilSoomro commented 1 year ago

No, you've top open features_list.dart file. You can find at below path:

packages/houzi_package/lib/pages/property_details_related_pages/features_list.dart
saharukkarim commented 1 year ago
image image
saharukkarim commented 1 year ago

Please Help

AdilSoomro commented 1 year ago

Pleas follow the documentation, you’re still using com.houzi.app, it should be your own unique app id. Read documentation related to app identifier here: App Identifier

To fix your Android SDK issue, make sure to clean your project. Open this file Project_HOME > android > app > build.gradle Then change the sdk version to Android 33 Then create your app bundle, and upload.

Additionally, make sure you’ve integrated your own firebase, googlecloud, maps and places api keys as well. Follow the documentation step by step.

Mrmontez commented 1 year ago

Hello can someone please help me, am still facing error to change the icon? It is still the demo icon and I can't change it. I have tried the comment shared above by using adaptive icon but still no luck?

Mrmontez commented 1 year ago

Please explain why I can't build my app without getting your icon on my app, and also when I use the software to modify the app it removes the purchase code and the mobile login when exporting the configuration file.

I have done all that I see in your guide, and still doesn't work as it should. I need you to confirm how to generate my app with a working state. That your icon won't show on my app, and about the issues of the purchase code and the mobile login problem. And you need to rise the (ext.kotlin_version) to '1.6.21' also you need to add this (android:exported= "true") because it is giving errors.

Please give me a solution for this as soon as you can.

AdilSoomro commented 1 year ago

@Mrmontez please create new issue.

Mrmontez commented 1 year ago

@AdilSoomro please check the new issue. Created as requested.

saharukkarim commented 1 year ago

Can i add custom link in side drawer? If possible please help how can i do

AdilSoomro commented 1 year ago

Yes, refer to our docs here: Add Item to drawer

Essentially something you’ll do from hooks.dart

First import this line import 'package:houzi_package/pages/app_settings_pages/web_page.dart'; go to Hooks.dart file and look for getDrawerItems(), replace it with this piece of code, paste it and modify according to your need

static getDrawerItems() {
    DrawerHook drawerHook = (BuildContext context) {
      DrawerItem drawerItem = DrawerItem(
        sectionType: "hook",
        title: "title",              // Add your title name you want to show in drawer
        checkLogin: false,           // if you want to check login first then make it true
        enable: true,
        icon: Icons.language_outlined,   // You can choose any material icon
        onTap: () {                      // this is the example of on tap function if you want to open link in webview
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => WebPage("https://www.google.com/","Google"), 
                 // pass the link and Webview appbar title in the first and second parameter respectively
            ),
          );
        },
        insertAt: 4,    // if you want to specify the index in drawer
      );

      List<dynamic> drawerItemList = [drawerItem];

      return drawerItemList;
    };
    return drawerHook;
  }
saharukkarim commented 1 year ago

Thanks its working. How to add multiple item in drawer?

AdilSoomro commented 1 year ago

Create multiple DrawerItem and add it to drawerItemList.

saharukkarim commented 1 year ago

Can you provide sample code? i can't find DrawerItem and add it to drawerItemList

AdilSoomro commented 1 year ago

That is literally available in sample code above, third line.

saharukkarim commented 1 year ago

I couldn't add multiple items in drawer

AdilSoomro commented 1 year ago

Share your code.

saharukkarim commented 1 year ago

import 'package:flutter/material.dart'; import 'package:houzi_package/dataProvider/locale_provider.dart'; import 'package:houzi_package/houzi_main.dart'; import 'package:houzi_package/l10n/l10n.dart'; import 'package:houzi_package/models/article.dart'; import 'package:houzi_package/models/drawer_menu_item.dart'; import 'package:houzi_package/models/realtor_model.dart'; import 'package:houzi_package/pages/home_page_screens/home_elegant_related/related_widgets/home_elegant_sliver_app_bar.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/all_agents.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/settings_page.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/user_related/phone_sign_in_widgets/user_get_phone_number.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/user_related/user_profile.dart'; import 'package:houzi_package/pages/property_details_related_pages/pd_widgets_listing.dart'; import 'package:houzi_package/widgets/article_box_widgets/article_box_design.dart'; import 'package:houzi_package/widgets/explore_by_type_design_widgets/explore_by_type_design.dart'; import 'package:houzi_package/widgets/generic_settings_row_widget.dart'; import 'package:houzi_package/widgets/home_screen_widgets/home_screen_drawer_widgets/home_screen_drawer_widget.dart'; import 'package:houzi_package/widgets/home_screen_widgets/home_screen_realtors_related_widgets/home_screen_realtors_list.dart'; import 'package:houzi_package/widgets/home_screen_widgets/home_screen_sliver_app_bar_widgets/search_by_id_widget.dart'; import 'package:houzi_package/pages/app_settings_pages/web_page.dart'; class IconHooks { static getHeaderMap() { Map<String, dynamic> map = { // "secretkey": "!@#%^&*()-+=", "secret_key": "", }; return map; }

static getPropertyDetailPageIconsMap() { Map<String, dynamic> _iconMap = { // "Air Conditioning": Icons.ac_unit_outlined, };

return _iconMap;

}

static getElegantHomeTermsIconMap() { Map<String, dynamic> _iconMap = { // "for-rent": Icons.vpn_key_outlined, };

return _iconMap;

} }

class CustomDrawerHooks { static getDrawerItems() { DrawerHook drawerHook = (BuildContext context) { DrawerItem drawerItem = DrawerItem( sectionType: "hook", title: "Loan Calculator", // Add your title name you want to show in drawer checkLogin: false, // if you want to check login first then make it true enable: true, icon: Icons.calculate, // You can choose any material icon onTap: () { // this is the example of on tap function if you want to open link in webview Navigator.push( context, MaterialPageRoute( builder: (context) => WebPage("https://my.iqibd.com/loan.html","Loan Calculator"), // pass the link and Webview appbar title in the first and second parameter respectively ), ); }, insertAt: 4, // if you want to specify the index in drawer

  );

  List<dynamic> drawerItemList = [drawerItem];

  return drawerItemList;
};
return drawerHook;

}

}

class CustomFontsHooks { static getFontHook() { FontsHook fontsHook = (Locale locale) { // return "Ubuntu"; // return "Qwitcher_Grypen"; return ""; };

return fontsHook;

} }

class CustomItemDesignHooks { //provide your own design for property item static getPropertyItemHook() { PropertyItemHook propertyItemHook = (BuildContext context, Article article) { // return Container( // child: Center(child: Text(article.title)), // );

  return null;
};

return propertyItemHook;

} //provide your own design for term item design in the app static getTermItemHook() { TermItemHook termItemHook = (List metaDataList) { return null; };

return termItemHook;

} //provide your own designs for agent item design in the app. static getAgentItemHook() { AgentItemHook agentItemHook = (Agent item) { // return Container( // height: 100, // padding: EdgeInsets.only( // bottom: 10, // ), // child: Card( // // shape: AppThemePreferences.roundedCorners(AppThemePreferences.realtorPageRoundedCornersRadius), // // elevation: AppThemePreferences.horizontalListForAgentsElevation, // child: InkWell( // borderRadius: const BorderRadius.all(Radius.circular(10)), // onTap: () { // // navigateToRealtorInformationDisplayPage( // // context: context, // // heroId: heroId, // // realtorType: tag == AGENTS_TAG ? AGENT_INFO : AGENCY_INFO, // // realtorInfo: tag == AGENTS_TAG ? {AGENT_DATA : item} : {AGENCY_DATA : item}, // // ); // }, // child: Container( // // width: , // // height: 135, // height: 100, // padding: const EdgeInsets.symmetric(horizontal: 10), // child: Text( // item.title, // textAlign: TextAlign.left, // maxLines: 1, // strutStyle: const StrutStyle(forceStrutHeight: true), // overflow: TextOverflow.ellipsis, // // style: AppThemePreferences().appTheme.homeScreenRealtorTitleTextStyle, // ), // ), // ), // ), // ); return null; }; return agentItemHook; } //provide your own design for agency item static getAgencyItemHook() { AgencyItemHook agencyItemHook = (Agency agency) { return null; };

return agencyItemHook;

} }

class CustomWidgetHooks { //provide your own design for each section of the property page //you can use the provided details in Article (property) static getWidgetHook() { PropertyPageWidgetsHook detailsHook = (BuildContext context, Article article, String hook) { if (hook == 'article_images') { return null; } else if (hook == 'article_title') { return null; } else if (hook == 'article_address') { return null; } else if (hook == 'article_status_price') { return null; } else if (hook == 'valued_features') { return null; } else if (hook == 'article_features_details') { return null; } else if (hook == 'article_features') { return null; } else if (hook == 'article_description') { return null; // return descriptionWidget(article); } else if (hook == 'article_address_info') { return null; } else if (hook == 'article_map') { return null; } else if (hook == 'article_floor_plans') { return null; } else if (hook == 'article_multi_units') { return null; } else if (hook == 'article_contact_information') { return null; } else if (hook == 'enquire_info') { return null; } else if (hook == 'setup_tour') { return null; } else if (hook == 'watch_video') { return null; } else if (hook == 'virtual_tour') { return null; } else if (hook == 'article_related_posts') { return null; } return null; };

return detailsHook;

} //a sample widget for description in property details page. static Widget descriptionWidget(Article article) { if (article != null) { String content = article.content; return content != null && content.isNotEmpty ? Container( padding: const EdgeInsets.fromLTRB(20, 5, 20, 0), child: Align( alignment: Alignment.centerLeft, child: Text( content, maxLines: 5, overflow: TextOverflow.ellipsis, textAlign: TextAlign.justify, ), ), ) : Container(); } else { return Container(); } }

// static Widget descriptionWidget(Article article) { // return Text( // article.content, // maxLines: 5, // overflow: TextOverflow.ellipsis, // textAlign: TextAlign.justify, // ); // } }

class CustomLanguageHooks { //add new language static getLanguageCodeAndName() { LanguageHook languageHook = () { /// Make sure to add LANGUAGE-CODE_localization.json is added in asset and path /// must be define in project level pubspec.yaml /// assets/localization/LANGUAGE-CODE_localization.json

  Map<String,dynamic> russianLanguageMap = {
    "languageName": "Russian",
    "languageCode": "ru"
  };

  Map<String,dynamic> yourLanguageMap = {
    "languageName": "YOUR-LANGUAGE-NAME", // Specify your language name
    "languageCode": "YOUR-LANGUAGE-CODE"  // Specify your language code
  };

  Map<String,dynamic> amhericLanguageMap = {
    "languageName": "Amheric",
    "languageCode": "am"
  };

  Map<String,dynamic> turkishLanguageMap = {
    "languageName": "Turkish",
    "languageCode": "tr"
  };

  List<dynamic> languageList = [russianLanguageMap,amhericLanguageMap, turkishLanguageMap];
  return languageList;
};

return languageHook;

}

}

class DefaultHook {

static getDefaultLanguageHook() { DefaultLanguageCodeHook defaultLanguageCodeHook = () { /// Write here your default language code String defaultLanguage = "en"; return defaultLanguage; };

return defaultLanguageCodeHook;

}

static getDefaultCountryCodeHook() { DefaultCountryCodeHook defaultCountryCodeHook = () { /// return 2 Letter ISO Code to make it default country code for phone login return "PK"; };

return defaultCountryCodeHook;

} }

class HomeRightBarButtonWidgetHookClass { static getHomeRightBarButtonWidgetHookHook() { HomeRightBarButtonWidgetHook homeRightBarButtonWidgetHook = (context) {

  Widget rightBarButtonHook = null;
  // Widget rightBarButtonHook = SearchByIdWidget();

  return rightBarButtonHook;
};

return homeRightBarButtonWidgetHook;

} }

class SettingsPageHook{ static getSettingsItemHook(){ SettingsHook settingsHook = (BuildContext context){ /// /// /// For info about adding Setting item visit below link: /// https://houzi-docs.booleanbites.com/hooks-widgets/add_item_settings/

  List<dynamic> settingsItemHookList = [
    // Add menu item map here
  ];
  return settingsItemHookList;
};
return settingsHook;

} }

class ProfilePageHook{ static getProfileItemHook(){ ProfileHook profileHook = (BuildContext context){ /// /// /// For info about adding Profile item visit below link: /// https://houzi-docs.booleanbites.com/hooks-widgets/add_item_profile/

  List<Widget> profileItemHookList = [
    // Add menu item map here
  ];
  return profileItemHookList;
};
return profileHook;

} }

AdilSoomro commented 1 year ago

Only share the code that you tried to add multiple items.

saharukkarim commented 1 year ago
class CustomDrawerHooks {
  static getDrawerItems() {
    DrawerHook drawerHook = (BuildContext context) {
      DrawerItem drawerItem = DrawerItem(
        sectionType: "hook",
        title: "Loan Calculator",              // Add your title name you want to show in drawer
        checkLogin: false,           // if you want to check login first then make it true
        enable: true,
        icon: Icons.calculate,   // You can choose any material icon
        onTap: () {                      // this is the example of on tap function if you want to open link in webview
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => WebPage("https://iqibd.com/loan.html","Loan Calculator"),
              // pass the link and Webview appbar title in the first and second parameter respectively
            ),
          );
        },
        insertAt: 4,    // if you want to specify the index in drawer

      );

      List<dynamic> drawerItemList = [drawerItem];

      return drawerItemList;
    };
    return drawerHook;
  }

}
saharukkarim commented 1 year ago

I add one item but want to add multiple item

AdilSoomro commented 1 year ago

Just like you added one DrawerItem to List, you'll add more items like below:

DrawerItem drawerItem = DrawerItem(
        ...
        title: "Loan Calculator",              // Add your title name you want to show in drawer
        ...
);

DrawerItem drawerItemSecond = DrawerItem(
        ...
        title: "Second Item",              // Add your title name you want to show in drawer
        ...
);

DrawerItem drawerItemThird = DrawerItem(
        ...
        title: "Third Item",              // Add your title name you want to show in drawer
        ...
);

List<dynamic> drawerItemList = [drawerItem, drawerItemSecond, drawerItemThird];
AdilSoomro commented 1 year ago

followup. did it solve your issue?

Alphonseaaron commented 1 year ago

I keep getting this error after running houzimain.dart then it's stuck on splash screen closure call with mismatched arguments: function 'main' Tried calling: main()

AdilSoomro commented 1 year ago

Hello @Alphonseaaron please create your separate issue.

saharukkarim commented 1 year ago

Screenshot_20230122-231635 Can i hide this segment?

AdilSoomro commented 1 year ago

hello, open following file:

Project_HOME > packages > houzi_package > lib > common > constants.dart

and look for these variables and set to false

const bool SHOW_DEMO_CONFIGURATIONS = false;
bool SHOW_THEME_RELATED_SETTINGS = false;

Open following file:

Project_HOME > packages > houzi_package > lib > pages > home_screen_drawer_menu_pages > settings_page.dart

and modify the first line of the method exploreByTypeThemeDesignsWidget() as below:

Widget exploreByTypeThemeDesignsWidget(BuildContext context, ItemDesignNotifier itemDesignNotifier){
    return !SHOW_THEME_RELATED_SETTINGS ? Container() : genericSettingsWidget(
    ...
}

the change in first line is to insert !SHOW_THEME_RELATED_SETTINGS ? Container() : after return keyword.

saharukkarim commented 1 year ago

Hello Can i add bangla language in apps?

AdilSoomro commented 1 year ago

Yes, please follow Doc here:

saharukkarim commented 1 year ago

Screenshot_20230130-012105 Search by id not showing .Plz help

AdilSoomro commented 1 year ago

Please follow the doc:

Customize Home Right Bar Button Id Widget

It adds the search by id functionality via DefaultRightBarButtonIdWidget()

saharukkarim commented 1 year ago
image

Please See it

Hassan6197 commented 1 year ago

Hello @saharukkarim, Place the following code at the end of Hooks.dart file. The imports should be at the top of the file.

import 'package:flutter/material.dart';
import 'package:houzi_package/common/constants.dart';
import 'package:houzi_package/files/app_preferences/app_preferences.dart';
import 'package:houzi_package/files/generic_methods/utility_methods.dart';
import 'package:houzi_package/pages/property_details_page.dart';
import 'package:houzi_package/pages/search_result.dart';
import 'package:houzi_package/widgets/dialog_box_widget.dart';
import 'package:houzi_package/widgets/generic_text_widget.dart';

class DefaultRightBarButtonIdWidget extends StatefulWidget {
  const DefaultRightBarButtonIdWidget({Key? key}) : super(key: key);

  @override
  State<DefaultRightBarButtonIdWidget> createState() => _DefaultRightBarButtonIdWidgetState();
}

class _DefaultRightBarButtonIdWidgetState extends State<DefaultRightBarButtonIdWidget> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      child: Row(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          AppThemePreferences().appTheme.homeScreenTopBarSearchIcon!,
          genericTextWidget(
            UtilityMethods.getLocalizedString("id"),
            style: AppThemePreferences().appTheme.searchByIdTextStyle,
          ),
        ],
      ),
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
        _searchByPropertyIdDialog(context);
      },
    );
  }

  Future _searchByPropertyIdDialog(BuildContext context) {
    GlobalKey<FormState> formKey = GlobalKey<FormState>();
    String propertyId = "";
    return dialogBoxWidget(
      context,
      title: UtilityMethods.getLocalizedString("search_property"),
      textAlign: TextAlign.center,
      content: Form(
        key: formKey,
        child: TextFormField(
          textInputAction: TextInputAction.search,
          // keyboardType: TextInputType.text,
          // inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly,],
          onFieldSubmitted: (text) {
            if(formKey.currentState!.validate()){
              searchByIdOnSubmit(context, propertyId);
            }
          },
          onChanged: (text){
            propertyId = text;
          },
          validator: (text){
            if(text == null || text.isEmpty){
              return UtilityMethods.getLocalizedString("this_field_cannot_be_empty");
            }
            return null;
          },
          decoration: InputDecoration(
            hintText: UtilityMethods.getLocalizedString("search"),
            focusedBorder: OutlineInputBorder(
              borderRadius: const BorderRadius.all(Radius.circular(24.0)),
              borderSide: BorderSide(color: AppThemePreferences().appTheme.primaryColor!),
            ),
            enabledBorder: OutlineInputBorder(
              borderRadius: const BorderRadius.all(Radius.circular(24.0)),
              borderSide: BorderSide(color: Colors.grey[300]!),
            ),
            suffixIcon: AppThemePreferences().appTheme.searchBarIcon,
            contentPadding: const EdgeInsets.symmetric(vertical: 15.0, horizontal: 20.0),
          ),
        ),
      ),
      actions: <Widget>[
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: genericTextWidget(UtilityMethods.getLocalizedString("cancel")),
        ),
        TextButton(
          child: genericTextWidget(UtilityMethods.getLocalizedString("go")),
          onPressed: () {
            if(formKey.currentState!.validate()){
              searchByIdOnSubmit(context, propertyId);
            }
          },
        ),
      ],
    );
  }

  void searchByIdOnSubmit(BuildContext context, String propertyId){
    String heroId = propertyId + SINGLE;
    if(UtilityMethods.isNumeric(propertyId)) {
      int id = int.parse(propertyId);
      Route route = MaterialPageRoute(
        builder: (context) => PropertyDetailsPage(
          propertyID: id,
          heroId: heroId,
        ),
      );
      Navigator.pushReplacement(context, route);

    } else {
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => SearchResult(
            searchRelatedData: UtilityMethods.isText(propertyId)
                ? {PROPERTY_KEYWORD : propertyId}
                : {PROPERTY_UNIQUE_ID : propertyId},
            searchPageListener: (Map<String, dynamic> map, String closeOption){
              if(closeOption == CLOSE){
                Navigator.of(context).pop();
              }
            },
          ),
        ),
      );
    }
  }
}
saharukkarim commented 1 year ago

I face error can you provide full code for hooks.dart

Hassan6197 commented 1 year ago

What's the error?

saharukkarim commented 1 year ago

import 'package:flutter/material.dart'; import 'package:houzi_package/dataProvider/locale_provider.dart'; import 'package:houzi_package/houzi_main.dart'; import 'package:houzi_package/l10n/l10n.dart'; import 'package:houzi_package/models/article.dart'; import 'package:houzi_package/models/drawer_menu_item.dart'; import 'package:houzi_package/models/realtor_model.dart'; import 'package:houzi_package/pages/home_page_screens/home_elegant_related/related_widgets/home_elegant_sliver_app_bar.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/all_agents.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/settings_page.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/user_related/phone_sign_in_widgets/user_get_phone_number.dart'; import 'package:houzi_package/pages/home_screen_drawer_menu_pages/user_related/user_profile.dart'; import 'package:houzi_package/pages/property_details_related_pages/pd_widgets_listing.dart'; import 'package:houzi_package/widgets/article_box_widgets/article_box_design.dart'; import 'package:houzi_package/widgets/explore_by_type_design_widgets/explore_by_type_design.dart'; import 'package:houzi_package/widgets/generic_settings_row_widget.dart'; import 'package:houzi_package/widgets/home_screen_widgets/home_screen_drawer_widgets/home_screen_drawer_widget.dart'; import 'package:houzi_package/widgets/home_screen_widgets/home_screen_realtors_related_widgets/home_screen_realtors_list.dart'; import 'package:houzi_package/widgets/home_screen_widgets/home_screen_sliver_app_bar_widgets/search_by_id_widget.dart'; import 'package:houzi_package/pages/app_settings_pages/web_page.dart'; import 'package:flutter/material.dart'; import 'package:houzi_package/common/constants.dart'; import 'package:houzi_package/files/app_preferences/app_preferences.dart'; import 'package:houzi_package/files/generic_methods/utility_methods.dart'; import 'package:houzi_package/pages/property_details_page.dart'; import 'package:houzi_package/pages/search_result.dart'; import 'package:houzi_package/widgets/dialog_box_widget.dart'; import 'package:houzi_package/widgets/generic_text_widget.dart'; class IconHooks { static getHeaderMap() { Map<String, dynamic> map = { // "secretkey": "!@#%^&*()-+=", "secret_key": "", }; return map; }

static getPropertyDetailPageIconsMap() { Map<String, dynamic> _iconMap = { // "Air Conditioning": Icons.ac_unit_outlined, };

return _iconMap;

}

static getElegantHomeTermsIconMap() { Map<String, dynamic> _iconMap = { // "for-rent": Icons.vpn_key_outlined, };

return _iconMap;

} }

class CustomDrawerHooks { static getDrawerItems() { DrawerHook drawerHook = (BuildContext context) { DrawerItem drawerItem = DrawerItem( sectionType: "hook", title: "Loan Calculator", // Add your title name you want to show in drawer checkLogin: false, // if you want to check login first then make it true enable: true, icon: Icons.calculate, // You can choose any material icon onTap: () { // this is the example of on tap function if you want to open link in webview Navigator.push( context, MaterialPageRoute( builder: (context) => WebPage("https://iqibd.com/loan.html","Loan Calculator"), // pass the link and Webview appbar title in the first and second parameter respectively ), ); }, insertAt: 4, // if you want to specify the index in drawer

  );
  DrawerItem drawerItemSecond = DrawerItem(
    sectionType: "hook",
    title: "Area Converter",              // Add your title name you want to show in drawer
    checkLogin: false,           // if you want to check login first then make it true
    enable: true,
    icon: Icons.crop_rotate,   // You can choose any material icon
    onTap: () {                      // this is the example of on tap function if you want to open link in webview
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => WebPage("https://iqibd.com/areacon.html","Area Converter"),
          // pass the link and Webview appbar title in the first and second parameter respectively
        ),
      );
    },
    insertAt: 5,    // if you want to specify the index in drawer

  );
  DrawerItem drawerItemThird = DrawerItem(
    sectionType: "hook",
    title: "Plot Finder",              // Add your title name you want to show in drawer
    checkLogin: false,           // if you want to check login first then make it true
    enable: true,
    icon: Icons.near_me,   // You can choose any material icon
    onTap: () {                      // this is the example of on tap function if you want to open link in webview
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => WebPage("https://iqibd.com/plot.html","Plot Finder"),
          // pass the link and Webview appbar title in the first and second parameter respectively
        ),
      );
    },
    insertAt: 6,    // if you want to specify the index in drawer

  );

  List<dynamic> drawerItemList = [drawerItem, drawerItemSecond, drawerItemThird];

  return drawerItemList;
};
return drawerHook;

}

}

class CustomFontsHooks { static getFontHook() { FontsHook fontsHook = (Locale locale) { // return "Ubuntu"; // return "Qwitcher_Grypen"; return ""; };

return fontsHook;

} }

class CustomItemDesignHooks { //provide your own design for property item static getPropertyItemHook() { PropertyItemHook propertyItemHook = (BuildContext context, Article article) { // return Container( // child: Center(child: Text(article.title)), // );

  return null;
};

return propertyItemHook;

} //provide your own design for term item design in the app static getTermItemHook() { TermItemHook termItemHook = (List metaDataList) { return null; };

return termItemHook;

} //provide your own designs for agent item design in the app. static getAgentItemHook() { AgentItemHook agentItemHook = (Agent item) { // return Container( // height: 100, // padding: EdgeInsets.only( // bottom: 10, // ), // child: Card( // // shape: AppThemePreferences.roundedCorners(AppThemePreferences.realtorPageRoundedCornersRadius), // // elevation: AppThemePreferences.horizontalListForAgentsElevation, // child: InkWell( // borderRadius: const BorderRadius.all(Radius.circular(10)), // onTap: () { // // navigateToRealtorInformationDisplayPage( // // context: context, // // heroId: heroId, // // realtorType: tag == AGENTS_TAG ? AGENT_INFO : AGENCY_INFO, // // realtorInfo: tag == AGENTS_TAG ? {AGENT_DATA : item} : {AGENCY_DATA : item}, // // ); // }, // child: Container( // // width: , // // height: 135, // height: 100, // padding: const EdgeInsets.symmetric(horizontal: 10), // child: Text( // item.title, // textAlign: TextAlign.left, // maxLines: 1, // strutStyle: const StrutStyle(forceStrutHeight: true), // overflow: TextOverflow.ellipsis, // // style: AppThemePreferences().appTheme.homeScreenRealtorTitleTextStyle, // ), // ), // ), // ), // ); return null; }; return agentItemHook; } //provide your own design for agency item static getAgencyItemHook() { AgencyItemHook agencyItemHook = (Agency agency) { return null; };

return agencyItemHook;

} }

class CustomWidgetHooks { //provide your own design for each section of the property page //you can use the provided details in Article (property) static getWidgetHook() { PropertyPageWidgetsHook detailsHook = (BuildContext context, Article article, String hook) { if (hook == 'article_images') { return null; } else if (hook == 'article_title') { return null; } else if (hook == 'article_address') { return null; } else if (hook == 'article_status_price') { return null; } else if (hook == 'valued_features') { return null; } else if (hook == 'article_features_details') { return null; } else if (hook == 'article_features') { return null; } else if (hook == 'article_description') { return null; // return descriptionWidget(article); } else if (hook == 'article_address_info') { return null; } else if (hook == 'article_map') { return null; } else if (hook == 'article_floor_plans') { return null; } else if (hook == 'article_multi_units') { return null; } else if (hook == 'article_contact_information') { return null; } else if (hook == 'enquire_info') { return null; } else if (hook == 'setup_tour') { return null; } else if (hook == 'watch_video') { return null; } else if (hook == 'virtual_tour') { return null; } else if (hook == 'article_related_posts') { return null; } return null; };

return detailsHook;

} //a sample widget for description in property details page. static Widget descriptionWidget(Article article) { if (article != null) { String content = article.content; return content != null && content.isNotEmpty ? Container( padding: const EdgeInsets.fromLTRB(20, 5, 20, 0), child: Align( alignment: Alignment.centerLeft, child: Text( content, maxLines: 5, overflow: TextOverflow.ellipsis, textAlign: TextAlign.justify, ), ), ) : Container(); } else { return Container(); } }

// static Widget descriptionWidget(Article article) { // return Text( // article.content, // maxLines: 5, // overflow: TextOverflow.ellipsis, // textAlign: TextAlign.justify, // ); // } }

class CustomLanguageHooks { //add new language static getLanguageCodeAndName() { LanguageHook languageHook = () { /// Make sure to add LANGUAGE-CODE_localization.json is added in asset and path /// must be define in project level pubspec.yaml /// assets/localization/LANGUAGE-CODE_localization.json

  Map<String,dynamic> russianLanguageMap = {
    "languageName": "Russian",
    "languageCode": "ru"
  };

  Map<String,dynamic> yourLanguageMap = {
    "languageName": "YOUR-LANGUAGE-NAME", // Specify your language name
    "languageCode": "YOUR-LANGUAGE-CODE"  // Specify your language code
  };

  Map<String,dynamic> amhericLanguageMap = {
    "languageName": "Amheric",
    "languageCode": "am"
  };

  Map<String,dynamic> turkishLanguageMap = {
    "languageName": "Turkish",
    "languageCode": "tr"
  };

  List<dynamic> languageList = [russianLanguageMap,amhericLanguageMap, turkishLanguageMap];
  return languageList;
};

return languageHook;

}

}

class DefaultHook {

static getDefaultLanguageHook() { DefaultLanguageCodeHook defaultLanguageCodeHook = () { /// Write here your default language code String defaultLanguage = "en"; return defaultLanguage; };

return defaultLanguageCodeHook;

}

static getDefaultCountryCodeHook() { DefaultCountryCodeHook defaultCountryCodeHook = () { /// return 2 Letter ISO Code to make it default country code for phone login return "PK"; };

return defaultCountryCodeHook;

} }

class HomeRightBarButtonWidgetHookClass { static getHomeRightBarButtonWidgetHookHook() { HomeRightBarButtonWidgetHook homeRightBarButtonWidgetHook = (context) {

  Widget rightBarButtonHook = null;
  // Widget rightBarButtonHook = SearchByIdWidget();

  return rightBarButtonHook;
};

return homeRightBarButtonWidgetHook;

} }

class SettingsPageHook{ static getSettingsItemHook(){ SettingsHook settingsHook = (BuildContext context){ /// /// /// For info about adding Setting item visit below link: /// https://houzi-docs.booleanbites.com/hooks-widgets/add_item_settings/

  List<dynamic> settingsItemHookList = [
    // Add menu item map here
  ];
  return settingsItemHookList;
};
return settingsHook;

} }

class ProfilePageHook{ static getProfileItemHook(){ ProfileHook profileHook = (BuildContext context){ /// /// /// For info about adding Profile item visit below link: /// https://houzi-docs.booleanbites.com/hooks-widgets/add_item_profile/

  List<Widget> profileItemHookList = [
    // Add menu item map here
  ];
  return profileItemHookList;
};
return profileHook;

} }

saharukkarim commented 1 year ago

Please add search by id in this code

Hassan6197 commented 1 year ago
import 'package:flutter/material.dart';
import 'package:houzi_package/dataProvider/locale_provider.dart';
import 'package:houzi_package/houzi_main.dart';
import 'package:houzi_package/l10n/l10n.dart';
import 'package:houzi_package/models/article.dart';
import 'package:houzi_package/models/drawer_menu_item.dart';
import 'package:houzi_package/models/realtor_model.dart';
import 'package:houzi_package/pages/home_page_screens/home_elegant_related/related_widgets/home_elegant_sliver_app_bar.dart';
import 'package:houzi_package/pages/home_screen_drawer_menu_pages/all_agents.dart';
import 'package:houzi_package/pages/home_screen_drawer_menu_pages/settings_page.dart';
import 'package:houzi_package/pages/home_screen_drawer_menu_pages/user_related/phone_sign_in_widgets/user_get_phone_number.dart';
import 'package:houzi_package/pages/home_screen_drawer_menu_pages/user_related/user_profile.dart';
import 'package:houzi_package/pages/property_details_related_pages/pd_widgets_listing.dart';
import 'package:houzi_package/widgets/article_box_widgets/article_box_design.dart';
import 'package:houzi_package/widgets/explore_by_type_design_widgets/explore_by_type_design.dart';
import 'package:houzi_package/widgets/generic_settings_row_widget.dart';
import 'package:houzi_package/widgets/home_screen_widgets/home_screen_drawer_widgets/home_screen_drawer_widget.dart';
import 'package:houzi_package/widgets/home_screen_widgets/home_screen_realtors_related_widgets/home_screen_realtors_list.dart';
import 'package:houzi_package/widgets/home_screen_widgets/home_screen_sliver_app_bar_widgets/default_right_bar_widget.dart';
import 'package:houzi_package/widgets/home_screen_widgets/home_screen_sliver_app_bar_widgets/search_by_id_widget.dart';
import 'package:houzi_package/pages/app_settings_pages/web_page.dart';
import 'package:flutter/material.dart';
import 'package:houzi_package/common/constants.dart';
import 'package:houzi_package/files/app_preferences/app_preferences.dart';
import 'package:houzi_package/files/generic_methods/utility_methods.dart';
import 'package:houzi_package/pages/property_details_page.dart';
import 'package:houzi_package/pages/search_result.dart';
import 'package:houzi_package/widgets/dialog_box_widget.dart';
import 'package:houzi_package/widgets/generic_text_widget.dart';
class IconHooks {
  static getHeaderMap() {
    Map<String, dynamic> map = {
// "secret_key": "!@#%^&*()_-+=",
      "secret_key": "",
    };
    return map;
  }

  static getPropertyDetailPageIconsMap() {
    Map<String, dynamic> _iconMap = {
// "Air Conditioning": Icons.ac_unit_outlined,
    };

    return _iconMap;
  }

  static getElegantHomeTermsIconMap() {
    Map<String, dynamic> _iconMap = {
// "for-rent": Icons.vpn_key_outlined,
    };

    return _iconMap;
  }
}

class CustomDrawerHooks {
  static getDrawerItems() {
    DrawerHook drawerHook = (BuildContext context) {
      DrawerItem drawerItem = DrawerItem(
        sectionType: "hook",
        title: "Loan Calculator", // Add your title name you want to show in drawer
        checkLogin: false, // if you want to check login first then make it true
        enable: true,
        icon: Icons.calculate, // You can choose any material icon
        onTap: () { // this is the example of on tap function if you want to open link in webview
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => WebPage("https://iqibd.com/loan.html","Loan Calculator"),
// pass the link and Webview appbar title in the first and second parameter respectively
            ),
          );
        },
        insertAt: 4, // if you want to specify the index in drawer

      );
      DrawerItem drawerItemSecond = DrawerItem(
        sectionType: "hook",
        title: "Area Converter",              // Add your title name you want to show in drawer
        checkLogin: false,           // if you want to check login first then make it true
        enable: true,
        icon: Icons.crop_rotate,   // You can choose any material icon
        onTap: () {                      // this is the example of on tap function if you want to open link in webview
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => WebPage("https://iqibd.com/areacon.html","Area Converter"),
              // pass the link and Webview appbar title in the first and second parameter respectively
            ),
          );
        },
        insertAt: 5,    // if you want to specify the index in drawer

      );
      DrawerItem drawerItemThird = DrawerItem(
        sectionType: "hook",
        title: "Plot Finder",              // Add your title name you want to show in drawer
        checkLogin: false,           // if you want to check login first then make it true
        enable: true,
        icon: Icons.near_me,   // You can choose any material icon
        onTap: () {                      // this is the example of on tap function if you want to open link in webview
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => WebPage("https://iqibd.com/plot.html","Plot Finder"),
              // pass the link and Webview appbar title in the first and second parameter respectively
            ),
          );
        },
        insertAt: 6,    // if you want to specify the index in drawer

      );

      List<dynamic> drawerItemList = [drawerItem, drawerItemSecond, drawerItemThird];

      return drawerItemList;
    };
    return drawerHook;
  }

}

class CustomFontsHooks {
  static getFontHook() {
    FontsHook fontsHook = (Locale locale) {
// return "Ubuntu";
// return "Qwitcher_Grypen";
      return "";
    };

    return fontsHook;
  }
}

class CustomItemDesignHooks {
//provide your own design for property item
  static getPropertyItemHook() {
    PropertyItemHook propertyItemHook =
        (BuildContext context, Article article) {
// return Container(
// child: Center(child: Text(article.title)),
// );

      return null;
    };

    return propertyItemHook;
  }
//provide your own design for term item design in the app
  static getTermItemHook() {
    TermItemHook termItemHook = (List metaDataList) {
      return null;
    };

    return termItemHook;
  }
//provide your own designs for agent item design in the app.
  static getAgentItemHook() {
    AgentItemHook agentItemHook = (Agent item) {
// return Container(
// height: 100,
// padding: EdgeInsets.only(
// bottom: 10,
// ),
// child: Card(
// // shape: AppThemePreferences.roundedCorners(AppThemePreferences.realtorPageRoundedCornersRadius),
// // elevation: AppThemePreferences.horizontalListForAgentsElevation,
// child: InkWell(
// borderRadius: const BorderRadius.all(Radius.circular(10)),
// onTap: () {
// // navigateToRealtorInformationDisplayPage(
// // context: context,
// // heroId: heroId,
// // realtorType: tag == AGENTS_TAG ? AGENT_INFO : AGENCY_INFO,
// // realtorInfo: tag == AGENTS_TAG ? {AGENT_DATA : item} : {AGENCY_DATA : item},
// // );
// },
// child: Container(
// // width: ,
// // height: 135,
// height: 100,
// padding: const EdgeInsets.symmetric(horizontal: 10),
// child: Text(
// item.title,
// textAlign: TextAlign.left,
// maxLines: 1,
// strutStyle: const StrutStyle(forceStrutHeight: true),
// overflow: TextOverflow.ellipsis,
// // style: AppThemePreferences().appTheme.homeScreenRealtorTitleTextStyle,
// ),
// ),
// ),
// ),
// );
      return null;
    };
    return agentItemHook;
  }
//provide your own design for agency item
  static getAgencyItemHook() {
    AgencyItemHook agencyItemHook = (Agency agency) {
      return null;
    };

    return agencyItemHook;
  }
}

class CustomWidgetHooks {
//provide your own design for each section of the property page
//you can use the provided details in Article (property)
  static getWidgetHook() {
    PropertyPageWidgetsHook detailsHook =
        (BuildContext context, Article article, String hook) {
      if (hook == 'article_images') {
        return null;
      } else if (hook == 'article_title') {
        return null;
      } else if (hook == 'article_address') {
        return null;
      } else if (hook == 'article_status_price') {
        return null;
      } else if (hook == 'valued_features') {
        return null;
      } else if (hook == 'article_features_details') {
        return null;
      } else if (hook == 'article_features') {
        return null;
      } else if (hook == 'article_description') {
        return null;
// return descriptionWidget(article);
      } else if (hook == 'article_address_info') {
        return null;
      } else if (hook == 'article_map') {
        return null;
      } else if (hook == 'article_floor_plans') {
        return null;
      } else if (hook == 'article_multi_units') {
        return null;
      } else if (hook == 'article_contact_information') {
        return null;
      } else if (hook == 'enquire_info') {
        return null;
      } else if (hook == 'setup_tour') {
        return null;
      } else if (hook == 'watch_video') {
        return null;
      } else if (hook == 'virtual_tour') {
        return null;
      } else if (hook == 'article_related_posts') {
        return null;
      }
      return null;
    };

    return detailsHook;
  }
//a sample widget for description in property details page.
  static Widget descriptionWidget(Article article) {
    if (article != null) {
      String content = article.content;
      return content != null && content.isNotEmpty
          ? Container(
        padding: const EdgeInsets.fromLTRB(20, 5, 20, 0),
        child: Align(
          alignment: Alignment.centerLeft,
          child: Text(
            content,
            maxLines: 5,
            overflow: TextOverflow.ellipsis,
            textAlign: TextAlign.justify,
          ),
        ),
      )
          : Container();
    } else {
      return Container();
    }
  }

// static Widget descriptionWidget(Article article) {
// return Text(
// article.content,
// maxLines: 5,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.justify,
// );
// }
}

class CustomLanguageHooks {
//add new language
  static getLanguageCodeAndName() {
    LanguageHook languageHook = () {
      /// Make sure to add LANGUAGE-CODE_localization.json is added in asset and path
      /// must be define in project level pubspec.yaml
      /// assets/localization/LANGUAGE-CODE_localization.json

      Map<String,dynamic> russianLanguageMap = {
        "languageName": "Russian",
        "languageCode": "ru"
      };

      Map<String,dynamic> yourLanguageMap = {
        "languageName": "YOUR-LANGUAGE-NAME", // Specify your language name
        "languageCode": "YOUR-LANGUAGE-CODE"  // Specify your language code
      };

      Map<String,dynamic> amhericLanguageMap = {
        "languageName": "Amheric",
        "languageCode": "am"
      };

      Map<String,dynamic> turkishLanguageMap = {
        "languageName": "Turkish",
        "languageCode": "tr"
      };

      List<dynamic> languageList = [russianLanguageMap,amhericLanguageMap, turkishLanguageMap];
      return languageList;
    };

    return languageHook;
  }

}

class DefaultHook {

  static getDefaultLanguageHook() {
    DefaultLanguageCodeHook defaultLanguageCodeHook = () {
      /// Write here your default language code
      String defaultLanguage = "en";
      return defaultLanguage;
    };

    return defaultLanguageCodeHook;
  }

  static getDefaultCountryCodeHook() {
    DefaultCountryCodeHook defaultCountryCodeHook = () {
      /// return 2 Letter ISO Code to make it default country code for phone login
      return "PK";
    };

    return defaultCountryCodeHook;
  }
}

class HomeRightBarButtonWidgetHookClass {
  static getHomeRightBarButtonWidgetHookHook() {
    HomeRightBarButtonWidgetHook homeRightBarButtonWidgetHook = (context) {

      Widget rightBarButtonHook = SearchByIdWidget();
      // Widget rightBarButtonHook = SearchByIdWidget();

      return rightBarButtonHook;
    };

    return homeRightBarButtonWidgetHook;
  }
}

class SettingsPageHook{
  static getSettingsItemHook(){
    SettingsHook settingsHook = (BuildContext context){
      ///
      ///
      /// For info about adding Setting item visit below link:
      /// https://houzi-docs.booleanbites.com/hooks-widgets/add_item_settings/

      List<dynamic> settingsItemHookList = [
        // Add menu item map here
      ];
      return settingsItemHookList;
    };
    return settingsHook;
  }
}

class ProfilePageHook{
  static getProfileItemHook(){
    ProfileHook profileHook = (BuildContext context){
      ///
      ///
      /// For info about adding Profile item visit below link:
      /// https://houzi-docs.booleanbites.com/hooks-widgets/add_item_profile/

      List<Widget> profileItemHookList = [
        // Add menu item map here
      ];
      return profileItemHookList;
    };
    return profileHook;
  }
}

class SearchByIdWidget extends StatefulWidget {
  const SearchByIdWidget({Key? key}) : super(key: key);

  @override
  State<SearchByIdWidget> createState() => _SearchByIdWidgetState();
}

class _SearchByIdWidgetState extends State<SearchByIdWidget> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      child: Row(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          AppThemePreferences().appTheme.homeScreenTopBarSearchIcon!,
          genericTextWidget(
            UtilityMethods.getLocalizedString("id"),
            style: AppThemePreferences().appTheme.searchByIdTextStyle,
          ),
        ],
      ),
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
        _searchByPropertyIdDialog(context);
      },
    );
  }

  Future _searchByPropertyIdDialog(BuildContext context) {
    GlobalKey<FormState> formKey = GlobalKey<FormState>();
    String propertyId = "";
    return dialogBoxWidget(
      context,
      title: UtilityMethods.getLocalizedString("search_property"),
      textAlign: TextAlign.center,
      content: Form(
        key: formKey,
        child: TextFormField(
          textInputAction: TextInputAction.search,
          // keyboardType: TextInputType.text,
          // inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly,],
          onFieldSubmitted: (text) {
            if(formKey.currentState!.validate()){
              searchByIdOnSubmit(context, propertyId);
            }
          },
          onChanged: (text){
            propertyId = text;
          },
          validator: (text){
            if(text == null || text.isEmpty){
              return UtilityMethods.getLocalizedString("this_field_cannot_be_empty");
            }
            return null;
          },
          decoration: InputDecoration(
            hintText: UtilityMethods.getLocalizedString("search"),
            focusedBorder: OutlineInputBorder(
              borderRadius: const BorderRadius.all(Radius.circular(24.0)),
              borderSide: BorderSide(color: AppThemePreferences().appTheme.primaryColor!),
            ),
            enabledBorder: OutlineInputBorder(
              borderRadius: const BorderRadius.all(Radius.circular(24.0)),
              borderSide: BorderSide(color: Colors.grey[300]!),
            ),
            suffixIcon: AppThemePreferences().appTheme.searchBarIcon,
            contentPadding: const EdgeInsets.symmetric(vertical: 15.0, horizontal: 20.0),
          ),
        ),
      ),
      actions: <Widget>[
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: genericTextWidget(UtilityMethods.getLocalizedString("cancel")),
        ),
        TextButton(
          child: genericTextWidget(UtilityMethods.getLocalizedString("go")),
          onPressed: () {
            if(formKey.currentState!.validate()){
              searchByIdOnSubmit(context, propertyId);
            }
          },
        ),
      ],
    );
  }

  void searchByIdOnSubmit(BuildContext context, String propertyId){
    String heroId = propertyId + SINGLE;
    if(UtilityMethods.isNumeric(propertyId)) {
      int id = int.parse(propertyId);
      Route route = MaterialPageRoute(
        builder: (context) => PropertyDetailsPage(
          propertyID: id,
          heroId: heroId,
        ),
      );
      Navigator.pushReplacement(context, route);

    } else {
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => SearchResult(
            searchRelatedData: UtilityMethods.isText(propertyId)
                ? {PROPERTY_KEYWORD : propertyId}
                : {PROPERTY_UNIQUE_ID : propertyId},
            searchPageListener: (Map<String, dynamic> map, String closeOption){
              if(closeOption == CLOSE){
                Navigator.of(context).pop();
              }
            },
          ),
        ),
      );
    }
  }
}
Hassan6197 commented 1 year ago

@saharukkarim try this.

saharukkarim commented 1 year ago
image
saharukkarim commented 1 year ago

Brother i face this error