Source: stores/modules/friend.js

/**
 * @file stores/modules/friendStore.js
 * @description Pinia Store,用于管理用户的好友列表、好友请求以及相关操作。
 * @module FriendStore
 */

import { defineStore } from 'pinia'
import { ref } from 'vue'
import { useUserStore } from '@/stores' // useUserStore 已导入但未使用,如果确实不需要,可以考虑移除。
import {
  getFriendRequestList,
  getFriendList,
  deleteFriend as apiDeleteFriend
} from '../../api/friend'
import { ElMessage } from 'element-plus'
import emitter from '../../services/eventBus'

/**
 * @function useFriendStore
 * @description Pinia Store,用于管理用户的好友关系,包括好友列表、好友请求和未读请求计数。
 * @returns {{
 * friendList: Ref<Array<object>>,
 * friendRequestList: Ref<Array<object>>,
 * unreadRequestCount: Ref<number>,
 * getList: Function,
 * getIncomingRequests: Function,
 * clearUnreadRequestCount: Function,
 * handleNewRequest: Function,
 * addNewFriend: Function,
 * deleteFriend: Function
 * }}
 * @property {Ref<Array<object>>} friendList - 当前用户的好友列表。
 * @property {Ref<Array<object>>} friendRequestList - 当前用户收到的好友请求列表。
 * @property {Ref<number>} unreadRequestCount - 未处理的好友请求数量。
 * @property {Function} getList - 从后端获取并更新好友列表。
 * @property {Function} getIncomingRequests - 从后端获取并更新收到的好友请求列表,并更新未读请求计数。
 * @property {Function} clearUnreadRequestCount - 清除未读好友请求计数。
 * @property {Function} handleNewRequest - 处理新的实时好友请求,将其添加到列表中并发送通知。
 * @property {Function} addNewFriend - 将新朋友添加到好友列表。
 * @property {Function} deleteFriend - 从后端删除好友并更新本地列表。
 */
export const useFriendStore = defineStore('friend', () => {
  // --- 状态 (State) ---
  /** @type {Ref<Array<object>>} */
  const friendList = ref([]) // 当前用户的好友列表
  /** @type {Ref<Array<object>>} */
  const friendRequestList = ref([]) // 当前用户收到的好友请求列表
  /** @type {Ref<number>} */
  const unreadRequestCount = ref(0) // 未处理的好友请求数量

  // Actions

  /**
   * @function getList
   * @description 从后端 API 获取当前用户的好友列表,并更新 `friendList` 状态。
   * @returns {Promise<void>}
   * @throws {Error} 如果获取好友列表失败,会打印错误信息。
   */
  const getList = async () => {
    try {
      const response = await getFriendList() // 调用 API 获取好友列表
      friendList.value = response.data // 更新好友列表
    } catch (error) {
      console.error('获取好友列表失败:', error)
    }
  }

  /**
   * @function getIncomingRequests
   * @description 从后端 API 获取当前用户收到的好友请求列表,并更新 `friendRequestList`。
   * 同时更新 `unreadRequestCount` 为当前请求列表的长度。
   * @returns {Promise<void>}
   * @throws {Error} 如果获取请求列表失败,会打印错误信息。
   */
  const getIncomingRequests = async () => {
    try {
      const response = await getFriendRequestList() // 调用 API 获取好友请求列表
      friendRequestList.value = response.data // 更新好友请求列表
      unreadRequestCount.value = friendRequestList.value.length // 更新未读请求计数
    } catch (error) {
      console.error('获取好友请求列表失败:', error)
    }
  }

  /**
   * @function clearUnreadRequestCount
   * @description 将未读好友请求计数重置为 0。
   * @returns {void}
   */
  const clearUnreadRequestCount = async () => {
    unreadRequestCount.value = 0
  }

  /**
   * @function handleNewRequest
   * @description 处理新的实时好友请求。
   * 将新请求添加到 `friendRequestList` 的最前面,增加未读计数,并发送桌面通知。
   * @param {object} newRequestData - 新的好友请求数据。
   * @param {object} newRequestData.requester - 请求者的用户信息(包含 username)。
   * @returns {void}
   */
  const handleNewRequest = (newRequestData) => {
    friendRequestList.value.unshift(newRequestData) // 将新请求添加到列表开头
    unreadRequestCount.value++ // 增加未读计数

    // 发送全局通知事件,提醒用户有新的好友请求
    emitter.emit('show-notification', {
      title: '新的好友请求',
      message: `用户 ${newRequestData.requester.username} 想添加你为好友`
    })
  }

  /**
   * @function addNewFriend
   * @description 将新的好友添加到本地 `friendList`。
   * 在添加前会检查好友是否已存在,避免重复。
   * @param {object} newFriend - 新添加的好友对象。
   * @returns {void}
   */
  const addNewFriend = (newFriend) => {
    // 检查好友是否已存在,避免重复添加
    if (!friendList.value.some((f) => f._id === newFriend._id)) {
      friendList.value.unshift(newFriend) // 添加到列表开头
    }
  }

  /**
   * @function deleteFriend
   * @description 根据好友 ID 从后端删除好友,并更新本地 `friendList`。
   * @param {string} friendId - 要删除的好友的 ID。
   * @returns {Promise<void>}
   * @throws {Error} 如果删除好友失败,会打印错误信息。
   */
  const deleteFriend = async (friendId) => {
    try {
      await apiDeleteFriend(friendId) // 调用 API 删除好友
      // 从本地列表中过滤掉已删除的好友
      friendList.value = friendList.value.filter((f) => f._id !== friendId)
      ElMessage.success('删除成功')
    } catch (error) {
      console.error(error)
    }
  }

  // --- 返回 Store 的状态和操作 ---
  return {
    friendList,
    friendRequestList,
    unreadRequestCount,
    getList,
    getIncomingRequests,
    clearUnreadRequestCount,
    handleNewRequest,
    addNewFriend,
    deleteFriend
  }
})