0

I'm facing the same problem of this closed issue. I'm trying to display the following html inside a react-native-paper List.Accordion element in my expo application using the iframe-plugin for the react-native-render-html library to render iframe inside html

<!DOCTYPE html>
                            <html>
                            <body>
                            
                            <h1>The iframe element</h1>
                            
                            <iframe width="100%" height="315"
                                src="https://www.youtube.com/embed/M_xq5YB0z-A">
                            </iframe>
                            
                            </body>
                            </html>

the h1 tag is displayed just fine but the iframe tag is not displayed.

So I searched for a solution and found the solution under issue #41 and I tried it. It basically says that I have to create Iframe renderer manually using the following function

const IframeRenderer = function IframeRenderer(props) {
  const iframeProps = useHtmlIframeProps(props);
  const {width, height} = StyleSheet.flatten(iframeProps.style);
  return (
    <View style={{width, height}}>
      <HTMLIframe {...iframeProps} />
    </View>
  );
};

However, when I ran the application it crashed and I got the following error

Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.

Check the render method of HTMLIframe.

When I searched for the error on Google, it said that it is an import problem so I don't know what to do about it. So if you know what could be the problem or how to get the iframe to render, I would highly appreciate it.

my code:

import React, { useEffect, useState } from "react";
import {
  View,
  SafeAreaView,
  ScrollView,
  useWindowDimensions,
} from "react-native";
import {
  List,
} from "react-native-paper";
import {
  iframeModel,
  HTMLIframe,
  useHtmlIframeProps,
} from "@native-html/iframe-plugin";

import RenderHtml, {
  HTMLContentModel,
  defaultHTMLElementModels,
} from "react-native-render-html";

import { WebView } from "react-native-webview";

const IframeRenderer = function IframeRenderer(props) {
  const iframeProps = useHtmlIframeProps(props);
  const {width, height} = StyleSheet.flatten(iframeProps.style);
  return (
    <View style={{width, height}}>
      <HTMLIframe {...iframeProps} />
    </View>
  );
};

const renderers = {
  iframe: IframeRenderer,
};

const customHTMLElementModels = {
  img: defaultHTMLElementModels.img.extend({
    contentModel: HTMLContentModel.mixed,
  }),
  iframe: iframeModel,
};

const NotificationPage = (props) => {

  const { width } = useWindowDimensions();

return (<SafeAreaView style={{ flex: 1 }}>
        <ScrollView style={{ flex: 1 }}>
              <List.Accordion
                            title="Content Body"
                            titleStyle={{
                              textAlign: "center",
                            }}
                            style={{ marginTop: "5%" }}
                          >
                         <RenderHtml
                      renderers={renderers}
                      contentWidth={width}
                      WebView={{ WebView }}
                      source={{
                        html: `<!DOCTYPE html>
                            <html>
                            <body>
                            
                            <h1>The iframe element</h1>
                            
                            <iframe width="100%" height="315"
                                src="https://www.youtube.com/embed/M_xq5YB0z-A">
                            </iframe>
                            
                            </body>
                            </html>`,
                      }}
                      customHTMLElementModels={customHTMLElementModels}/>
             </List.Accordion>

        </ScrollView>
      </SafeAreaView>
)
}

export default NotificationPage;

Expo CLI 3.20.3 environment info: ``` System: OS: Windows 10 10.0.19044 Binaries: Node: 16.18.0 - C:\Program Files\nodejs\node.EXE npm: 8.19.2 - C:\Program Files\nodejs\npm.CMD IDEs: Android Studio: Version 3.5.0.0 AI-191.8026.42.35.5791312 npmPackages: expo: ~46.0.16 => 46.0.20 react: 18.0.0 => 18.0.0 react-dom: 18.0.0 => 18.0.0 react-native: 0.69.6 => 0.69.6 react-native-web: ~0.18.7 => 0.18.10 react-navigation: ^4.4.4 => 4.4.4

Libraries

"@native-html/iframe-plugin": "^2.6.1",
"react-native-webview": "^11.26.1",
"react-native-render-html": "^6.3.4",
RN 0.69.6

0 Answers0