import TabBar from "@/components/navigation/TabBar"; import { rpxToPx } from "@/utils/tools"; import { View, Text, Image, ScrollView, Button, Block } from "@tarojs/components"; import Taro, { useDidShow, useRouter, useShareAppMessage } from "@tarojs/taro"; import { useDispatch, useSelector } from "react-redux"; import { useEffect, useRef, useState } from "react"; import { followUser, getFriendMoments, getMyFriends, getUserDashBoard } from "@/services/friend"; import FriendGuide from "./guide"; import EmptyContent from "./empty_content"; import MomentItem from "./moment_item"; import { useTranslation } from "react-i18next"; import { windows } from "@/services/health"; import { setFastWithSleep, setFinishSetup, setLongFast, setRefreshs, setWindows } from "@/store/health"; import { getInfoSuccess } from "@/store/user"; import showActionSheet from "@/components/basic/ActionSheet"; import { jumpPage } from "@/features/trackTimeDuration/hooks/Common"; import './moment.scss' import ListFooter from "@/_health/components/list_footer"; import { MainColorType } from "@/context/themes/color"; import dayjs from "dayjs"; import { IconClose, IconMenu } from "@/components/basic/Icons"; import MomentShare from "./moment_share"; import NoRecord from "@/_health/components/no_record"; import ShareBtn from "@/components/basic/ShareBtn"; import NewButton, { NewButtonType } from "@/_health/base/new_button"; import MomentDetailShare from "./moment_detail_share"; import { getThemeColor } from "@/features/health/hooks/health_hooks"; import shareTitle from "./moment_unit"; let useRoute; let useNavigation; let FlatList; let useActionSheet; let RefreshControl; let useSafeAreaInsets; if (process.env.TARO_ENV == 'rn') { useActionSheet = require('@expo/react-native-action-sheet').useActionSheet RefreshControl = require("react-native").RefreshControl useRoute = require("@react-navigation/native").useRoute useNavigation = require("@react-navigation/native").useNavigation FlatList = require('react-native').FlatList useSafeAreaInsets = require('react-native-safe-area-context').useSafeAreaInsets } let timer; let myScrollTop = 0 export default function MomentMain() { const user = useSelector((state: any) => state.user); // const observerObjBottom = Taro.createIntersectionObserver().relativeToViewport({ bottom: 100 }) const [loading, setLoading] = useState(false) const [noMore, setNoMore] = useState(false) const [friends, setFriends] = useState([]) const [count, setCount] = useState(0) const systemInfo: any = Taro.getWindowInfo ? Taro.getWindowInfo() : Taro.getSystemInfoSync(); const navigationBarHeight = systemInfo.statusBarHeight + 44; const screenHeight = systemInfo.screenHeight const [itemLayouts, setItemLayouts] = useState([]) const [itemHeights, setItemHeights] = useState([]) const [isPulling, setIsPulling] = useState(false) const [pageTop, setPageTop] = useState(0) const scrollRef = useRef() let showActionSheetWithOptions; let insets:any if (process.env.TARO_ENV == 'rn') { showActionSheetWithOptions = useActionSheet() insets = useSafeAreaInsets(); } let router let navigation; if (useNavigation) { navigation = useNavigation() } if (process.env.TARO_ENV == 'rn') { router = useRoute() } else { router = useRouter() } const [loaded, setLoaded] = useState(false) const [homeType, setHomeType] = useState('NO_FRIEND') const [dashBoard, setDashBoard] = useState(null) const [moments, setMoments] = useState([]) const [page, setPage] = useState(1) const [endSignal, setEndSignal] = useState(0) const [closeGuide, setCloseGuide] = useState(false) const [showGuide, setShowGuide] = useState(false) const [showShareGuide, setShowShareGuide] = useState(false) const [shareInfo, setShareInfo] = useState(null) const query: any = process.env.TARO_ENV == 'weapp' ? Taro.createSelectorQuery() : null const dispatch = useDispatch() const { t } = useTranslation() const momentsRef = useRef(moments) useEffect(() => { dayjs.locale(global.language == 'en' ? 'en' : 'zh-cn'); require('moment/locale/en-gb') require('moment/locale/zh-cn') timer = setInterval(() => { setCount(count => count + 1) }, 1000) Taro.eventCenter.on('followUser', listenFollowUser) Taro.eventCenter.on('unfollowUser', listenUnfollowUser) Taro.eventCenter.on('refreshMoments', refreshMoments) Taro.eventCenter.on('moment_share', momentShare) Taro.eventCenter.on('refresh_timeline', refreshItem) //Taro.eventCenter.trigger('refresh_timeline',(res as any).feed_item) return () => { Taro.eventCenter.off('followUser') Taro.eventCenter.off('unfollowUser') Taro.eventCenter.off('refreshMoments') Taro.eventCenter.off('moment_share') Taro.eventCenter.off('refresh_timeline') clearInterval(timer) } }, []) useEffect(() => { momentsRef.current = moments; }, [moments]) function listenFollowUser(e) { myFriends() } function listenUnfollowUser(e) { myFriends() } function refreshMoments(e) { myFriends() } function refreshItem(e) { if (!e) return const { link, moment, user } = e var list = JSON.parse(JSON.stringify(momentsRef.current)) list.map((item) => { if (item.link.event_id == link.event_id) { if (link) { item.link = e.link } if (moment) { item.moment = e.moment } if (user) { item.user = e.user } } }) setMoments(list) } function momentShare(e) { setShareInfo(e) setShowShareGuide(true) // var dt = scrollRef.current // query.select(`#myscrollview`).boundingClientRect().exec(res=>{ // debugger // }) } useEffect(() => { myFriends() if (router.params && router.params.type == 'share') { if (global.shareTicket) { Taro.getShareInfo({ shareTicket: global.shareTicket, success(result) { updateRelation(result) }, }) } else { updateRelation(null) } } }, [user.isLogin]) useEffect(() => { if (moments.length == 0) return setTimeout(() => { measureItemLayouts() }, 300) if (process.env.TARO_ENV == 'weapp') { const observerObjBottom = Taro.createIntersectionObserver().relativeToViewport({ bottom: 100 }) observerObjBottom && observerObjBottom.observe('#footer', (res) => { setEndSignal(endSignal => endSignal + 1) }) } }, [moments]) useEffect(() => { if (moments.length == 0) return loadMore() }, [endSignal]) function measureItemLayouts() { if (process.env.TARO_ENV == 'rn') return if (moments.length <= 10) { moments.forEach((item, index) => { query.select(`#history2-${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 { moments.forEach((item, index) => { if (index >= itemLayouts.length) { query.select(`#history2-${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) } useDidShow(() => { getDashBoard() }) function myFriends() { if (!user.isLogin) { setLoaded(true) Taro.hideLoading() return } setItemHeights([]) setItemLayouts([]) getDashBoard() getMoments(1) } function onRefresh() { setIsPulling(true) getMoments(1) getDashBoard() } function getMoments(index) { setPage(index) getFriendMoments({ page: index, limit: 10 }).then(res => { setIsPulling(false) if (index == 1) { setMoments((res as any).data) } else { setMoments([...moments, ...(res as any).data]) } setLoading(false) if ((res as any).data.length == 0) { setNoMore(true) } else { setNoMore(false) } }).catch(e => { setIsPulling(false) setLoading(false) setLoaded(true) Taro.hideLoading() }) } function getDashBoard() { getUserDashBoard().then(res => { setLoaded(true) setHomeType((res as any).homepage_type) setDashBoard(res) Taro.hideLoading() }).catch(e => { setLoaded(true) Taro.hideLoading() }) } function updateRelation(obj) { if (!user.isLogin) { Taro.setStorageSync('share_uid', router.params.uid) Taro.setStorageSync('share_info', JSON.stringify(obj)) return } if (user.id != router.params.uid) { var params: any = { follow_origin: obj ? 'WECHAT_GROUP_CHAT' : 'WECHAT_PRIVATE_CHAT', user_id: router.params.uid, } if (obj) { params.wechat = obj } followUser(params).then(res => { myFriends() }) } } function loadMore() { if (loading) return; if (noMore) return; setLoading(true) var index = page; index++; setPage(index) getMoments(index) } function more() { showActionSheet({ showActionSheetWithOptions: showActionSheetWithOptions, title: '', itemList: ['个人主页', '我的搭子', '消息通知'], success: (index) => { switch (index) { case 0: jumpPage('/_moment/pages/home?uid=' + user.id, 'UserHome', navigation, { uid: user.id }) break; case 1: jumpPage('/_moment/pages/relation', 'Relation', navigation) break case 2: jumpPage('/_moment/pages/message', 'Message', navigation) break } } }) } function friendGuide() { return {/* { setCloseGuide(true) }}>关闭 */} { user.isLogin && { // setCloseGuide(true) setShowGuide(false) }} > } { setTimeout(() => { setShowGuide(false) }, 500) }} /> { process.env.TARO_ENV == 'weapp' && } } function empty() { return { user.isLogin && { setCloseGuide(true) }} > } { process.env.TARO_ENV == 'weapp' && } } function shareGuideContent() { console.log(shareInfo) return { if (process.env.TARO_ENV == 'weapp') { e.stopPropagation() } setShowShareGuide(false) }}> { if (process.env.TARO_ENV == 'weapp') { e.stopPropagation() } }}> {shareTitle(t, shareInfo.join.user)} { setShowShareGuide(false) }}> { }} /> } function wxList() { return { // setPage(1) // if (moments.length > 10) { // setMoments(moments.slice(0, 10)) // setItemHeights(itemHeights.slice(0, 10)) // setItemLayouts(itemLayouts.slice(0, 10)) // } }} // onScrollToLower={props.loadMore} > { dashBoard && dashBoard.new_message && { jumpPage('/_moment/pages/message') }}> { dashBoard.new_message.avatars.map((item, index) => { return }) } {dashBoard.new_message.message_tip} } { moments.map((item, index) => { if (itemLayouts.length >= index + 1 && pageTop > 0 && index > 5) { if (Math.abs(itemLayouts[index] - pageTop) > 2500) { return } } return { var list = JSON.parse(JSON.stringify(moments)) list.splice(index, 1) setMoments(list) } } /> }) } { moments.length == 0 && } } function rnList() { return { // console.log(item,index) return index }} renderItem={({ item, index }) => { var list = JSON.parse(JSON.stringify(moments)) list.splice(index, 1) setMoments(list) } } />} refreshControl={ } onEndReached={loadMore} // 上拉加载更多 onEndReachedThreshold={0.5} // 当距离底部还有 50% 的高度时触发加载 ListFooterComponent={} // 加载指示器 /> } function listDetail() { return {t('health.moments')} { setShowGuide(true) }} style={{ position: 'absolute', left: 54, top: 0, bottom: 0, width: 44, display: 'flex', alignItems: 'center', justifyContent: 'center' }}> {/* 好友数量{count} { friends.map((item, index) => { return {item.nickname} {item.relation} }) } { process.env.TARO_ENV == 'weapp' && } }