<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bibhuti</title>
    <description>The latest articles on Forem by Bibhuti (@bibhuti9).</description>
    <link>https://forem.com/bibhuti9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1268009%2Fb0f902d3-25e1-46f3-8a64-beb4d057182c.JPG</url>
      <title>Forem: Bibhuti</title>
      <link>https://forem.com/bibhuti9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bibhuti9"/>
    <language>en</language>
    <item>
      <title>Navigating React Native: A Step-by-Step Guide to Convert HTML to String in Native Modules Using Native Module 🌐</title>
      <dc:creator>Bibhuti</dc:creator>
      <pubDate>Sun, 28 Jan 2024 21:22:43 +0000</pubDate>
      <link>https://forem.com/bibhuti9/navigating-react-native-a-step-by-step-guide-to-convert-html-to-string-in-native-modules-using-native-module-3ado</link>
      <guid>https://forem.com/bibhuti9/navigating-react-native-a-step-by-step-guide-to-convert-html-to-string-in-native-modules-using-native-module-3ado</guid>
      <description>&lt;p&gt;&lt;strong&gt;Understanding the Need: Why Convert HTML to String? 🤔&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you have a compelling HTML representation of content like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Hey, this is React Native&amp;lt;/h1&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey, this is React Native

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, directly displaying HTML in a notification is not the most user-friendly approach. The key lies in converting this HTML to a string first. This process ensures a clean and readable presentation, making it ideal for various scenarios, including notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenarios Where HTML to String Conversion Shines 🌟:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Notifications: As mentioned, converting HTML to a string is crucial when delivering content in notifications.&lt;br&gt;
Text Display: When rendering HTML content within a Text component in React Native, having it in string format simplifies the display process.&lt;br&gt;
Data Processing: In scenarios where data manipulation or processing is involved, having HTML in string form facilitates smoother operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now let’s get started 😀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Set Up Your React Native Project 🚀&lt;/strong&gt;&lt;br&gt;
Create a React Native project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx react-native init YourProjectName
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My project name is rnnativemodule&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx react-native init rnnativemodule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Create the Native Module&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Android&lt;/strong&gt;&lt;br&gt;
For Android we have to create two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebViewModule.java&lt;/li&gt;
&lt;li&gt;WebViewPackage.java&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;inside the android/app/src/main/java/com/yourapp/ directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgl4qwnvr70up32wrzh3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgl4qwnvr70up32wrzh3p.png" alt="Image description" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now Add code in WebViewModule.java file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.rnnativemodule;

import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.Html;
import android.util.Log;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import java.util.Random;

public class WebViewModule extends ReactContextBaseJavaModule {

