import ArrowSvg from '@/assets/icons/svg/arrow.svg'; import ReturnArrowSvg from '@/assets/icons/svg/returnArrow.svg'; import { CascaderItem } from '@/components/cascader'; import ClassifyModal from '@/components/owner/classify'; import LocationModal from '@/components/owner/location'; import PodiumComponent from '@/components/owner/podium'; import RankList from '@/components/owner/rankList'; import { ThemedText } from '@/components/ThemedText'; import { transformData } from '@/components/utils/objectToCascader'; import { fetchApi } from '@/lib/server-api-util'; import { GroupedData, RankingItem, TargetItem } from '@/types/user'; import { useRouter } from "expo-router"; import { useCallback, useEffect, useRef, useState } from 'react'; import { LayoutChangeEvent, StyleSheet, TouchableOpacity, View } from 'react-native'; import { useSafeAreaInsets } from "react-native-safe-area-context"; export default function OwnerPage() { const insets = useSafeAreaInsets(); const router = useRouter(); // 位置弹窗 const [locationModalVisible, setLocationModalVisible] = useState(false); // 分类弹窗 const [classifyModalVisible, setClassifyModalVisible] = useState(false); // 在组件内部添加: const podiumRef = useRef(null); const [podiumPosition, setPodiumPosition] = useState({ x: 0, y: 0, width: 0, height: 0 }); // 获取分类 const [classify, setClassify] = useState([]); const getClassify = () => { fetchApi("/title-tags").then((res: GroupedData) => { setClassify(transformData(res)); }); } // 选择地区 const [selectedLocation, setSelectedLocation] = useState(); // 选择分类 const [selectedClassify, setSelectedClassify] = useState(); const onPodiumLayout = (event: LayoutChangeEvent) => { if (podiumRef.current) { podiumRef.current.measure((x, y, width, height, pageX, pageY) => { setPodiumPosition({ x: pageX, y: pageY, width, height }); }); } }; // 地区选择 const handleLocationChange = useCallback((selectedItems: CascaderItem[]) => { console.log('SelectedLocation:', selectedItems); if (selectedItems.length > 0) { const lastItem = selectedItems[selectedItems.length - 1]; // 只有当选择完成时才更新状态 if (!lastItem.children || lastItem.children.length === 0) { setSelectedLocation(selectedItems); } } }, []); // 分类选择 const handleClassifyChange = useCallback((selectedItems: CascaderItem[]) => { console.log('SelectedClassify:', selectedItems); if (selectedItems.length > 0) { const lastItem = selectedItems[selectedItems.length - 1]; // 只有当选择完成时才更新状态 if (!lastItem.children || lastItem.children.length === 0) { setSelectedClassify(selectedItems); } } }, []); // 获取排名信息 const [ranking, setRanking] = useState([]); const getRanking = () => { fetchApi("/title-rank", { method: "POST", body: JSON.stringify({ "title_tag_id": selectedClassify?.length > 0 ? selectedClassify[selectedClassify?.length - 1].value : 3, "area_id": 1 }) }).then((res) => { setRanking(res); }); } // 当用户选择发生变化时,重新获取排名 useEffect(() => { getRanking(); }, [selectedLocation, selectedClassify]) // 初始化获取分类 useEffect(() => { getClassify(); }, []) return ( {/* 导航栏 */} { router.push('/owner') }} style={{ padding: 16 }}> Top Memory Makers 123 { setLocationModalVisible(true) }} style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', gap: 8 }}> 0 ? '#FFB645' : '#4C320C' }}> {selectedLocation?.length > 0 ? selectedLocation[selectedLocation?.length - 1].name : "地区"} { selectedLocation?.length > 0 ? : } { setClassifyModalVisible(true) }} style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', gap: 8 }}> 0 ? '#FFB645' : '#4C320C' }}> {selectedClassify?.length > 0 ? selectedClassify[selectedClassify?.length - 1].name : "分类"} {selectedClassify?.length > 0 ? : } {/* 颁奖台 */} {/* 排名区域 */} {/* 地区选择弹窗 */} {/* 分类选择弹窗 */} ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: 'white', }, header: { display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginVertical: 16, }, headerTitle: { fontSize: 20, fontWeight: '700', color: '#4C320C', } });