tiefen_space_app/screeens/WebWithHeader/index.jsx

193 lines
5.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 (
<>
<WebView
incognito
source={{
uri: route.params.uri,
}}
userAgent="FromWebview"
onMessage={async (event) => {
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}
/>
<MyModal
visible={overlayVisible}
setVisible={setOverlayVisible}
title="您还未打开媒体权限"
content="是否前往设置开启权限?"
cancel={() => {
setOverlayVisible(false);
}}
confirm={() => {
Linking.openSettings();
setOverlayVisible(false);
}}
/>
</>
);
}