import { View, Text, Image, ScrollView } from "@tarojs/components"; import './home.scss' import Taro, { useRouter } from "@tarojs/taro"; import { useEffect, useState } from "react"; import { followUser, getFriendMoments, getUserMoments, getUserProfile, unfollowUser } from "@/services/friend"; import { useSelector } from "react-redux"; import NewButton, { NewButtonType } from "@/_health/base/new_button"; import { rpxToPx } from "@/utils/tools"; import { MainColorType } from "@/context/themes/color"; import showActionSheet from "@/components/basic/ActionSheet"; import ListFooter from "@/_health/components/list_footer"; import RecentItem from "../components/recent_item"; import { useTranslation } from "react-i18next"; import NoRecord from "@/_health/components/no_record"; let useRoute; let useNavigation; let scenario = ''; if (process.env.TARO_ENV == 'rn') { useRoute = require("@react-navigation/native").useRoute useNavigation = require("@react-navigation/native").useNavigation } let timer export default function UserHome() { const user = useSelector((state: any) => state.user); const [profile, setProfile] = useState(null) const [loaded, setLoaded] = useState(false) const [loadedList, setLoadedList] = useState(false) const systemInfo: any = Taro.getWindowInfo ? Taro.getWindowInfo() : Taro.getSystemInfoSync(); const navigationBarHeight = systemInfo.statusBarHeight + 44; const [loading, setLoading] = useState(false) const [noMore, setNoMore] = useState(false) const [itemLayouts, setItemLayouts] = useState([]) const [itemHeights, setItemHeights] = useState([]) const [pageTop, setPageTop] = useState(0) const [page, setPage] = useState(1) const [endSignal, setEndSignal] = useState(0) const [list, setList] = useState([]) const query = Taro.createSelectorQuery() const { t } = useTranslation() const [myScrollTop, setMyScrollTop] = useState(0) const [count, setCount] = useState(0) let router let navigation; if (useNavigation) { navigation = useNavigation() } if (process.env.TARO_ENV == 'rn') { router = useRoute() } else { router = useRouter() } useEffect(() => { getProfile() moments(1) }, []) useEffect(() => { timer = setInterval(() => { setCount(count => count + 1) }, 1000) return () => { clearInterval(timer) } }, []) useEffect(() => { if (list.length == 0) return setTimeout(() => { measureItemLayouts() }, 300) if (process.env.TARO_ENV == 'weapp') { const observerObjBottom = Taro.createIntersectionObserver().relativeToViewport({ bottom: 100 }) observerObjBottom.observe('#footer', (res) => { setEndSignal(endSignal => endSignal + 1) // console.log(moments.length) // if (moments.length==0) return // loadMore() }) } }, [list]) useEffect(() => { if (moments.length == 0) return // loadMore() }, [endSignal]) function getProfile() { getUserProfile({ user_id: router.params.uid }).then(res => { setProfile(res) setLoaded(true) }) } function loadMore() { if (loading) return; if (noMore) return; setLoading(true) var index = page; index++; setPage(index) moments(index) } function moments(index) { setPage(index) var params: any = { user_id: router.params.uid, page: index, limit: 10 } if (index != 1 && list.length > 0) { params.last_timestamp = list[list.length - 1].time.timestamp } getUserMoments(params).then(res => { if (index == 1) { setList((res as any).data) } else { setList([...list, ...(res as any).data]) } setLoading(false) setLoadedList(true) if ((res as any).data.length == 0) { setNoMore(true) } else { setNoMore(false) } }) } function measureItemLayouts() { if (process.env.TARO_ENV == 'rn') return if (list.length <= 10) { list.forEach((item, index) => { query.select(`#history3-${index}`).boundingClientRect() }); query.exec((res) => { var layouts: any = [] var heights: any = [] res.forEach((rect, index) => { if (rect) { layouts[index] = rect.top + myScrollTop heights[index] = rect.height } }); setItemLayouts(layouts) setItemHeights(heights) }) } else { list.forEach((item, index) => { if (index >= itemLayouts.length) { query.select(`#history3-${index}`).boundingClientRect() } }); query.exec((res) => { var layouts: any = [] var heights: any = [] res.forEach((rect, index) => { if (rect) { layouts[index] = rect.top + myScrollTop heights[index] = rect.height } }); setItemLayouts([...itemLayouts, ...layouts]) setItemHeights([...itemHeights, ...heights]) }) } } function onScroll(e) { // var top = e.detail.scrollTop // myScrollTop = top var top = e.detail.scrollTop - e.detail.deltaY // myScrollTop = e.detail.scrollTop setPageTop(top) setMyScrollTop(e.detail.scrollTop) } function tapFollow() { var params: any = { follow_origin: 'WECHAT_PRIVATE_CHAT', user_id: router.params.uid, } followUser(params).then(res => { getProfile() Taro.eventCenter.trigger('followUser', router.params.uid) }) } function tapFollowing() { showActionSheet({ title: `不再关注“${profile.nickname}”,他的动态将不出现在搭子圈`, itemList: ['不再关注'], success: (res) => { if (res == 0) { unfollowUser(profile.id).then(res => { Taro.eventCenter.trigger('unfollowUser', router.params.uid) getProfile() }) } } }) } if (!loaded) return // console.log(list.length,pageTop,itemLayouts,) return { setPage(1) setPageTop(0) if (moments.length > 10) { setList(list.slice(0, 10)) setItemHeights(itemHeights.slice(0, 10)) setItemLayouts(itemLayouts.slice(0, 10)) } }} onScrollToLower={loadMore} > {profile.nickname} = rpxToPx(380) ? '#f5f5f5' : 'transparent', display: 'flex', flexDirection: 'column', justifyContent: 'flex-end' }}> {/* { Taro.navigateBack() }} style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 80, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>Back */} { Taro.navigateBack() }} /> = rpxToPx(380) ? '#000' : 'transparent' }} className="bold">{profile.nickname} { router.params.uid != user.id && { profile.relation == 'FRIEND' || profile.relation == 'FOLLOWING' ? // {t('health.following2')} : } } {/* */} { list.map((item, index) => { if (itemLayouts.length >= index + 1 && pageTop > 0 && index > 5) { if (Math.abs(itemLayouts[index] - pageTop) > 2500) { return } } return }) } { loadedList && list.length == 0 && } }