import React, { useState, useEffect } from "react"; import { Alert } from "react-native"; import { WebView } from "react-native-webview"; import * as FileSystem from "expo-file-system"; import * as MediaLibrary from "expo-media-library"; import * as Linking from "expo-linking"; import * as Clipboard from "expo-clipboard"; import Toast from "react-native-toast-message"; import MyModal from "../../components/MyModal"; import baseRequest from "../../utils/baseRequest"; export default function WebWithHeader({ navigation, route }) { //设置页面标题 useEffect(() => { navigation.setOptions({ title: route.params?.title, }); }, [navigation, route]); //前往打开权限弹窗 const [overlayVisible, setOverlayVisible] = useState(false); //设置cookies const [cookies, setCookies] = useState(); useEffect(() => { async function getCookies() { const base = await baseRequest(); setCookies({ b_mid: base.b_mid, b_did: base.b_did, b_ver: base.b_ver, b_dt: base.b_dt, b_model: base.b_model, b_nt: base.b_nt, b_token: base.b_token, }); } getCookies(); }, []); const setCookieScript = ` document.cookie = "b_mid=${cookies?.b_mid} ;"; document.cookie = "b_did=${cookies?.b_did} ;"; document.cookie = "b_ver=${cookies?.b_ver} ;"; document.cookie = "b_dt=${cookies?.b_dt} ;"; document.cookie = "b_model=${cookies?.b_model} ;"; document.cookie = "b_nt=${cookies?.b_nt} ;"; document.cookie = "b_token=${cookies?.b_token} ;"; true; `; //请求相册访问权限并保存 const saveImage = async (data) => { const permission = await MediaLibrary.requestPermissionsAsync(); if (permission.granted) { const base64Code = data.split("data:image/png;base64,")[1]; const filename = FileSystem.cacheDirectory + "poster.png"; await FileSystem.writeAsStringAsync(filename, base64Code, { encoding: FileSystem.EncodingType.Base64, }); await MediaLibrary.saveToLibraryAsync(filename); Toast.show({ type: "success", text1: "已保存到相册", topOffset: 60, }); } else { setOverlayVisible(true); } }; //保存内容到剪贴板 const copy = async (data) => { await Clipboard.setStringAsync(data); Toast.show({ type: "success", text1: "已复制到剪贴板", topOffset: 60, }); }; //从浏览器打开网页 const openBrowser = async (data) => { Linking.openURL(data); }; //唤起支付宝或微信 const handleUrlRedirect = (event) => { const { url } = event; // 对alipays:相关的scheme处理 if (url.startsWith("alipays:") || url.startsWith("alipay")) { try { // 尝试启动支付宝客户端 Linking.openURL(url).catch(() => { // 启动支付宝客户端失败,弹出提示安装对话框 Alert.alert( "支付宝提醒", "未检测到支付宝客户端,请安装后重试。", [ { text: "立即安装", onPress: () => { const alipayUrl = "https://d.alipay.com"; Linking.openURL(alipayUrl); }, }, { text: "取消", style: "cancel" }, ], { cancelable: false } ); }); return false; // 应用程序处理了该URL } catch (error) { // 启动支付宝客户端失败,继续加载URL console.error(error); } } // weixin:相关的scheme处理 if (url.startsWith("weixin:") || url.startsWith("weixin")) { try { // 尝试启动微信客户端 Linking.openURL(url).catch(() => { // 启动微信客户端失败,弹出提示安装对话框 Alert.alert( "微信提醒", "未检测到微信客户端,请安装后重试。", [{ text: "确认", style: "cancel" }], { cancelable: false } ); }); return false; // 应用程序处理了该URL } catch (error) { // 启动微信客户端失败,继续加载URL console.error(error); } } // 处理其他URL return true; }; return ( <> { const msg = JSON.parse(event.nativeEvent.data); if (msg.type === "SAVE_IMAGE") { saveImage(msg.data); } else if (msg.type === "COPY_URL") { copy(msg.data); } else if (msg.type === "NAVIGATE") { navigation.navigate(msg.data.page, { ...msg.data.params }); } else if (msg.type === "OPEN_BROWSER") { openBrowser(msg.data); } }} injectedJavaScript={setCookieScript} originWhitelist={[ "https://*", "http://*", "alipays://*", "alipay://*", "weixin://*", ]} onShouldStartLoadWithRequest={handleUrlRedirect} /> { setOverlayVisible(false); }} confirm={() => { Linking.openSettings(); setOverlayVisible(false); }} /> ); }