# Houzi Documentation - Full Content This file contains the complete documentation for Houzi, a white-label real estate Flutter application. ## Houzi AI Agent Skill URL: https://houzi-doc.booleanbites.com/ai-agents/houzi_skill

⚡ The Future of No-Code & Low-Code Customization is Here

Configuring and customizing Houzi has never been easier. By using an AI coding assistant powered by our Houzi AI Agent Skill, you don’t need to manually do the configurations.

Simply tell your AI assistant (like Antigravity, Cursor, Claude Code, or GitHub Copilot) what you want to do in plain English. It’s like having a senior Houzi engineer pair-programming with you 24/7.


🚀 See It In Action: Example Prompts

Here are some real-world prompts you can give your AI agent right now to perform common setup tasks and complex architectural customizations.

🎨 Common Setup & Configuration

🛠️ Advanced Customizations & Integrations


How to use the Skill

The skill is stored in the project at: [project-root]/.agents/skills/houzi/

While the examples below demonstrate how to use Antigravity to execute customizations step-by-step, the Houzi Skill system is fully universal and works out-of-the-box with any modern AI coding assistant (like Cursor, Claude Code, or GitHub Copilot).

💡 Pro Tip: Direct Skill Invocation Since the Houzi configurations and hooks guidance is registered as a custom workspace skill, you can directly activate it by prefixing your prompt with /houzi in your AI chat panel:

/houzi change the app bundle identifier to com.pisocasa.app

Step-by-Step Guide: Customizing Houzi with Antigravity

Houzi AI Skill in Action

Step 1: Install & Set Up Antigravity

Download and install the Antigravity IDE or command-line agent. Antigravity is a agentic AI coding companion by Google. Download from https://antigravity.ai/.

Step 2: Open Your Houzi Project

Launch Antigravity and open your Houzi Flutter project folder.

Step 3: Automatic Skill Detection

Once opened, Antigravity will automatically detect the .agents/skills/houzi/ skill. You don’t need to configure anything—the AI immediately becomes an “expert Houzi developer”.

Step 4: Ask & Automate

Now, simply open the AI chat panel and start instructing the agent. Here are step-by-step examples of how to run your commands:

Example A: Customizing App Name, Bundle ID, & Launcher Icons
  1. Ask Antigravity:

    “/houzi Update my app’s name to ‘PisoCasa’, change the iOS and Android bundle identifiers to ‘com.pisocasa.app’, and use assets/icons/logo.png to generate all launcher icons.”

  2. What Antigravity does:
