refactor store

This commit is contained in:
pa
2026-03-10 17:19:03 +09:00
parent 95c4a1d3e6
commit 1cbad7fb60
39 changed files with 1290 additions and 2366 deletions
+9 -297
View File
@@ -1,22 +1,17 @@
import { computed, reactive, ref, watch } from 'vue';
import { defineStore } from 'pinia';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
import { i18n } from '../plugin/i18n';
import {
compareByCreatedAtAscending,
createRateLimiter,
executeWithBackoff,
getFriendsSortFunction,
getNameColour,
getUserMemo,
isRealInstance
} from '../shared/utils';
import { friendRequest, userRequest } from '../api';
import {
runDeleteFriendshipFlow,
runUpdateFriendshipsFlow
} from '../coordinators/friendRelationshipCoordinator';
import {
runInitFriendsListFlow,
runRefreshFriendsListFlow
@@ -25,6 +20,10 @@ import {
runPendingOfflineTickFlow,
runUpdateFriendFlow
} from '../coordinators/friendPresenceCoordinator';
import {
updateFriendship,
runUpdateFriendshipsFlow
} from '../coordinators/friendRelationshipCoordinator';
import { applyUser } from '../coordinators/userCoordinator';
import { AppDebug } from '../service/appConfig';
import { database } from '../service/database';
@@ -33,10 +32,6 @@ import { useFavoriteStore } from './favorite';
import { useGeneralSettingsStore } from './settings/general';
import { useGroupStore } from './group';
import { useLocationStore } from './location';
import { useModalStore } from './modal';
import { useNotificationStore } from './notification';
import { useSharedFeedStore } from './sharedFeed';
import { useUiStore } from './ui';
import { useUserStore } from './user';
import { watchState } from '../service/watchState';
@@ -48,16 +43,12 @@ export const useFriendStore = defineStore('Friend', () => {
const appearanceSettingsStore = useAppearanceSettingsStore();
const generalSettingsStore = useGeneralSettingsStore();
const userStore = useUserStore();
const notificationStore = useNotificationStore();
const uiStore = useUiStore();
const groupStore = useGroupStore();
const sharedFeedStore = useSharedFeedStore();
const locationStore = useLocationStore();
const favoriteStore = useFavoriteStore();
const modalStore = useModalStore();
const { t } = useI18n();
const router = useRouter();
const t = i18n.global.t;
const state = reactive({
friendNumber: 0
@@ -236,7 +227,7 @@ export const useFriendStore = defineStore('Friend', () => {
onlineFriendCount.value = 0;
pendingOfflineMap.clear();
if (isLoggedIn) {
runInitFriendsListFlow(t);
runInitFriendsListFlow(i18n.global.t);
pendingOfflineWorkerFunction();
} else {
if (pendingOfflineWorker !== null) {
@@ -270,94 +261,7 @@ export const useFriendStore = defineStore('Friend', () => {
init();
/**
*
* @param ref
*/
function updateUserCurrentStatus(ref) {
if (watchState.isFriendsLoaded) {
refreshFriendsStatus(ref);
}
updateOnlineFriendCounter();
if (appearanceSettingsStore.randomUserColours) {
getNameColour(userStore.currentUser.id).then((colour) => {
userStore.setCurrentUserColour(colour);
});
}
}
/**
*
* @param args
*/
function handleFriendStatus(args) {
const D = userStore.userDialog;
if (D.visible === false || D.id !== args.params.userId) {
return;
}
const { json } = args;
D.isFriend = json.isFriend;
D.incomingRequest = json.incomingRequest;
D.outgoingRequest = json.outgoingRequest;
}
/**
*
* @param args
*/
function handleFriendDelete(args) {
const D = userStore.userDialog;
if (D.visible === false || D.id !== args.params.userId) {
return;
}
D.isFriend = false;
runDeleteFriendshipFlow(args.params.userId);
deleteFriend(args.params.userId);
}
/**
*
* @param args
*/
function handleFriendAdd(args) {
addFriendship(args.params.userId);
addFriend(args.params.userId);
}
/**
*
* @param ref
*/
function userOnFriend(ref) {
updateFriendship(ref);
if (
watchState.isFriendsLoaded &&
ref.isFriend &&
!friendLog.has(ref.id) &&
ref.id !== userStore.currentUser.id
) {
addFriendship(ref.id);
}
}
/**
*
* @param {string} userId
* @returns {*|string}
*/
function getFriendRequest(userId) {
const array = notificationStore.notificationTable.data;
for (let i = array.length - 1; i >= 0; i--) {
if (
array[i].type === 'friendRequest' &&
array[i].senderUserId === userId
) {
return array[i].id;
}
}
return '';
}
/**
*
@@ -794,183 +698,13 @@ export const useFriendStore = defineStore('Friend', () => {
*
* @param {string} id
*/
function addFriendship(id) {
if (
!watchState.isFriendsLoaded ||
friendLog.has(id) ||
id === userStore.currentUser.id
) {
return;
}
const ref = userStore.cachedUsers.get(id);
if (typeof ref === 'undefined') {
// deleted account on friends list
return;
}
friendRequest
.getFriendStatus({
userId: id,
currentUserId: userStore.currentUser.id
})
.then((args) => {
if (args.params.currentUserId !== userStore.currentUser.id) {
// safety check for delayed response
return;
}
handleFriendStatus(args);
if (args.json.isFriend && !friendLog.has(id)) {
if (state.friendNumber === 0) {
state.friendNumber = friends.size;
}
ref.$friendNumber = ++state.friendNumber;
configRepository.setInt(
`VRCX_friendNumber_${userStore.currentUser.id}`,
state.friendNumber
);
addFriend(id, ref.state);
const friendLogHistory = {
created_at: new Date().toJSON(),
type: 'Friend',
userId: id,
displayName: ref.displayName,
friendNumber: ref.$friendNumber
};
friendLogTable.value.data.push(friendLogHistory);
database.addFriendLogHistory(friendLogHistory);
notificationStore.queueFriendLogNoty(friendLogHistory);
sharedFeedStore.addEntry(friendLogHistory);
const friendLogCurrent = {
userId: id,
displayName: ref.displayName,
trustLevel: ref.$trustLevel,
friendNumber: ref.$friendNumber
};
friendLog.set(id, friendLogCurrent);
database.setFriendLogCurrent(friendLogCurrent);
uiStore.notifyMenu('friend-log');
deleteFriendRequest(id);
userRequest
.getUser({
userId: id
})
.then(() => {
if (
userStore.userDialog.visible &&
id === userStore.userDialog.id
) {
userStore.applyUserDialogLocation(true);
}
});
}
});
}
/**
*
* @param {string} userId
*/
function deleteFriendRequest(userId) {
const array = notificationStore.notificationTable.data;
for (let i = array.length - 1; i >= 0; i--) {
if (
array[i].type === 'friendRequest' &&
array[i].senderUserId === userId
) {
array.splice(i, 1);
return;
}
}
}
/**
*
* @param {object} ref
*/
function updateFriendship(ref) {
const ctx = friendLog.get(ref.id);
if (!watchState.isFriendsLoaded || typeof ctx === 'undefined') {
return;
}
if (ctx.friendNumber) {
ref.$friendNumber = ctx.friendNumber;
}
if (!ref.$friendNumber) {
ref.$friendNumber = 0; // no null
}
if (ctx.displayName !== ref.displayName) {
if (ctx.displayName) {
const friendLogHistoryDisplayName = {
created_at: new Date().toJSON(),
type: 'DisplayName',
userId: ref.id,
displayName: ref.displayName,
previousDisplayName: ctx.displayName,
friendNumber: ref.$friendNumber
};
friendLogTable.value.data.push(friendLogHistoryDisplayName);
database.addFriendLogHistory(friendLogHistoryDisplayName);
notificationStore.queueFriendLogNoty(
friendLogHistoryDisplayName
);
sharedFeedStore.addEntry(friendLogHistoryDisplayName);
const friendLogCurrent = {
userId: ref.id,
displayName: ref.displayName,
trustLevel: ref.$trustLevel,
friendNumber: ref.$friendNumber
};
friendLog.set(ref.id, friendLogCurrent);
database.setFriendLogCurrent(friendLogCurrent);
ctx.displayName = ref.displayName;
uiStore.notifyMenu('friend-log');
}
}
if (
ref.$trustLevel &&
ctx.trustLevel &&
ctx.trustLevel !== ref.$trustLevel
) {
if (
(ctx.trustLevel === 'Trusted User' &&
ref.$trustLevel === 'Veteran User') ||
(ctx.trustLevel === 'Veteran User' &&
ref.$trustLevel === 'Trusted User')
) {
const friendLogCurrent3 = {
userId: ref.id,
displayName: ref.displayName,
trustLevel: ref.$trustLevel,
friendNumber: ref.$friendNumber
};
friendLog.set(ref.id, friendLogCurrent3);
database.setFriendLogCurrent(friendLogCurrent3);
return;
}
const friendLogHistoryTrustLevel = {
created_at: new Date().toJSON(),
type: 'TrustLevel',
userId: ref.id,
displayName: ref.displayName,
trustLevel: ref.$trustLevel,
previousTrustLevel: ctx.trustLevel,
friendNumber: ref.$friendNumber
};
friendLogTable.value.data.push(friendLogHistoryTrustLevel);
database.addFriendLogHistory(friendLogHistoryTrustLevel);
notificationStore.queueFriendLogNoty(friendLogHistoryTrustLevel);
sharedFeedStore.addEntry(friendLogHistoryTrustLevel);
const friendLogCurrent2 = {
userId: ref.id,
displayName: ref.displayName,
trustLevel: ref.$trustLevel,
friendNumber: ref.$friendNumber
};
friendLog.set(ref.id, friendLogCurrent2);
database.setFriendLogCurrent(friendLogCurrent2);
uiStore.notifyMenu('friend-log');
}
ctx.trustLevel = ref.$trustLevel;
}
/**
*
@@ -1394,21 +1128,7 @@ export const useFriendStore = defineStore('Friend', () => {
*
* @param id
*/
function confirmDeleteFriend(id) {
modalStore
.confirm({
description: t('confirm.unfriend'),
title: t('confirm.title')
})
.then(async ({ ok }) => {
if (!ok) return;
const args = await friendRequest.deleteFriend({
userId: id
});
handleFriendDelete(args);
})
.catch(() => {});
}
/**
* Clears all entries in friendLog.
@@ -1452,14 +1172,6 @@ export const useFriendStore = defineStore('Friend', () => {
initFriendLog,
migrateFriendLog,
getFriendLog,
getFriendRequest,
userOnFriend,
confirmDeleteFriend,
updateUserCurrentStatus,
handleFriendAdd,
handleFriendDelete,
handleFriendStatus,
addFriendship,
tryApplyFriendOrder,
resetFriendLog,
initFriendLogHistoryTable