  public WebViewModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "WebViewModule";
  }

  @ReactMethod
  public void convertHTML(String html, com.facebook.react.bridge.Callback callback) {
      CharSequence output = Html.fromHtml(html);
      String htmlOutput = output.toString();
      callback.invoke(htmlOutput);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now for WebViewPackage.java&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.rnnativemodule;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class WebViewPackage implements ReactPackage {

    @Override
    public List&amp;lt;NativeModule&amp;gt; createNativeModules(ReactApplicationContext reactContext) {
        List&amp;lt;NativeModule&amp;gt; modules = new ArrayList&amp;lt;&amp;gt;();
        modules.add(new WebViewModule(reactContext)); // Your native module name
        return modules;
    }

    @Override
    public List&amp;lt;ViewManager&amp;gt; createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finally, add WebViewPackage() in MainApplication.java inside your protected List&amp;lt;ReactPackage&amp;gt; getPackages:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgoqaovjglr9owkblsz83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgoqaovjglr9owkblsz83.png" alt="Image description" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's it! We successfully created for Android 🥳&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now for IOS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;for IOS, open your Xcode by following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xed ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can open your rnnativemodule.xcworkspace file&lt;/p&gt;

&lt;p&gt;Now right-click on your project name and create New File&lt;br&gt;
Click to Swift File&lt;br&gt;
Save As: WebViewModule&lt;br&gt;
Click to Create&lt;br&gt;
It will ask you for Create Bridging Header click to Create Bridging Header&lt;br&gt;
That’s it,&lt;/p&gt;

&lt;p&gt;Add below code in WebViewModule.swift file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//
//  WebViewModule.swift
//  rnnativemodule
//
//  Created by Bibhuti Swain on 29/01/24.
//

import Foundation
import React
import UIKit


@objc(WebViewModule)
class WebViewModule:NSObject{

  @objc func convertHTML(_ html: String, callback: @escaping RCTResponseSenderBlock) {
      if let attributedString = try? NSAttributedString(data: html.data(using: .utf8)!, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) {
          let plainText = attributedString.string
          callback([plainText])
      } else {
          callback([""])
      }
  }

  @objc func constantsToExport() -&amp;gt; [AnyHashable : Any]! {
      return ["convertHtml": "value"] 
  }

  @objc static func requiresMainQueueSetup() -&amp;gt; Bool {
      return true
  }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Create an Objective-C file by&lt;/p&gt;

&lt;p&gt;Right click on your project name&lt;br&gt;
Click New File&lt;br&gt;
Select Objective-C file&lt;br&gt;
Click Next&lt;br&gt;
Enter file name as WebViewModule&lt;br&gt;
Click to Next&lt;br&gt;
Cool.&lt;/p&gt;

&lt;p&gt;Now add below code into your WebViewModule.m file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//
//  WebViewModule.m
//  rnnativemodule
//
//  Created by Bibhuti Swain on 29/01/24.
//

#import &amp;lt;Foundation/Foundation.h&amp;gt;
#import "React/RCTBridgeModule.h"
#import &amp;lt;React/RCTEventEmitter.h&amp;gt;

@interface RCT_EXTERN_MODULE(WebViewModule,NSObject)

RCT_EXTERN_METHOD(convertHTML:(NSString *)html callback:(RCTResponseSenderBlock)callback)

@end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Clean Build Folder and Build your project&lt;/p&gt;

&lt;p&gt;Your Swift file process&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz8d21o4shkxyx2gqppp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz8d21o4shkxyx2gqppp.png" alt="Image description" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ogg82e4lr6eyjsssh1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ogg82e4lr6eyjsssh1f.png" alt="Image description" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5w66zz6txfa75xbl6izp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5w66zz6txfa75xbl6izp.png" alt="Image description" width="540" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04xys8m1duqc1zrz2zve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04xys8m1duqc1zrz2zve.png" alt="Image description" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6631qs3hxsncpd7sjqsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6631qs3hxsncpd7sjqsx.png" alt="Image description" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Yehhhh You have successfully added a native module for both Android and iOS 🥳&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Now It’s time to implement 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;open your App.tsx or App.js file or whichever file you want to use&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;import { NativeModules } from 'react-native';&lt;br&gt;
const { WebViewModule } = NativeModules;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add some dummy HTML:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const html =&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;Hey, this is React Native&lt;/h1&gt;
&lt;code&gt;;&lt;br&gt;
&lt;/code&gt;

&lt;p&gt;Use your convertHTML function by calling:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;WebViewModule.convertHTML(html, (result: string) =&amp;gt; {&lt;br&gt;
   console.log(result); // the result contains your actual result&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here is my App.tsx file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, {useState} from 'react';
import {
  NativeModules,
  StyleSheet,
  Text,
  TouchableOpacity,
  View,
} from 'react-native';

const {WebViewModule} = NativeModules;

const App = () =&amp;gt; {
  const [convertToString, setConvertToString] = useState('');
  const html = `&amp;lt;h1&amp;gt;Hey this is react  native&amp;lt;/h1&amp;gt;`;

  return (
    &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;Text style={styles.text}&amp;gt;{html}&amp;lt;/Text&amp;gt;
      &amp;lt;Text style={styles.text}&amp;gt;After HTML to String : {convertToString}&amp;lt;/Text&amp;gt;

      &amp;lt;TouchableOpacity
        style={styles.btn}
        onPress={() =&amp;gt; {
          WebViewModule.convertHTML(html, (result: string) =&amp;gt; {
            setConvertToString(result); // the result contain your actual result
          });
        }}&amp;gt;
        &amp;lt;Text style={styles.btnText}&amp;gt;Convert to String&amp;lt;/Text&amp;gt;
      &amp;lt;/TouchableOpacity&amp;gt;
    &amp;lt;/View&amp;gt;
  );
};

export default App;

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  text: {
    fontSize: 18,
    marginBottom: 10,
  },
  btn: {
    marginTop: 40,
    backgroundColor: '#e4aa3f',
    borderRadius: 30,
    padding: 10,
    justifyContent: 'center',
    alignItems: 'center',
    paddingHorizontal: 20,
  },
  btnText: {
    fontSize: 18,
    color: '#fff',
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbe5mcdyr7sr132rjk96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbe5mcdyr7sr132rjk96.png" alt="Image description" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations!🙌 You’ve successfully integrated a native module to convert HTML to a string in your React Native project. Whether you’re displaying notifications or processing data, this step-by-step guide empowers you to seamlessly handle rich HTML content in your React Native applications. Go ahead, explore the possibilities, and elevate your React Native development experience! 🚀&lt;/p&gt;

&lt;p&gt;Github repo: bibhuti9/RN-Native-Module (github.com)&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>nativemodule</category>
      <category>react</category>
      <category>crossplatform</category>
    </item>
  </channel>
</rss>
