@@ -103,6 +98,8 @@ import { useStoreUser } from '@/store/user';
import { useStoreProfile } from '@/store/profile';
import { storeToRefs } from 'pinia';
import { Api } from '@/utils/request';
+import { usePagination } from '@/composables/usePagination';
+import UserAction from '@/composables/useUserAction';
const storeMain = useStoreMain();
const storeUser = useStoreUser();
@@ -116,6 +113,20 @@ const router = useRouter();
const dialog = useDialog();
const newestTweetsStyle = ref<'newest' | 'hots' | 'following'>('newest');
+
+// 筛选按钮配置
+const filterButtons = [
+ { key: 'newest' as const, label: '全部', index: 0 },
+ { key: 'hots' as const, label: '热门推荐', index: 1 },
+ { key: 'following' as const, label: '正在关注', index: 2 },
+];
+
+const onFilterClick = (key: 'newest' | 'hots' | 'following', index: number) => {
+ newestTweetsStyle.value = key;
+ handleBarClick(slideBarList.value[index], index);
+};
+
+// 保留原有的方法以确保兼容性
const onNewestTweets = () => {
newestTweetsStyle.value = 'newest';
handleBarClick(slideBarList.value[0], 0);
@@ -175,38 +186,16 @@ const user = reactive
({
const inActionPost = ref(null);
const title = ref('泡泡广场');
-const loading = ref(false);
-const noMore = ref(false);
const targetStyle = ref(1);
const targetUsername = ref('');
const list = ref([]);
-const page = ref(1);
-const pageSize = ref(20);
-const totalPage = ref(0);
-const showWhisper = ref(false);
const showAddFriendWhisper = ref(false);
-const whisperReceiver = ref({
- id: 0,
- avatar: '',
- username: '',
- nickname: '',
- is_admin: false,
- is_friend: true,
- is_following: false,
- created_on: 0,
- follows: 0,
- followings: 0,
- status: 1,
-});
-const onSendWhisper = (user: Item.UserInfo) => {
- whisperReceiver.value = user;
- showWhisper.value = true;
-};
+// 使用 usePagination composable
+const { loading, noMore, page, pageSize, totalPage, reset, nextPage } = usePagination(20);
-const whisperSuccess = () => {
- showWhisper.value = false;
-};
+// 使用 UserAction.useWhisper()
+const { showWhisper, whisperReceiver, onSendWhisper, whisperSuccess } = UserAction.useWhisper();
const openAddFriendWhisper = () => {
showAddFriendWhisper.value = true;
@@ -257,6 +246,12 @@ function postFollowAction(userId: number, isFollowing: boolean) {
list.value[index].user.is_following = isFollowing;
}
}
+
+ // 如果是在【正在关注】tab,且是取消关注操作(isFollowing 为 false),则刷新列表
+ if (targetStyle.value === 3 && !isFollowing) {
+ resetAll();
+ loadPosts('following');
+ }
}
const updateTitle = () => {
@@ -286,16 +281,14 @@ const showTrendsBar = computed(() => {
);
});
-const reset = () => {
- loading.value = false;
- noMore.value = false;
+// 重写 reset 方法以包含 list 的重置
+const resetAll = () => {
+ reset();
list.value = [];
- page.value = 1;
- totalPage.value = 0;
};
const handleBarClick = (data: Item.SlideBarItem, index: number) => {
- reset();
+ resetAll();
targetStyle.value = data.style;
if (route.query.q) {
route.query.q = null;
@@ -483,18 +476,12 @@ const loadMorePosts = () => {
}
};
-const nextPage = () => {
- if (page.value < totalPage.value || totalPage.value == 0) {
- noMore.value = false;
- page.value++;
- loadMorePosts();
- } else {
- noMore.value = true;
- }
+const handleNextPage = () => {
+ nextPage(loadMorePosts);
};
onMounted(() => {
- reset();
+ resetAll();
loadContacts();
loadPosts('newest');
});
@@ -508,7 +495,7 @@ watch(
(to, from) => {
updateTitle();
if (to.refresh !== from.refresh) {
- reset();
+ resetAll();
setTimeout(() => {
loadContacts();
loadMorePosts();
@@ -516,7 +503,7 @@ watch(
return;
}
if (from.path !== '/post' && to.path === '/') {
- reset();
+ resetAll();
setTimeout(() => {
loadContacts();
loadMorePosts();
diff --git a/web/src/views/User.vue b/web/src/views/User.vue
index 193700f7..f134dcc7 100644
--- a/web/src/views/User.vue
+++ b/web/src/views/User.vue
@@ -153,7 +153,7 @@ import { useStoreUser } from '@/store/user';
import { useStoreProfile } from '@/store/profile';
import { storeToRefs } from 'pinia';
import { Api } from '@/utils/request';
-import UserAction from '@/utils/useUserAction';
+import UserAction from '@/composables/useUserAction';
type PageType = 'post' | 'comment' | 'highlight' | 'media' | 'star';
@@ -515,7 +515,7 @@ const openDeleteFriend = () => {
});
};
const handleFollowUser = () => {
- UserAction.followAction(user.id, user.username, user.is_following)
+ UserAction.followAction(dialog, user.id, user.username, user.is_following)
.then(_action => {
userLoading.value = false;
loadUser();