Example B: Updating Theme Colors & Fonts
  1. Ask Antigravity:

    “/houzi Change the app theme’s primary color to a premium Indigo (#3F51B5), background to off-white, and switch the font family to ‘Outfit’.”

  2. What Antigravity does:
Example C: Advanced Layout Tweaks
  1. Ask Antigravity:

    “/houzi Add feature taxonomy terms as tabs in Home Air and also add its icons. Use wordpress api to fetch taxonomy from my website.”

  2. What Antigravity does:

Why use AI Agents with Houzi?

Houzi is a highly configurable, white-label real estate application. It follows a clean architecture governed by two primary customization vectors: an OTA-enabled Configuration Engine (configurations.json) and a Dart-level Hooks Customization System (hooks_v2.dart).

Using an AI agent with the Houzi Skill allows you to leverage these systems seamlessly to:


--- ## Tools Setup URL: https://houzi-doc.booleanbites.com/tools/tools_setup

Tools setup covers all of the technical things that you need to setup before you start editing the app. Here’re the few of the prerequisite before continue next. These are all mandatory.

  1. Wordpress Hosted Website.
  2. Houzez real estate theme Installed, Setup and Working.
  3. Houzi Plugin Installed and activated.
  4. JWT Auth plugin setup with secret key.
  5. Firebase (phone sign in, google sign in, analytics)
  6. Google Cloud (Maps, Places Apis)
--- ## Setup Houzi Rest Api plugin URL: https://houzi-doc.booleanbites.com/tools/houzi_plugin




We’ve developed a plugin that extends the default rest api functionality of Houzez theme to mobile apps. You can find the plugin inside your downloaded folder after purchase on codecanyon. It should be located in houzi / wordpress-plugin / houzi-rest-api-x.x.x.zip

You can also download the wordpress plugin from here Houzi Rest Api

Install & Activate

To install this plugin, you go into your wordpress dashboard, from left menu select plugin and add new plugin

how to add houzi rest api wordpress plugin

  1. Wordpress > Left Menu > Plugin
  2. From plugin choose Add New
  3. From top left side choose ‘Upload Plugin’ > ‘Choose File’.
  4. From the File Picker, Choose ‘houzi-rest-api-x.x.x.zip’ from Houzi folder and click Upload
  5. Choose ‘Install Now’ and Activate the Plugin.
  6. Goto ‘Houzi Api’ from Wordpress > Left Menu > Houzi Api and unlock plugin with your purchase code.

Unlock Plugin Functionality

You also need to unlock the plugin functionality with entering the purchase code from CodeCanyon. You can consult this article to learn how to get item purchase code. Activation allows you to continuous upgrade, seamlsess api integration and support.

--- ## Setup App Secret URL: https://houzi-doc.booleanbites.com/tools/app_secret




Security is really importan, so we need to make communication between app and website secure. App Secret is a secret key that is used by your app when communicating with Wordpress and Rest Api.

Important This feature requires Houzi Rest Api Plugin version 1.2.0 or greater. You also need to activate your rest api plugin and also unlock it with your purchase code. Otherwise you won’t be able to setup Secret Key and many other configurations.

Setup a secret key on Admin Panel

You can enter any string of 10 to 20 characters lenght. (shouldn’t be too long, though). When saved, Rest Api running on your website would look for app secret when any important communication is done, like add new property, user login, sign up or send email etc.

Setup a secret key on mobile app

How your app will send secret key? The app needs to send this secret key in header hook. Read instruction below:

open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getHeaderMap() method. and find key value pair for ‘app-secret’ in a given map. eg:

  …
    Map<String, dynamic> map = {
      ...
      "app-secret": "!296@#%234^&*()_-+=", 
    };
  …

Make sure both keys on mobile app and website should be same, and keep them safe.

Allowing grace period for old versions

If you released your apps with older versions of Houzi than 1.2.0. And you want to disable the app secret and nonce checks for sometimes to give old version users sometime to update to newer version, you can disable this security check by check marking the “Disable Nonce security” checkbox on the plugin. It’ll pause the checks and will allow all kind of traffic to pass.

Additionally Disable NONCE can be used to do some quick testing.

Added in version 1.2.0

--- ## Setup JWT Auth for login from app URL: https://houzi-doc.booleanbites.com/tools/jwt_auth_plugin_setup

In order for the login and other user related tasks (add property, add review, CRM functionalities, admin activities), we’re using JWT (JSON Web Token) approach. For this we are using JWT Auth plugin.

You can download here: https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/

JWT Auth Plugin is required if you want to login from app.

Install & Activate

To install this plugin, you go into your wordpress dashboard, from left menu select plugin and add new plugin

  1. Wordpress > Left Menu > Plugin
  2. From plugin choose Add New
  3. Search ‘JWT Auth’.
  4. From the Results, Choose ‘JWT Authentication for WP REST API’ by ‘tmeister’ and Click Install
  5. Activate the Plugin.

how to add new wordpress plugin

Setup Plugin Secret Key

JWT Auth Plugin require a unique key to be setup in your wordpress installation. The key name is JWT_AUTH_SECRET_KEY. To setup this key, you’ll need to access the wp-config.php file of your Wordpress installation. You might either require FileZilla (or other ftp clients) or you can access the wp-config.php file from FileManager (or similar option ie File Explorer, File Browser etc) of your hosting. Some hosting may not provide FileManager service. Use FileZilla or similar apps in that case. The steps are as follow:

  1. Open wp-config.php file via your preferred editor.
  2. Scroll down to Authentication Unique Keys and Salts section. (usually line # 40-60s)
  3. You should see many keys already defined. You just need to add another key to bottom of the list.
  4. How to generate key? You can use Wordpress service for this. Open this link in your browser: https://api.wordpress.org/secret-key/1.1/salt/, you should see bunch of keys on every refresh.
  5. Copy any key from there and paste to bottom of your already defined key.
  6. Now replace the left variable or key name with JWT_AUTH_SECRET_KEY
  7. Your keys should look like below screenshot.

JWT Auth Secret Key

Consult Description of JWT Auth Plugin for more guidance here: https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/

--- ## Android Studio Setup URL: https://houzi-doc.booleanbites.com/tools/android_setup




Install Android Studio

Head over to this link to get the Android Studio executable or zip file. Follow instructions https://developer.android.com/studio

Install the SDK

Within Android Studio, you can install the Android any SDK as follows:

step 1. Click Tools > SDK Manager.

  1. In the SDK Platforms tab, select Android you want to install e.g 12.
  2. In the SDK Tools tab, select Android SDK Build-Tools 31.
  3. Click OK to install the SDK.
--- ## Xcode Setup URL: https://houzi-doc.booleanbites.com/tools/xcode_setup

Setup a Xcode on MacOS

Xcode is necessary to develop and upload apps for the iOS environment.

https://developer.apple.com/documentation/xcode

CocoaPods setup

Just like gradle, CocoaPods is a dependency management system for iOS projects. Its necessary if you want to develop iOS apps with Flutter.

https://guides.cocoapods.org/using/getting-started.html

--- ## Flutter Setup URL: https://houzi-doc.booleanbites.com/tools/flutter_setup




Install Flutter

Download the Flutter SDK version eg 3.44.XX for your platform from below URL:

Windows:

flutter_windows

MacOS (Intel):

flutter_macos

MacOS (Apple Silicon):

flutter_macos_arm

Go to URL, https://docs.flutter.dev/get-started/install and follow setup instructions.

--- ## Setup Firebase URL: https://houzi-doc.booleanbites.com/tools/firebase_setup




Make sure your desired app bundle identifiers are set before setting up firebase.

Firebase is necessary to be set up if you want analytics, planning to support push notifications and other diagnostic related data.

It is good to have signing keys setup before setting firebase project. So you can generate SHA keys and add them to firebase project configurations.

Android setup (mandatory)

https://firebase.google.com/docs/android/setup

iOS setup (mandatory)

https://firebase.google.com/docs/ios/setup

App setup (mandatory)

After acquiring the json and plist for both platforms. Place them at following places:

--- ## Setup Google Cloud URL: https://houzi-doc.booleanbites.com/tools/google_cloud_setup




When you create a Firebase project, a corresponding Google Cloud project is automatically created. This Google Cloud project serves as the underlying infrastructure for your Firebase project, allowing you to use various Google Cloud services (such as Maps, Places Api, Play Integrity, etc.) in conjunction with Firebase.

Headover to Google Google Cloud Console. Click the Project dropdown in the top-left corner. Select your project from the list or search for it. Then enable following options.

Once done, it is always a good idea to download latest configuration file from firebase console and update them at following place:

--- ## Setup Maps API key URL: https://houzi-doc.booleanbites.com/tools/setup_maps_api




Once you have setup the project on Google Cloud, you need to acquire the Key, and place it in Android and iOS projects.

You’ve to put the API key in configuration.json (automatically or manually) as well as in native project files. This API key is used for Maps, Places search and Static Maps.

Setup maps api key by Houzi Config

You can use Houzi Config Builder to save the Maps api key: Theme Api & Config.

Setup maps api key by config.json

You can change colors from config by replacing *** with your own color code. Open the Project_HOME > assests > configuration > configuration.json file, and look for the following keys:

  "google_map_api_key": "your_key_here",

Additional steps (mandatory)

After adding maps key in configuration.json, its mandatory to add this in native projects as well. Because both platform use native maps sdk to show maps in flutter apps.

Android

Open AndroidStudio, expand android > app > src > main > res > values project folder, and find strings.xml file in your Android project. And look for the map key map_api_key and paste the key in value attributes.

iOS

Open Xcode and goto AppDelegate.swift, look for GMSServices.provideAPIKey() and paste your key in there.

--- ## Setup Places Api & Location Search URL: https://houzi-doc.booleanbites.com/tools/setup_places_api

Enabling location autocomplete is done in three steps as follow:

Enable Place API on Google Cloud

Once you have setup the project on Google Cloud, you need to enable the places api in your project on your Google Project console, in order to get the location search in filter page working. You can enable Places API here: Enable Places API

Billing setup is required for each project, but you will only be charged if a project exceeds its free quota. Here you can read about billing and free quota

Setup maps api key

You need to set maps api key (also used for places api) in your application.

Setup maps api key by Houzi Config

You can use Houzi Config Builder to save the Maps api key: Theme Api & Config.

Or setup maps api key manually by editing config.json

You can change colors from config by replacing *** with your own color code. Open the Project_HOME > assests > configuration > configuration.json file, and look for the following keys:

  "google_map_api_key": "your_key_here",
  "lock_places_api": true,
  "lock_places_api_countries": "US,FR",

Note: The lock_places_api, lock_places_api_countries are used to lock places api suggestions to specific countries. You should definitely limit the countries to get the correct results.

Enable Location option in Houzi Config Builder

Once you’ve enabled Places API and billing on your project, you need to enable location search via Houzi Config Builder. Customize Search Screen

Or you can manually look into Project_HOME > assests > configuration > configuration.json and look for following keys:

{
    "section_type": "location_picker",
    "title": "City",
    ...
    "show_search_by_city": true,
    "show_search_by_location": false,
    ...
}

Set the show_search_by_location to true and you’re done. Relaunch the app, and you should see the location selection on the filter search page.

--- ## Setup signing key for Android URL: https://houzi-doc.booleanbites.com/tools/setup_android_signing




For uploading apps to PlayStore or configuring firebase, you need to sign your builds with uniquely generated keys and keystores. Follow instructions here:

  1. Creating a keystore from an Android Project is easier. So create new android dummy project. Name it Dummy.
  2. Open this project in Android Studio.
  3. In the menu bar, click Build > Generate Signed Bundle/APK.
  4. In the Generate Signed Bundle or APK dialog, select Android App Bundle or APK and click Next.
  5. Below the field for Key store path, click Create new.
  6. On the New Key Store window, provide the following information for your keystore and key, as shown in figure 2.
  7. Keystore
  8. Key

Generate New Keystore

Follow Android Docs for any further help: Generate an upload key and keystore

Once you have generated a keystore.jks, you need to replace the existing keystore here:

Project_HOME > android > houzi_public_keystore.jks

If you have different name, you need to update its reference in this file:

Project_HOME > android > key.properties

The key.properties file refers to path relevant to gradle location. So always consider adding a path with relation to the gradle file.

--- ## Setup signing for iOS Project URL: https://houzi-doc.booleanbites.com/tools/setup_ios_signing

For uploading apps to AppStore, you need to sign your builds with provisioning profile. A provisioning profile is coupled with a SigningCertificate.

Note: Apple Developer account is required for this step. Make sure to buy one before continuing.

There’re two ways to setup signing for your iOS app, one is doing everything manual, and second is doing automatic signing.

Automatic Signing

In modern Xcode, when you use automatic signing to let Xcode do everything required to sign the app. Here’re the steps:

  1. Make sure you have setup your app identifier and app name before setting up signing.
  2. Login your apple id in Xcode by going to top left Xcode > preferences menu (CMD + ,) and switch to Accounts tab.
  3. Now tick the automatic signing checkbox and select your team in project signing tab of project info Xcode Project > Runner > Signing & Capabilities > Team
  4. Connect a physical device (iPhone) and press Repair.
  5. It should create your app id, signing certificate, provisioning profile, add your device id to your Apple Developer Portal.

For full instructions, read through here: https://help.apple.com/xcode/mac/current/#/dev60b6fbbc7

Manual Signing

The manual signing requires some steps that need to be performed and the process to do so may vary on different MacOS, Xcodes and environment. The essential steps required are listed below:

The manual process is sometimes necessary to enable certain features, so its better to follow online latest guideline to do do this process manually.

Full instructions to manually sign the app can found here: Manually sign an app

--- ## Setup Google social sign in URL: https://houzi-doc.booleanbites.com/tools/setup_google_signin




Google Sign in

The keystore that you intend to use to sign the Android app will be used in this step. You might have already created this keystore in previous sections. After generating a signing key, the next step is to add SHA-1 and SHA-256 certificates to the firebase project. You go to the Firebase console > project > project settings > Add fingerprint Here you add your SHA-1 and SHA-256 certificates, that you generated from your signing key and from the Google play console.

To generate SHA-1 and SHA-256 certificates from the key: https://developers.google.com/android/guides/client-auth#using_keytool_on_the_certificate

To get SHA-1 and SHA-256 certificates from the Google play console: https://developers.google.com/android/guides/client-auth#using_play_app_signing

You might also want to set the project name and email in Firebase > Settings > General > Public settings

Enable Google Sign-In for your Firebase project

To allow users to sign in using Google Sign-In, you must first enable the Google Sign-In provider for your Firebase project:

  1. In the Firebase console, open the Authentication section.
  2. On the Sign in method tab, enable the Google provider.
  3. Click Save.

After adding the certificates, download the google-services.json. Place it at following place:

Also download the GoogleServices-Info.plist for iOS and place it here:

For iOS you need to provide a URL scheme for Google sign in, open the GoogleService-Info.plist configuration file, and look for the REVERSED_CLIENT_ID key. Copy the value of that key, and paste it into the URL Schemes box on the configuration page

Project_HOME > ios > Runner > Info Tab > URL Types section > Google Login Scheme

On completing above mentioned steps, google sign in is functional.(No additional work is required).

You might need to copy your PlayStore sha1 in your firebase as well to get the google login working.

--- ## Setup Facebook sign in URL: https://houzi-doc.booleanbites.com/tools/setup_facebook_signin

Facebook sign in

For Facebook sign in, first you need to register as a Facebook developer. Follow this link: https://developers.facebook.com/docs/development/register/

Then you have to create an app. Follow this link: https://developers.facebook.com/docs/development/create-an-app

If you integrate Facebook login in your mobile app, Facebook cross-checks your app’s ownership on your website at following address:

https://domain.com/app-ads.txt

Go to Project_HOME > server_files Open and edit the app-ads.txt file and replace FB_APP_ID_GOES_HERE with your Facebook app id. And then upload to your website root folder.

Android

After creating app you will refer to app dashboard, on the top left your app id is mentioned, copy the app id and go to strings.xml file

Project_HOME > android > app > src > main > res > values > strings.xml and look for facebook_app_id. Replace its value with your own app id.

On facebook dashboard, go to Settings > Advanced and look for client token, copy it and go to strings.xml file and paste it for facebook_client_token.

On facebook dashboard, go to Settings > Basic fill your basic information and at the end of the page click on Add platform. Select android and then Google Play Store. Then go to Project_HOME > android > app > src > main > AndroidManifest.xml copy your package name and paste it in the Package Names field. Then copy the package name and paste in Class Name and write .MainActivity with your package name like this YOURPACKAGENAME.MainActivity (e.g com.houzi.app.MainActivity).

Then put your hashkey in the Key hashes field. To find info to how to generate you key hash go to
https://developers.facebook.com/docs/facebook-login/android?locale=en_US#6–provide-the-development-and-release-key-hashes-for-your-app

OR to quickly find your hash key, copy your SHA-1 certificate and go to this website http://tomeko.net/online_tools/hex_to_base64.php paste it in the hex string field and you will get your key hashes in the output field.

IOS

On facebook dashboard, go to Settings > Basic at the end of the page click on Add platform and fill in the details.

Open Project_HOME > ios > Runner > Info >

FacebookAppID, FacebookClientToken, FacebookDisplayName

Replace these with your own facebook app id, client token and your app name.

Also look for the Facebook Login Scheme in the URL types (CFBundleURLTypes) section and enter your own facebook app id with fb prefixed like this:

fb1122334455667788

Save changes and facebook sign in is complete.

--- ## Setup Phone sign in URL: https://houzi-doc.booleanbites.com/tools/setup_phone_signin




The phone signup feature allows users to register for the mobile app using their phone numbers. Users will receive a verification code via SMS, which they must enter to complete the registration process. We have integrated firebase phone signup feature in the app. Make sure you have done following things before continuing:

  1. Changed App Identifier
  2. Have setup Custom Keystore
  3. Firebase integrated
  4. GoogleCloud integrated
  5. Attached a payment method to your GoogleCloud.

Important: Adding a payment method to your Google Cloud Project is necessary for firebase to send an sms. Firebase allows 10 Free SMS per day. But it requires you to have payment method added.

The keystore that you intend to use to sign the Android app will be used in this step. You might have already created this keystore in previous sections. After generating a signing key, the next step is to add SHA-1 and SHA-256 certificates to the firebase project. You go to the Firebase console > project > project settings > Add fingerprint Here you add your SHA-1 and SHA-256 certificates, that you generated from your signing key and from the Google play console.

To generate SHA-1 and SHA-256 certificates from the key: https://developers.google.com/android/guides/client-auth#using_keytool_on_the_certificate

To get SHA-1 and SHA-256 certificates from the Google play console: https://developers.google.com/android/guides/client-auth#using_play_app_signing

You might also want to set the project name and email in Firebase > Settings > General > Public settings

After adding the certificates, download the google-services.json. Place it at following place:

Also download the GoogleServices-Info.plist for iOS and place it here:

For iOS you need to provide a URL scheme for Google sign in, open the GoogleService-Info.plist configuration file, and look for the REVERSED_CLIENT_ID key. Copy the value of that key, and paste it into the URL Schemes box on the configuration page

Project_HOME > ios > Runner > Info Tab > URL Types section > Google Login Scheme

Now with Phone Sign In setup, ensure you have followed these steps:

Step 1

Enable Phone as a Sign-In method in the Firebase console. Go to Firebase console > Authentication > Enable Phone

Step 2

Goto Firebase > Project Settings > Your Apps > Android app. Make sure to add SHA-1 and SHA-256 fingerprints under SHA certificate fingerprints.

Step 3

Goto Firebase > App Check > Apps. And Register your app for Play Integrity. Read here about App Check Documentation

Step 4

Go to Google Cloud, APIs & Services section and enable Google Play Integrity API

After these step you are good to go sign in with Phone

Important! Please test phone signup on real device.

--- ## Setup Apple social sign in URL: https://houzi-doc.booleanbites.com/tools/setup_apple_signin

Note: If your iOS app offers social login with either facebook or Google, Apple login is a must in order to get the iOS app approved from Apple, its required to support Sign in with Apple, you cannot disable it on iPhone app and keep facebook or Google.

Apple sign in

Integrate Apple sign in by following: sign_in_with_apple | Flutter Package (pub.dev)

You can skip the Android and Web sections.

If you want to enable Android, then follow the steps in library guide and then go to Project_HOME > packages > houzi_package > lib > common > constants.dart and look for APPLE_SIGN_ON_CLIENT_ID add APPLE_SIGN_ON_REDIRECT_URI. Replace their values with your own Service ID and Redirect Uri.

These constants not needed if you just want to enable Apple sign in for iOS only.

--- ## Google AdMob integration URL: https://houzi-doc.booleanbites.com/tools/setup_admob

To setup ads on Houzi app, you need following things:

  1. Android App ID on Admob
  2. iOS App ID on Admob
  3. Native Advanced Ad Id for Android App
  4. Native Advanced Ad Id for iOS App

Create Apps in Admob

Register your app as an AdMob app by completing the following steps:

  1. Sign in to or Sign up for an AdMob account.
  2. Register your app with AdMob. This step creates an AdMob app with a unique AdMob App ID for each platform. You can also choose your already released app on both stores.
  3. Copy App ID of both apps.

Create Native Advanced Ad Unit

Once apps for each platform are created, it is time to create a native ad unit. follow this link to create these ads: Create a native ad unit.

When you’ve acquired Native Ad Unit IDs, configure it in the app in the steps below.

Setup Admob App ID

After getting your app AdMob App ID go to:

- Android houzi > android > app > src > main > res > values > strings.xml file, and look for google_ads_app_id. Replace its value with your own AdMob App ID.

- iOS Project_HOME > ios > Runner > Info.plist file, and look for GADApplicationIdentifier. Replace its value with your own AdMob App ID.

Enable iOS App Tracking Transparency

You need to enable App Tracking Transparency in iOS Project. Follow here: Setup iOS ads tracking

Good to remember: After creating AdMob app, update your GoogleServices-Info.plist for iOS and google-services.json for android by downloading fresh copy from firebase.

Add/Change AdMob Native Advanced Ad ids by Houzi Config

Open houzi config and go to the section Api & Config. Enter your Android and iOS native ads id here

enter-ad-mob-key.JPG

Add/Change AdMob Native Advanced Ad by editing config.json

Copy that native ad unit and go to the Project_HOME > assests > configuration > configuration.json file, and look for android_native_ad_id for android and ios_native_ad_id for IOS. Replace its value with your own native ad unit. Make sure set the value of show_ads: true to turn on the ads

Add/Change AdMob Native Advanced Ad by editing constants.dart

Copy that native ad unit and go to the Project_HOME > packages > houzi_package > lib > common > constants.dart file, and look for ANDROID_NATIVE_AD_ID for android and IOS_NATIVE_AD_ID for IOS. Replace its value with your own native ad unit. Make sure set the value of SHOW_ADS=true to turn on the ads

Enable Ad Validator to Debug your ads

AdMob sdk provides a way to validate your ads on screen. We’ve disabled the ad validator by default. However you can enable the ad validator to check if you’ve any issues with your configurations.

Enable Ad Validator Android

Open houzi > android > app > src > main > AndroidManifest.xml file, and look for com.google.android.gms.ads.flag.NATIVE_AD_DEBUGGER_ENABLED. Replace its value android:value="false" to true.

Enable Ad Validator iOS

Open file Project_HOME > ios > Runner > Info.plist file, and look for GADNativeAdValidatorEnabled. Replace its next tag <false/> with <true/>

This will enable ad validator for your app.

Good to remember: After AdMob has been integrated, Google may ask you to verify your apps ownership via app-ads.txt. It will ensure your app ad inventory is only sold through channels you’ve identified as authorized.

Good to remember: After AdMob has been integrated, it is best to link your apps with your firebase. The Linked services page allows you to turn on user metrics and link your apps to Firebase from a single page in your AdMob account. Readmore about Linked Services.

--- ## Setup iOS ads tracking URL: https://houzi-doc.booleanbites.com/tools/setup_ads_tracking

If you want to show ads, you need to have a key in your Info.plist named NSUserTrackingUsageDescription and its description string like below:

<key>NSUserTrackingUsageDescription</key>
<string>Allows app to show ads more relevant to you.</string>

If you’ve this key in your info.plist you’re required to

Failing to do any of the above item will result in REJECTION by Apple.

From Houzi Configurations, if you set true for showing ads, Houzi will show app tracking permission dialog automatically as shown below:

tracking_dialog

So make sure you’ve setup tracking correctly.

If you want to SHOW ads:

You’ll need to do following things:

NOTE: if you have enabled ads in Houzi Config, but don’t have NSUserTrackingUsageDescription key in your info.plist, app will crash at launch.

If you DON’T plan on showing ads:

You’ll need to do following things:

If your app was rejected before for this reason, remove this key, set next build number and upload new binary resubmit for app review.

Read more about App Tracking Transparency

--- ## Setup Deep Link URL: https://houzi-doc.booleanbites.com/tools/setup_deeplinks

Deep links or Universal link is the ability of your application being launch when user taps website URL and you want to open the URL in your application. We have added the ability to open property profile, when a property URL is opened on mobile.

Note: Right now application consider permalinks when it finds patterns as domain.com/property/, so make sure you are using this format in your website settings. Otherwise you can make changes to the URL supported in Android and iOS code.

Setup Application:

Android:

To setup Deep Link in app, go to Project_HOME > android > app > src > main > res > values > strings.xml file, look for scheme,host and path_prefix. Replace its value with your own scheme (http or https) and domain host.

Make sure flutter_deeplinking_enabled meta tag added in AndroidManifest.xml file:

 <meta-data android:name= "flutter_deeplinking_enabled" android:value="true" />
 <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
          <data
              android:scheme="@string/scheme"
              android:host="@string/host"
              android:pathPrefix="@string/path_prefix"/>
  </intent-filter>

iOS:

To setup Deep Link in app for iOS go to Project_HOME > iOS > Runner > Info.plist file, look for key CFBundleURLName, replace it with your host and CFBundleURLSchemes replace it with your scheme. Example below:

<key>CFBundleURLTypes</key>
<array>
    ....
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>your_good_domain_here.com</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>https</string>
        </array>
    </dict>
    ....
</array>

Make sure FlutterDeepLinkingEnabled added in Info.plist` file:

<key>FlutterDeepLinkingEnabled</key>
  <true/>

Then go to iOS Runner.entitlements in file: PROJECT_HOME/ios/Runner/Runner.entitlements and add following line:

...
<key>com.apple.developer.associated-domains</key>
  <array>
	<string>applinks:domain.com</string>
  </array>
...

Replace domain.com with your domain.

Setup Server File:

  1. apple-app-site-association
  2. assetlinks.json

These files are located in your source code Project_HOME > server_files. You need to upload these files to your website root folder / .well-known directory and they must be publicly accessible like below:

https://domain.com/.well-known/apple-app-site-association https://domain.com/.well-known/assetlinks.json

Go to Project_HOME > server_files Open and Edit assetlinks.json file and enter your app package name against package_name key like below:

"package_name": "com.domain.app"

You also need to provide sha256 of your keystore.

There’re two flavour of same app in this files. One is for production sha256 and the other is for development purpose.

Apple App Site Association:

Go to Project_HOME > server_files Open and edit the apple-app-site-association file and enter your apple developer team id and app identifier against appID key like below:

"appID": "TEAM_ID_XX.com.domain.app"

That’s pretty much it, now your application should open the URL.

Note: You might need to restart the device or wait for few hours in case it is not working.

--- ## Migration Guide URL: https://houzi-doc.booleanbites.com/tools/upgrading_future_version

Always make a backup before updating to the next version.

Migration Guide for 1.4.8

1.4.8 introduces Houzi AI (AI-powered search, AI-first home, and ask-the-listing), upgrades all Android and iOS dependencies to their latest versions, and migrates the iOS project from CocoaPods to Swift Package Manager (SPM).

Once you’re done migrating, follow the AI Features setup guide to see what the new AI features look like and enable them on the Houzi Rest Api plugin.

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

Important — iOS is different this time. This release moves iOS from CocoaPods to Swift Package Manager. Hand-migrating an existing ios folder (removing the Podfile, de-integrating CocoaPods, and re-wiring OneSignal and Google Maps through SPM) is highly technical and error-prone, so we do not ask you to migrate it. Instead, replace your ios folder with the one we provide in 1.4.8 and reconfigure it with your own app details (see the iOS section below). This also raises the minimum iOS version to 15.

Let’s assume you simply want to update your houzi_package, updating to 1.4.8 requires the following:

Android

iOS (replace & reconfigure)

Because iOS moved to Swift Package Manager, replace your ios folder instead of migrating it:

Finish

On the wordpress admin panel:

Migration Guide for 1.4.7.2

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

If you are upgrading from an older version than 1.4.7.1, you must follow the previous migration guides below.

Let’s assume you simply want to update your houzi_package, updating to 1.4.7.2 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.7.1

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

If you are upgrading from an older version than 1.4.7, you must follow Migration Guide 1.4.5 to update your project for Android 15+ (API 36) and 16KB page size support.

Let’s assume you simply want to update your houzi_package, updating to 1.4.7.1 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.7

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

If you are upgrading from an older version than 1.4.7, you must follow Migration Guide 1.4.5 to update your project for Android 15+ (API 36) and 16KB page size support.

Let’s assume you simply want to update your houzi_package, updating to 1.4.7 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.6

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

If you are upgrading from an older version than 1.4.5, you must follow Migration Guide 1.4.5 to update your project for Android 15+ (API 36) and 16KB page size support.

Let’s assume you simply want to update your houzi_package, updating to 1.4.6 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.5

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

Let’s assume you simply want to update your houzi_package, updating to 1.4.5 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.4.1

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

Let’s assume you simply want to update your houzi_package, updating to 1.4.0.1 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.4

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

Let’s assume you simply want to update your houzi_package, updating to 1.4.4 requires following things:

On the wordpress admin panel:

Migration Guide for 1.4.3.4

Important Notice: If you are updating from version lower than 1.4.0, we recommend you to first perform the migration for 1.4.0, then do essentials listed in 1.4.2 migration and then perform migration to 1.4.3. Upgrading from 1.4.2 should be easy as below.

We always assume, you haven’t made changes to files in houzi_package. If you made changes in your houzi_package then you’ll need to move over those manually (again).

Let’s assume you simply want to update your houzi_package, updating to 1.4.3.4 requires following things:

On the wordpress admin panel:

--- ## Import postman collection URL: https://houzi-doc.booleanbites.com/tools/import_postman_collection

When building the REST API for the app, we added all the api routes to a postman collection to share between the teams. So this became a useful collection to list all the required api and their path that we use in the app. It is pretty helpful when debugging the app behaviors and finding bugs.

The Houzi Rest API plugin contains a postman collection, that can be imported to postman to test different apis You can download here: Postman Collection

Install and activate. A normal flow would be login first, get the auth token and use this auth token for everything that requires authentication. API uses bearer token auth approach.

--- ## In App Purchase URL: https://houzi-doc.booleanbites.com/tools/in_app_purchase

Documentation for Setting Up Houzi’s In-App Purchase

This guide will walk you through the necessary steps to configure In-App Purchase in Google Play and Apple Store for Android and iOS devices, respectively. By following these instructions, you’ll be able to offer various membership procedures to your users. Houzez offers three membership procedure i.e Free (Pay for featured), Pay Per Listing, and Membership options. You can choose one at a time.

Table of Contents

  1. Setup Admin Panel
    1. Free (Pay for featured)
    2. Pay Per Listing
    3. Membership
  2. Setup Apple Store
    1. Paid Apps Agreements
    2. Configuring In-App Purchases
      1. Free (Pay for featured)
      2. Pay Per Listing
      3. Membership
  3. Setup Google Play
    1. Setting Up Your Google Payments Merchant Account
    2. Configuring In-App Purchases
      1. Free (Pay for featured)
      2. Pay Per Listing
      3. Membership
  4. Conclusion

Let’s dive into the details of each section.


Setup Admin Panel

To begin setting up in-app purchases and membership procedures in your Houzi app, first go to your admin panel on your website. Navigate to Theme Options > Membership then follow the steps below:


theme-option-membership


  1. Free (Pay for featured)

    In this procedure, your app is free to list properties, but users are charged if they want to upgrade their properties to featured. To enable this option:


    admin-free-1


    Additionally, within the Houzi API plugin, in the in-app purchase tab, add your “Make Featured product ID”. Ensure that this product ID matches the configuration of your in-app product on Google Play and Apple Store.


    free-featured-pi


  2. Pay Per Listing

    In this procedure, users are charged for each property they publish. To set up this option:


    per-listing

    Within the Houzi API plugin, in the in-app purchase tab, add your “Make Featured” and “Per Listing” product IDs. Ensure that these product IDs match the configuration of your in-app products on Google Play and Apple Store.


    per-listing-pi


  3. Membership

    In this procedure, you can create membership packages that users can purchase. To configure this option:


    Repeat the package creation process for each membership package you want to offer.

Once you have completed the setup in the admin panel, you can proceed to configure in-app purchases on Apple Store and Google Play.


Setup Apple Store

To configure in-app purchases for iOS devices on the Apple Store, follow these steps:

Before proceeding with in-app purchases, make sure you have an active agreement for paid apps in App Store Connect:

  1. Visit https://appstoreconnect.apple.com/ and log in.
  2. Click on “Agreements, Tax, and Banking.”
  3. In the agreements section, ensure that the status for free apps is “Active” and for paid apps is “New.”
  4. Review the terms, accept them, and provide all the required information.
  5. Once everything is set correctly, the status for paid apps will become “Active.”

Sandbox Testing

To ensure a smooth and error-free experience for your users, it’s essential to conduct thorough testing of your in-app purchases before releasing them on the Apple Store. Apple provides a sandbox environment specifically for testing in-app purchases without making actual payments. Follow the steps below to set up sandbox testing:

  1. To test the in-app purchases, you need a sandbox test user. This test user shouldn’t be connected to iTunes—it’s only used for testing in-app purchases. You can’t use an email address that is already used for an Apple account. In Users and Access, go to Testers under Sandbox to create a new sandbox account or to manage the existing sandbox Apple IDs.

Note: If you are using a Gmail account you can create a task-specific email address. For example, if you own foo@gmail.com you can create an account with the following e-mail foo+sandbox@gmail.com. The email for this account will still be received in foo@gmail.com inbox. Google Workspace Learning Center.


user-access

  1. Now you can set up your sandbox user on your iPhone by going to Settings > App Store > Sandbox-account.


    sandbox-account

Important: If you cannot find the sandbox account in Settings > App Store, simply log out from your App Store account. Next, launch the app and proceed with a purchase. During this process, you will be prompted to log in using the sandbox test user. Make sure to input the credentials that you previously added to the Sandbox Testers section.

Configuring your in-app purchases

To configure in-app purchases on Apple Store:

  1. Go to https://appstoreconnect.apple.com/apps/ and select your app.
  2. Navigate to “In-App Purchases” and click on “Manage.”
  1. Select the “Consumable” type and create your in-app purchase using the product ID mentioned in the Houzi API plugin’s in-app purchase tab.
  2. Set the price according to the value specified in Theme Options > Membership.
  3. Fill out the remaining information.
  4. In the screenshot section, add a screenshot of the app where the “Make featured” option is visible. You can find this in app Properties > Action button on property card

sandbox-account ss-f

Pay Per Listing

  1. Select the “Consumable” type and create two in-app purchases—one for the featured product ID and another for the per listing product ID mentioned in the Houzi API plugin’s in-app purchase tab.
  2. Set the prices according to the values specified in Theme Options > Membership.
  3. Fill out the remaining information.
  4. In the screenshot section, add a screenshot of the app where the “Make featured” and “Pay Now” options are visible. You can find this in app Properties > Action button on property card

Membership

  1. For each package you created in the admin panel, add a product using the respective iOS product ID mentioned in the package details.
  2. Select the “Consumable” type and fill out the remaining information.
  3. In the screenshot section, take a screenshot of the package from the profile page. You can find this in app Profile > Membership
  4. Repeat these steps for each package.

Setup Google Play

You first need to release on the closed testing track as this results in a code review from Google. This is a requirement to be able to access any play store products. Next, upload the app-release.aab app bundle that was generated by the build command. Click Save and then click Review release. Finally, click Start rollout to Internal testing to activate the internal testing release.

Set up test users

To be able to test in-app purchases, Google accounts of your testers must be added in the Google Play console in two locations:

First, start with adding the tester to the internal testing track. Go back to Release > Testing > Internal testing and click the Testers tab.

tester

Create a new email list by clicking Create email list. Give the list a name, and add the email addresses of the Google accounts that need access to testing in-app purchases.

Next, select the checkbox for the list, and click Save changes.

Then, add the license testers:

To configure in-app purchases for Android devices on Google Play, follow these steps:

Setting Up Your Google Payments Merchant Account

To enable in-app purchases for your application on the Google Play Store, you’ll need to set up a Google Payments merchant account. Follow the steps below to get started:

  1. Access Payments Settings: In the Play Console, navigate to the “Setup” section and select “Payments profile.”

  2. Create Payments Profile: Click on the “Create payments profile” option. Make sure you have your business information ready as you’ll need it to set up your payments profile.

  3. Provide Business Details:
  4. Public Business Information:
  5. Submission: Once you’ve filled in the required information, click the “Submit” button to finalize your payments profile setup.

Configuring your in-app purchases

  1. Go to the Google Play Console and select your application.
  2. Navigate to Monetize > Products > In-app products.
  3. Click on “Create product.”
  1. Create your in-app product using the product ID mentioned in the Houzi API plugin’s in-app purchase tab.
  2. Set the price according to the value specified in Theme Options > Membership.
  3. Fill out the remaining information.

Pay Per Listing

  1. Create two in-app products—one for the featured product ID and another for the per listing product ID mentioned in the Houzi API plugin’s in-app purchase tab.
  2. Set the prices according to the values specified in Theme Options > Membership.
  3. Fill out the remaining information.

Membership

  1. For each package you created in the admin panel, add a product using the respective Android product ID mentioned in the package details.
  2. Fill out the remaining information.

Conclusion

Congratulations! You have successfully completed the setup of in-app purchases and membership procedures for your Houzi app. Users can now enjoy the powerful property management system, and you can monetize your real estate marketplace by offering different membership options.

Make sure to follow the instructions carefully and double-check all the configurations to ensure a smooth user experience. If you encounter any issues or need further assistance, please refer to the Houzi documentation or contact our support team.

--- ## Add Kurdish Language Support URL: https://houzi-doc.booleanbites.com/tools/add_kurdish_language_support

You can add Kurdish Language support in your app by following these simple steps:

  1. Download the kurdish_material_localization_delegate.dart file.

  2. Download the kurdish_widget_localization_delegate.dart file.

  3. Now head to the project and go to the l10n directory, path:

    PROJECT_NAME/packages/houzi_package/lib/l10n

  4. Now place both the files in this directory.

  5. Now go to the houzi_main.dart file, path:

    PROJECT_NAME/packages/houzi_package/lib/houzi_main.dart

  6. Add following imports at the start of file, under all the imports.

    import 'package:flutter_localizations/flutter_localizations.dart';
    import 'package:houzi_package/l10n/kurdish_material_localization_delegate.dart';
    import 'package:houzi_package/l10n/kurdish_widget_localization_delegate.dart';
    

    kurdish-imports

  7. Now go to the build() function and add following lines in the localizationsDelegates.

    KurdishMaterialLocalizations.delegate,
    KurdishWidgetLocalizations.delegate,
    

    kurdish-delegates

  8. Now head to the hooks_v2.dart file and look for the getLanguageCodeAndName() hook, path:

    PROJECT_NAME/lib/hooks_v2.dart

  9. Define kurdishLanguageMap and add this map to the languageList in the hook.

    kurdish-hook

  10. Restart the app.

Now Kurdish language support is added to your app.

--- ## Push Notifications URL: https://houzi-doc.booleanbites.com/tools/push_notifications_integration




Push notifications play a crucial role in keeping your real estate business updated. We’ve incorporated this feature to enhance engagement with your app and website.

❗️❗️IMPORTANT❗️❗️

Houzez v 3.1.0 or later is required. This version introduces the ability to send push notifications for important actions. Please ensure you update to Houzez v 3.1.0 before implementing push notifications on your website.

❗️❗️IMPORTANT NOV 28, 2024❗️❗️

OneSignal has recently updated to new rich api, where they only need OneSignal App ID, OneSingnal API Key. We’ve patched the Houzi Rest API Plugin in version 1.4.2.2. Please download the latest plugin from here: Houzi Rest API 1.4.2.2

We utilize OneSignal for push notifications. You will need to configure OneSignal on both your WordPress site and your app. This guide includes the following sections:

OneSignal setup

We require two things from OneSignal.

  1. OneSignal App ID
  2. OneSingnal API Key Token

To acquire these, use the following link to sign-up/login in. https://app.onesignal.com/login

A typical flow should like this:

  1. You use social login or signup with email & password.
  2. Provide your info in About You section. Choose “Drive Visits to Website/App” and Choose “Push Notification” for channel options.
  3. Provide info about your organization.
  4. Provide info about your app.
  5. In the following Welcome page, choose below options
    1. Messaging Channels -> Push Notifications.
    2. Android:
      1. Choose Android. and continue, you will be asked to upload your firebase configruation file. Follow the guide by OneSignal. Android Guide to get the firebase configruation file.
      2. Once firebase-adminsdk-key is uploaded, You can choose Flutter in next step. Click save and Continue.
      3. Copy the app id and click done.
    3. iOS
      1. From the Inactive platforms, choose iOS. You need paid Apple Developer Membership program for this step.
      2. You will be asked to provide APNs info. Follow the guide by OneSignal for acquiring the p8 file from AppleDeveloper portal. iOS Guide
      3. Once .p8 key file is uploaded, You can enter the other info and Save And Continue. You can choose Flutter in next step. Click save and Continue.
      4. Copy the app id and click done. Both app id should be same.

Keep in mind that we already have integrated the SDKs in the project, you just need app id so don’t follow steps to integrate sdks.

OneSignal setup on Wordpress

Go to the Houzi Api > Push Notification > OneSignal Configurations.

one-signal-wordpress-config

You have to provide these following configurations:

1. OneSignal App ID:

Provide your OneSignal App ID in the respective text field.
If you do not know how to get the One Signal App ID, Go to https://app.onesignal.com/apps/ page, find your application, and open it. You can find the APP ID in the URL. Or go to Settings tab and find in Keys and Ids section of settings.

2. OneSingnal API Key Token:

Provide your OneSingnal API Key Token in the respective text field. If you do not know how to get the OneSingnal API Key Token, Go to https://app.onesignal.com/apps/YOUR_APP_ID/settings/keys_and_ids page.

If you don’t have a Rest API Key already generated, please generate a new one by clicking the Generate New API Key button.

After providing the configurations, click on the Save Changes button.

OneSignal setup on App

Copy your OneSignal App ID. If you do not know how to get the One Signal App ID, Go to https://app.onesignal.com/apps/ page, find your application, and open it. You can find the APP ID in the URL. Or go to Settings tab and find in Keys and Ids section of settings.

You will have to provide this app id in the following destinations (Mandatory):

1. Android native project:

Nees to setup two things:

  1. Open AndroidManifest.xml and Find meta tag and change its value to your own package for NotificationServiceExtension, if you haven’t done already. Follow guide here: OneSignal Push Configurations for Android
  2. Go to the Project_HOME > android > app > src > main > res > values > strings.xml file, and look for onesignal_app_id. Replace its value with your app id.

2. iOS native project:

Nees to setup two things:

  1. Setup App group bundle identfier for App Groups for NotificationServiceExtension, if you haven’t done already. App Group identifier help share resources between app and NotificationServiceExtension. Follow guide here: OneSignal Push Configurations for iOS
  2. Go to the Project_HOME > ios > Runner > AppDelegate.swift file, and look for ONE_SIGNAL_APP_ID. Replace its value with your app id.

3. Houzi Flutter App

Open your configuration.json in HouziBuilder Go to the Api & Config section of the Houzi Builder and provide the OneSignal App ID in the respective text field. Checkout HouziBuilder Push Notifications Configurations.

If you don’t want to use HouziBuilder, open configuration.json and find one_signal_app_id and provide your OneSignal App ID as its value. If the key doesn’t exist in your configuration, you can add as a new key in the root object of json.

Change Notification Icon

Please follow this guide to change the notifcation icon:

Added in version 1.4.0

--- ## Direct Messages URL: https://houzi-doc.booleanbites.com/tools/direct_messages

Direct Messaging is an excellent way to connect with realtors efficiently. We’ve developed this feature to significantly improve engagement and communication between clients and real estate professionals. By enabling seamless and direct interaction, it fosters a more personalized and responsive experience, allowing for timely updates and meaningful conversations. This feature is designed to bridge the gap between clients and realtors, enhancing overall satisfaction and streamlining the real estate process.

Important: These messages are not real-time like WhatsApp; instead, they are HTTP-based, where the app periodically polls the server for new messages. You can adjust the polling interval through a hook as described below.

Direct Message are disabled by default on Houzez. To use the Direct Message feature, you will need to perform some configurations on your WordPress site.

This guide includes the following sections:

Direct Messages Setup on WordPress

You have to provide these following configurations:

1. Enable Direct Message Button:

Go to the Theme Options > Contact Forms. Enable the Direct Message Button setting and Save Changes.

messages-setup-wordpress-01

2. Create Message Page:

messages-setup-wordpress-02

3. Enable Push Notification:

Houzez v3.3.0 already sends the push notification for direct messages.

To Enable Push Notifications for Messages in Houzez version 3.2.5 and below, you will need to do following changes manually:

$notificationArgs = array(
            "title" => $subject,
            "message" => $message,
            "type" => "messages",
            "to" => $user_email,
        );

do_action('houzez_send_notification', $notificationArgs);

messages-setup-wordpress-03

Houzi Package via Houzi Builder

Direct Messages Pooling Interval Configuration via Hooks

Checkout Direct Messages Hooks for further direct messages configurations.

❗️❗️IMPORTANT❗️❗️

Direct Messages Setup on WordPress is required. Please ensure that you have configured Direct Messages on your Wordpress before configuring via HouziBuilder and Hooks.

❗️❗️IMPORTANT❗️❗️

Direct Messages are sent directly to the author of the listing. If the listing is assigned to an agency or an agent, they will not receive these messages. In contrast, when a contact email is sent regarding a listing, it is directed to the assigned agency or agent. This is how Houzez theme designed the messages.

Added in version 1.4.2

--- ## Publishing to the App Store URL: https://houzi-doc.booleanbites.com/tools/publish_on_appstore




This guide walks you through the step-by-step process of publishing your Houzi Flutter app on the Apple App Store, from setting up your developer account to making your app live.

Prerequisites

Before you begin, ensure you have the following:


Step 1: Setting Up Your Apple Developer Account

  1. Visit Apple Developer and sign in with your Apple ID.
  2. Enroll in the Apple Developer Program by following the on-screen instructions.
  3. Pay the annual $99 fee to activate your account.
  4. Once approved, sign in to App Store Connect.

Step 2: Configuring Your App in App Store Connect

  1. Log in to App Store Connect and go to My Apps.
  2. Click the + button and select New App.
  3. Enter the following details:
  4. Under the Distribution tab, fill in the following:
  5. Under the App Information option on the left, configure subtitle, content right and age rating.
  6. Under the App Privacy option on the left, provide Privacy URL, and fill out Data Safety form. It is a long process, so take your time.
  7. Under the Pricing and Availability section, choose your app’s price tier and availability location.

Step 3: Preparing Your App for Submission

  1. Open Xcode and load your Houzi Flutter project.
  2. Ensure the following settings are correctly configured:
  3. Run your app on a real iOS device for testing.

Step 4: Archiving and Uploading Your App

  1. In Xcode, select Product > Archive.
  2. Once the build process is complete, open Organizer and select the latest archive.
  3. Click Distribute App and choose App Store Connect.
  4. Select Upload and ensure that all app metadata is correct.
  5. Click Upload and wait for the submission to complete.

Step 5: Submitting for Review

  1. Go to App Store Connect > My Apps.
  2. Under the TestFlight tab, check the status of binary, if it is ready for submission. We’re ready.
  3. Under the Distribution tab, scroll down to binary section and choose the latest binary.
  4. Click save on the top right.
  5. Click Add for Review.
  6. Click Submit for Review.

Step 6: Apple’s Review Process


Step 7: Post-Publication Maintenance

  1. Monitor App Analytics in App Store Connect to track performance.
  2. Update Your App Regularly to fix bugs and introduce new features.
  3. Engage With Users by responding to reviews and feedback.
  4. Optimize In-App Purchases for better monetization.

Final Thoughts

Congratulations! You’ve successfully published your Houzi Flutter App on the Apple App Store. Follow these steps carefully, and you’ll ensure a smooth launch process.

If you have any questions, feel free to reach out. Happy publishing!

--- ## Publishing to the GooglePlay URL: https://houzi-doc.booleanbites.com/tools/publish_on_google_play




This guide walks you through the step-by-step process of publishing your Houzi Flutter app on the GooglePlay store, from setting up your developer account to making your app live.

Prerequisites

Before you begin, ensure you have the following:

Generate the Android App Bundle (AAB)

  1. Open Android Studio and load your Flutter project.
  2. Ensure correct configurations:
  3. Build the Android App Bundle (.AAB):

Setting Up Google Play Console and Creating an App

  1. Log in to Google Play Console.
  2. Create a New App.
  3. Provide:
  4. Save changes.

Preparing for Closed Testing Release

Google Requires Some Configurations Before Applying to Production

  1. Privacy & Data Safety:
  2. App Access:
  3. Ads Declaration:
  4. Content Rating:
  5. Target Audience:
  6. Some App related Declarations
  7. App category and Contact details
  8. Store Listing Setup
  9. Prepare for Closed Testing.

Waiting for Approval

Invite Testers to Closed Testing App

Once app is approved for closed testing. Now is the time to share link with closed testers.

  1. In Google Play Console, go to Testers.
  2. Add at least 12 testers if not already added.
  3. Copy the link for Android app.
  4. Share the link with your testers.
  5. Get the app downloaded on at least 12 tester phones.

Running Closed Testing for 14 Days

Apply to Production

Once the 14-day testing is complete, it is time to Apply for Production.

Release to Production

Once approved, you can release your app to Production.

  1. In Google Play Console, go to Production > Create Release.
  2. Select Google Play App Signing (recommended for security).
  3. Upload your .AAB file.
  4. Add Release Notes (e.g., bug fixes, new features).
  5. Click Review & Submit.

Google Play Review Process

Congratulations!

Your Houzi Flutter App is now published on the Google Play Store. Keep improving it, monitor performance, and engage with users for long-term success!

--- ## Setup AI Features URL: https://houzi-doc.booleanbites.com/tools/setup_ai_features

Houzi now ships with built-in AI features that make your real estate app smarter for your users. The AI features are powered by your own AI provider account (bring your own key), so you stay in full control of the provider, the model, and the cost.

There are three AI features in the app:

1. AI Home — Tailored for You

The home screen greets users with a natural language search box and a Tailored for You section — AI-generated shortcuts based on the taxonomies of your website (property types, statuses, and features), along with Top Matches for You. See the Home AI Layout guide to select this design and configure the AI widgets.

AI home screen with Tailored for You suggestions

Users can type (or speak) what they’re looking for in plain language — for example, “Looking for residential options in Miami preferably with swimming pool and outdoor shower”. The AI understands the query, converts it into structured search filters (property type, location, features), and shows matching listings. Users can refine further with suggested follow-up chips like Under $1M or 3+ Bedrooms.

AI search screen with parsed natural language query and matching listings

3. Ask About This Listing

On the property details screen, buyers can chat with AI about the listing. The AI answers questions strictly based on the listing data — directions to the property, agent contact, floor details, and more — with rich, actionable cards (map with directions, agent call/message buttons, floor plan).

Ask AI chat about a property listing


How to enable AI features

1. Upgrade

The AI features require:

Update the Houzi Rest Api plugin on your WordPress site and rebuild your app with the latest Houzi version. If you’re upgrading an existing project, follow the 1.4.8 Migration Guide first.

2. Enable AI on the plugin

In your WordPress admin, go to Houzi Rest Api → AI tab.

Houzi Rest Api plugin AI settings tab

Turn on Enable AI — the master switch for all AI features.

3. Add your AI provider key

Houzi AI works on a bring-your-own-key (BYOK) model. Your API key stays on your server; the app never sees it. Pick one of the supported providers and paste its API key:

Select the provider in the AI Provider dropdown and paste the key in the API Key field.

4. Choose a model (we recommend flash / lite models)

Since AI calls are billed to your provider account, we recommend using the flash / lite / mini model of each provider. They are very cost effective and more than sufficient for the features Houzi offers:

Provider Recommended Model Recommended Lite Model
Google (Gemini) gemini-3-flash-preview gemini-3.1-flash-lite
Claude (Anthropic) claude-haiku-4-5 claude-haiku-4-5
OpenAI gpt-5-mini gpt-5-nano

Note: These are the recommended models as of writing this doc (23 July 2026). Please check your provider’s website for the latest available models when you set this up — newer flash / lite variants may have been released since.

5. Pick the features you want

Under Features, toggle each AI feature individually:

6. Optional settings

Hit Save Changes — and that’s it. Launch the app and the AI features will light up on the home screen.

--- ## Houzi Project Components URL: https://houzi-doc.booleanbites.com/app-setup/houzi_project_components




The Houzi project is a real estate app designed using Flutter and includes several essential components. This document outlines the major parts of the project and their purpose, providing developers with a comprehensive understanding of how each piece works.

1. Flutter Project

This is the main part of the Houzi project and follows a standard Flutter project structure. The Flutter project contains two critical files:

2. Houzi Package Dependency

The houzi_package is the core of the app, containing all of the code that powers Houzi’s features and functionality. While the Flutter project depends on this package, it exists as a separate component. This separation allows for easier upgrades when a new version of Houzi is released.

Key Points:

3. Android Native Project

The Android native project is the part that interacts with Android-specific functionalities like Firebase, push notifications, and Android-specific permissions. You will need to edit following things when configuring the project for the first time.

Once set up initially, updates to the houzi_package usually do not require editing the Android project files.

4. iOS Native Project

Similar to the Android native project, the iOS native project is responsible for iOS-specific features like push notifications and deep linking. You will need to edit following things when configuring the project for the first time.

This part generally doesn’t need editing when updating the houzi_package unless you need to change core settings or app branding.

5. Assets Directory

The assets directory contains all the static files used by the app, including:

Typically, this directory remains unchanged when upgrading the houzi_package unless you need to update your custom branding or design elements.

6. Configurations JSON File

The configurations.json file is a vital part of the app’s customization. It includes:

Importance:


Important Notes:


--- ## Change Website URL URL: https://houzi-doc.booleanbites.com/app-setup/change_app_url




Change URL by Houzi Config

You can use Houzi Config Builder to Change Website URL and provide many other URLs required for the app.

Change URL by editing config.json

Open the Project_HOME > assests > configuration > configuration.json file, and look for wordpress_url_domain and wordpress_url_scheme. Replace with your own domain and scheme.

//Mandatory
"wordpress_url_scheme": "https",
"wordpress_url_domain": "domain.com",
"wordpress_url_path": "",

if your website URL does not contain a subpath then leave wordpress_url_path as it is.

You need to provide following URL to your website pages

//Optional
"app_terms_url": "https://domain.com/terms.html",
"app_privacy_url": "https://domain.com/privacy.html",
"app_terms_of_use_url": "https://domain.com/terms.html",
"wordpress_url_gdpr_agreement": "https://domain.com/gdpr.html",

/// Your Company Related
"company_url": "https://booleanbites.com",

Important: If you are using non secure domain, add your domain to following files for mobile systems to allow communication to non-secure domain:

Read guides here:

--- ## Set App Icon URL: https://houzi-doc.booleanbites.com/app-setup/change_app_icon




Since this is a Flutter app, and it generates both Android and iOS projects. You’ll need to change icons in each platform project.

Automatic Way

Flutter Launcher Icons has been designed to help quickly generate launcher icons for both Android and iOS:

  1. Flutter Launcher Icon.

  2. Add the package to your pubspec.yaml file (within your Flutter project) to use it.
    dev_dependencies:
      flutter_launcher_icons: "0.9.2"
    
  3. Within the pubspec.yaml file specify the path of the icon you wish to use for the app and then choose whether you want to use the icon for the iOS app, Android app or both.
    flutter_launcher_icons:
      android: true
      ios: true
      image_path: "assets/icon/icon.png"
    
  4. After setting up the configuration, all that is left to do is run the package.
    flutter pub get
    dart run flutter_launcher_icons
    

The default launcher icons have now been replaced with your custom icon.

Manual method

You can manually replace icons in Android and iOS projects at following places:

Keep in mind, in a manual method, you’ll have to generate icons in different resolutions. There’s plenty of tools available that can take your high-res icon and convert them to platform supported resolutions.

Adaptive Icons (Android)

Starting from Android OS 8 api 26, Android has provided adaptive icons option. An adaptive icon, or AdaptiveIconDrawable, can display differently depending on individual device capabilities and user theming.

adaptive-icons-android

We also have included a sample adaptive icon in android project. Either you can provide your own adaptive icon or remove those icons.

If you want to add your own adaptive icons:
  1. replace these files with your own:

     res / drawable / icon_background.xml
     res / drawable / icon_foreground.xml
    
  2. rename the res / mipmap-anydpi-v26 / ic_launcher_rename_if_required.xml to ic_launcher.xml

To provide your own icon as adaptive, you’ll need to design your icon as an svg and then export both the background and foreground layers in separate svg files. Later either convert them to Android vector or import them using android import tool from Android Studio. Importing an SVG or PSD file

If you keep the file name same as above, then nothing more need to be done. Otherwise you’ll need to reference these newly imported files in res / mipmap-anydpi-v26 / ic_launcher.xml as foreground and background of your vector.

If you want to remove adaptive icon

For 1.3.0 and above, nothing needed.

For 1.2.0 and below, remove following files:

res / drawable / icon_background.xml
res / drawable / icon_foreground.xml
res / mipmap-anydpi-v26 / ic_launcher.xml 

Themed Icons (Android API 33 and Above)

Starting from Android 13 (API level 33), Android introduced a feature for Themed Icons. Themed icons dynamically adjust their color based on the user’s chosen wallpaper and system-wide theme, giving your app a modern and personalized look. When a user applies a new wallpaper, the icon color will adapt to complement the overall theme of the device, ensuring visual harmony. adaptive-icon-themed-icons
To add support for themed icons in your app, follow these steps:

  1. Create a Monochrome Icon: Your themed icon needs to be a monochrome version of your primary icon. This will be used for theming purposes.

  2. Add to Android Project: Add the monochrome icon file in the Android project and update the launcher configuration.

    <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
        <background android:drawable="@drawable/icon_background"/>
        <foreground android:drawable="@drawable/icon_foreground"/>
        <monochrome android:drawable="@drawable/monochrome_icon"/>   <!-- this can be icon_foreground or a separate monocrhome icon>
    </adaptive-icon>
    

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

--- ## App display name URL: https://houzi-doc.booleanbites.com/app-setup/change_app_display_name




By default the display name for the app is set to Houzi. For Android, you can change it in AndroidManifest.xml. For iOS, you can change it in info.plist.

Android

Open AndroidStudio, expand android > app > src > main project folder, and find AndroidManifest.xml

Look for the application tag, and replace android:label attribute with your own display name.

For iOS

open Xcode, and click on the project name (Runner) on the top left side and click on Info tab, you should see the Bundle Identifier option, change its value with your own. Project_HOME > ios > Runner > Info > Bundle Name

Replace Bundle Name value with your display name.

--- ## App bundle identifier & version URL: https://houzi-doc.booleanbites.com/app-setup/change_app_identifier




Mandatory App bundle identifiers are unique identifiers for your apps, they’re globally unique. Most of the time, you can reverse your website domain to create an identifier for your app. For example: com.domain.app_name

This guide consists of following sections:

Once you’ve decided the unique identifiers, you need to replace existing with your own package identifier.

Important Once you have changed the bundle identifier, you will be required to setup your own firebase projects. App will not compile if you just change your package identifier and not setup your own firebase.

Android:

You’ve to change package info in two places. build.gradle and AndroidManifest.xml

Change applicationId in build.gradle:

To change the package in build.gradle, follow these steps:

Change package in AndroidManifest.xml:

To change the package in AndroidManifest.xml, follow these steps:

android > app > src > main > kotlin > your > package > name > all_kotlin_files

Suggestion We suggest renaming the folders manually using Finder or Windows Explorer. Then change the package declaration in kotlin files as well, for example in all kotlin files change this line:

package com.houzi.app

To your own package like this:

package your.package.name

OneSignal Push Configurations for Android

If you want to support push notification, you have to do following steps:

Change App Bundle Identifier

For iOS, open Xcode, and click on the project name (Runner) on the top left side and click on General tab, you should see the Bundle Identifier option, change its value with your own.

ios-app-bundle-identifier

open: Project_HOME > ios > Runner > General > Bundle Identifier

OneSignal Push Configurations for iOS

If you want to enable OneSignal Push Notification, then you also need to update the App Group bundle identifier in two places.

  1. Target Runner:
    ios-app-groups-id-1.jpg
     open: Project_HOME > ios > Runner > Signing & Capabilities > App Groups
    

    Set the App Groups in signing to be group.YOUR_BUNDLE_IDENTIFIER.onesignal where YOUR_BUNDLE_IDENTIFIER is the same as your Main Application “Bundle Identifier”.

  2. Target OneSignalNotificationServiceExtension
    ios-app-groups-id-2.jpg
     open: Project_HOME > ios > OneSignalNotificationServiceExtension > Signing & Capabilities > App Groups
    

    Set the App Groups in signing to be group.YOUR_BUNDLE_IDENTIFIER.onesignal where YOUR_BUNDLE_IDENTIFIER is the same as your Main Application “Bundle Identifier”. Make sure it is the same as you have in your Main Runner Target App Group.

--- ## Changing Theme Colors URL: https://houzi-doc.booleanbites.com/app-setup/change_app_theme

Change Theme Colors by Houzi Config

You can use Houzi Config Builder to change Theme Colors and many other options.

Change Theme Colors by config.json

You can change colors from config by replacing *** with your own color code. Open the Project_HOME > assests > configuration > configuration.json file, and look for the following keys:

Note: The FF, 4D, 99 are used for opacity, if you want to change the opacity then modify them otherwise leave it as it is:

 "primary_color": "#FF******",
  "secondary_color": "#FF******",
  "icon_tint_color": "#FF******",
  "bottom_tab_bar_tint_color": "#FF******",
  "slider_tint_color": "#FF******",
  "selected_item_background_color": "#4D******",
  "un_selected_item_background_color": "#1A808080",
  "selected_item_text_color": "#FF******",
  "un_selected_item_text_color": "#8A000000",
  "action_button_background_color": "#FF******",
  "featured_label_background_color": "#99******",

Note: If you didn’t update the version number of config, then you will need to remove the existing app and re-install on device.

--- ## Changing Splash screen URL: https://houzi-doc.booleanbites.com/app-setup/change_app_splash_screen




Flutter command: You can change splash background by adding this flutter library: https://pub.dev/packages/flutter_native_splash Follow instructions for changing splash from one place.

Manual method

You can manually change splash screen in Android and iOS projects at following places:

Android:

Project_HOME > android > app > src > main > res > values > strings.xml

Background Color

Change the “backgroundColor” with hex color like this:

<color name="backgroundColor">#2B3D2D</color>
Splash icon

To change or remove the splash icon, open these files:

To remove the icon, remove these line:

<item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/ic_launcher" />
</item>

To edit or replace the icon, replace the image file at this place:

The icon can be of any size. You can use any name with icon file, just update the reference in launch_background.xml

iOS

Project_HOME > ios > Runner > Runner > LaunchScreen Open LaunchScreen and it’ll show you a graphical interface to edit your launch screen. You can add text, photos and anything on your screen. To learn more, read the official docs here: Specifying Your App’s Launch Screen

Run App

Once everything is set up. Do a flutter clean, so flutter picks up the new configuration and setup everything in child projects. From top menu toolbar select Tools > Flutter > Flutter Clean From top menu toolbar select Run > Run main.dart

Wait… and see if it compiles and run for you.

--- ## Localization (Translation) URL: https://houzi-doc.booleanbites.com/app-setup/localization

Add new language?

Follow Hooks and Widget section on how to Add New Language.

Philosophy

There are two types of strings that we need to handle, first one is app level/static strings and the other is for translating dynamic strings sent from the server. Both of them can be handle in one file

We’ve generated an exhaustive English translation file. You can copy this file and rename it with your own language.

For translation, copy and duplicate the following file with your own locale.

Go to the Project_HOME > assets > localization > en_localization.json and duplicate and translate the values on the right side in the new file like this:

"search": "Search"
To Dutch like this:
"search": "zoekopdracht"

The traditional localisation method handles strings that are already included in the project source, but there are certain events where strings come from the server, and we still need to translate those.

For example we cannot know how many property statuses or how many property features are there on your server, so we also covered a dynamic way of localisation for those strings.

Find json files placed in following folder:

Project_HOME > assets > localization > en_localization.json

Add missing / non translated strings to the English file, and then copy this file in the same folder, prefix this to your locale like ar_localization.json for Arabic and start adding strings that are coming from your server in a json format.

If you need to use this custom translation at any place, use following method:

String localized = UtilityMethods.getLocalizedString("String Key in json");
--- ## Localized URL for WPML URL: https://houzi-doc.booleanbites.com/app-setup/app_url_localization

When you’re using WPML, you provide localization of your data on langugage specific URL of your website. It can either be a parameter (domain.com/?lang=en, domain.com/?lang=fr) or it can be a subdirectory (domain.com/en, domain.com/fr). The REST API provide localized data on localized URL. So if you want to get localized data from server you can add language name as Parameter or Directory. There is a third option if you do not want to add language name to the URL.

Open the Project_HOME > assests > configuration > configuration.json file, and look for the locale_in_url key. If you want to add language name as parameter set the value Language name as parameter, like following:

    ...
    "locale_in_url": "Language name as parameter",
    ...

If you want to add language name as directory set the value Language name as directory, like following:

    ...
    "locale_in_url": "Language name as directory",
    ...

If you want to do not want both of them set the value Do not change url, like following:

    ...
    "locale_in_url": "Do not change url",
    ...

You can also change these option from Houzi Builder Api & Config section.

--- ## Add item in drawer URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_item_in_drawer

To add an item to the drawer, follow these steps:

  1. Open the file hooks_v2.dart located in the following path within your project: Project_HOME > lib > hooks_v2.dart.

  2. Locate the getDrawerItems() method in the file.

  3. Inside the getDrawerItems() method, you can add a new item to the drawer by creating a DrawerItem object.

  4. Specify the properties of the DrawerItem object as follows:

  1. Once you have created the DrawerItem object, add it to the drawerItemList list.

  2. Finally, return the drawerItemList from the getDrawerItems() method.

To add an expandable item to the drawer, you can follow a similar process with an additional step:

  1. Create a new DrawerItem object for the expandable item.

  2. Set the expansionTileChildren property of the expandable item to a list of DrawerItem objects. These objects represent the items that will be displayed when the expandable item is clicked.

  3. Add the expandable item, along with its child items, to the drawerItemList list.

Here’s an updated example of the code:

@override
DrawerHook getDrawerItems() {
  DrawerHook drawerHook = (BuildContext context) {
    // Add a regular drawer item
    DrawerItem drawerItem = DrawerItem(
      sectionType: "section_name",
      title: "Your title here",
      checkLogin: false,
      enable: true,
      insertAt: 5,
      icon: Icons.real_estate_agent,
      onTap: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => AllAgents(),
          ),
        );
      },
    );

    // Add an expandable item with child items
    DrawerItem expandedDrawerItem = DrawerItem(
      sectionType: "section_name",
      title: "Your title here",
      checkLogin: false,
      enable: true,
      insertAt: 5,
      icon: Icons.real_estate_agent,
      expansionTileChildren: [
        DrawerItem(
          sectionType: "hook",
          title: "Activities",
          checkLogin: true,
          enable: true,
          icon: Icons.article_outlined,
          onTap: () {
            // Add your code here for desired action
          },
        ),
        DrawerItem(
          sectionType: "hook",
          title: "Inquiries",
          checkLogin: true,
          enable: true,
          icon: Icons.question_answer,
          onTap: () {
            // Add your code here for desired action
          },
        ),
      ],
    );

    List<dynamic> drawerItemList = [drawerItem, crmExpandedDrawerItem];

    return drawerItemList;
  };

  return drawerHook;
}

Remember to replace the placeholder values with your desired names, titles, and actions.

Note: The Icons.xxxxx values in the code are based on the icons provided by the Google Material icons library. You can find the complete list of available icons here. Choose the appropriate icon by selecting the corresponding icon name from the library.

--- ## Add item in Profile tab URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_item_profile

If you want to add item in profile tab, go to Project_HOME > lib > hooks_v2.dart. Look for the getProfileItemHook() method.

  static getProfileItemHook(){
    ProfileHook profileHook = (BuildContext context){
      List<Widget> profileItemHookList = [
        // Add menu item map here
      ];
      return profileItemHookList;
    };
  }

Steps to Add Menu item:

  1. Copy and paste the sample code of menuItem.
  Widget menuItem = genericWidgetRow(
    iconData: ,
    text: ,
    onTap: (){
      // Some Function()
    },
    removeDecoration: ,
    padding: ,
  );
  1. Provide IconData against the iconData field.
  2. Provide Item Label against the text field.
  3. Provide action that you want to perform on tap of this item, against the onTap field.
  4. If you do not want a divider under the menu item, set the value of removeDecoration to true.
  5. If you want to manually adjust the padding of menu item, provide Padding against the padding field.
  6. Rename the widget menuItem, as you like.
  7. Finally add the Widget to the List profileItemHookList.
  8. Restart the App.

Example code for Menu item:

Widget descriptionMenuItem = genericWidgetRow(
  iconData: Icons.description_outlined,
  text: "Temporary Show Description",
  onTap: (){
    // Some Function()
    print("Showing Description.........................");
  },
  // removeDecoration: true,
  // padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
);

Widget helpMenuItem = genericWidgetRow(
  iconData: Icons.help_outlined,
  text: "Temporary Show Help",
  onTap: (){
    // Some Function()
    print("Showing Description.........................");
  },
  // removeDecoration: true,
  // padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
);

List<Widget> profileItemHookList = [
  // Add menu item map here
  descriptionMenuItem,
  helpMenuItem,
];

--- ## Add item in Settings URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_item_settings

If you want to add item in Settings, go to Project_HOME > lib > hooks_v2.dart. Look for the getSettingsItemHook() method.

static getSettingsItemHook(){
    SettingsHook settingsHook = (BuildContext context){
      List<dynamic> settingsItemHookList = [
        // Add menu item map here
      ];
      return settingsItemHookList;
    };
  }

There are two types of items that you can add to Settings:

  1. Single Settings Menu item.
  2. Settings Menu Section with Menu items.

Steps to Add Single Settings Menu item:

  1. Copy and paste the sample code of singleSettingsMenuItem.

    
    Widget singleSettingsMenuItem = genericWidgetRow(
         iconData: ,
         text: ,
         onTap: (){
           // Some Function()
         },
         removeDecoration: ,
         padding: ,
         sectionType: "preferences",
       );
    
       Map<String, dynamic> singleSettingsMenuItemMap = {
         "sectionType" : "preferences",
         "menuItem" : singleSettingsMenuItem,
       };
    
    
  2. Provide IconData against the iconData field.
  3. Provide Item Label against the text field.
  4. Provide action that you want to perform on tap of this item, against the onTap field.
  5. If you do not want a divider under the menu item, set the value of removeDecoration to true.
  6. If you want to manually adjust the padding of menu item, provide Padding against the padding field.
  7. Rename the widget singleSettingsMenuItem, as you like.
  8. There are two sections on ‘Settings’ page:
    1. preferences.
    2. community_standards_and_legal_policies.

    If you want to place the menu item in specific section, define the section type (preferences or community_standards_and_legal_policies) against the sectionType key in singleSettingsMenuItemMap.

  9. Add the widget name (e.g. singleSettingsMenuItem, if not changed) against the menuItem key in singleSettingsMenuItemMap.
  10. Rename the widget singleSettingsMenuItemMap, as you like.
  11. Finally add the Widget Map name to the List settingsItemHookList.
  12. Restart the App.

Example code for Single Settings Menu item:


Widget descriptionSettingsMenuItem = genericWidgetRow(
            iconData: Icons.description_outlined,
            text: "Temporary Show Description",
            onTap: (){
                // Some Function()
                print("Showing Description.........................");
            },
            removeDecoration: true,
            padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
        );

        Map<String, dynamic> descriptionSettingsMenuItemMap = {
            "sectionType" : "",
            "menuItem" : descriptionSettingsMenuItem,
        };

        Widget helpSettingsMenuItem = genericWidgetRow(
            iconData: Icons.help_outlined,
            text: "Temporary Show Help",
            onTap: (){
                // Some Function()
                print("Showing Description.........................");
            },
            removeDecoration: true,
            padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
        );

        Map<String, dynamic> helpSettingsMenuItemMap = {
            "sectionType" : "",
            "menuItem" : helpSettingsMenuItem,
        };


        List<dynamic> settingsItemHookList = [
            descriptionSettingsMenuItemMap,
            helpSettingsMenuItemMap,
        ];

Steps to Add Settings Menu Section with Menu items:

  1. Copy and paste the sample code of settingsMenuSectionWithItems.

    
    Widget settingsMenuSectionWithItems = genericSettingsWidget(
         headingText: "",
         headingSubTitleText: "",
         removeDecoration: false,
         enableTopDecoration: true,
         enableBottomDecoration: false,
         body: Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
             // define your menu items here
           ],
         ),
       );
    
       Map<String, dynamic> settingsMenuSectionWithItemsMap = {
         "sectionType" : "",
         "menuItem" : settingsMenuSectionWithItems,
       };
    
    
  2. Provide Section Heading Name against the ‘headingText’ field.
  3. Provide Section Sub-Heading Name against the ‘headingSubTitleText’ field.
  4. If you do not want a divider under the menu item, set the value of removeDecoration to true.
  5. If you want to provide a divider above the menu section, set the value of enableTopDecoration to true.
  6. If you want to provide a divider below the menu section, set the value of enableBottomDecoration to true.
  7. Rename the widget settingsMenuSectionWithItems, as you like.
  8. Add the menu items in the childern section of the body.
  9. Leave the empty value against sectionType key in settingsMenuSectionWithItemsMap.
  10. Add the widget name (e.g. settingsMenuSectionWithItems, if not changed) against the menuItem key in settingsMenuSectionWithItemsMap.
  11. Rename the widget settingsMenuSectionWithItemsMap, as you like.
  12. Finally add the Widget Map name to the List settingsItemHookList.
  13. Restart the App.

Example code for Settings Menu Section with items:

Widget settingsMenuSectionWithItems = genericSettingsWidget(
    headingText: "Temporary Heading",
    headingSubTitleText: "Temporary Sub Heading",
    enableTopDecoration: true,
    enableBottomDecoration: false,
    body: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
            genericWidgetRow(
                iconData: Icons.description_outlined,
                text: "Temporary Show Description",
                onTap: (){
                    // Some Function()
                    print("Showing Description.........................");
                    },
                removeDecoration: true,
                ),
                genericWidgetRow(
                iconData: Icons.help_outlined,
                text: "Temporary Help Description",
                onTap: (){
                    // Some Function()
                    print("Showing Help.........................");
                    },
                removeDecoration: true,
            ),
        ],
    ),
);

Map<String, dynamic> settingsMenuSectionWithItemsMap = {
    "sectionType" : "",
    "menuItem" : settingsMenuSectionWithItems,
};


List<dynamic> settingsItemHookList = [
    settingsMenuSectionWithItemsMap,
];

--- ## Add new Language URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_new_language

If you want to add new langauge, you have to follow some few steps:

Step 1

First open Project_HOME > assets > localization, simply make a copy of English localization and rename it as YOUR-LANGUAGE-CODE_localization.json then translate the right side of sentences in your language.

*Note: Your file name must contain language code like YOUR-LANGUAGE-CODE_localization.json (e.g. en_localization.json).

*If you want to use different script for the same language like Chinese zh-Hant and zh-Hans, rename your file including the script code. For example, zh_Hant_localization.json etc.

Step 2

You need to add the new files path in pubspec.yaml, so it can be bundled in final app binary after compile. Open file Project_HOME > pubspec.yaml and find the assets section. Copy your localized strings file name and mention it like following example.

assets:
  ...
    # if you are not using different script:
    - assets/localization/YOUR-LANGUAGE-CODE_localization.json
    - assets/localization/en_localization.json

    # if you are using different script, add script code as well:
    - assets/localization/YOUR-LANGUAGE-CODE_SCRIPT-CODE_localization.json
    - assets/localization/zh-Hant_localization.json
  ...

Step 3

Now go to Project_HOME > lib > hooks_v2.dart and look for the getLanguageCodeAndName() method. Specify your language code and language name.

[Optional] You can also specify scriptCode, countryCode and languageFileName.

  
  static getLanguageCodeAndName() {
    LanguageHook languageHook = () {

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

       Map<String,String> chineseLanguageMap = {
        "languageName": "Chinese (Traditional)",
        "languageCode": "zh",
        "scriptCode": "Hant",
        "countryCode": "CN",
        "languageFileName": "zh_Hant_localization.json",
      };

      Map<String,dynamic> yourLanguageMap = {
        "languageName": "YOUR-LANGUAGE-NAME",      // Specify your language name
        "languageCode": "YOUR-LANGUAGE-CODE"       // Specify your language code
        "scriptCode": "YOUR-SCRIPT-CODE"       // [Optional] Specify your script code
        "countryCode": "YOUR-COUNTRY-CODE"       // [Optional] Specify your country code
        "languageFileName": "YOUR-LANGUAGE-FILE-NAME"       // [Optional] Specify your language file name
        /// Optional for routing/localized URL:
        "languageCodeForURL": "/uk"                   // "/uk" or simply "uk"
      };

      List<dynamic> languageList = [russianLanguageMap, chineseLanguageMap, yourLanguageMap];  //add your map here
      return languageList;
    };

    return languageHook;
  }
  

*Note: You can add yourLanguageMap in the languageList without the Optional fields. In simple words, the optional fields can be removed.

--- ## Add new font URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_new_font

You can add new fonts to the app by copying the font with different weight in the following folder

Project_HOME > fonts > new_font_folder

They should contain font weight files like this:

Project_HOME > fonts > new_font_folder

> new_font-regular.ttf
> new_font-light.ttf
> new_font-bold.ttf

Don’t forget to add new font entry to following file in pubspec.yaml fonts section, open file here: Project_HOME > pubspec.yaml

And add the entry in fonts section like this

Fonts:
- family: FontNameYouDesire
  Fonts:
    - asset: fonts/new_font_folder/new_font-regular.ttf
    - asset: fonts/new_font_folder/new_font-light.ttf        
    - asset: fonts/new_font_folder/new_font-bold.ttf

Register font at app level

If you want to apply the font at application level, open following file: Project_HOME > lib > hooks_v2.dart Look for the getFontHook() method and add your font name as follow:

//you can also add a condition to change font for multiple locales as well:
FontsHook fontsHook = (Locale locale) {

    return "FontNameYouDesire";

};

//You can also use this font in a TextStyle like this
TextStyle(
    
    fontFamily: "FontNameYouWroteInPubSpec",
); 

Read more about fonts here: https://docs.flutter.dev/cookbook/design/fonts

--- ## Set default Language URL: https://houzi-doc.booleanbites.com/hooks-widgets/set_default_language

If you want to set default langauge, go to Project_HOME > lib > hooks_v2.dart. Look for the getDefaultLanguageHook() method.

DefaultLanguageCodeHook defaultLanguageCodeHook = () {
      /// Add here your default language code
      return "en";
    };
--- ## Default Country for Phone Login URL: https://houzi-doc.booleanbites.com/hooks-widgets/set_default_country_code

If you want to set default Country Code for Phone Login, go to Project_HOME > lib > hooks_v2.dart. Look for the getDefaultCountryCodeHook() method.

DefaultCountryCodeHook defaultCountryCodeHook = () {
    // return 2 Letter ISO Code to make it default country code for phone login
    return "PK";
};
--- ## Change design of Property listing URL: https://houzi-doc.booleanbites.com/hooks-widgets/property_item_design_custom

If you want to change property listing, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Set the Height of Design

Look for the getPropertyItemHeightHook() method. Return the height (in double, e.g. return 200;) instead of returning null.

Example Code:

  
   @override
  PropertyItemHeightHook getPropertyItemHeightHook() {
    PropertyItemHeightHook propertyItemHeightHook = (String designName) {

        return null;
    };
    return propertyItemHeightHook;
  }
  

Set the Widget of Design

Look for the getPropertyItemHookV2() method. You are provided with the following parameters:

article:

aritcle is the instance of property/listing item. You can get the listing related information (e.g. Listing’s title, price etc.) from it.

designName:

designName is a String parameter. If you want to use specific design for specific type of listing item/items, you can use the designName to achieve this purpose.

Whe you select the “item_design_form_hook” option form the dropdown menu of layout designs, the Title of that widget will be provided to you as the designName so if you want, you can provide seperate listing design for that paritcular listing section.

heroId:

By default, the listings provided by the Houzi app uses the Hero widget for smooth transititon between listing item and listitng item profile. If you want to take advantange of this Hero widget, you can use the heroId in the tag of your Hero widget.

onTap:

onTap is the default call back provided by the Houzi app. If you want to use the default call back on the listing item, then use the onTap.

Example Code:

  
    @override
  PropertyItemHookV2 getPropertyItemHookV2() {
    PropertyItemHookV2 propertyItemHookV2 =
        ({required article, required designName, required heroId, required onTap}) {

      // Return your designName specific listing design widget here
     if (designName == 'Featured Properties') {
        return YOUR_SPECIFIC_DESIGN_WIDGET_HERE or null;
      }

      // Return your global listing design widget here
      return YOUR_GLOBAL_DESIGN_WIDGET_HERE or null;
    };

    return propertyItemHookV2;
  }
  

Deprecated Hook

Following is the description of depricated hook. We recommend you to use the PropertyItemHookV2.

Look for the getPropertyItemHook() method. The Property/Article instance is provided to you, return the widget that you want to show. eg:

  
    PropertyItemHook propertyItemHook = (BuildContext context, Article article) {

      return YOUR_GLOBAL_DESIGN_WIDGET_HERE or null;

    };
  
--- ## Change design of Agency listing URL: https://houzi-doc.booleanbites.com/hooks-widgets/agency_item_design_custom

If you want to change property listing, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getAgencyItemHook() method. The Agency instance is provided to you, return the widget that you want to show. eg:

  
    AgencyItemHook agencyItemHook = (Agency agency) {
      return Container(
        child: Center(child: Text(agency.title)),
      );
    };
  
--- ## Change design of Agents listing URL: https://houzi-doc.booleanbites.com/hooks-widgets/agent_item_design_custom

If you want to change property listing, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getAgentItemHook() method. The Agent instance is provided to you, return the widget that you want to show. eg:

  
    AgentItemHook agentItemHook = (Agent agent) {
      return Container(
        child: Center(child: Text(agent.title)),
      );
    };
  
--- ## Set icon for Terms on Home URL: https://houzi-doc.booleanbites.com/hooks-widgets/term_icon_item_design_custom

Each Property Type, Property Status and Property Label are called Term in the Houzez (wordpress) taxonomies. When you add a new property type, you actually add new term in Property Type taxonomy in your wordpress.

When you open app, the app loads Property Type, Property Status and other taxonomies on homepage. For each term (for-sale, for-rent, house, office) we show an icon against its slug. See below screenshot

Houzi home term icon

Each Term has title, slug and other meta-data. So lets say you’ve a term Shop, and its slug is shop, you can set its icon with hooks. If you want to show term icon for your translated Term, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getElegantHomeTermsIconMap() method. Then look for _iconMap, and edit existing or add new entry for your desired term, add the slug-name of your term.

Use Google Material Icon

You can return Google Material Icon library icon as term for a slug, as below:

Map<String, dynamic> _iconMap = {
    "for-rent": Icons.vpn_key_outlined,
    "residential": Icons.apartment_outlined,

    "shop": Icons.store_outlined,
    "متجر": Icons.store_outlined,     //<-- translated slug of term for shop
    ...
};

The Icons.xxxxx are coded from Google Material icons here: https://fonts.google.com/icons

Use custom icon or image

You can also provide your own colored icon or image for a term. This will allow you to provide more customized and brand aligned icons for your app.

Houzi home term custom icon

The process is as below:

  1. Start by adding the desired icon to your assets folder.
  2. Add references to your project pubspec file by opening Project_HOME > pubspec.yaml and add reference to the newly added icons under assets: keyword, so they’re bundled in your app.
assets:
    ...
    existing assets references
    ...
    - assets/new_icon_here.png
  1. Then open Project_HOME > lib > hooks_v2.dart and find getElegantHomeTermsIconMap() and make changes as below:
Map<String, dynamic> _iconMap = {
    "for-rent": Image.asset('assets/for-rent.png'),
    "for-sale": Image.asset('assets/for-sale.png'),
    "commercial": Image.asset('assets/commercial.png'),
    "residential": Image.asset('assets/residential.png'),
    ...
};

The recommended size for the custom icon image is 100x100.

--- ## Change design of Term URL: https://houzi-doc.booleanbites.com/hooks-widgets/term_widget_item_design_custom

If you want to change Term Widget design, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getTermItemHook() method. The metaDataList list is provided to you, return the widget that you want to show. eg:

  
    TermItemHook termItemHook = (List metaDataList) {

      return //your widget here;
    };
  
--- ## Design sections in Property Details URL: https://houzi-doc.booleanbites.com/hooks-widgets/property_details_customization

Houzi provides you with the option to completely customize your Property Details Screen. You can provide your own custom widgets if you do not want to utilize the default Houzi widgets for the Property details screen.

Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getWidgetHook() method. You are provided wtih the following parameters:

context

The parameter context is of the type of Build Context. If you wnat to provide a inline widget you can use this context widget.

It is recommended that you use proper widget (stateless or stateful) instead of using inline or function widgets.

article

The parameter article is property object whose details are being displayed. If you are providing your custom widget then you will need the property object data to display in your widget e.g. Tiltle or Address of property etc.

You can visit the following file to learn more about article.

Project_HOME > packages > houzi_package > lib > models > article.dart

hook

The parameter hook represents the identifier for the widget being built.

If you provide your custom widget against the desired hook, the default Houzi widget (or an empty space) will be replaced with your custom widget.

Hook

Following is the glimpse of the getWidgetHook(). You can provide your custom widget against any desired section/widget just by simply returning your custom widget instead of returing null.

  
   @override
  PropertyPageWidgetsHook 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;
      } 
  

Example

You have a custom widget named as customDescriptionWidget() and you want to use this widget instead of default Houzi Description widget on the Property Details Screen. You can simply replace the null with your custom widget against the “article_description” hook as follows:

  
    else if (hook == 'article_features') {

        return null;
    } else if (hook == 'article_description') {
      
        return customDescriptionWidget(context, article);
    } else if (hook == 'article_address_info') {

        return null;
    }
  

// your customDescriptionWidget 
static Widget customDescriptionWidget(BuildContext context, Article article) {
    return Text(
        article.content ?? "",
        maxLines: 5,
        overflow: TextOverflow.ellipsis,
        textAlign: TextAlign.justify,
      );

After modifications, restart the app and the changes will reflect in your app.

--- ## Feature icon in Property Details URL: https://houzi-doc.booleanbites.com/hooks-widgets/property_details_feature_icons

If you want to show feature icon for your translated property feature, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getPropertyDetailPageIconsMap() method. Then look for _iconMap, and edit existing or add new entry for your desired features, eg:

Map<String, dynamic> _iconMap = {
    "Piscine": Icons.pool_outlined, 
    "Pool": Icons.pool_outlined,
    ...
};

The Icons.xxxxx are coded from Google Material icons here: https://fonts.google.com/icons

--- ## Set Home Right Bar Button URL: https://houzi-doc.booleanbites.com/hooks-widgets/home_right_bar_button

If you want to add item in Settings, go to Project_HOME > lib > hooks_v2.dart. Look for the getHomeRightBarButtonWidgetHook() method.

static getHomeRightBarButtonWidgetHook() {
    HomeRightBarButtonWidgetHook homeRightBarButtonWidgetHook = (context) {

      Widget? rightBarButtonHook;
      // Widget rightBarButtonHook = DefaultRightBarButtonIdWidget();

      return rightBarButtonHook;
    };
  }

Steps to Customize Home Right Bar Button Id Widget:

  1. If you want to hide the Home Right Bar Button Id Widget, define null against rightBarButtonHook.
  2. If you want to show the default Home Right Bar Button Id Widget, define DefaultRightBarButtonIdWidget() against rightBarButtonHook.
  3. If you want to show your custom widget, define yourWidget() against rightBarButtonHook.
  4. Finally return the widget rightBarButtonHook.
  5. Restart the App.

Example code snippets:


// Hide Home Right Bar Button Id Widget
Widget rightBarButtonHook = null;
return rightBarButtonHook;

// Default Home Right Bar Button Id Widget
Widget rightBarButtonHook = DefaultRightBarButtonIdWidget();
return rightBarButtonHook;

// Custom Widget
 Widget rightBarButtonHook = GestureDetector(
  child: Icon(Icons.search_outlined),
  onTap: () {
    // Perform Some Function here
  },
);

return rightBarButtonHook;

--- ## Set default HomePage URL: https://houzi-doc.booleanbites.com/hooks-widgets/default_home_page

If you want to set default HomePage, go to Project_HOME > lib > hooks_v2.dart. Look for the getDefaultHomePageHook() method. You can choose your default home for the app. You have four options, choose one of the following:

  1. home_0 (Home Carousel)
  2. home_1 (Home Elegant)
  3. home_2 (Home Location)
  4. home_3 (Home Tabbed)
DefaultHomePageHook defaultHomePageHook = () {
  
  return "home_1";

};

Otherwise you can set this from Houzi Builder.

--- ## Set Custom Map Pin URL: https://houzi-doc.booleanbites.com/hooks-widgets/set_custom_marker

If you want to show custom map pin with custom dynamic string like price on MapView instead of default Google Maps Pin, you can enable this using this hook.

Open file at Project_HOME > lib > hooks_v2.dart. Look for the getCustomMarkerHook() method.

  CustomMarkerHook getCustomMarkerHook() {
    
    CustomMarkerHook markerIconHook = (BuildContext context, Article article) {
      /// If you want to set the default Pin Point marker return null
      /// else return the title, background, title-color and an optional text style
      ///
      MapMarkerData markerData = MapMarkerData(
          text: article.getCompactPriceForMap(),
          backgroundColor: Colors.red,
          textColor: Colors.white
      );
      return markerData;
    };

    return markerIconHook;
  }

MapMarkerData is a class that takes text, backgroundColor, textColor and textStyle. You can provide the text that you want to show on Map pin. textColor and textStyle are optional. But they’re there for you to provide any customization.

You can return null if you don’t want to use custom map pin.

Map Pins Showing price

Added in version 1.2.0

--- ## Set Custom Map Icon URL: https://houzi-doc.booleanbites.com/hooks-widgets/custom_map_marker

Show custom marker in MapView instead of default Pin Point marker using this hook. First you have to go to Project_HOME > assets folder and paste your image. Copy your image name and go to PROJECT_HOME > pubspec.yaml and specify image path in asset section e.g

  ...
    assets:
      - assets/IMAGE-NAME.png
  ...

Then go to Project_HOME > lib > hooks_v2.dart. Look for the getMarkerIconHook() method.

static getMarkerIconHook() {
    MarkerIconHook markerIconHook = () {
      // If you want to set the default Pin Point marker return null
      // else return the path of the image
      //
      //
      //return null;

      return "assets/IMAGE-NAME.png";
    };

    return markerIconHook;

  }
--- ## Set Marker Title in Map View URL: https://houzi-doc.booleanbites.com/hooks-widgets/map_marker_title

You can set Marker Title in Map View, go to Project_HOME > lib > hooks_v2.dart. Look for the getMarkerTitleHook() method.

Set title to the marker in MapView. Instance of Article/Property is provided. You can choose whatever the title you want to set, it can be property title, id, price or anything

static getMarkerTitleHook() {
    MarkerTitleHook markerTitleHook = (Article article) {
  
      String markerTitle = article.title!;
      return markerTitle; // return title here (should be string type) 
    };

    return markerTitleHook;

  }
--- ## Set Price Format URL: https://houzi-doc.booleanbites.com/hooks-widgets/price_formatter_customization

In the Houzi app, you have the flexibility to set your own price format methods. There are two price formatters used in different parts of the app.

1. Formatting Price in Property Detail Page or Other Places

If you want to format the price in the Property Detail page or any other place, follow these steps:

  1. Locate the file hooks_v2.dart in your project. The path is Project_HOME > lib > hooks_v2.dart.

  2. Look for the method getPriceFormatterHook() in the hooks_v2.dart file.

  3. Inside the getPriceFormatterHook() method, define your own method to format the price and return the formatted string. If you prefer to use the default Houzi formatter, you can simply return null. Here’s an example:

    @override
    PriceFormatterHook getPriceFormatterHook() {
      PriceFormatterHook priceFormatterHook = (String propertyPrice, String firstPrice) {
        // Define your own formatting here and return the formatted price string
        return null;
      };
    
      return priceFormatterHook;
    }
    

2. Formatting Price on Property Card

If you want to format the price on the Property Card, follow these steps:

  1. Open the file hooks_v2.dart in your project. The path is Project_HOME > lib > hooks_v2.dart.

  2. Locate the method getCompactPriceFormatterHook() in the hooks_v2.dart file.

  3. Inside the getCompactPriceFormatterHook() method, define your own method to format the price and return the formatted string. If you prefer to use the default Houzi formatter, you can return null. Here’s an example:

    @override
    CompactPriceFormatterHook getCompactPriceFormatterHook() {
      CompactPriceFormatterHook compactPriceFormatterHook = (String inputPrice) {
        // Define your own formatting here and return the formatted price string
        return null;
      };
    
      return compactPriceFormatterHook;
    }
    

3. Displaying Full Price on Property Card

If you want to show the full price on the Property Card, you can use the following code in the getCompactPriceFormatterHook() method:

@override
CompactPriceFormatterHook getCompactPriceFormatterHook() {
  CompactPriceFormatterHook compactPriceFormatterHook = (String inputPrice) {
    // Use the utility method priceFormatter to format the price
    return UtilityMethods.priceFormatter(inputPrice, "");
  };

  return compactPriceFormatterHook;
}

4. Displaying Indian Compact Currency on Property Card

If you want to show the Indian compact price on the Property Card, you can use the following code in the getCompactPriceFormatterHook() method:

@override
CompactPriceFormatterHook getCompactPriceFormatterHook() {
  CompactPriceFormatterHook compactPriceFormatterHook = (String inputPrice) {
    // Define your own formatting here and return the formatted price string
    String compactPrice = '';
    String postfix = '';
    String additionalCharacter = '';
    String defaultCurrency = '₹';

    RegExp pattern = RegExp(r"\b(\d+(\.\d+)?)(M|K)\b"); //Checks for normal compact price

    pattern = RegExp(r'^[\d,.]+[KkLlCcRr]+$'); //Checks for Indian compact prices

    /// Return Input Price If already in Compact State
    if (pattern.hasMatch(inputPrice)) {
      return inputPrice;
    }

    /// Remove Currency from Input Price
    if(inputPrice.contains(defaultCurrency)) {
      inputPrice = inputPrice.replaceAll(defaultCurrency, '');
    }
    /// Remove ',' from Input Price
    if(inputPrice.contains(',')) {
      inputPrice = inputPrice.replaceAll(',', '');
    }
    /// Separate Postfix from Input Price, like 2000/per month or 400/per sq yd
    if(inputPrice.contains('/')){
      postfix = inputPrice.split('/')[1];
      inputPrice = inputPrice.split('/')[0];
    }
    /// Round of Input Price to One Digit
    if (inputPrice.contains('.')) {
      var priceDouble = double.tryParse(inputPrice);
      if (priceDouble == null) return inputPrice;

      inputPrice = priceDouble.toStringAsFixed(0);
    }
    /// Check for any plus sign and append later like 400+
    if(inputPrice.contains('+')){
      inputPrice = inputPrice.split('+')[0];
      additionalCharacter = "+";
    }
    /// Strip any pipe sign
    if(inputPrice.contains('|')){
      inputPrice = inputPrice.split('|')[0];
    }

    /// Make the Input Price Compact
    var priceDouble = double.tryParse(inputPrice);
    if (priceDouble == null) return inputPrice;
    NumberFormat compactFormat = NumberFormat.compactCurrency(
      decimalDigits: 2,
      symbol: defaultCurrency, // Currency symbol (e.g., ₹)
      locale: 'en_IN', // Indian locale
    );
    compactPrice = compactFormat.format(priceDouble);

    ///  Add PostFix to Input Price
    if(postfix.isNotEmpty) {
      compactPrice = '$compactPrice/$postfix';
    }

    if(additionalCharacter.isNotEmpty) {
      compactPrice = '$compactPrice$additionalCharacter';
    }

    return compactPrice;
  };

  return compactPriceFormatterHook;
}

By following these instructions, you can customize the price formatting in the Houzi app according to your requirements.

--- ## Hide Show Price URL: https://houzi-doc.booleanbites.com/hooks-widgets/hide_show_price

If you want to hide price on property cards or in property details page, you can use following hook.

Go to Project_HOME > lib > hooks_v2.dart. Look for the getHidePriceHook() method. For e.g:

@override
HidePriceHook getHidePriceHook() {
  HidePriceHook hidePriceHook = () {

    bool hidePropertyPrice = false;

    return hidePropertyPrice;
  };

  return hidePriceHook;
}

You can return conditional checks as well, like if you want to hide price by default and show to logged in users only. Or if you want to show price to certain user roles, example below:

// Use isLoggedIn, if you want to show price to logged in users.
bool isLoggedIn = HiveStorageManager.isUserLoggedIn();
hidePropertyPrice = isLoggedIn ? false : true;

// Use roles, if you want to show price to certain roles for logged in user.
String userRole = HiveStorageManager.getUserRole() ?? "";
hidePropertyPrice = (userRole == ROLE_ADMINISTRATOR || userRole == USER_ROLE_HOUZEZ_AGENCY_VALUE) ? false : true;

This will hide listing price on property cards as well as on property details pages.

Added in version 1.2.0

--- ## Segmented Control Design URL: https://houzi-doc.booleanbites.com/hooks-widgets/segmented_control_design

If you want to add your own Segmented Control design, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getCustomSegmentedControlHook() method. The necessary items are provided to you.

  1. dataList is the list on which segmented control will build.
  2. selectionIndex is currently selected item index.
  3. onSegmentChosen is the callback to use when a segmented item is chosen. It is better to use provided onSegmentChosen callback as it is handling all the necessary things rather than your own callback.

Return the widget that you want to show. eg:

  
    CustomSegmentedControlHook customSegmentedControlHook = (context, dataList, selectionIndex, onSegmentChosen) {

      return null; // return null if you want to use default app MaterialSegmentedControl
    };

    return customSegmentedControlHook;
  
--- ## Add Header in webservice URL: https://houzi-doc.booleanbites.com/hooks-widgets/set_api_header

If you want to add Header in webservice, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getHeaderMap() method. Add key value pair in a given map. eg:

  
    Map<String, dynamic> map = {
      ...
      "your_key_here": "your_value_here",
      
      //like this
      "secret_key": "!@#%^&*()_-+=",
    };
  
--- ## Hide empty items in Terms URL: https://houzi-doc.booleanbites.com/hooks-widgets/hide_empty_terms

If you want to hide empty cities, areas or states, you can use follwing hook to hide empty enteries in any term. Terms are added on backend, and there can be lot of terms with empty data

If this function returns true, for a Term, the empty enteries in that terms will be hidden.

For example, for property_city, you’ve three cities [New York, Miami, Los Angeles] One of the city doesn’t have any listing. Meaning you don’t have any property listing in that city. So do you want to hide the city from selection that has zero listings? return true when it asks for term ‘property_city’

Specially useful for property_area, as it can be filtered out to show only non-empty areas.

Project_HOME > lib > hooks_v2.dart

Look for the hideEmptyTerm() method. Add key value pair in a given map. eg:

  HideEmptyTerm shouldHide = (String termName) {
    
    if (termName == 'property_city') {
      return true; //return true to hide empty cities.
    }
    if (termName == 'property_area') {
      return true; //return true to hide empty areas.
    }
    
    return false; //false shows all.
  };
  

The terms names are the one Houzez uses on the admin panel. These consist of following terms: property_country, property_state, property_city, property_area, property_type, property_features, property_label, property_status.

Added in version 1.2.0

--- ## Add Custom Widget in Home URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_widget_in_home

You can show custom widgets to your home pages easily via hooks.

adding custom widget placeholder

If you want to show a ‘custom widget’ in Home page, you need to do following things:

For Example: If you have a custom widget named as 'banner-notification-section'. Just replace the HOOK_NAME with 'banner-notification-section' and return your widget as follows:

  HomeWidgetsHook homeWidgetsHook = (
        BuildContext context,
        String? hookName,
        bool isRefreshed) {

//      This is sample code:
//      if (hookName == 'HOOK_NAME') {
//        return WIDGET;
//      }

        if (hookName == 'banner-notification-section') {
          return Container(
            height: 120,
            child: Text("I'm custom widget"),
          );
        }

      return null;
    };
  

Note: You can re-arrange the position of your 'banner-notification-section' & you can re-name your 'banner-notification-section' from the HouziBuilder Desktop App.

Added in version 1.3.0

--- ## Add Custom Widget in Home Sliver App bar URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_widget_in_home_sliver_appbar

You can show custom widgets to your home pages sliver appbar easily via hooks.

If you want to show a ‘custom widget’ in Home page sliver appbar, you need to do following things:

For Example: If you have a custom widget named as CustomWidget(), define its height and body and define _bodyHookMap and restart the app.

  @override
  HomeSliverAppBarBodyHook getHomeSliverAppBarBodyHook() {
    HomeSliverAppBarBodyHook _homeSliverAppBarBodyHook = (context) {
      Map<String, dynamic>? _bodyHookMap;
      double? _bodyWidgetHeight;
      Widget? _bodyWidget;

      // _bodyWidgetHeight = 220;
      // _bodyWidget = CustomWidget();
      
      _bodyHookMap = {
        "height" : _bodyWidgetHeight,
        "widget" : _bodyWidget,
      };
      return _bodyHookMap;
    };
    return _homeSliverAppBarBodyHook;
  }
  

Added in version 1.3.0

--- ## Add Custom Widget in Property Details URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_widget_in_property_details

You can show custom widgets to your property details pages easily via hooks.

adding custom widget placeholder

If you want to show a ‘custom widget’ in property details page, you need to do following things:

You are provided with the Property Article Information as the object ‘article’. You can get your desired information from the ‘article’ and display in your Custom Widget.

Configuration Structure

The configuration entry in configurations.json for a custom widget must follow this structure:

{
  "widget_type": "place_holder",
  "widget_title": "banner-notification-section",
  "widget_enable": true,
  "widget_view_type": ""
}

Hook Implementation

In lib/hooks_v2.dart, replace the HOOK_NAME with the value you provided in widget_title:

  PropertyPageWidgetsHook detailsHook = (
      BuildContext context,
      Article article,
      String hook,
    ) {
      
      if (hook == 'banner-notification-section') {
          return Container(
            height: 120,
            child: Text("I'm custom widget"),
          );
        }

      return null;
    };

Note: You can re-arrange the position of your banner-notification-section & you can re-name your banner-notification-section from the HouziBuilder Desktop App.

Added in version 1.3.0

--- ## Add Custom Header in Drawer URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_drawer_header

If you want to add a custom drawer header, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getDrawerHeaderHook() method. You are provided with:

@override
DrawerHeaderHook getDrawerHeaderHook() {
  DrawerHeaderHook drawerHeaderHook = (
    BuildContext context,
    String appName,
    String appIconPath,
    String? userProfileName,
    String? userProfileImageUrl,
  ) {
    Widget? drawerHeaderWidget;
    // Customization logic for the drawer header goes here
    return drawerHeaderWidget;
  };
  return drawerHeaderHook;
}

Make sure to replace the placeholder comments with your specific customization logic for the drawer header.

Added in version 1.3.0

--- ## Add Custom Widget in Drawer URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_widget_in_drawer

If you want to add a custom widget in drawer, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getDrawerWidgetsHook() method. You are provided with hookName parameter. In the if_statement() comparison, replace the HOOK_NAME with your specific hookName (which you have already defined in the HouziBuilder Desktop Application.) and replace your Custom widget with WIDGET.

For Example: If you have a custom widget named as custom-widget. Just replace the HOOK_NAME with custom-widget and return your widget as follows:

@override
  DrawerWidgetsHook getDrawerWidgetsHook() {
    DrawerWidgetsHook drawerWidgetsHook = (
        BuildContext context,
        String? hookName) {

        //      This is sample code:
        //      if (hookName == 'HOOK_NAME') {
        //        return WIDGET;
        //      }

        if (hookName == 'custom-widget') {
          return Container(
            height: 100,
            child: Text("I'm custom widget"),
          );
        }

      
    };

    return drawerWidgetsHook;
  }

Note: You can re-arrange the position of your custom widget & you can re-name your custom widget from the HouziBuilder Desktop App.

Added in version 1.3.5

--- ## Add Custom Page in Navigation Bar URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_page_in_navigation_bar

If you want to add a custom page to Bottom Navigation Bar (Tab bar), you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getNavbarWidgetsHook() method. You are provided with hookName parameter. In the if_statement() comparison, replace the HOOK_NAME with your specific hookName (which you have already defined in the HouziBuilder Desktop Application.) and replace your Custom widget with WIDGET.

For Example: If you have added a place_holder type widget to navigation bar and name it custom-widget. Just replace the HOOK_NAME with custom-widget and return your widget/page as follows:

Code Preview:

  @override
  NavbarWidgetsHook getNavbarWidgetsHook() {
    NavbarWidgetsHook navbarWidgetsHook = (
        BuildContext context,
        String? hookName,
        ) {

      //      This is sample code:
      //      if (hookName == 'HOOK_NAME') {
      //        return WIDGET;
      //      }

      if (hookName == 'custom-widget') {
        return Container(
          height: 100,
          child: Text("I'm custom widget"),
        );
      }

      return null;
    };

    return navbarWidgetsHook;
  }

You can return full page from here. For example, to show :

  if (hookName == 'custom-widget') {
    return AddPropertyRequest();
  }

Note: You can re-arrange the position of your custom widget and you can re-name your custom widget from the Houzi Builder Desktop App.

Added in version 1.3.8

--- ## Add Floating Action Button URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_floating_action_button

By default when you enable Floating Action Button from HouziBuilder, it always open Quick Add Property.

You can customize the Floating Action Button on the Navigation Bar (tab bar).

To customize the FAB, do following:

  1. You need to Enable FAB via HouziBuilder, then export and save configurations.
  2. Customize it with hooks.

Note: Enabling FAB from Houzi Builder is necessary. For quick enabling, you can add or edit "show_bottom_navbar_add_button": true, to your configuration.json file.

To customize FAB, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getAddPlusButtonInBottomBarHook() method.

You will be provided with some code in this method. Just comment or remove the return null; statement and un-comment the commented below code:

Now define your custom Action, that you want to perform when the Floating Action Button will be pressed, in the onPressed method.

Code Preview:

 @override
  AddPlusButtonInBottomBarHook getAddPlusButtonInBottomBarHook() {
    AddPlusButtonInBottomBarHook hook = (BuildContext context) {
      /// If you wish to include a Plus button in the center of the bottom bar,
      /// return your widget else return null.
      ///
      /// Please note that this approach is not compatible with BOTTOM BAR DESIGN_02.

      // return null;

      return Container(
        width: 65,
        height: 65,
        margin: const EdgeInsets.only(top: 0),
        child: FloatingActionButton(
          backgroundColor: AppThemePreferences.appSecondaryColor,
          child: Icon(Icons.add,color: Colors.white,size: 35),
          elevation: 4.0,
          onPressed: () {
            // add your custom action here
          },
        ),
      );
    };

    return hook;
  }

Note: Add Floating Action Button is not availble for Navigation Bar Design 02.

Added in version 1.3.8

--- ## Customize Cluster Marker Icon URL: https://houzi-doc.booleanbites.com/hooks-widgets/customize_cluster_marker_icon

If you want to customize the cluster marker on Google Maps, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getCustomizeClusterMarkerIconHook() method. You can modify the cluster icon colors as well as its size. You are provided with the clusterMarkerDataMap. Provide your releted customization against the respective key and return the clusterMarkerDataMap instead of returning null.

After modifications, restart the app and the changes will reflect on Maps.

@override
  ClusterMarkerIconHook getCustomizeClusterMarkerIconHook() {
    ClusterMarkerIconHook customizedClusterMarkerIconHook = () {
      Map<String, dynamic>? clusterMarkerDataMap = {
        "clusterColor": Colors.blue,
        "clusterTextColor": Colors.white,
        "clusterBorderColor": Colors.white,
        "clusterWidth": 80, // int
        "clusterBorderWidth": 10.0, // double
      };

      // return clusterMarkerDataMap;
      return null;
    };

    return customizedClusterMarkerIconHook;
  }

Note: If you want to show the Cluster Marker Icon with default settings, return null.

Added in version 1.3.8

--- ## Custom Cluster Marker Icon URL: https://houzi-doc.booleanbites.com/hooks-widgets/custom_cluster_marker_icon

If you want to display your custom cluster marker on Google Maps, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getCustomClusterMarkerIconHook() method. You are provided with the customClusterMarkerIconHook with 2 additional parameters i.e. BuildContext and clusterSize. Define your cluster marker icon here and return it instead of returning null.

After modifications, restart the app and the changes will reflect on Maps.

@override
  CustomClusterMarkerIconHook getCustomClusterMarkerIconHook() {
    CustomClusterMarkerIconHook customClusterMarkerIconHook = (BuildContext context, int clusterSize) {

      return null;
    };

    return customClusterMarkerIconHook;
  }

Note: If you want to show the Default Cluster Marker Icon, return null.

Added in version 1.3.8

--- ## Set minimum characters for Login Password URL: https://houzi-doc.booleanbites.com/hooks-widgets/set_minimum_characters_login_password

If you want to set the minimum character for the password of the Login and User-Sign-up, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getMinimumPasswordLengthHook() method. By default, the minimum characters limit is set to 8. Replace it according to your requirement.

After modifications, restart the app and the changes will reflect on Maps.

@override
  MinimumPasswordLengthHook getMinimumPasswordLengthHook() {
    MinimumPasswordLengthHook minimumPasswordLengthHook = () {
      return 8;
    };
    return minimumPasswordLengthHook;
  }

Added in version 1.3.9

--- ## Agent Profile Configurations URL: https://houzi-doc.booleanbites.com/hooks-widgets/agent_profile_configurations

If you want to customize the Agent Profile such as show/hide fields like tax number, license etc, you need to open following file:

Project_HOME > lib > hooks_v2.dart

Look for the getAgentProfileConfigurationsHook() method. Perform customization according to your requirement.

After modifications, restart the app and the changes will reflect on Maps.

@override
  AgentProfileConfigurationsHook getAgentProfileConfigurationsHook() {
    AgentProfileConfigurationsHook agentProfileConfigurationsHook = (hook) {
      if (hook == "additional_info") {
        return null;  // return true if you want to hide the whole additional information section.
      } else if (hook == "license") {
        return null;  // return true if you want to hide the license section.
      } else if (hook == "tax_number") {
        return null;  // return true if you want to hide the tax number section.
      } else if (hook == "service_areas") {
        return null;  // return true if you want to hide the service areas section.
      } else if (hook == "specialities") {
        return null;  // return true if you want to hide the specialities section.
      }

      return null;
    };
    return agentProfileConfigurationsHook;
  }

Added in version 1.3.9

--- ## Text Form Field Customization URL: https://houzi-doc.booleanbites.com/hooks-widgets/text_form_field_customization

Houzi proivdes you with the getTextFormFieldCustomizationHook() to customize the Text Form Field throughout the app. Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getTextFormFieldCustomizationHook() method:

@override
  TextFormFieldCustomizationHook getTextFormFieldCustomizationHook() {
    TextFormFieldCustomizationHook textFormFieldCustomizationHook = () {
      Map<String, dynamic> textFormFieldCustomizationMap = {
        'labelTextStyle' : null,
        'hintTextStyle' : null,
        'additionalHintTextStyle' : null,
        'backgroundColor' : null,
        'focusedBorderColor' : null,
        'hideBorder' : null,
        'borderRadius' : null,
      };

      return textFormFieldCustomizationMap;
    };

    return textFormFieldCustomizationHook;
  }

You can customize following attributes of Text Form Field:

Let’s dive into the details of each attribute customization.

Label TextStyle

Label is the title of the text form field. If you do not want to use the default Houzi Label TextStyle, you can define your custom label textstyle and instead of returning null against the ‘labelTextStyle’ key in the textFormFieldCustomizationMap, return your custom textstyle for label.

Hint TextStyle

Hint is the helping text provided as the placeholder text inside the empty text form field. If you do not want to use the default Houzi Hint TextStyle, you can define your custom hint textstyle and instead of returning null against the ‘hintTextStyle’ key in the textFormFieldCustomizationMap, return your custom textstyle for hint.

Additional Hint TextStyle

Additional Hint is the helping text provided below the text form field for some additional guidance. If you do not want to use the default Houzi Additional Hint TextStyle, you can define your custom additional hint textstyle and instead of returning null against the ‘additionalHintTextStyle’ key in the textFormFieldCustomizationMap, return your custom textstyle for additional hint.

Background Color

Background Color is the background color of the text form field. If you do not want to use the default Houzi Background Color for the text form field, you can define your custom background color and instead of returning null against the ‘backgroundColor’ key in the textFormFieldCustomizationMap, return your custom background color.

Focused Border Color

Focused Border Color is the border color of the text form field when the user interacts with it. If you do not want to use the default Houzi Focused Border Color for the text form field, you can define your custom focused Border color and instead of returning null against the ‘focusedBorderColor’ key in the textFormFieldCustomizationMap, return your custom focused Border color.

Hide Border

If you do not want to show border around the text form field, instead of returning null against the ‘hideBorder’ key in the textFormFieldCustomizationMap, return true.

Border Radius

Border Radius is the radius of borders of the text form field. If you do not want to use the default Houzi Border Radius, you can define your custom border radius and instead of returning null against the ‘borderRadius’ key in the textFormFieldCustomizationMap, return your custom border radius.

After modifications, restart the app and the changes will reflect in your app.

--- ## Text Form Field Configuration URL: https://houzi-doc.booleanbites.com/hooks-widgets/text_form_field_configuration

Houzi proivdes you with the getTextFormFieldWidgetHook() to configure the Text Form Field throughout the app. Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getTextFormFieldWidgetHook() method.

@override
  TextFormFieldWidgetHook getTextFormFieldWidgetHook() {
    TextFormFieldWidgetHook textFormFieldWidgetHook = (
        context,
        labelText,
        hintText,
        additionalHintText,
        suffixIcon,
        initialValue,
        maxLines,
        readOnly,
        obscureText,
        controller,
        keyboardType,
        inputFormatters,
        validator,
        onSaved,
        onChanged,
        onFieldSubmitted,
        onTap,
    ) {

      Widget? textFormFieldWidget;
      return textFormFieldWidget;
    };

    return textFormFieldWidgetHook;
  }

Simply define your custom Text Form Field widget against the textFormFieldWidget as follows:

...
      Widget? textFormFieldWidget = YOUR_CUSTOM_WIDGET_HERE();
      return textFormFieldWidget;
    };

    return textFormFieldWidgetHook;
  }

After modifications, restart the app and the changes will reflect in your app.

--- ## Perform Action on User Login URL: https://houzi-doc.booleanbites.com/hooks-widgets/perform_action_on_user_login

Houzi proivdes you with the getUserLoginActionHook() to perform some action on User Login. Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getUserLoginActionHook() method.

@override
  UserLoginActionHook? getUserLoginActionHook() {
    UserLoginActionHook loginActionHook = ({
      required context,
      required formKey,
      required usernameEmail,
      required password,
      required loginNonce,
      required defaultLoginFunc}) {
      // define your action here
    };

    // return loginActionHook;
    return null;
  }

You are provided with the following parameter:

Let’s dive into the details of each parameter.

context

context is the Build Context. You are provided with the context so you can perform build context related actions.

formKey

You are provided with the formKey so could perform form actions. e.g. you can validate the form fields using the formKey etc.

For validating the form state just type following code:

formKey.currentState!.validate();

usernameEmail

After validating the form fields, you can save the form state and then you will get the input provided by the user as Email or User name in the usernameEmail parameter.

For saving the form state just type following code:

formKey.currentState!.save();

password

After validating the form fields, you can save the form state and then you will get the input provided by the user as password in the password parameter.

For saving the form state just type following code:

formKey.currentState!.save();

loginNonce

You are required to pass a login nonce along the user credientials for the user login. You are provided with the loginNonce for this purpose.

defaultLoginFunc

If you want to perform some additional actions along the default Houzi Login Action, you can use the defaultLoginFunc for this purpose. Just define your additional actions and at the end use the defaultLoginFunc.

For example:

UserLoginActionHook loginActionHook = ({
      required context,
      required formKey,
      required usernameEmail,
      required password,
      required loginNonce,
      required defaultLoginFunc}) {
      // define your actions here
      actions();
      // use defaultLoginFunc at the end
      defaultLoginFunc();
    };
@override
  UserLoginActionHook? getUserLoginActionHook() {
    UserLoginActionHook loginActionHook = ({
      required context,
      required formKey,
      required usernameEmail,
      required password,
      required loginNonce,
      required defaultLoginFunc}) {
      // define your action here
    };

     return loginActionHook;
  }
--- ## Perform Action on Add Property URL: https://houzi-doc.booleanbites.com/hooks-widgets/perform_action_on_add_property

Houzi proivdes you with the getAddPropertyActionHook() to perform some action on Add Property. Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getAddPropertyActionHook() method.

@override
  AddPropertyActionHook? getAddPropertyActionHook() {
    AddPropertyActionHook addPropertyActionHook = ({
      required context,
      required addPropertyNonce,
      required uploadImagesNonce,
      required addPropertyDataMap,
      required defaultAddPropertyFunc}) {
      // define your action here
    };

    // return addPropertyActionHook;
    return null;
  }

You are provided with the following parameter:

Let’s dive into the details of each parameter.

context

context is the Build Context. You are provided with the context so you can perform build context related actions.

addPropertyNonce

You are required to pass a Add Property Nonce aginst the addPropertyNonce key along the property data map for adding a property. You are provided with the addPropertyNonce for this purpose.

uploadImagesNonce

You are required to pass a Upload Image Nonce aginst the addPropertyImageNonce key along the image data map for uploading an image. You are provided with the uploadImagesNonce for this purpose.

addPropertyDataMap

You are provided with all the form fields related keys and values data e.g. Property Title and its user input etc. in the addPropertyDataMap. You can use this map for your custom actions.

defaultAddPropertyFunc

If you want to perform some additional actions along the default Houzi Add Property Action, you can use the defaultAddPropertyFunc for this purpose. Just define your additional actions and at the end use the defaultAddPropertyFunc.

For example:

@override
  AddPropertyActionHook? getAddPropertyActionHook() {
    AddPropertyActionHook addPropertyActionHook = ({
      required context,
      required addPropertyNonce,
      required uploadImagesNonce,
      required addPropertyDataMap,
      required defaultAddPropertyFunc}) {
      // define your action here
      actions();
     // use defaultAddPropertyFunc at the end
      defaultAddPropertyFunc();
    };

    // return addPropertyActionHook;
    return null;
  }
@override
  AddPropertyActionHook? getAddPropertyActionHook() {
    AddPropertyActionHook addPropertyActionHook = ({
      required context,
      required addPropertyNonce,
      required uploadImagesNonce,
      required addPropertyDataMap,
      required defaultAddPropertyFunc}) {
      // define your action here
    };

    return addPropertyActionHook;
  }
--- ## Add Custom Drawer Menu Row Design URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_drawer_menu_row_design

Houzi proivdes you with the getDrawerMenuItemDesignHook() for providing widget for custom drawer menu row design. Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getDrawerMenuItemDesignHook() method.

@override
  DrawerMenuItemDesignHook? getDrawerMenuItemDesignHook() {
    DrawerMenuItemDesignHook drawerMenuItemDesignHook = ({
      required iconData, required label, required onTap, required selectedItem}) {
      // return your design widget here
      return null;
    };

    // return drawerMenuItemDesignHook;
    return null;
  }

You are provided with the following parameter:

Let’s dive into the details of each parameter.

label

You are provided with the String type label parameter which is the label of the row. You can use the this parameter as label text in your custom design widget.

iconData

You are provided with the IconData type iconData parameter which is used in the Icon widget of the row. You can use the this parameter in the Icon widget of your custom design widget.

selectedItem

You are provided with the String type selectedItem parameter which is the current selected item of the drawer menu. You can use the this parameter in your custom design widget accordingly.

onTap

You are provided with the VoidCallback type onTap parameter which is the callback on drawer menu row. You can use the this parameter in your custom design widget accordingly.

Return drawerMenuItemDesignHook instead of null for the modifications to work.

@override
  DrawerMenuItemDesignHook? getDrawerMenuItemDesignHook() {
    DrawerMenuItemDesignHook drawerMenuItemDesignHook = ({
      required iconData, required label, required onTap, required selectedItem}) {
      // return your design widget here
    };

    return drawerMenuItemDesignHook;
  }

After modifications, restart the app and the changes will reflect in your app.

--- ## Default App Theme Mode URL: https://houzi-doc.booleanbites.com/hooks-widgets/default_app_theme_mode

Houzi proivdes you with the getDefaultAppThemeModeHook() for configuring the default app theme mode. You have following theme mode options:

  1. light (For the Light Theme Mode).
  2. dark (For the Dark Theme Mode).
  3. system (For the System Default Theme Mode).

Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getDefaultAppThemeModeHook() method. Return the desired option from one of the above mentioned options.

@override
  DefaultAppThemeModeHook? getDefaultAppThemeModeHook() {
    DefaultAppThemeModeHook defaultAppThemeModeHook = () {
      return "light";
    };

    return defaultAppThemeModeHook;
  }

After modifications, restart the app and the changes will reflect in your app.

--- ## Direct Messages Hooks URL: https://houzi-doc.booleanbites.com/hooks-widgets/direct_messages_hooks

Direct Messages is one of the best way to contact the realtor. Houzi proivdes you with the getThreadApiRefreshTimeHook() and getMessageApiRefreshTimeHook() for configuring the Refresh rate for the Threads and Messages APIs.

By default, the refresh rate for both APIs is 5 seconds.

Simply open the file from the following path:

Project_HOME > lib > hooks_v2.dart

Look for the getThreadApiRefreshTimeHook() method. Return the desired refresh rate.

@override
  ThreadApiRefreshTimeHook? getThreadApiRefreshTimeHook() {
    ThreadApiRefreshTimeHook? threadApiRefreshTimeHook = () {
      return 5;// time in seconds
    };

    return threadApiRefreshTimeHook;
  }

Similarly look for the getMessageApiRefreshTimeHook() method. Return the desired refresh rate.

@override
  MessageApiRefreshTimeHook? getMessageApiRefreshTimeHook() {
    MessageApiRefreshTimeHook? messageApiRefreshTimeHook = () {
      return 5;// time in seconds
    };

    return messageApiRefreshTimeHook;
  }

After modifications, restart the app and the changes will reflect in your app.

Added in version 1.4.2

--- ## Hide Fields in Edit Profile URL: https://houzi-doc.booleanbites.com/hooks-widgets/edit_profile_show_field

Houzi provides you with the EditProfileShowFieldHook() which allows you to dynamically show or hide specific profile fields in the Edit Profile screen—such as Facebook, Instagram, WhatsApp, etc.

This can be useful for customizing which fields are visible based on your app’s requirements.

File Location

Project_HOME > lib > hooks_v2.dart To edit this hook, open the following file in your project:

How It Works

The EditProfileShowFieldHook() is a hook function that returns a function (EditProfileShowFieldHook) which takes a fieldName as a String and returns a bool (or null) based on whether you want the field to be shown or hidden.

Code Example

EditProfileShowFieldHook getEditProfileShowFieldHook() {
  EditProfileShowFieldHook editProfileShowFieldHook = (String fieldName) {
    
    if (fieldName == "facebook") {
      return true; // Show Facebook field
    } else if (fieldName == "phone") {
      return true; // Show Phone field
    } else if (fieldName == "instagram") {
      return false; // Hide Instagram field
    } else if (fieldName == "whatsApp") {
      return true; // Show WhatsApp field
    } else if (fieldName == "youtube") {
      return true; // Show YouTube field
    } else if (fieldName == "pinterest") {
      return true; // Show Pinterest field
    } else if (fieldName == "title_position") {
      return true; // Show Title Position field
    } else if (fieldName == "tax_number") {
      return false; // Hide Tax Number field
    } else if (fieldName == "website") {
      return true; // Show Website field
    }

    return null; // Return null if no condition matched (default behavior)
  };

  return editProfileShowFieldHook;
}

After modifications, restart the app and the changes will reflect in your app.

Added in version 1.4.4

--- ## Phone Signup Countries URL: https://houzi-doc.booleanbites.com/hooks-widgets/add_custom_country

Houzi provides the CustomCountryHook() to customize the country list available in the phone signup page. This hook allows you to either:

How It Works

The CustomCountryHook() returns a function that provides a list of Country objects. This list defines which countries (and their respective phone codes) should be shown in the phone number field.

CustomCountryHook getCustomCountryHook() {
  CustomCountryHook customCountryHook = () {
    List<Country> countryList = [
      Country(
        code: "PK",
        dialCode: "92",
        name: "Pakistan",
        flag: '🇵🇰',
        nameTranslations: {},
        minLength: 10,
        maxLength: 10,
      ),
      Country(
        code: "RU",
        dialCode: "7",
        name: "Russia",
        flag: '🇷🇺',
        nameTranslations: {},
        minLength: 10,
        maxLength: 10,
      ),
    ];

    // Return this list to show only selected countries
    // return countryList;

    // Return null to show all countries by default
    return null;
  };

  return customCountryHook;
}

Country Field Reference Table

Property Description Example
code 2-letter ISO country code "PK" for Pakistan
dialCode Country calling code "92"
name Country name "Pakistan"
flag Country flag emoji '🇵🇰'
nameTranslations Country name translations (can be empty) {}
minLength Minimum phone number length 10
maxLength Maximum phone number length 10

Emoji Tips for Flags

To correctly display country flags using emoji, follow the platform-specific instructions below:

On macOS:

On Windows:

⚠️ Important
Ensure you’re using valid Regional Indicator Symbols.
Using incorrect or unsupported emoji may result in display/rendering issues or show as blank squares or placeholders.

After modifications, restart the app and the changes will reflect in your app.

Added in version 1.4.4

--- ## Home Background Hook URL: https://houzi-doc.booleanbites.com/hooks-widgets/home_sliver_app_bar_background_image

Houzi provides the HomeSliverAppBarBGImageHook() to customize the background image displayed in the Sliver AppBar on the home screen. This hook allows you to either:

How It Works

The HomeSliverAppBarBGImageHook() returns a function that provides a String? path to your background image asset. This path defines which image should be displayed as the background in the home screen’s Sliver AppBar.

HomeSliverAppBarBGImageHook getHomeSliverAppBarBGImageHook() {
  return (BuildContext context) {
    String? _backgroundImage;
    
    // Example asset paths:
    // _backgroundImage = "assets/image/any_image.png";
    // _backgroundImage = "assets/settings/dummy_property_image_01.jpg"; // For Test
    
    // Return the background image path
    // return _backgroundImage;
    
    // If you don't want to use background image, return null
    return null;
  };
}

Asset Configuration

Make sure your pubspec.yaml is properly configured to load your background image:

flutter:
  assets:
    - assets/image/
    - assets/settings/

Usage Examples

Example 1: Using a Custom Background Image

HomeSliverAppBarBGImageHook getHomeSliverAppBarBGImageHook() {
  return (BuildContext context) {
    String? _backgroundImage = "assets/image/home_background.png";
    return _backgroundImage;
  };
}

Example 2: Conditional Background Based on Context

HomeSliverAppBarBGImageHook getHomeSliverAppBarBGImageHook() {
  return (BuildContext context) {
    // You can use context to determine which image to show
    bool isDarkMode = Theme.of(context).brightness == Brightness.dark;
    
    String? _backgroundImage = isDarkMode 
        ? "assets/image/dark_home_bg.png"
        : "assets/image/light_home_bg.png";
        
    return _backgroundImage;
  };
}

Example 3: No Background Image

HomeSliverAppBarBGImageHook getHomeSliverAppBarBGImageHook() {
  return (BuildContext context) {
    // Return null for no background image
    return null;
  };
}

Best Practices

⚠️ Important
Ensure your image assets are properly added to your pubspec.yaml file and exist in the specified directories. Missing assets will cause runtime errors.

After modifications, restart the app and the changes will reflect in your app.

Added in version 1.4.4

--- ## Custom Search Web Params URL: https://houzi-doc.booleanbites.com/hooks-widgets/custom_search_web_params

Houzi allows you to use custom query parameters into search API requests using the getCustomSearchWebParamsHook().

This hook is useful if you have customized your backend to filter properties based on additional parameters that are not part of the default Houzi search.

How to Use

Open hooks_v2.dart and locate the getCustomSearchWebParamsHook() method.

  1. Define a Map<String, dynamic> with your custom parameter keys and values.
  2. Return this map from the function.
@override
CustomSearchWebParamsHook getCustomSearchWebParamsHook() {
  /* If you have custom params for searching then use the following hook to add
    your params */
  CustomSearchWebParamsHook customSearchWebParamsHook = () {
    /// Use this hook to inject custom query parameters into your search API requests.
    ///
    /// This is useful if you have customized your backend to filter properties
    /// based on additional parameters that are not part of the default Houzi search.
    ///
    /// To use this:
    /// 1. Define a Map<String, dynamic> with your custom parameter keys and values.
    /// 2. Return this map from the function.
    ///
    /// Example is below map having key and its value
    Map<String, dynamic>? customWebServiceParams = {
      /// For Example: You have this key and value as an example
      /// "agent_contact":"+923001234567"
    };

    /// return customWebServiceParams;
    /// Leave it null incase you don't have any custom params
    return null;
  };
  return customSearchWebParamsHook;
}

Note: Return null if you do not want to pass any custom search parameters.

After modifications, hot reload or restart the application to see the changes.

--- ## Houzi Map Provider Hook URL: https://houzi-doc.booleanbites.com/hooks-widgets/houzi_map_provider_hook

Houzi provides the getHouziMapProviderHook() to let you set the default map provider used throughout the app. You can choose between Google Maps and OpenStreetMap (OSM).

When to Use

Use this hook when you want to override the default map provider set by Houzi. By default, Houzi uses OpenStreetMap (OSM) as the map provider. If your app requires Google Maps, you can switch to it using this hook.

How to Use

Open hooks_v2.dart and locate the getHouziMapProviderHook() method. If not available then copy and paste the code from here.

  1. Return "google" to use Google Maps.
  2. Return "osm" to use OpenStreetMap.
  3. Return "" (empty string) to use the default map provider set by Houzi (which is OSM).
@override
HouziMapProviderHook getHouziMapProviderHook() {
  HouziMapProviderHook houziMapProviderHook = () {
    /// Use this hook to set the default map provider.
    ///
    /// We have two map providers to use:
    /// 1. Return "google" for Google Maps.
    /// 2. Return "osm" for OpenStreetMap.
    ///
    /// Example is below map to use Google Maps
    /// Uncomment the below line to use Google Maps
    // return "google";

    /// Example is below map to use OpenStreetMap
    /// Uncomment the below line to use OpenStreetMap
    // return "osm";

    /// Return empty incase to use default map provider set by Houzi which is OSM
    return "";
  };
  return houziMapProviderHook;
}

Usage Examples

Example 1: Using Google Maps

@override
HouziMapProviderHook getHouziMapProviderHook() {
  HouziMapProviderHook houziMapProviderHook = () {
    return "google";
  };
  return houziMapProviderHook;
}

Example 2: Using OpenStreetMap

@override
HouziMapProviderHook getHouziMapProviderHook() {
  HouziMapProviderHook houziMapProviderHook = () {
    return "osm";
  };
  return houziMapProviderHook;
}

Note: If you choose to use OpenStreetMap (OSM), you must provide a valid admin email address using the OSM Geo Admin Email Hook. Please refer to the OSM Geo Admin Email Hook documentation to set it up.

After modifications, restart the app and the changes will reflect in your app.

--- ## OSM Geo Admin Email Hook URL: https://houzi-doc.booleanbites.com/hooks-widgets/osm_geo_admin_email_hook

Houzi provides the getOsmGeoAdminEmailHook() to set a valid admin email address required by OpenStreetMap’s Nominatim service for geocoding (search and reverse geocoding) requests.

When to Use

This hook is required when you are using OpenStreetMap (OSM) as your map provider. Nominatim requires a valid contact email for identification purposes as part of its usage policy.

Important
If you have set your map provider to "osm" using the Houzi Map Provider Hook, you must configure this hook with a valid email address. Without it, your geocoding requests may be blocked by the Nominatim service.

Note: This hook is not needed if you are using Google Maps only.

How to Use

Open hooks_v2.dart and locate the getOsmGeoAdminEmailHook() method. If not available then copy and paste the code from here.

  1. Replace the example email with your valid admin/support email.
  2. Return the email string from the function.
@override
OSMGeoAdminEmailHook getOsmGeoAdminEmailHook() {
  OSMGeoAdminEmailHook osmGeoAdminEmailHook = () {

    /// Return a valid admin email for OpenStreetMap (Nominatim) Search/Reverse.
    /// Required by OSM for identification and contact purposes.
    /// Example: "support@yourapp.com"
    /// Not needed if using Google Maps only.

    return "support@yourapp.com";
  };
  return osmGeoAdminEmailHook;
}

Usage Example

@override
OSMGeoAdminEmailHook getOsmGeoAdminEmailHook() {
  OSMGeoAdminEmailHook osmGeoAdminEmailHook = () {
    return "admin@myrealestate.com";
  };
  return osmGeoAdminEmailHook;
}

After modifications, restart the app and the changes will reflect in your app.

--- ## Map View Initial Location Hook URL: https://houzi-doc.booleanbites.com/hooks-widgets/map_view_initial_location_hook

Houzi provides the getMapViewInitialLocationHook() to set the initial/default center location and zoom level of the map view when it first loads, before any property markers are displayed.

When to Use

Use this hook when you want to control where the map is centered on initial load. This is useful if your properties are concentrated in a specific region and you want the map to open directly on that area instead of the default location.

How to Use

Open hooks_v2.dart and locate the getMapViewInitialLocationHook() method. If not available then copy and paste the code from here.

  1. Set the latitude and longitude values to your desired initial map center.
  2. Set the initial_zoom value to control how zoomed in the map should be on load.
  3. Return the map from the function.
@override
MapViewInitialLocationHook getMapViewInitialLocationHook() {
  MapViewInitialLocationHook mapViewInitialLocationHook = () {

    /// Return a Map with 'latitude' and 'longitude' keys to set the
    /// initial/default center of the map view.
    /// These coordinates will be used when the map first loads,
    /// before any property markers are shown.

    Map<String, dynamic> initialLocationMap = {
      "latitude": 37.4219999,
      "longitude": -122.0862462,
      "initial_zoom": 8.0,
    };

    return initialLocationMap;
  };
  return mapViewInitialLocationHook;
}

Map Keys

Key Type Description
latitude double Latitude of the initial map center
longitude double Longitude of the initial map center
initial_zoom double Initial zoom level of the map (e.g., 8.0 for region-level, 12.0 for city-level)

Usage Example

@override
MapViewInitialLocationHook getMapViewInitialLocationHook() {
  MapViewInitialLocationHook mapViewInitialLocationHook = () {
    Map<String, dynamic> initialLocationMap = {
      "latitude": 25.2048,
      "longitude": 55.2708,
      "initial_zoom": 10.0,
    };
    return initialLocationMap;
  };
  return mapViewInitialLocationHook;
}

After modifications, restart the app and the changes will reflect in your app.

--- ## Map Box Api Key Hook URL: https://houzi-doc.booleanbites.com/hooks-widgets/map_box_api_key_hook

Houzi provides the getMapBoxApiKeyHook() to set the Mapbox API key for Mapbox services in the app.

When to Use

Use this hook when you want to use Mapbox services in the app.

How to Use

Open hooks_v2.dart and locate the getMapBoxApiKeyHook() method. If not available then copy and paste the code from here.

  1. Set the map_box_api_key value to your desired Mapbox API key.
  2. Return the map from the function.
@override
  MapBoxApiKeyHook getMapBoxApiKeyHook() {
    MapBoxApiKeyHook mapBoxApiKeyHook = () {

      /// Return your Mapbox Access Token if you are using Mapbox as the map provider.
      /// Required for loading Mapbox tiles, styles, geocoding, and reverse geocoding services.
      /// You can generate your access token from the Mapbox Dashboard:
      /// https://account.mapbox.com/
      /// Example: "pk.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.abcdefghijklmnopqrstuvwxyz"
      /// Not needed if using Google Maps or OpenStreetMap only.
      ///
      /// Leave empty if you are using Google Maps or OpenStreetMap only.

      return "";
    };
    return mapBoxApiKeyHook;
  }

Usage Example

@override
MapBoxApiKeyHook getMapBoxApiKeyHook() {
  MapBoxApiKeyHook mapBoxApiKeyHook = () {
    /// Example Key: "pk.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.abcdefghijklmnopqrstuvwxyz"
    /// Replace with your Mapbox Access Token
    return "YOUR_MAPBOX_API_KEY";
  };
  return mapBoxApiKeyHook;
}

After modifications, restart the app and the changes will reflect in your app.

--- ## Property Valued Feature Design Hook URL: https://houzi-doc.booleanbites.com/hooks-widgets/valued_feature_design_hook

Houzi provides the getValuedFeatureDesignHook() to control the design/layout version of the property valued features section (bedrooms, bathrooms, garage, size, year built, etc.) displayed on the property details page.

When to Use

Use this hook when you want to choose between the two supported valued feature layouts:

How to Use

Open hooks_v2.dart and locate the getValuedFeatureDesignHook() method. If not available then copy and paste the code from here.

  1. Set the design version string you want to return ("v1" or "v2").
  2. Return the design version from the function.
  3. Important: Register this hook in your lib/main.dart inside the hooksMap by adding:
    hooksMap["valuedFeatureDesignHook"] = v2Hooks.getValuedFeatureDesignHook();
    
@override
ValuedFeatureDesignHook getValuedFeatureDesignHook() {
  ValuedFeatureDesignHook hook = () {
    /// Return "v1" for horizontal list design
    /// Return "v2" for 3-column grid design (default)
    return "v2";
  };
  return hook;
}

Supported Layouts

1. Horizontal Scroll Layout (v1)

This is the original Houzi design. The features are displayed in a single-row horizontal scrolling card list.

2. 3-Column Grid Layout (v2 - Default)

This is a modern grid layout where items are arranged in a 3-column structure.

Usage Example

@override
ValuedFeatureDesignHook getValuedFeatureDesignHook() {
  ValuedFeatureDesignHook hook = () {
    // Switch to the horizontal layout (v1)
    return "v1";
  };
  return hook;
}

After modifications, restart the app and the changes will reflect in your app.

--- ## Introduction URL: https://houzi-doc.booleanbites.com/houzi-builder/intro

This is setup documentation for Houzi Builder App.

HouziBuilder is designed to generate configuration file for your app. The app is available for Windows and MacOS desktop. This documentation provides the guidance with ease to generate or update/edit the configuration file of the app.

houzi-app-builder-for-houzez

--- ## Houzi Builder Activation Guide URL: https://houzi-doc.booleanbites.com/houzi-builder/houzi_builder_activation_guide

On opening the application, the first screen, that you will encounter, will be the Houzi Builder Activation screen. Enter your Purchase Code in the required text field and press Activate button. After verification, you will be taken to Houzi Wizard Screen.

If you require help of any kind regarding Houzi Builder, press the Support text button (at the bottom of screen). It will take you to the github page of the houzi-support. Open a new issue there and Houzi team will try to response as soon as possible.

Once you have successfully activated your Houzi Builder, the app will auto varify your license on each launch.

activate-builder-page

--- ## Houzi Wizard Guide URL: https://houzi-doc.booleanbites.com/houzi-builder/houzi_wizard

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

After activating the Houzi Builder application, the next screen, that you will encounter, will be the Houzi Wizard Screen. Houzi Wizard will analyze your website for API connectivity and it will detect any possible issues.

houzi-wizard-screenshot-idle

Provide your Website Wordpress URL in the required Wordpress Url field. Click on Wordpress URL text field. A dialog will open. Provide the Wordpress URL Scheme, Wordpress URL Domain and Wordpress URL Path in their respective fields. (If your website URL does not contain a subpath then leave Wordpress URL Path field empty.)

add-url-screenshot

Example 1 (Website Url with path):
Url: https://domain.com/path/
Wordpress URL Scheme = https
Wordpress URL Domain = domain.com
Wordpress URL Path = path

Example 2 (Website Url without path):
Url: https://domain.com/
Wordpress URL Scheme = https
Wordpress URL Domain = domain.com
Wordpress URL Path = 

On pressing the Done button, Houzi Wizard will analyze your website for the following possible tests:

  1. Houzez Wordpress Theme Installation.
  2. Houzi API Plugin installation.
  3. JWT Auth Plugin installation and activation.
  4. JWT Auth Key setup verification.
  5. Purchase code verification.

If none issue is detected then you will be taken to the Houzi Builder screen.

houzi-wizard-screenshot-success

Note: If you have already defined App Config on wordpress-admin-panel > Houzi Api then the Houzi Builder feilds will be filled with the values of that App Config.

If Houzi Wizard detects any issue, you will remain on Houzi Wizard Screen and you will be notified regarding the issue and also about its solution (if any).

houzi-wizard-screenshot-failure

If all the issues are resloved, click on Next button. You will be navigated to the Houzi Builder screen.

You can re-run the Houzi Wizard by pressing the Run Troubleshoot button. Your website will be re-analyze for any possible issues.

Note: You can navigate directly to the Houzi Builder screen without analyzing your Houzez wordpress website either by clicking on the HouziBuilder text on the top of screen or by clicking the Skip text button at the left-bottom of screen.

--- ## Basic App Setup URL: https://houzi-doc.booleanbites.com/houzi-builder/basic_setup

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

basic_home_setup_screenshot

Please follow these steps for the Basic Setup of your Mobile app.

  1. Open the houziBuilder application.
  2. Click on Houzi Builder on the left side of the top bar. (Houzi Builder Screen will open)
  3. Provide App Name in the required field.
  4. Provide Wordpress URL in the required field.

    Note: To provide Wordpress URL, just click on Wordpress URL Text Field. A dialog will open. Provide the Wordpress URL Scheme, Wordpress URL Domain and Wordpress URL Path in their respective fields.
    If your website URL does not contain a subpath then leave Wordpress URL Path field as it is.

    add-url-screenshot

     Example 1 (Website Url with path):
     Url: https://domain.com/path/
     Wordpress URL Scheme = https
     Wordpress URL Domain = domain.com
     Wordpress URL Path = path
    
     Example 2 (Website Url without path):
     Url: https://domain.com/
     Wordpress URL Scheme = https
     Wordpress URL Domain = domain.com
     Wordpress URL Path = 
    

Note: If you have already defined App Config on wordpress-admin-panel > Houzi Api then the HouziBuilder feilds will be filled with the values of that App Config.

  1. Provide Terms and Conditions URL in the required field.
  2. Provide Privacy Policy URL in the required field.
  3. Provide Terms of Use URL in the required field.
  4. Provide GDPR Agreement URL in the required field.
  5. Provide Company URL in the required field.

Note: If you come to Houzi Buider Screen via Houzi Wizard (after passing all test), and if you have already defined App Config on wordpress-admin-panel > Houzi Api then the HouziBuilder feilds will be filled with the values of that App Config. Here you can modifiy those values with ease.

--- ## Changing Theme Colors URL: https://houzi-doc.booleanbites.com/houzi-builder/change_theme_color

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

style-menu-screenshot

This guide consists of following sections:

Style Configurations
How to Customize Style Option

Let’s dive into the details of each section.


Style Configurations

The syle configurations are divided into following three catagories for the ease of customization:

1. General Configurations

General configurations include the style choices that stay the same no matter if you are using Light Mode or Dark Mode. For example, App Primary Color etc.

2. Light Mode Configurations

Light Mode configurations include the style choices that are for the Light Mode of app. For example, App Background Color etc.

light-mode-style

3. Dark Mode Configurations

Dark Mode configurations include the style choices that are for the Dark Mode of app. For example, App Background Color etc.

dark-mode-style


How to Customize Style Option

If you want to change the Primary Color of the app, follow these steps:

  1. Click on the Colored circle or Droper icon of **App Primary Color **field.

    app-primary-color-field-screenshot

  2. A color picker dialog will open. Choose you desired color, its opacity (optional) and press Done.

    color-picker-screenshot

  3. If you have a Hex value of the desired color, you can simply put it in App Primary Color field or color picker dialog Hex field and press Done button.

App Primary Color will change accordingly.

--- ## Customize Home Screen URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_home

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

houzi-app-builder-for-houzez

This guide consists of following sections:

Home Designs
Add New Section
Edit a Section
Delete a Section
Re-arrange a Section

Let’s dive into the details of each section.


Home Designs

Houzi provides you wide range of home designs. On the top right side of Home section, Home designs are provided. Click on any Home design, and you will be able to see, how it will look on real device in the Mobile App View. (By default, selected design is Home Elegant, one of most popular designs.)

home-designs

There are some additional customizations related to Home designs as follows:


Add New Section

Click the ADD NEW WIDGET button at the right bottom of the screen, a dialog box will open. You will encounter following fields while adding a new section.

Widget Type
Title
Design
List Type
List Type Value
View Type
Additional Fields

home-add-section-screenshot

Let’s dive into the details of each section.

Widget Type

Houzi offers a diverse selection of widget types for your home screen, making it easy to personalize and enhance your user experience. Details of these widget types is as follows:

Define the “Title” of the section.

Title field is not available for the ads section.

Design

Design field is only available for the Properties Listing related sections (i.e. section with the types property or term).

Select the Design as follows:

List Type

List Type field is only available for the Properties Listing related sections (i.e. section with the widget types property or term).

List types are the Houzez taxonomies. You can customize the Properties Listing on home screen by selecting the one or multiple List Type.

The details of the List Types are as follows:

Above mentioed List-Types are generic Houzez Taxonomies/List-Type options. You may encounter all or some of these options, according to the data of your website.

List Type Value

List Type Value field is only available for the Properties Listing related sections (i.e. section with the widget types property or term).

List type values are the Houzez taxonomies related data. You can customize the Properties Listing on home screen by selecting the one or multiple List Type value.

The details of the List Types are as follows:

View Type

View Type field is not available for the ads, term_with_icon and place_holder widget type sections.

You can define the view of a section (e.g. vertical or horizontal) from the View Type dropdown menu. Views are of following types:

Slider View Type field is only available for the property and blogs widget type sections.

Additional Fields

There are following additonal fields related to the property widget type sections:

Please consider the fact that you won’t have properties available for all user locations. Also consider location permission and other gps related issues as well.

Terms With Icons Customization

Houzi provides you some by default Houzez Taxonomies Terms (e.g. For Rent, For Sale, Commercial, Residential etc.). These terms have by default icons assosiated with them. You can simply select the term_with_icons widget type and provide the section name and Terms with icons widget with by default attributes will be added to your home screen. You can change the icons of these by default terms.

If you want to customize the Terms also, Houzi Builder provides you a convinent way to do so. You just have to Add a new terms_with_icon type widget or you can Edit a existing one. If you are adding a new terms_with_icon type widget or editing the existing one, you will see Widget Configurations field. Click on this field and a Terms with icon configurations dialog will open. Follow these steps and you can add you customized Terms along your custom Icons.

  1. Click on ADD NEW WIDGET button, a dialog will open.

  2. Select Term (e.g. property_type etc.) from the dropdown menu.

  3. Select Sub-Term (e.g. Commercial etc.) from the dropdown menu.

  4. Select the Icon by clicking on the icon button field.

  5. Click on the Done Text Button and your added Term will be displayed in the Terms with icon configurations dialog.

  6. Repeat these steps if you want to add more Terms.

  7. You can re-arrange the added term widget just by clicking and holding a widget and dragging it upwards or downward.

  8. You can edit any term widget just by clicking on the edit icon.

  9. You can delete any un-necessary term widget just by clicking on the delete icon. After clicking delete from the confirmation dialog box, your widget will be deleted.

  10. Click on Done Text button and your customized Terms with custom icons will be added on Home Screen.


Edit a Section

You can Edit any section just by clicking on its Edit Icon. While editing a section, you can perform following actions:

home-screenshot-list-tile

home-edit-section-screenshot


Delete a Section

You can Delete any section just by clicking on delete icon of respective section. A delete confirmation dialog will open.

home-screenshot-list-tile

home-delete-section-screenshot

Click Delete if you want to delete the section.
Click Cancel if you want to discard the action.


Re-arrange a Section

You can Re-arrange the sections on Home Screen. Hold the section that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in sections list.

home-re-arrange-01

home-re-arrange-02

--- ## Home AI Layout URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_home_ai

Requires: Houzi app 1.4.8+ and Houzi Rest Api plugin 1.4.8+ with AI enabled. Follow the AI Features setup guide first to enable AI on your plugin.

Houzi 1.4.8 introduces Home AI — an AI-first home design — along with two AI-powered home widgets, AI Smart Terms and AI Matches, that you can add to any home design.

Home AI layout with AI header, Tailored for You, and Top Matches


Select the Home AI design

In Houzi Builder, go to the Home section and pick Home AI from the Home Designs on the top right — just like any other home design. The Mobile App View in the center shows a live preview.

The AI Header

The AI header is the fixed top area of the Home AI design. It contains:

The header is built into the design, so there’s nothing to configure in the builder. The hero texts come from the app’s localization files (ai_* keys in assets/localization/*.json), so you can reword them per language like any other string — see Localization.

Everything below the header is the regular config-driven home_layout pipeline — the same sections every other home design uses (term_with_icons, property, recent_search, and the new AI widgets below), in the order you arrange them in the builder.


AI Widgets

Two new widget types are available when you add a new section in the builder’s Home section. They work in any home design — you don’t have to use the Home AI design to use them (though Home AI ships with both by default).

Both widgets render their own headers and are fully self-contained: they fetch their own data, and if there’s nothing to show they hide themselves — an empty section never appears on the home screen.

ai_smart_terms — “Tailored for You”

A two-column grid of smart suggestion cards built from your website’s own taxonomies — property status, property type, and property features. The cards are personalized: they are selected from the user’s recent searches (most-searched terms first) and backfilled with your site’s popular terms, so the grid is useful even for a brand-new user.

The short subtitle line under each card title is AI-curated (this is what the plugin’s Lite Model is used for) so the wording resonates with the user’s recent intent — city, size, budget. The cards render instantly with a generic subtitle and upgrade to the AI copy when it arrives; if AI is off or unreachable, the generic line simply stays. Tapping a card opens the matching property listing.

Configurable fields:

ai_matches — “Top Matches for You”

A property listing personalized from the user’s own past searches. The widget mines the recent-searches history (captured by both the normal and AI search flows), builds one filter from the dominant signals — city, property type, bedrooms — and shows the matching properties, with a View all action. When the user has no search history yet, it falls back to your Featured listings, so the section is never empty.

Configurable fields:


Edit configurations.json directly

If you edit your configuration file by hand instead of using the builder, the AI widgets are regular home_layout entries:

{
  "section_type": "ai_smart_terms",
  "title": ""
},
{
  "section_type": "ai_matches",
  "title": "",
  "layout_design": "design_01",
  "section_listing_view": "list"
}

Leave title empty for the localized defaults. As always, increment api_config_version after changing the configuration.

--- ## Customize Navigation Bar URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_navigation_bar

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

bottom-navbar-screen

This guide consists of following sections:

Bottom Navigation Bar Designs
Add New Section
Edit a Section
Delete a Section
Re-arrange a Section

Let’s dive into the details of each section.


Bottom Navigation Bar Designs

Houzi provides you wide range of bottom navigation bar designs. On the top right side of Navigation Bar section, Navigation Bar designs are provided. Click on any Navigation Bar design, and you will be able to see, how it will look on real device in the Mobile App View. (By default, selected design is Design 02, one of most popular designs.)

bottom-navbar-designs

There are some additional customizations related to Home designs as follows:

If you select Design 01 or Design 03, you can show or hide a Floating Action Button on the center of Navigation Bar, just by Check Marking or Un-Marking the Show Add Floating Action Button checkbox field.

bottom-navbar-additional-config

By default, Floating Action Button will be a circular FAB Button with plus sign, and it’ll open Quick Add Property. You can customize or add custom actions to Floating Action Button.


Add New Section

The maximum limit is 05 for adding sections in Design 02.

For adding new section in Navigation Bar, follow these steps:

You will encounter following fields on the dialog box:

Widget Type
Title
Check Login
Icon
Term Type
Term Type Value

Widget Type:

You are provided with the dropdown list of Widget Types. The details of widget types are as follows:

If you are unable to find the ‘messages’ in the list, you need to Configure the Direct Messages.

Title:

Title is label that will be displayed on the Navigation Bar. Define the Title of the section.

Check Login:

If you want that only logged-in user will be able to see the content of this particular navigation bar item, select true from the dropdown menu of Check Login, else leave it as false.

Icon:

You can define the icon of your navigation bar item. Click on the icon button, an icon picker dialog will open. You can either choose from Material Icons or Cupertino Icons. Just search and click the required icon, it will be displayed and previous icon will be replaced.

icon-picker

Term Type:

Term Type is only section type “Term” related field.

If you have selected the Term widget type, an additional field will be visible to you named as Term Type.

navbar-term-related-fields

Select the Term Type from the Term Type dropdown menu.

navbar-term-type

Term Type Value:

Term Type Value is only section type “Term” related field.

If you have selected the Term widget type, an additional field will be visible to you named as Term Type Value.

navbar-term-type-related

Select the Term Type Value from the Term Type Value dropdown menu.

navbar-term-type-value

Above displayed Term Type and Term Type Value are generic houzez options. You may encounter all or some of these options, according to the data of your website.


Edit a Section

You can Edit the sections just by clicking on Edit Icon of respective section. While editing a section, you can perform following actions:

Term Type and Term Type Value are only section type “Term” related fields.

edit-navbar-section-01

edit-navbar-section-02


Delete a Section

The minimum limit is 02 sections. If there are only 2 sections left, you can not delete further sections.

You can Delete any section just by clicking on delete icon of respective section. A delete confirmation dialog will open.

navbar-delete-section-01

navbar-delete-section-02

Click Delete if you want to delete the section.
Click Cancel if you want to discard the action.


Re-arrange a Section

You can Re-arrange the sections on Navigation Bar. Hold the section that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in sections list.

navbar-re-arrange-01

navbar-re-arrange-02

--- ## Customize Drawer Menu URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_drawer

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

drawer-screenshot

This guide consists of following sections:

Add New Section
Edit a Section
Show-Hide a Section
Re-arrange a Section
Delete a Section

Let’s dive into the details of each section.


Add New Section

You can Add a new section in Drawer Menu with ease. There is a Add button at the right-bottom of the screen. Press this Add button, a dialog box will open.

drawer-add-widget-dialog

You will encounter following fields on the dialog box:

Widget Type
Title
Check Login
Initialize Data

Widget Type:

You are provided with the dropdown list of Widget Types. The details of widget types are as follows:

Title:

Title is label that will be displayed on the drawer menu. Define the Title of the section.

Check Login:

If you want that only logged-in user will be able to see the content of this particular menu item, select true from the dropdown menu of Check Login, else leave it as false.

Initialize Data:

If you have selected the Term widget type, an additional field will be visible to you named as Initialize Data.

drawer-add-widget-term

You can initialize the data of your term by following these steps:

Initialize Data field is only available to Term type widgets.
New widget will be added to the last of menu items. You can Re-arrange its position.


Edit a Section

There are two type of sections in drawer screen as follows:

Default Sections: Sections that are provided by Houzi team by default and can not be deleted but can be hide.

Custom Sections: Sections that are added by users and can be deleted as well as hide.

Editing a Default Section:

While editing a default section, you only get to Rename the section. Just click on Edit Icon of respective section. A dialog will open. Rename the section as you like.

drawer-list-tile-screenshot

drawer-edit-section-screenshot

Editing a Custom Section:

While editing a custom section, you can perform following actions:

drawer-edit-section-screenshot-02


Show-Hide a Section

You can show or hide any section just by clicking on Visibility / Invisibility Icon of respective section.

drawer-list-tile-screenshot

drawer-list-tile-01-screenshot


Re-arrange a Section

You can Re-arrange the sections on Drawer Menu. Hold the section that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in sections list.

drawer-re-arrange-01

drawer-re-arrange-02


Delete a Section

There are two type of sections in drawer screen as follows:

Default Sections: Sections that are provided by Houzi team by default and can not be deleted but can be hide.

Custom Sections: Sections that are added by users and can be deleted as well as hide.

You can Delete any custom section just by clicking on delete icon of respective section. A delete confirmation dialog will open.

drawer-delete-section-screenshot-01

drawer-delete-section-screenshot-02

--- ## Customize Search Filters URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_search_filters

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

search-screenshot

You can Enable Cupertino Sliding Segment Control instead of using Material Segment Control from Api and Config section.

This guide consists of following sections:

Add New Section
Edit a Section
Delete a Section
Re-arrange a Section

Let’s dive into the details of each section.


Add New Section

There is a Add button at the bottom of the column. Press this button and a dialog box will open.

search-add-section-screenshot

You will encounter following fields on the dialog box:

Widget Type
Title
Data Type
Api Value
Picker Type
Additional Fields

Widget Type:

You are provided with the dropdown list of Widget Types. The details of widget types are as follows:

Title:

Title is label that will be displayed on the *Search Page. Define the Title of the section.

Data Type:

You are provided with the dropdown list of Data Types. You can define the Data Type of the various sections as follows:

All the other Widget Types have Default Data Types.

Api Value:

Each section has its by default Api Value.

Picker Type:

You are provided with the dropdown list of Picker Types. The details of picker types are as follows:

All the other Widget Types have Default Picker Type.

Additional Fields

You can define some additional customizations for some sections. For this purpose you are provided with some Additional fields. Their details are as follows:

Click Done to add the new section.
Click Cancel to discard the action.


Edit a Section

You can Edit the sections just by clicking on Edit Icon of respective section. While editing a section, you can perform following actions:


Delete a Section

You can Delete any section just by clicking on delete icon of respective section. A delete confirmation dialog will open.

search-list-tile-screenshot

search-delete-section-screenshot

Click Delete if you want to delete the section.
Click Cancel if you want to discard the action.


Re-arrange a Section

You can Re-arrange the sections on Search Page. Hold the section that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in sections list.

search-re-arrange-01

search-re-arrange-02

--- ## Customize Results and Maps URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_results_and_maps

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

results-and-maps-screen

This guide consists of following sections:

Listing Item Designs
Display Configurations
Sorting Configurations

Let’s dive into the details of each section.


Listing Item Designs

Houzi provides you wide range of listing items designs. On the top right side of Results and Maps section, Listing Items designs are provided. Click on any design, and you will be able to see, how it will look on real device in the Mobile App View. (By default, selected design is Design 01, one of most popular designs.)

results-designs


Display Configurations


Sorting Configurations

Houzi provides you with following two sorting configuration:

Default Sort By
Sort First By

Let’s dive into the details of each configuration.

Default Sort By

When you search something, the corresponding search results can be sorted w.r.t. one of the following orders:

The default Houzi sort by order is “Newest”. You can select the desired sort by order from the Default Sort By dropdown.

sort-by-dropdown

sort-by-dropdown-menu


Sort First By

When you search something, the corresponding search results are sort by the default sort by order. If you want to further sort these results on the basis of some specific attributes e.g. if you want to sort results w.r.t. “Featured” results (meaning show featured results on top) or if you want to sort results w.r.t. “Term”, you can configure some settings in the “Sort First By” configurations.

To configure the Sort First By settings, Click on the Sort First By dropdown menu.

sort-first-by-dropdown

Following dialog will open:

sort-first-by-dialog

You can perform following opertions while configuring the Select First By settings:

Add new Item
Edit an Item
Delete an Item
Re-arrange an Item

You can add one or more Sort First By items to configure the sort. e.g. You can sort the searched results in such order that you want to see the newest result items on top and among these newest result items, you want to see those items on top which have the attribute of “Hot Offer” and among these items, you want to see the “Featured” items on top. To achieve such sorting, you can select the newest order from the Default Sort By dropdown. Next step will be to add the Featured and *Hot Offer *(which is a term attribute) in the Sort First By items. You can add these items by following the guide.

Let’s dive into the details of each operation.

Add New Item

You can add a sort first by item by clicking on the “ADD NEW WIDGET” button. Following dialog will be displayed:

sort-first-by-add-dialog-01

You have to set the following fields to add the sort first by item:

Section Type
Title
Default Value
Icon
Term
Sub-Term


Section Type

You can add sort first by items based on following two types of attributes from the Section Type dropdown menu:

  1. Featured.
  2. Term.

Featured
If you want to show the results items that have the attribute “Featured” on the top of results items listing.

Term
If you want to show the results items that have the attribute “Term” (some specific term e.g. result item with property_label Hot Offer) on the top of results items listing.

sfb-section-type-01

sfb-section-type-02


Title

You can define the title of the item in Title field.

sfb-title


Default Value

The default value indicates that either you want to apply this sort order on the search result items by default or let the user decide to use this sort order from the sort menu on the Results screen. You can choose the default value of an item to be on or off. On indicates that this sort option will be applied by default.

sfb-default-value-01

sfb-default-value-02

User can manually turn on or turn off the value of sort first by item from the sort menu on Results screen.


Icon

You can define the icon of your sort first by menu item. Click on the icon button, an icon picker dialog will open. You can either choose from Material Icons or Cupertino Icons. Just search and click the required icon, it will be displayed and previous icon will be replaced.

sfb-icon-01

sfb-icon-02


Term

This field is only available if you have chosen the Term section type.

You are provided with following three Houzez taxonomies to select your term:

Click on the Term dropdown menu and select your required taxonomy as Term.

sfb-term-01

sfb-term-02


Sub-Term

This field is only available if you have chosen the Term section type.

You select the sub-term, you must first select a term from the Term dropdown menu. After selecting the required term let say property_label, now its related sub-terms will be available for selection in the Sub-Term dropdown menu. Click on the Sub-Term dropdown menu and select your required sub-term.

sfb-sub-term-01

sfb-sub-term-02


After defining all the above sections, click on the Done button on the bottom of the dialog. Your item will added like following screenshot:

sfb-dialog-02

Click on the Done button on the bottom of the dialog.

You can see the view of Sort menu on the Mobile App View in the center of screen.


Edit an Item

You can Edit the item just by clicking on Edit Icon of respective section. While editing a section, you can perform following actions:

Term and Sub-Term are only section type “Term” related fields.

sfb-edit-01

sfb-edit-02


Delete an Item

You can Delete any item just by clicking on delete icon of respective item. A delete confirmation dialog will open.

sfb-delete-01

sfb-delete-02

Click Delete if you want to delete the item.
Click Cancel if you want to discard the action.


Re-arrange an Item

You can Re-arrange the Sort First By items. Hold the item that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in items list.

sfb-re-arrange-01

sfb-re-arrange-02

--- ## Customize Listing Details URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_property_profile

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

property-profile-screenshot

This guide consists of following sections:

Property Profile Configurations
Add New Section
Edit a Section
Show-Hide a Section
Re-arrange a Section
Delete a Section

Let’s dive into the details of each section.


Property Profile Configurations

If you are unable to find the ‘Direct Message Button config’ on the property profile page, you need to Configure the Direct Messages.


Add New Section

You can Add a new place_holder widget in Property Profile Screen with ease. There is a Add New Widget button at the right-bottom of the screen. Press this Add New Widge button, a dialog box will open.

pp-add-widget-dialog

You will encounter following fields on the dialog box:

Section Type
Section Name
Enable Widget

Section Type:

You are provided with the dropdown list of Section Types. The details of section types are as follows:

Section Name:

Define the name of Custom Widget in the Section Name text field.

Enable Widget:

You can show/hide any section just by selecting true/false from the Enable Widget dropdown.


Edit a Section

There are two type of sections in property profile screen as follows:

Default Sections: Sections that are provided by Houzi team by default and can not be deleted but can be hide.

Custom Sections: Sections that are added by users and can be deleted as well as hide.

Editing a Default Section:

While editing a default section, you only get to Rename the section. Just click on Edit Icon of respective section. A dialog will open. Rename the section as you like.

pp-list-tile-screenshot

pp-edit-section-screenshot

Editing a Custom Section:

While editing a custom section, you can perform following actions:

pp-edit-section-screenshot-02


Show-Hide a Section

You can show or hide any section just by clicking on Visibility / Invisibility Icon of respective section.

drawer-list-tile-screenshot

pp-list-tile-01-screenshot


Re-arrange a Section

You can Re-arrange the sections on Property Profile Screen. Hold the section that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in sections list.

pp-re-arrange-01

pp-re-arrange-02


Delete a Section

There are two type of sections in drawer screen as follows:

Default Sections: Sections that are provided by Houzi team by default and can not be deleted but can be hide.

Custom Sections: Sections that are added by users and can be deleted as well as hide.

You can Delete any custom section just by clicking on delete icon of respective section. A delete confirmation dialog will open.

pp-delete-section-screenshot-01

pp-delete-section-screenshot-02

--- ## Customize Blog Profile URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_blog_profile

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

property-profile-screenshot

This guide consists of following sections:

Blog Profile Configurations
Show-Hide a Section
Re-arrange a Section

Let’s dive into the details of each section.


Blog Profile Configurations

You can enable or disable the HTML, in the blog description widget, just by Check Marking or Un-Marking the Enable HTML in description checkbox field.

blog-config


Show-Hide a Section

You can show or hide any section just by clicking on Visibility / Invisibility Icon of respective section.

blog-list-tile-01

blog-list-tile-02


Re-arrange a Section

You can Re-arrange the sections on Blog Profile Screen. Hold the section that you want to re-arrange and move it vertically (upwards or downwards). Place it on desire position in sections list.

blog-re-arrange-01

blog-re-arrange-02

--- ## Customize Add Property Form URL: https://houzi-doc.booleanbites.com/houzi-builder/customize_add_property_form

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

A Mobile App View is provided in the center of screen, so you can see how the modifications will look on real device.

add-property-screen

This guide consists of following sections:

Detailed Add Property
Quick Add Property

Let’s dive into the details of each section.


Detailed Add Property

This section guides through all the steps related to detailed add property form. This section consists of following sub-sections:


Quick Add Property

This section guides through all the steps related to quick add property form. This section consists of following sub-sections.


Add New Page

You can Add a new Page in Add Property Form by following these steps:


Add New Section

You can Add a new Section in Page by following these steps:


Add New Field

You can Add a new Field in Section by following these steps:


Edit Page

Form Page Item Screenshot

page-item-screenshot

You can perform following opertions while Editing a page.

Show or Hide a Page

You can show/hide a form page just by clicking on show/hide icon of Form Page Item.

Delete a Page

You can delete a form page just by clicking on delete icon of Form Page Item. A delete confirmation dialog will open. On clicking Cancel, the action will be discarded and dialog will be closed. On clicking Delete, the page will be deleted (this action can not be undone).

delete-page-dialog

Edit a Page

You can Edit a Form Page by following these steps:


Edit Section

Form Section Item Screenshot

form-section-item

You can perform following opertions while Editing a section.

Show or Hide a Section

You can show/hide a form section just by clicking on show/hide icon of Form Section Item.

Delete a Section

You can delete a form section just by clicking on delete icon of Form Section Item. A delete confirmation dialog will open. On clicking Cancel, the action will be discarded and dialog will be closed. On clicking Delete, the section will be deleted (this action can not be undone).

delete-section-dialog

Edit a Section

You can Edit a Form Section in the Page by following these steps:


Edit Field

Form Field Item Screenshot

form-field-item

You can perform following opertions while Editing a field.

Show or Hide a Field

You can show/hide a form field just by clicking on show/hide icon of Form Field Item.

Delete a Field

You can delete a form field just by clicking on delete icon of Form Field Item. A delete confirmation dialog will open. On clicking Cancel, the action will be discarded and dialog will be closed. On clicking Delete, the field will be deleted (this action can not be undone).

delete-field-dialog

Edit a Field

You can Edit a Form Field in the Form Section by following these steps:


Re-Arrange

You can perform the Re-arrange action just by Holding the page, section or field item and move it vertically (upwards or downwards). Place it on desire position in related list.

re-arrange-form-pages-01

re-arrange-form-pages-02

--- ## Api and Configurations Setup URL: https://houzi-doc.booleanbites.com/houzi-builder/api_config_setup

Important: You are required to install the Houzi Rest API Plug-in on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

This guide consists of following configuration settings:

Routes Configurations
Google Maps Api Key
Places Api Configurations
Ads Configurations
Push Notification Configurations
Social Sign-On Configurations
Search Results Configurations
Segment Control Configuration

Let’s dive into the details of each section.


Routes Configurations:

Rest Api Properties Route:

If your website use wp/v2/property or wp/v2/translated_property_name instead of wp/v2/properties, then define property or translated_property_name as Rest Api Properties Route.

Rest Api Agent Route:

If your website use wp/v2/houzez_agent or wp/v2/translated_agent_name instead of wp/v2/agents, then define houzez_agent or translated_agent_name as Rest Api Agent Route.

Rest Api Agency Route:

If your website use wp/v2/houzez_agency or wp/v2/translated_agency_name instead of wp/v2/agencies, then define houzez_agency or translated_agency_name as Rest Api Agency Route.

routes-config-screenshot


Google Maps Api Key:

Please provide your Google Maps Api Key in the respective text field.

google-maps-api-key

Google Maps Api Key is prerequisite. If you do not have Google Maps Api Key, you can aquire key by following these steps:

  1. Setup Google Cloud Project Console
  2. Once you have setup the project on Google Cloud, you need to Aquire the Maps Api Key for Android and iOS separately.

Places Api Configurations:

If you want to limit the Places Api to specific country or countries, follow these steps:

  1. Check mark the Lock Places Api to Specific Country or Countries checkbox field. places-api-configuartions

  2. Provide Country/Countries Tags (e.g. US, UK etc.) in respective text field.
    places-api-configuartions


Ads Configurations:

#### Ads Key:

Please provide Android/IOS Native Ad Id in the respective text fields.

ads-screenshot-02

AdMob App ID is prerequisite. If you do not have AdMob App ID, you can aquire AdMob App ID by registering your app as an AdMob app. Simply follow these steps:

  1. Sign in to or Sign up for an AdMob account.
  2. Register your app with AdMob. This step creates an AdMob app with a unique AdMob App ID for each platform.

#### Enable/ Disable Ads:

Prerequisite: Android/IOS Native Ad Id.


Push Notification Configurations

Please provide your One Signal App Id in the respective text field.

one-signal-app-id

Prerequisite: Push Notifications Integration.


Social Sign-On Configurations:

You can enable or disable Social Sign-On i.e. Sign-in with Facebook, Google, Apple and Phone with their respective checkbox fields.

social-sign-on-config

Sign-in with Apple is only available in IOS.
Prerequisite: Social Sign-on Configuration.


Search Results Configurations:


Segment Control Configuration:

You can enable or disable Cupertino Sliding Segment Control in whole App, just by check marking or check unmarking the Show Cupertino Segment Control checkbox field.

cupertino-segment-control-config

If you check unmark the Show Cupertino Segment Control checkbox field, the Material Segment Control widget will be used in the whole app.

--- ## Export Configuration URL: https://houzi-doc.booleanbites.com/houzi-builder/export_configuration

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

Once you have filled all the required fields, follow these steps:

  1. Press the Export button, at the top-right side of screen. A dialogbox will open with preview of the configurations of your app.

    export-config-01

    export-config-02

  2. At the bottom of dialogbox, there is Copy button. Press the Copy button and the configurations of your app will be copied to clipboard.

  3. [Optional Task] At the bottom of dialogbox, you will see a checkbox named as Increase configurations version number. If you are Editing/Updating the configurations of your app, then checkmark it, else leave it unchecked.

Now you need to save it to two places:

1. configurations.json in your app source code:

Open following file configurations.json file path:

> Project_HOME > assets > configurations > configurations.json

and paste the copied configurations in it, replacing the old configurations.

2. App Config field on Houzi Api on WPAdmin:

Although optional, you can save and server and update your config from website. Open your wordpress admin panel and navigate to the Houzi Api Plugin. Paste the copied json to the App Config text field and click on Save Changes.

export-config-to-houzi-plugin

Benifits of saving configurations to Houzi Api

  1. The configuration saved in App Config file are served over the air, which means, when app opens, it fetches latest configurations saved in Houzi Api Plugin. If it has the latest version, it will apply the latest configurations to the app. This is helpful if you want to hide/show sections of the app that is already installed on user devices. You can change search filter layout, home sections, hide/show property details sections, add remove menus in left drawer or change property item designs in listings and many more.
  2. When Houzi Builder starts and you enter your website, the configuration saved in App Config file are also fetched and Houzi Builder shows all options and layouts according to your saved configurations in App Config field.
  3. Although Houzi Builder fetches and applies the configurations from Houzi Api plugin, you can still load local configurations by loading the configuration.json file to Houzi Builder by opening file picker when clicking on top right “Upload from File” button.

Important: If app receives the same version number in configurations, then it’ll not honor the new configurations having the same config version. So if you don’t increase the version number while exporting, then delete the existing app from device and reluanch to view the changes.

--- ## Edit/Update Configurations URL: https://houzi-doc.booleanbites.com/houzi-builder/edit_configuration

Important: You are required to install the Houzi Rest Api Plugin on your Houzez wordpress. To install the Plug-in, click on Houzi Rest Api Plugin Link.

If you want to Edit/Update configurations of your app (e.g. the changing the Theme Color etc.), follow these steps:

  1. Press the Upload from File button, at the top-right side of screen. A Finder/Explorer dialogbox will open.

    export-config-01

  2. Select the configurations.json file of you project.

    configurations.json file path: Project_HOME > assets > configurations > configurations.json

    After selecting the file, all the data will be filled in the respective fields.

  3. Edit/Update the required section/sections.

  4. Export the configurations of you project.

---