Skip to content

Commit 909cc80

Browse files
simplifying the ConnectWidget
1 parent 37d6d67 commit 909cc80

2 files changed

Lines changed: 46 additions & 22 deletions

File tree

example/src/app/connect.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useEffect, useState } from "react"
2-
import { StyleSheet } from "react-native"
2+
import { StyleSheet, useWindowDimensions } from "react-native"
33
import { SafeAreaView } from "react-native-safe-area-context"
44
import * as Linking from "expo-linking"
55

@@ -16,6 +16,8 @@ const styles = StyleSheet.create({
1616
export default function Connect() {
1717
const clientRedirectUrl = Linking.createURL("connect")
1818

19+
const { height, width } = useWindowDimensions()
20+
1921
const [url, setUrl] = useState<string | null>(null)
2022

2123
useEffect(() => {
@@ -25,7 +27,7 @@ export default function Connect() {
2527
}, [clientRedirectUrl])
2628

2729
return (
28-
<SafeAreaView style={styles.page}>
30+
<SafeAreaView style={{ ...styles.page, height, width }}>
2931
{url && (
3032
<ConnectWidget
3133
url={url}

src/components/ConnectWidgets.tsx

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,63 @@
1+
import React from "react"
12
import {
23
dispatchConnectLocationChangeEvent,
34
ConnectPostMessageCallbackProps,
45
ConnectOAuthRequestedPayload,
56
} from "@mxenabled/widget-post-message-definitions"
6-
7-
import { Type, SsoUrlProps, ConnectWidgetConfigurationProps } from "../sso"
87
import * as WebBrowser from "expo-web-browser"
9-
import { StylingProps, useWidgetRenderer } from "./renderer"
8+
import { WebView, WebViewProps } from "react-native-webview"
9+
import { sdkVersion } from "../version"
10+
import { makeRequestInterceptor } from "./request_interceptor"
11+
12+
interface ExtraProps {
13+
url: string
14+
webViewProps?: WebViewProps
15+
}
1016

11-
export type ConnectWidgetProps = SsoUrlProps &
12-
StylingProps &
13-
ConnectPostMessageCallbackProps<string> &
14-
ConnectWidgetConfigurationProps &
15-
JSX.IntrinsicAttributes
17+
export type ConnectWidgetProps = ConnectPostMessageCallbackProps<string> & ExtraProps
1618

1719
export function ConnectWidget(props: ConnectWidgetProps) {
20+
const { url: webviewUrl, webViewProps, ...callbacks } = props
21+
1822
const onOAuthRequested = (payload: ConnectOAuthRequestedPayload) => {
1923
const { url } = payload
2024
WebBrowser.openAuthSessionAsync(url)
2125

2226
props.onOAuthRequested?.(payload)
2327
}
2428

25-
props = {
29+
const modifiedCallbacks = {
30+
...callbacks,
2631
onOAuthRequested,
27-
...props,
2832
}
2933

30-
const modifiedProps = {
31-
...props,
32-
onOAuthRequested,
33-
}
34-
35-
const elem = useWidgetRenderer(
36-
{ ...modifiedProps, widgetType: Type.ConnectWidget },
37-
dispatchConnectLocationChangeEvent,
34+
const handler = makeRequestInterceptor(webviewUrl, {
35+
onIntercept: (url) => {
36+
dispatchConnectLocationChangeEvent(url, modifiedCallbacks)
37+
},
38+
})
39+
40+
const setReactNativeSDKVersionOnWindow = `
41+
window.MXReactNativeSDKVersion = "${sdkVersion}";
42+
`
43+
44+
return (
45+
<WebView
46+
cacheMode="LOAD_NO_CACHE"
47+
domStorageEnabled={true}
48+
incognito={true}
49+
injectedJavaScriptBeforeContentLoaded={setReactNativeSDKVersionOnWindow}
50+
javaScriptEnabled={true}
51+
onOpenWindow={(event) => {
52+
WebBrowser.openBrowserAsync(event.nativeEvent.targetUrl)
53+
}}
54+
onShouldStartLoadWithRequest={handler}
55+
originWhitelist={["*"]}
56+
scrollEnabled={true}
57+
source={{ uri: webviewUrl }}
58+
testID="widget_webview"
59+
{...webViewProps}
60+
style={webViewProps?.style || { height: "100%", width: "100%" }}
61+
/>
3862
)
39-
40-
return elem
4163
}

0 commit comments

Comments
 (0)