feat(pagination): add updateItem for in-place list updates and optimize notifications
Add `updateItem` function to cursor pagination hook for updating single items without full list refresh. Use this in NotificationsScreen to mark messages as read locally instead of refetching. Also add `is_blocked` detection in postService and userProfile to show blocked state in profile screen.
This commit is contained in:
@@ -47,6 +47,7 @@ export const UserProfileScreen: React.FC<UserProfileScreenProps> = ({ mode, user
|
||||
handleMessage,
|
||||
handleBlock,
|
||||
isBlocked,
|
||||
isBlockedProfile,
|
||||
handleSettings,
|
||||
handleEditProfile,
|
||||
isCurrentUser,
|
||||
@@ -54,7 +55,18 @@ export const UserProfileScreen: React.FC<UserProfileScreenProps> = ({ mode, user
|
||||
} = useUserProfile({ mode, userId, isDesktop, isTablet });
|
||||
|
||||
// 渲染帖子列表 - Twitter 风格无边框
|
||||
const renderPostList = useCallback((postList: Post[], emptyTitle: string, emptyDesc: string) => {
|
||||
const renderPostList = useCallback((postList: Post[], emptyTitle: string, emptyDesc: string, blockedTitle?: string, blockedDesc?: string) => {
|
||||
if (isBlockedProfile && blockedTitle) {
|
||||
return (
|
||||
<EmptyState
|
||||
title={blockedTitle}
|
||||
description={blockedDesc || ''}
|
||||
icon="account-off-outline"
|
||||
variant="modern"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
if (postList.length === 0) {
|
||||
return (
|
||||
<EmptyState
|
||||
@@ -85,7 +97,7 @@ export const UserProfileScreen: React.FC<UserProfileScreenProps> = ({ mode, user
|
||||
})}
|
||||
</View>
|
||||
);
|
||||
}, [currentUser?.id, handlePostAction, activeTab]);
|
||||
}, [currentUser?.id, handlePostAction, activeTab, isBlockedProfile]);
|
||||
|
||||
// 渲染内容
|
||||
const renderContent = useCallback(() => {
|
||||
@@ -95,7 +107,9 @@ export const UserProfileScreen: React.FC<UserProfileScreenProps> = ({ mode, user
|
||||
return renderPostList(
|
||||
posts,
|
||||
mode === 'self' ? '还没有帖子' : '这个用户还没有发布任何帖子',
|
||||
mode === 'self' ? '分享你的想法,发布第一条帖子吧' : ''
|
||||
mode === 'self' ? '分享你的想法,发布第一条帖子吧' : '',
|
||||
mode === 'other' ? '已将该用户拉黑' : undefined,
|
||||
mode === 'other' ? '你已将此用户拉黑,不再显示其帖子' : undefined
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ export interface UseUserProfileReturn {
|
||||
loading: boolean;
|
||||
refreshing: boolean;
|
||||
isBlocked: boolean;
|
||||
isBlockedProfile: boolean;
|
||||
|
||||
// Tab 相关
|
||||
activeTab: number;
|
||||
@@ -82,6 +83,7 @@ export const useUserProfile = (options: UseUserProfileOptions): UseUserProfileRe
|
||||
const [refreshing, setRefreshing] = useState(false);
|
||||
const [activeTab, setActiveTab] = useState(0);
|
||||
const [isBlocked, setIsBlocked] = useState(false);
|
||||
const [isBlockedProfile, setIsBlockedProfile] = useState(false);
|
||||
|
||||
// 获取其他用户数据(other 模式)
|
||||
const loadOtherUserData = useCallback(async (forceRefresh = false) => {
|
||||
@@ -98,6 +100,7 @@ export const useUserProfile = (options: UseUserProfileOptions): UseUserProfileRe
|
||||
|
||||
const response = await postService.getUserPosts(userId);
|
||||
setPosts(response.list);
|
||||
setIsBlockedProfile(response.is_blocked || false);
|
||||
|
||||
return userData;
|
||||
} catch (error) {
|
||||
@@ -407,6 +410,7 @@ case 'like':
|
||||
loading,
|
||||
refreshing,
|
||||
isBlocked,
|
||||
isBlockedProfile,
|
||||
activeTab,
|
||||
setActiveTab,
|
||||
scrollBottomInset,
|
||||
|
||||
Reference in New Issue
Block a user