{"id":1505,"date":"2019-10-07T14:54:42","date_gmt":"2019-10-07T12:54:42","guid":{"rendered":"http:\/\/productcrafters.io\/blog\/?p=1505"},"modified":"2026-01-19T23:03:17","modified_gmt":"2026-01-19T21:03:17","slug":"how-to-create-wysiwyg-widget-editor-on-react-native","status":"publish","type":"post","link":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/","title":{"rendered":"How to Create WYSIWYG Widget Editor on React Native"},"content":{"rendered":"<p>[popup_anything id=&#8221;1677&#8243;]<\/p>\n<p><span style=\"font-weight: 400;\">Sometimes, in the process of the work of mobile applications, it can become necessary to dynamically form pages or allow users to adjust these pages up to their needs. The examples are the dynamic creation of survey forms, adding extra fields at the registration stage (within the framework of B2B app), etc. In this article, I will explain how to develop such a mechanism and implement basic methods to manage existing components. This will let us manage the page outlook on an entry-level.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For a starting point of our editor, we take a standard approach. This approach is used in the majority of CAD systems or in applications that allow creating wireframes of the web pages.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So, with the help of regular &#8220;tap&#8221; and following dragging, we select an area on the screen where we want to place the new component. It can be an input box, just a draft of \u201cdummy text\u201d or any other component.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">After that, we choose the needed element from the app components library and, if necessary, adjust its size. In the end, we receive JSON configuration with new page parameters.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">But enough with theory, let\u2019s write the code.<\/span><\/p>\n<h3>The Grid Formation<\/h3>\n<p><span style=\"font-weight: 400;\">For the convenient work with the form, first of all, we need a grid, which can be found in every editor. This grid lets to place components more accurately on the page and helps not to waste time on the element manual positioning. Let\u2019s try to implement something like this.\u00a0<\/span><\/p>\n<p><img decoding=\"async\" class=\" wp-image-1527 aligncenter\" src=\"http:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/1-768x1321-1.webp\" alt=\"\" width=\"301\" height=\"518\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Firstly, we need to create a component to be the wrapper for all components of the page: <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/PageWrap.js\">src\/pages\/Home\/components\/PageWrap<\/a>. It will also serve as a place where all events will be handled (interaction between user and components).<\/span><\/p>\n<pre>Make panResponder available and add our events\r\n<code class=\"js\">\r\nthis.panResponder = PanResponder.create({\r\n    \/\/ Ask to be the responder:\r\n    onStartShouldSetPanResponder: (e, gestureState) =&gt;\r\n        !!gestureState.dx || !!gestureState.dy,\r\n    onStartShouldSetPanResponderCapture: () =&gt; false,\r\n    onMoveShouldSetPanResponderCapture: () =&gt; false,\r\n    onMoveShouldSetPanResponder: (e, gestureState) =&gt;\r\n        !!gestureState.dx || !!gestureState.dy,\r\n    onPanResponderGrant: (evt, gestureState) =&gt; {\r\n        if (events.listenerCount(EVENT_MOVE_BEGIN)) {\r\n            events.emit(EVENT_MOVE_BEGIN, gestureState)\r\n        } else {\r\n            events.emit(EVENT_MOVE_NEW, gestureState)\r\n        }\r\n    },\r\n    onPanResponderMove: (evt, gestureState) =&gt; {\r\n        events.emit(EVENT_MOVE, gestureState)\r\n    },\r\n    onPanResponderRelease: (evt, gestureState) =&gt; {\r\n        events.emit(EVENT_MOVE_END, gestureState)\r\n    },\r\n    onPanResponderTerminationRequest: () =&gt; false,\r\n    onShouldBlockNativeResponder: () =&gt; false,\r\n})\r\n<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">For a proper drawing of the grid, we need to know the parameters of the page we are working with beforehand. Responsible for it is a handler: handleLayout <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/PageWrap.js\">src\/pages\/Home\/components\/PageWrap.js:51<\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Then we can create the grid component: <\/span><strong><a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/GridComponent.js\">src\/pages\/Home\/components\/GridComponent.js<\/a><\/strong><\/p>\n<pre>Form the grid\r\n<code class=\"js\">\r\n&lt;Svg height={height} width={width}&gt;\r\n    {_.range(0, height, grid.height).map((h) =&gt; (\r\n        &lt;Line\r\n            x1={0}\r\n            y1={h}\r\n            x2={width}\r\n            y2={h}\r\n            key={`line_${h}_${width}`}\r\n            stroke=\"rgba(0, 0, 0, 0.2)\"\r\n            strokeWidth={1.6}\r\n            strokeDasharray={`${pointSize} ${unitWidth - pointSize}`}\r\n            strokeDashoffset={0.4}\r\n        \/&gt;\r\n    ))}\r\n&lt;\/Svg&gt;\r\n<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">As a foundation, we use a hurriedly generated SVG picture. To make the form look beautiful, we need to make a flexible grid that depends on our own conditional units instead of screen pixels. It allows making the page readable independently of screen proportions or its positioning.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">HOC <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/GridComponent.js\">src\/pages\/Home\/components\/GridComponent.js<\/a> is responsible for the attachment of the elements to the grid and transformation of coordinates from pixels to our conditional units. It serves as a wrapper of all page elements and performs their positioning.\u00a0\u00a0\u00a0<\/span><\/p>\n<h3>Interaction With the Elements<\/h3>\n<p><span style=\"font-weight: 400;\">Now let\u2019s work on the functions of interaction with our elements. As said before, we need to be able to change the sizes of elements and their disposition on the screen.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For this interaction we use PanResponder. This is an event handler that allows us to track the interaction between users and elements on the screen. We need it not only for the elements but for the whole page. As at the very beginning of element creation (first click on the form&#8217;s empty space), the element itself doesn\u2019t exist.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So set panResponder against the whole page, or more specifically, against the wrapped component: <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/PageWrap.js\">src\/pages\/Home\/components\/PageWrap.js:22.\u00a0<\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">The handling of elements interaction is realized in the same way as it is usually done in browsers. That is through the events system. Actually, it is possible to realize it by standard React capabilities, when we implement OnClick function for every element and also for the wrapper element. Still,<\/span> I am more keen to use the approach with the events&#8217; system. It seems easier and eventually initiates a smaller number of render events.<\/p>\n<p><span style=\"font-weight: 400;\">Now, it\u2019s time for interactions. While initiating the PanResponder, we should instantly assign to its events onPanResponderGrant, onPanResponderMove, onPanResponderRelease. An attentive reader could ask why I missed onPanResponderTerminate. I did it on purpose, as now we are working on the conception and can neglect a few other additional aspects.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In its turn, with the help of eventEmiter, onclick events generate our custom events. And existing elements on the page react to these particular custom events.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Every element of the page has 2 phases: phase of calmness and phase of the interaction. It helps to assign all elements to our events only when it\u2019s necessary, and avoid their simultaneous interaction.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To implement such type of actions with a minimum number of code changes, we add one more wrapping component: <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/ComponentContainer.js\">src\/pages\/Home\/components\/ComponentContainer.js<\/a>. Its function is to realize assigning to events and interaction with users.\u00a0<\/span><\/p>\n<pre>Get attached to the mouse events\r\n<code class=\"js\">\r\nonListeningBegin = () =&gt; {\r\n    const { events } = this.props\r\n    events.addListener(EVENT_MOVE, this.onMove)\r\n    events.addListener(EVENT_MOVE_END, this.onMoveEnd)\r\n}\r\n<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">This new component is a container where we place our main component from the list of our components and also the component which changes the phase while choosing (in our case it\u2019s \u201ctap\u201d on the element): <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/ComponentContainer.js\">src\/pages\/Home\/components\/ComponentContainer.js:118<\/a>. There is also a range of additional marker components that appear only at the interaction phase and are used for convenient dragging\/changing the main component sizes.\u00a0<\/span><\/p>\n<pre>Figure coordinates to display the grid\r\n<code class=\"js\">\r\ngetNewPosition = (dx, dy) =&gt; {\r\n    if (this.interactionType === 'left') {\r\n        if (dx &lt; this.style.width) {\r\n            return { left: this.style.left + dx, width: this.style.width - dx }\r\n        }\r\n    } else if (this.interactionType === 'right') {\r\n        if (this.style.width + dx &gt; 0) {\r\n            return { width: this.style.width + dx }\r\n        }\r\n    } else if (this.interactionType === 'top') {\r\n        if (dy &lt; this.style.height) {\r\n            return { top: this.style.top + dy, height: this.style.height - dy }\r\n        }\r\n    } else if (this.interactionType === 'bottom') {\r\n        if (this.style.height + dy &gt; 0) {\r\n            return { height: this.style.height + dy }\r\n        }\r\n    } else if (this.interactionType === 'center') {\r\n        return { top: this.style.top + dy, left: this.style.left + dx }\r\n    }\r\n\r\n    return null\r\n}\r\n<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">For example, let&#8217;s take a look at the abstract element. It can be a button, field, etc.\u00a0 In the editing mode, it has to have zones that react to our events: 4 elements that handle the size changes while dragging beyond the component\u2019s rims and 1 central element that is responsible for transposition.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Schematically it looks like this:\u00a0<\/span><\/p>\n<p><img decoding=\"async\" class=\" wp-image-1528 aligncenter\" src=\"http:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/2-1-1.webp\" alt=\"\" width=\"338\" height=\"228\" \/><\/p>\n<p>&nbsp;<\/p>\n<pre>Element and interaction zones look like this\r\n<code class=\"js\">\r\n&lt;React.Fragment&gt;\r\n    &lt;InteractionMarket type=\"center\" onPress={this.handleInteract} \/&gt;\r\n    &lt;InteractionMarket type=\"left\" onPress={this.handleInteract} \/&gt;\r\n    &lt;InteractionMarket type=\"right\" onPress={this.handleInteract} \/&gt;\r\n    &lt;InteractionMarket type=\"top\" onPress={this.handleInteract} \/&gt;\r\n    &lt;InteractionMarket type=\"bottom\" onPress={this.handleInteract} \/&gt;\r\n&lt;\/React.Fragment&gt;\r\n<\/code><\/pre>\n<p><span style=\"font-weight: 400;\">Black square shows object outlines, blue and red zones handle the interaction: <\/span><a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/InteractionMarket.js\"><span style=\"font-weight: 400;\">src\/pages\/Home\/components\/InteractionMarket.js<\/span><\/a><\/p>\n<h3>Creation of a New Element<\/h3>\n<p><span style=\"font-weight: 400;\">To implement the creation of a new component we need to make a new additional cap component. This cap component is needed to define the location area for a new component and to choose the type of the component from our library: <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/CapComponent.js\">src\/pages\/Home\/components\/CapComponent.js\u00a0<\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">When the interaction between the user and this element is finished,\u00a0 the modal window is called. In our case, these are a few basic elements from the React-native-base library: <\/span><a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/ModalComponentsSelector\/index.js\"><span style=\"font-weight: 400;\">src\/pages\/ModalComponentsSelector\/index.js<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">After choosing the component, the mechanism of adding new element is called from the wrapped component: <a href=\"https:\/\/github.com\/ProductCrafters\/wysiwyg\/blob\/master\/src\/pages\/Home\/components\/PageWrap.js\">src\/pages\/Home\/components\/PageWrap.js:83<\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Therefore the configuration of a new component is added to the state and page rebuilding with new components takes place.\u00a0<\/span><\/p>\n<p><img decoding=\"async\" class=\" wp-image-1529 aligncenter\" src=\"http:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/3-1-1.webp\" alt=\"\" width=\"309\" height=\"547\" \/><\/p>\n<p><span style=\"font-weight: 400;\">This is the end of the main part of the conception of the dynamic page building.\u00a0 Received configuration can be sent to the server for future processing. Or, as in our case, saved in localStorage for descriptive reasons.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you find the article useful, I will continue the topic and describe how to change settings of previously created components.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p class=\"p1\">Read more:<\/p>\n<p class=\"p1\">\u2013 <a href=\"https:\/\/productcrafters.io\/blog\/adding-svg-icons-to-your-react-native-app\/\">Adding SVG Icons to Your React Native App<\/a><\/p>\n<p class=\"p1\">\u2013 <a href=\"https:\/\/productcrafters.io\/blog\/creating-custom-react-native-ui-components-android\/\">Creating Custom React Native UI Components Android<\/a><\/p>\n<p class=\"p1\">\u2013 <a href=\"https:\/\/productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\">How to Create WYSIWYG Widget Editor on React Native<\/a><\/p>\n<p class=\"p1\">\u2013 <a href=\"https:\/\/productcrafters.io\/blog\/responsive-react-native-apps\/\">Responsive React Native Apps<\/a><\/p>\n<p class=\"p1\">\u2013 <a href=\"https:\/\/productcrafters.io\/blog\/react-native-tips-to-style-you-app\/\">React Native Tips to Style Your App<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[popup_anything id=&#8221;1677&#8243;] Sometimes, in the process of the work of mobile applications, it can become necessary to dynamically form pages or allow users to&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2240,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1505","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Create WYSIWYG Widget Editor on React Native Tutorial | ProductCrafters<\/title>\n<meta name=\"description\" content=\"Build a WYSIWYG widget editor in React Native. Code examples, architecture, component design, and implementation best practices for developers.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create WYSIWYG Widget Editor on React Native Tutorial | ProductCrafters\" \/>\n<meta property=\"og:description\" content=\"Build a WYSIWYG widget editor in React Native. Code examples, architecture, component design, and implementation best practices for developers.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\" \/>\n<meta property=\"og:site_name\" content=\"ProductCrafters\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/productcrafters\" \/>\n<meta property=\"article:author\" content=\"#\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-07T12:54:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-19T21:03:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"668\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Oleg Kalyta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@#\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oleg Kalyta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\"},\"author\":{\"name\":\"Oleg Kalyta\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/person\/65956d0c96a9ca33a2e160ed676cd854\"},\"headline\":\"How to Create WYSIWYG Widget Editor on React Native\",\"datePublished\":\"2019-10-07T12:54:42+00:00\",\"dateModified\":\"2026-01-19T21:03:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\"},\"wordCount\":1147,\"publisher\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp\",\"articleSection\":[\"Development\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\",\"url\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\",\"name\":\"Create WYSIWYG Widget Editor on React Native Tutorial | ProductCrafters\",\"isPartOf\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp\",\"datePublished\":\"2019-10-07T12:54:42+00:00\",\"dateModified\":\"2026-01-19T21:03:17+00:00\",\"description\":\"Build a WYSIWYG widget editor in React Native. Code examples, architecture, component design, and implementation best practices for developers.\",\"breadcrumb\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage\",\"url\":\"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp\",\"contentUrl\":\"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp\",\"width\":1000,\"height\":668},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/stage.productcrafters.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Development\",\"item\":\"https:\/\/stage.productcrafters.io\/blog\/development\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Create WYSIWYG Widget Editor on React Native\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#website\",\"url\":\"https:\/\/stage.productcrafters.io\/blog\/\",\"name\":\"ProductCrafters\",\"description\":\"Our insights on development and business topics.\",\"publisher\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/stage.productcrafters.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#organization\",\"name\":\"ProductCrafters\",\"url\":\"https:\/\/stage.productcrafters.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2019\/04\/favicon.png\",\"contentUrl\":\"https:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2019\/04\/favicon.png\",\"width\":64,\"height\":64,\"caption\":\"ProductCrafters\"},\"image\":{\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/productcrafters\",\"https:\/\/www.linkedin.com\/company\/18621816\",\"https:\/\/github.com\/ProductCrafters\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/person\/65956d0c96a9ca33a2e160ed676cd854\",\"name\":\"Oleg Kalyta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7933ebedbe0e78c4a330b2080f5a4e429545588429c7f678fd0c87bb48ec123f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7933ebedbe0e78c4a330b2080f5a4e429545588429c7f678fd0c87bb48ec123f?s=96&d=mm&r=g\",\"caption\":\"Oleg Kalyta\"},\"description\":\"Founder\",\"sameAs\":[\"#\",\"https:\/\/www.linkedin.com\/in\/olegkalyta\/\",\"https:\/\/x.com\/#\"],\"url\":\"https:\/\/stage.productcrafters.io\/blog\/author\/oleg\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Create WYSIWYG Widget Editor on React Native Tutorial | ProductCrafters","description":"Build a WYSIWYG widget editor in React Native. Code examples, architecture, component design, and implementation best practices for developers.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/","og_locale":"en_US","og_type":"article","og_title":"Create WYSIWYG Widget Editor on React Native Tutorial | ProductCrafters","og_description":"Build a WYSIWYG widget editor in React Native. Code examples, architecture, component design, and implementation best practices for developers.","og_url":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/","og_site_name":"ProductCrafters","article_publisher":"https:\/\/www.facebook.com\/productcrafters","article_author":"#","article_published_time":"2019-10-07T12:54:42+00:00","article_modified_time":"2026-01-19T21:03:17+00:00","og_image":[{"width":1000,"height":668,"url":"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp","type":"image\/webp"}],"author":"Oleg Kalyta","twitter_card":"summary_large_image","twitter_creator":"@#","twitter_misc":{"Written by":"Oleg Kalyta","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#article","isPartOf":{"@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/"},"author":{"name":"Oleg Kalyta","@id":"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/person\/65956d0c96a9ca33a2e160ed676cd854"},"headline":"How to Create WYSIWYG Widget Editor on React Native","datePublished":"2019-10-07T12:54:42+00:00","dateModified":"2026-01-19T21:03:17+00:00","mainEntityOfPage":{"@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/"},"wordCount":1147,"publisher":{"@id":"https:\/\/stage.productcrafters.io\/blog\/#organization"},"image":{"@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage"},"thumbnailUrl":"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp","articleSection":["Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/","url":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/","name":"Create WYSIWYG Widget Editor on React Native Tutorial | ProductCrafters","isPartOf":{"@id":"https:\/\/stage.productcrafters.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage"},"image":{"@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage"},"thumbnailUrl":"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp","datePublished":"2019-10-07T12:54:42+00:00","dateModified":"2026-01-19T21:03:17+00:00","description":"Build a WYSIWYG widget editor in React Native. Code examples, architecture, component design, and implementation best practices for developers.","breadcrumb":{"@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#primaryimage","url":"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp","contentUrl":"https:\/\/stage.productcrafters.io\/blog\/wp-content\/uploads\/2026\/01\/hand-typing-on-a-laptop-with-code-on-the-screen.webp","width":1000,"height":668},{"@type":"BreadcrumbList","@id":"https:\/\/stage.productcrafters.io\/blog\/how-to-create-wysiwyg-widget-editor-on-react-native\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/stage.productcrafters.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Development","item":"https:\/\/stage.productcrafters.io\/blog\/development\/"},{"@type":"ListItem","position":3,"name":"How to Create WYSIWYG Widget Editor on React Native"}]},{"@type":"WebSite","@id":"https:\/\/stage.productcrafters.io\/blog\/#website","url":"https:\/\/stage.productcrafters.io\/blog\/","name":"ProductCrafters","description":"Our insights on development and business topics.","publisher":{"@id":"https:\/\/stage.productcrafters.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/stage.productcrafters.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/stage.productcrafters.io\/blog\/#organization","name":"ProductCrafters","url":"https:\/\/stage.productcrafters.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2019\/04\/favicon.png","contentUrl":"https:\/\/productcrafters.io\/blog\/wp-content\/uploads\/2019\/04\/favicon.png","width":64,"height":64,"caption":"ProductCrafters"},"image":{"@id":"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/productcrafters","https:\/\/www.linkedin.com\/company\/18621816","https:\/\/github.com\/ProductCrafters"]},{"@type":"Person","@id":"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/person\/65956d0c96a9ca33a2e160ed676cd854","name":"Oleg Kalyta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/stage.productcrafters.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7933ebedbe0e78c4a330b2080f5a4e429545588429c7f678fd0c87bb48ec123f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7933ebedbe0e78c4a330b2080f5a4e429545588429c7f678fd0c87bb48ec123f?s=96&d=mm&r=g","caption":"Oleg Kalyta"},"description":"Founder","sameAs":["#","https:\/\/www.linkedin.com\/in\/olegkalyta\/","https:\/\/x.com\/#"],"url":"https:\/\/stage.productcrafters.io\/blog\/author\/oleg\/"}]}},"_links":{"self":[{"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/posts\/1505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/comments?post=1505"}],"version-history":[{"count":58,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/posts\/1505\/revisions"}],"predecessor-version":[{"id":2246,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/posts\/1505\/revisions\/2246"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/media\/2240"}],"wp:attachment":[{"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/media?parent=1505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/categories?post=1505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stage.productcrafters.io\/blog\/wp-json\/wp\/v2\/tags?post=1505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}