import { View, Text, Modal, TouchableOpacity, ActivityIndicator, Platform, } from "react-native"; import React, { useState, useCallback, useEffect } from "react"; import { ImageViewer as OriginImageViewer } from "react-native-image-zoom-viewer"; import { Icon } from "@rneui/themed"; import { useTailwind } from "tailwind-rn"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import saveImage from "../../utils/saveImage"; import Toast from "react-native-toast-message"; import { get } from "../../utils/storeInfo"; import { useNavigation } from "@react-navigation/native"; import MyModal from "../MyModal"; import { Image } from "expo-image"; import { Button } from "@rneui/themed"; import { LinearGradient } from "expo-linear-gradient"; import { generateSignature } from "../../utils/crypto"; import baseRequest from "../../utils/baseRequest"; //imageUrls [{ url: string , id: int }] 网络图片需要查看原图时才传id,其他情况不用 //index int //lockedStartIndex int //onPressUnlockBtn () => void export function ImageViewer({ isShow, onClose, onChange, imageUrls, index, lockedStartIndex, onPressUnlockBtn, setImageViewerProps, }) { const tailwind = useTailwind(); const insets = useSafeAreaInsets(); const navigation = useNavigation(); const [isVisible, setIsVisible] = useState(false); useEffect(() => { setIsVisible(isShow); }, [isShow]); const closeImageViewer = () => { setIsVisible(false); onClose && onClose(); }; const checkRole = useCallback(async () => { const account = await get("account"); const role = account.role; const isVip = account.is_a_member; if (role !== 0 || isVip === 1) return true; return false; }, []); const [isVipModalVisible, setIsVipModalVisible] = useState(false); const [isSaving, setIsSaving] = useState(false); const hanldSaveImage = async (index) => { const isVip = await checkRole(); if (!isVip) { setIsVipModalVisible(true); return; } if (isSaving) return; setIsSaving(true); await saveImage(imageUrls[index].url); setIsSaving(false); }; //查看原图 const [isLoading, setIsLoading] = useState(false); const handleCheckOriginalImage = async (index) => { const isVip = await checkRole(); if (!isVip) { setIsVipModalVisible(true); return; } setIsLoading(true); const apiUrl = process.env.EXPO_PUBLIC_API_URL; try { const base = await baseRequest(); const body = { image_id: imageUrls[index].id, ...base, }; const signature = await generateSignature(body); const _response = await fetch( `${apiUrl}/api/previews/original_image?signature=${signature}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), } ); const _data = await _response.json(); if (_data.ret === -1) { Toast.show({ type: "error", text1: _data.msg, topOffset: 60, }); return; } setImageViewerProps((prev) => { let newImageViewerProps = prev; newImageViewerProps.imageUrls[index] = { id: imageUrls[index].id, url: _data?.data?.urls[0], }; return { ...newImageViewerProps }; }); Toast.show({ type: "success", text1: "已切换至原图", topOffset: 60, }); } catch (error) { console.error(error); } finally { setIsLoading(false); } }; return ( onChange(index) : () => null} enableSwipeDown backgroundColor="#07050A" renderImage={(props) => { if (index >= lockedStartIndex) { return ( ); } return ; }} renderFooter={(index) => ( hanldSaveImage(index)} style={{ marginLeft: 20, marginBottom: insets.bottom, ...tailwind( "flex justify-center items-center w-14 h-14 bg-[#FFFFFF1A] rounded-full" ), }} > {isSaving && } {!isSaving && ( )} 保存 {imageUrls[index]?.id && ( handleCheckOriginalImage(index)} style={{ marginLeft: 20, marginBottom: insets.bottom, ...tailwind( "flex justify-center items-center w-14 h-14 bg-[#FFFFFF1A] rounded-full" ), }} > {isLoading && } {!isLoading && ( )} 原图 )} )} onSave={(url) => { saveImage(url); }} saveToLocalByLongPress={false} loadingRender={() => } /> { setIsVipModalVisible(false); }} confirm={() => { setIsVipModalVisible(false); closeImageViewer(); navigation.navigate("WebWithoutHeader", { uri: process.env.EXPO_PUBLIC_WEB_URL + "/vip", }); }} /> ); }