Building a Modular White Label Frontend with React and TypeScript
Aniket
Posted on January 1, 2024
Hello everyone! In this article, I’ll be discussing how you can design a white-label product for web-based applications using React and TypeScript.
Before we start do you want to learn software development? with personalised classes and mentorship from a seasoned professional. With 4 years of hands-on experience contributing to top products used by industry giants like Amazon, Flipkart, Urban clap, meesho, Dominos, Swiggy etc. I specialize in React, Node.js, TypeScript, and System design. Let’s elevate your career together! Reach out at aniket.chanana@gmail.com or connect on LinkedIn.
A white-label solution refers to a product or service created by one entity and made available for use by others to conduct business. For instance, if you desire an image editing capability on your website without developing a new image editor, you can acquire a white-label solution. By customizing it to match your theme, you can seamlessly integrate and leverage it to enhance your business offerings.
Before we delve deeper, let me highlight some of the key offerings of a white-label solution.
- Easily integratable into any web application, enhancing its capabilities effortlessly.
- Offers customizable theming options to seamlessly align with the aesthetics of the host website.
- Facilitates smooth data flow between the host and child applications, ensuring seamless communication.
- Designed for ease of use, requiring minimal or no configuration for any third-party developer.
Considering the points mentioned earlier, let me explain the process in a simple way. We will use a basic example — of a form submission application.
Let’s take a look at the diagram below to get a basic understanding of the flow and application structure.
Also there are various methods to integrate your forms-app UI with the host app UI, like
- via javascript modules (npm module or tags).
- via iFrame Integration by providing child app src
In this article we will follow the 2nd approach because iframes provide:
- Isolation and Security.
- Ease of Implementation
- Cross-Domain Compatibility
Now Let’s jump into the code & build our white-label forms app — basically, it can plugged it into any app using an iframe and can be customised easily. you can check out the full code here: GitHub.
Here are the must-have things:
- Keeping messages Structured: Every message to and from the iframe follows the same structure. So that user cannot mess around — strict validation for all messages. ref: Message validation function
- Data Check: Our forms app checks any data that comes into the iframe before getting down to business logic. ref: Message handler hook
- Easy Peasy Form Fields: Host apps can tweak form fields with a simple post iframe message. ref: Host app postMessage with field config
- Style It Your Way: Our forms app supports some basic theming. So, if you’re integrating our iframe, you can make it look alike to match your app’s theme.
Out of Our Article’s Scope:
- Fancy Theming: We will touching on the basics of adding theming.
- Complex Logic: We will be skipping the complex logic. This article is all about the system design of a white-label frontend solution.
- Forms app dashboard: We won’t be developing any backend support for our forms application in this article; the focus here is purely on the frontend solution.
This article you what’s necessary and how to turn your app into a white-label app. You can grab these ideas and apply in your application.
Froms app UI
Forms app UI and functionalities
After building out config driven (ref: FieldRenderer) UI lets setup our incoming messages handler.
Setting up communication for Forms app & Host app
We will be having a communication between both our applications, e.g we will have a postMessage function for sending messages to other froms-app and useMessageHandler hook handle incoming messages.
As of now both the apps are under us so we can setup communication as per our wish, later when our Forms app is consumed by any 3rd party Host app in that case they can setup postMessage functionality and message handler functionality as per their wish.
This hook will handle all the incoming message + validation to our forms app (iframe)
This hook will be responsible for all the validation of incoming message and our handleIncomingMessage will be invoked as callback post validation from validateMessage, and our handleIncomingMessage function is responsible for routing correct message type to its business logic implementation.
Our business logic will take payload from the message and make our app react accordingly e.g if message contains instructions to CHANGE_THEME our app will invoke appropriate function for this and will change our app theme based on the message received.
Similarly we will be having a postMessage functionality for sending message to other app in.
Now that our communication is setup between both the apps we can start sending message from host-app to forms-app
Function in host-app for sending message to froms-app
message recieved in froms-app from host-app
Now that we our INIT_FORM event is getting data from host-app which includes our theme details, fields config and other configurable parameters.
We will use this data to drive our forms app UI using our message handler function
Implementation for handling incoming messages to forms app
You can refer this file and understand how we are deriving our UI from the config sent via postMessage from our host app.
Now that our forms-app is ready to handle our incoming data from host-app from here we can do what ever we want (i have console logged fieldValues), what you can do is
- Send this data back to host-app from post message communication of iframe.
- Or Make an API call to froms app server and store data in the dashboard
It totally depends on the Client usecase.
onSubmit method gets invoked on form submission
Conclusion
This is one way to create a user interface based on configuration settings. After working in software engineering for four years, I’ve found it to be a widely used approach in real-world applications because it offers:
- Easy Maintenance: It’s simpler to manage and update.
- Serve Multiple Clients: You can use a single application to serve multiple clients (like in a SAAS scenario). Everything is controlled through configuration settings.
- Effortless Updates: You can deliver updates without requiring users to run npm install or upgrade modules.
I hope you find this article on configuration-driven UI and how to white label any frontend application. Any suggestions or corrections for this article are welcome. Stay tuned for more articles. Happy coding till then !❤
Posted on January 1, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.