2023-12-29 00:27:44 +08:00
|
|
|
|
import React, { useState, useEffect } from "react";
|
|
|
|
|
import { Alert } from "react-native";
|
|
|
|
|
import { WebView } from "react-native-webview";
|
|
|
|
|
import { get } from "../../utils/storeInfo";
|
|
|
|
|
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();
|
2023-12-30 03:24:02 +08:00
|
|
|
|
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,
|
|
|
|
|
});
|
2023-12-29 00:27:44 +08:00
|
|
|
|
}
|
|
|
|
|
getCookies();
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const setCookieScript = `
|
2023-12-30 03:24:02 +08:00
|
|
|
|
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} ;";
|
2023-12-29 00:27:44 +08:00
|
|
|
|
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 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 true; // 应用程序处理了该URL
|
|
|
|
|
} catch (error) {
|
|
|
|
|
// 启动支付宝客户端失败,继续加载URL
|
|
|
|
|
console.error(error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// weixin:相关的scheme处理
|
|
|
|
|
if (url.startsWith("weixin:")) {
|
|
|
|
|
try {
|
|
|
|
|
// 尝试启动支付宝客户端
|
|
|
|
|
Linking.openURL(url).catch(() => {
|
|
|
|
|
// 启动微信客户端失败,弹出提示安装对话框
|
|
|
|
|
Alert.alert(
|
|
|
|
|
"微信提醒",
|
|
|
|
|
"未检测到微信客户端,请安装后重试。",
|
|
|
|
|
[{ text: "确认", style: "cancel" }],
|
|
|
|
|
{ cancelable: false }
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
return true; // 应用程序处理了该URL
|
|
|
|
|
} catch (error) {
|
|
|
|
|
// 启动微信客户端失败,继续加载URL
|
|
|
|
|
console.error(error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 处理其他URL
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<WebView
|
|
|
|
|
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 });
|
|
|
|
|
}
|
|
|
|
|
}}
|
|
|
|
|
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);
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|