| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import { defineStore } from 'pinia';
- import http from '../common/request'
- import { TERMINAL_TYPE } from '../common/enums.js'
- export default defineStore('friendStore', {
- state: () => {
- return {
- friendMap: new Map(),
- timer: null
- }
- },
- actions: {
- setFriends(friends) {
- this.friendMap.clear();
- friends.forEach(f => this.friendMap.set(f.id, f))
- },
- updateFriend(friend) {
- let f = this.findFriend(friend.id);
- friend.online = f.online;
- friend.onlineWeb = f.onlineWeb;
- friend.onlineApp = f.onlineApp;
- this.friendMap.set(friend.id, friend)
- },
- removeFriend(id) {
- this.friendMap.get(id).deleted = true;
- },
- addFriend(friend) {
- this.friendMap.set(friend.id, friend)
- },
- setOnlineStatus(onlineTerminals) {
- this.friends.forEach((f) => {
- let userTerminal = onlineTerminals.find((o) => f.id == o.userId);
- if (userTerminal) {
- f.online = true;
- f.onlineWeb = userTerminal.terminals.indexOf(TERMINAL_TYPE.WEB) >= 0
- f.onlineApp = userTerminal.terminals.indexOf(TERMINAL_TYPE.APP) >= 0
- } else {
- f.online = false;
- f.onlineWeb = false;
- f.onlineApp = false;
- }
- });
- },
- refreshOnlineStatus() {
- let userIds = this.friends.filter((f) => !f.deleted).map((f) => f.id);
- if (userIds.length == 0) {
- return;
- }
- http({
- url: '/user/terminal/online?userIds=' + userIds.join(','),
- method: 'GET'
- }).then((onlineTerminals) => {
- this.setOnlineStatus(onlineTerminals);
- })
- // 30s后重新拉取
- clearTimeout(this.timer);
- this.timer = setTimeout(() => {
- this.refreshOnlineStatus();
- }, 30000)
- },
- setDnd(id, isDnd) {
- this.friendMap.get(id).isDnd = isDnd;
- },
- clear() {
- this.friendMap.clear();
- clearTimeout(this.timer);
- this.timer = null;
- },
- loadFriend() {
- return new Promise((resolve, reject) => {
- http({
- url: '/friend/list',
- method: 'GET'
- }).then((friends) => {
- this.setFriends(friends);
- this.refreshOnlineStatus();
- resolve()
- }).catch((res) => {
- reject();
- })
- });
- }
- },
- getters: {
- friends: (state) => {
- return Array.from(state.friendMap.values());
- },
- findFriend: (state) => (userId) => {
- return state.friendMap.get(userId);
- },
- isFriend: (state) => (userId) => {
- let f = state.findFriend(userId)
- return f && !f.deleted
- }
- }
- })
|