refactor: store state

This commit is contained in:
pa
2025-10-11 15:30:44 +09:00
committed by Natsumi
parent 1e18d89b61
commit 86f7847c46
31 changed files with 2719 additions and 4029 deletions
+113 -153
View File
@@ -1,5 +1,5 @@
import { defineStore } from 'pinia';
import { computed, reactive, watch } from 'vue';
import { ref, computed, reactive, watch } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import * as workerTimers from 'worker-timers';
import { friendRequest, userRequest } from '../api';
@@ -45,79 +45,56 @@ export const useFriendStore = defineStore('Friend', () => {
const { t } = useI18n();
const state = reactive({
friends: new Map(),
localFavoriteFriends: new Set(),
isRefreshFriendsLoading: false,
onlineFriendCount: 0,
friendLogTable: {
data: [],
filters: [
{
prop: 'type',
value: [],
filterFn: (row, filter) =>
filter.value.some((v) => v === row.type)
},
{
prop: 'displayName',
value: ''
},
{
prop: 'type',
value: false,
filterFn: (row, filter) =>
!(filter.value && row.type === 'Unfriend')
}
],
tableProps: {
stripe: true,
size: 'small',
defaultSort: {
prop: 'created_at',
order: 'descending'
}
},
pageSize: 15,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
pageSizes: [10, 15, 20, 25, 50, 100]
}
},
friendNumber: 0
});
let friendLog = new Map();
const friends = computed({
get() {
return state.friends;
const friends = ref(new Map());
const localFavoriteFriends = ref(new Set());
const isRefreshFriendsLoading = ref(false);
const onlineFriendCount = ref(0);
const friendLogTable = ref({
data: [],
filters: [
{
prop: 'type',
value: [],
filterFn: (row, filter) =>
filter.value.some((v) => v === row.type)
},
{
prop: 'displayName',
value: ''
},
{
prop: 'type',
value: false,
filterFn: (row, filter) =>
!(filter.value && row.type === 'Unfriend')
}
],
tableProps: {
stripe: true,
size: 'small',
defaultSort: {
prop: 'created_at',
order: 'descending'
}
},
set(value) {
state.friends = value;
pageSize: 15,
paginationProps: {
small: true,
layout: 'sizes,prev,pager,next,total',
pageSizes: [10, 15, 20, 25, 50, 100]
}
});
const localFavoriteFriends = computed({
get() {
return state.localFavoriteFriends;
},
set(value) {
state.localFavoriteFriends = value;
}
});
async function init() {
const friendLogTableFiltersValue = JSON.parse(
await configRepository.getString('VRCX_friendLogTableFilters', '[]')
);
state.friendLogTable.filters[0].value = friendLogTableFiltersValue;
}
init();
const vipFriends = computed(() => {
return Array.from(state.friends.values())
return Array.from(friends.value.values())
.filter((f) => f.state === 'online' && f.isVIP)
.sort(
getFriendsSortFunction(
@@ -127,7 +104,7 @@ export const useFriendStore = defineStore('Friend', () => {
});
const onlineFriends = computed(() => {
return Array.from(state.friends.values())
return Array.from(friends.value.values())
.filter((f) => f.state === 'online' && !f.isVIP)
.sort(
getFriendsSortFunction(
@@ -137,7 +114,7 @@ export const useFriendStore = defineStore('Friend', () => {
});
const activeFriends = computed(() => {
return Array.from(state.friends.values())
return Array.from(friends.value.values())
.filter((f) => f.state === 'active')
.sort(
getFriendsSortFunction(
@@ -147,7 +124,7 @@ export const useFriendStore = defineStore('Friend', () => {
});
const offlineFriends = computed(() => {
return Array.from(state.friends.values())
return Array.from(friends.value.values())
.filter((f) => f.state === 'offline' || !f.state)
.sort(
getFriendsSortFunction(
@@ -156,41 +133,15 @@ export const useFriendStore = defineStore('Friend', () => {
);
});
const isRefreshFriendsLoading = computed({
get() {
return state.isRefreshFriendsLoading;
},
set(value) {
state.isRefreshFriendsLoading = value;
}
});
const onlineFriendCount = computed({
get() {
return state.onlineFriendCount;
},
set(value) {
state.onlineFriendCount = value;
}
});
const friendLogTable = computed({
get() {
return state.friendLogTable;
},
set(value) {
state.friendLogTable = value;
}
});
watch(
() => watchState.isLoggedIn,
(isLoggedIn) => {
state.friends.clear();
friends.value.clear();
state.friendNumber = 0;
friendLog.clear();
state.friendLogTable.data = [];
friendLogTable.value.data = [];
groupStore.groupInstances = [];
state.onlineFriendCount = 0;
onlineFriendCount.value = 0;
if (isLoggedIn) {
initFriendsList();
}
@@ -208,6 +159,15 @@ export const useFriendStore = defineStore('Friend', () => {
{ flush: 'sync' }
);
async function init() {
const friendLogTableFiltersValue = JSON.parse(
await configRepository.getString('VRCX_friendLogTableFilters', '[]')
);
friendLogTable.value.filters[0].value = friendLogTableFiltersValue;
}
init();
function updateUserCurrentStatus(ref) {
if (watchState.isFriendsLoaded) {
refreshFriendsStatus(ref);
@@ -280,7 +240,7 @@ export const useFriendStore = defineStore('Friend', () => {
function updateLocalFavoriteFriends() {
const favoriteStore = useFavoriteStore();
const { cachedFavorites } = favoriteStore;
state.localFavoriteFriends.clear();
localFavoriteFriends.value.clear();
for (const ref of cachedFavorites.values()) {
if (
!ref.$isDeleted &&
@@ -291,15 +251,15 @@ export const useFriendStore = defineStore('Friend', () => {
generalSettingsStore.localFavoriteFriendsGroups.length ===
0)
) {
state.localFavoriteFriends.add(ref.favoriteId);
localFavoriteFriends.value.add(ref.favoriteId);
}
}
updateSidebarFriendsList();
}
function updateSidebarFriendsList() {
for (const ctx of state.friends.values()) {
const isVIP = state.localFavoriteFriends.has(ctx.id);
for (const ctx of friends.value.values()) {
const isVIP = localFavoriteFriends.value.has(ctx.id);
if (ctx.isVIP === isVIP) {
continue;
}
@@ -314,7 +274,7 @@ export const useFriendStore = defineStore('Friend', () => {
* @param {string?} stateInput
*/
function updateFriend(id, stateInput = undefined) {
const ctx = state.friends.get(id);
const ctx = friends.value.get(id);
if (typeof ctx === 'undefined') {
return;
}
@@ -333,7 +293,7 @@ export const useFriendStore = defineStore('Friend', () => {
ctx.pendingOffline = false;
ctx.pendingOfflineTime = '';
}
const isVIP = state.localFavoriteFriends.has(id);
const isVIP = localFavoriteFriends.value.has(id);
let location = '';
let $location_at = undefined;
if (typeof ref !== 'undefined') {
@@ -478,11 +438,11 @@ export const useFriendStore = defineStore('Friend', () => {
);
}
}
if (!state.friends.has(id)) {
if (!friends.value.has(id)) {
console.log('Friend not found', id);
return;
}
const isVIP = state.localFavoriteFriends.has(id);
const isVIP = localFavoriteFriends.value.has(id);
const ref = ctx.ref;
if (ctx.state !== newState && typeof ctx.ref !== 'undefined') {
if (
@@ -554,11 +514,11 @@ export const useFriendStore = defineStore('Friend', () => {
* @param {string} id
*/
function deleteFriend(id) {
const ctx = state.friends.get(id);
const ctx = friends.value.get(id);
if (typeof ctx === 'undefined') {
return;
}
state.friends.delete(id);
friends.value.delete(id);
}
/**
@@ -582,13 +542,13 @@ export const useFriendStore = defineStore('Friend', () => {
}
for (const friend of map) {
const [id, state_input] = friend;
if (state.friends.has(id)) {
if (friends.value.has(id)) {
updateFriend(id, state_input);
} else {
addFriend(id, state_input);
}
}
for (id of state.friends.keys()) {
for (id of friends.value.keys()) {
if (map.has(id) === false) {
deleteFriend(id);
}
@@ -600,11 +560,11 @@ export const useFriendStore = defineStore('Friend', () => {
* @param {string?} state_input
*/
function addFriend(id, state_input = undefined) {
if (state.friends.has(id)) {
if (friends.value.has(id)) {
return;
}
const ref = userStore.cachedUsers.get(id);
const isVIP = state.localFavoriteFriends.has(id);
const isVIP = localFavoriteFriends.value.has(id);
let name = '';
const friend = friendLog.get(id);
if (friend) {
@@ -642,7 +602,7 @@ export const useFriendStore = defineStore('Friend', () => {
} else {
ctx.name = ref.name;
}
state.friends.set(id, ctx);
friends.value.set(id, ctx);
}
/**
@@ -650,7 +610,7 @@ export const useFriendStore = defineStore('Friend', () => {
* @returns {Promise<*[]>}
*/
async function refreshFriends() {
state.isRefreshFriendsLoading = true;
isRefreshFriendsLoading.value = true;
try {
const onlineFriends = await bulkRefreshFriends({
offline: false
@@ -664,10 +624,10 @@ export const useFriendStore = defineStore('Friend', () => {
friends = await refreshRemainingFriends(friends);
}
state.isRefreshFriendsLoading = false;
isRefreshFriendsLoading.value = false;
return friends;
} catch (err) {
state.isRefreshFriendsLoading = false;
isRefreshFriendsLoading.value = false;
throw err;
}
}
@@ -755,13 +715,13 @@ export const useFriendStore = defineStore('Friend', () => {
}
/**
* @param {Array} friends
* @param {Array} friendsArray
* @returns {Promise<*>}
*/
async function refetchBrokenFriends(friends) {
async function refetchBrokenFriends(friendsArray) {
// attempt to fix broken data from bulk friend fetch
for (let i = 0; i < friends.length; i++) {
const friend = friends[i];
for (let i = 0; i < friendsArray.length; i++) {
const friend = friendsArray[i];
try {
// we don't update friend state here, it's not reliable
let state_input = 'offline';
@@ -770,7 +730,7 @@ export const useFriendStore = defineStore('Friend', () => {
} else if (friend.platform) {
state_input = 'online';
}
const ref = state.friends.get(friend.id);
const ref = friends.value.get(friend.id);
if (ref?.state !== state_input) {
if (AppDebug.debugFriendState) {
console.log(
@@ -781,7 +741,7 @@ export const useFriendStore = defineStore('Friend', () => {
const args = await userRequest.getUser({
userId: friend.id
});
friends[i] = args.json;
friendsArray[i] = args.json;
} else if (friend.location === 'traveling') {
if (AppDebug.debugFriendState) {
console.log(
@@ -792,13 +752,13 @@ export const useFriendStore = defineStore('Friend', () => {
const args = await userRequest.getUser({
userId: friend.id
});
friends[i] = args.json;
friendsArray[i] = args.json;
}
} catch (err) {
console.error(err);
}
}
return friends;
return friendsArray;
}
/**
@@ -838,14 +798,14 @@ export const useFriendStore = defineStore('Friend', () => {
}
function updateOnlineFriendCoutner() {
const onlineFriendCount =
const onlineFriendCounts =
vipFriends.value.length + onlineFriends.value.length;
if (onlineFriendCount !== state.onlineFriendCount) {
if (onlineFriendCounts !== onlineFriendCount.value) {
AppApi.ExecuteVrFeedFunction(
'updateOnlineFriendCount',
`${onlineFriendCount}`
`${onlineFriendCounts}`
);
state.onlineFriendCount = onlineFriendCount;
onlineFriendCount.value = onlineFriendCounts;
}
}
@@ -854,7 +814,7 @@ export const useFriendStore = defineStore('Friend', () => {
let item;
const userIds = [];
const displayNames = [];
for (const ctx of state.friends.values()) {
for (const ctx of friends.value.values()) {
userIds.push(ctx.id);
if (ctx.ref?.displayName) {
displayNames.push(ctx.ref.displayName);
@@ -872,7 +832,7 @@ export const useFriendStore = defineStore('Friend', () => {
}
}
for (const ref of state.friends.values()) {
for (const ref of friends.value.values()) {
if (ref?.ref?.id && ref.ref.displayName) {
friendsByDisplayName.set(ref.ref.displayName, ref.id);
}
@@ -909,7 +869,7 @@ export const useFriendStore = defineStore('Friend', () => {
friendListMap.set(item.userId, friend);
}
for (item of friendListMap.values()) {
ref = state.friends.get(item.userId);
ref = friends.value.get(item.userId);
if (ref?.ref) {
ref.ref.$joinCount = item.joinCount;
ref.ref.$lastSeen = item.lastSeen;
@@ -948,7 +908,7 @@ export const useFriendStore = defineStore('Friend', () => {
handleFriendStatus(args);
if (args.json.isFriend && !friendLog.has(id)) {
if (state.friendNumber === 0) {
state.friendNumber = state.friends.size;
state.friendNumber = friends.value.size;
}
ref.$friendNumber = ++state.friendNumber;
configRepository.setInt(
@@ -963,7 +923,7 @@ export const useFriendStore = defineStore('Friend', () => {
displayName: ref.displayName,
friendNumber: ref.$friendNumber
};
state.friendLogTable.data.push(friendLogHistory);
friendLogTable.value.data.push(friendLogHistory);
database.addFriendLogHistory(friendLogHistory);
notificationStore.queueFriendLogNoty(friendLogHistory);
const friendLogCurrent = {
@@ -1037,7 +997,7 @@ export const useFriendStore = defineStore('Friend', () => {
userId: id,
displayName: ctx.displayName || id
};
state.friendLogTable.data.push(friendLogHistory);
friendLogTable.value.data.push(friendLogHistory);
database.addFriendLogHistory(friendLogHistory);
notificationStore.queueFriendLogNoty(friendLogHistory);
friendLog.delete(id);
@@ -1097,7 +1057,7 @@ export const useFriendStore = defineStore('Friend', () => {
previousDisplayName: ctx.displayName,
friendNumber: ref.$friendNumber
};
state.friendLogTable.data.push(friendLogHistoryDisplayName);
friendLogTable.value.data.push(friendLogHistoryDisplayName);
database.addFriendLogHistory(friendLogHistoryDisplayName);
notificationStore.queueFriendLogNoty(
friendLogHistoryDisplayName
@@ -1145,7 +1105,7 @@ export const useFriendStore = defineStore('Friend', () => {
previousTrustLevel: ctx.trustLevel,
friendNumber: ref.$friendNumber
};
state.friendLogTable.data.push(friendLogHistoryTrustLevel);
friendLogTable.value.data.push(friendLogHistoryTrustLevel);
database.addFriendLogHistory(friendLogHistoryTrustLevel);
notificationStore.queueFriendLogNoty(friendLogHistoryTrustLevel);
const friendLogCurrent2 = {
@@ -1195,10 +1155,10 @@ export const useFriendStore = defineStore('Friend', () => {
async function migrateFriendLog(userId) {
VRCXStorage.Remove(`${userId}_friendLogUpdatedAt`);
VRCXStorage.Remove(`${userId}_friendLog`);
state.friendLogTable.data = await VRCXStorage.GetArray(
friendLogTable.value.data = await VRCXStorage.GetArray(
`${userId}_friendLogTable`
);
database.addFriendLogHistoryArray(state.friendLogTable.data);
database.addFriendLogHistoryArray(friendLogTable.value.data);
VRCXStorage.Remove(`${userId}_friendLogTable`);
await configRepository.setBool(`friendLogInit_${userId}`, true);
}
@@ -1241,7 +1201,7 @@ export const useFriendStore = defineStore('Friend', () => {
}
async function initFriendLogHistoryTable() {
state.friendLogTable.data = await database.getFriendLogHistory();
friendLogTable.value.data = await database.getFriendLogHistory();
}
/**
@@ -1257,7 +1217,7 @@ export const useFriendStore = defineStore('Friend', () => {
ref.friendNumber = friendNumber;
friendLog.set(ref.userId, ref);
database.setFriendLogCurrent(ref);
const friendRef = state.friends.get(userId);
const friendRef = friends.value.get(userId);
if (friendRef?.ref) {
friendRef.ref.$friendNumber = friendNumber;
}
@@ -1285,7 +1245,7 @@ export const useFriendStore = defineStore('Friend', () => {
setFriendNumber(state.friendNumber, userId);
}
if (state.friendNumber === 0) {
state.friendNumber = state.friends.size;
state.friendNumber = friends.value.size;
}
console.log('Applied friend order from API', state.friendNumber);
await configRepository.setInt(
@@ -1398,7 +1358,7 @@ export const useFriendStore = defineStore('Friend', () => {
}
function applyFriendLogFriendOrderInReverse() {
state.friendNumber = state.friends.size + 1;
state.friendNumber = friends.value.size + 1;
const friendLogTable = getFriendLogFriendOrder();
for (let i = friendLogTable.length - 1; i > -1; i--) {
const friendLogEntry = friendLogTable[i];
@@ -1412,23 +1372,23 @@ export const useFriendStore = defineStore('Friend', () => {
ref.friendNumber = --state.friendNumber;
friendLog.set(ref.userId, ref);
database.setFriendLogCurrent(ref);
const friendRef = state.friends.get(friendLogEntry.id);
const friendRef = friends.value.get(friendLogEntry.id);
if (friendRef?.ref) {
friendRef.ref.$friendNumber = ref.friendNumber;
}
}
state.friendNumber = state.friends.size;
state.friendNumber = friends.value.size;
console.log('Applied friend order from friendLog');
}
function getFriendLogFriendOrder() {
const friendLogTable = [];
for (let i = 0; i < state.friendLogTable.data.length; i++) {
const ref = state.friendLogTable.data[i];
const result = [];
for (let i = 0; i < friendLogTable.value.data.length; i++) {
const ref = friendLogTable.value.data[i];
if (ref.type !== 'Friend') {
continue;
}
if (friendLogTable.findIndex((x) => x.id === ref.userId) !== -1) {
if (result.findIndex((x) => x.id === ref.userId) !== -1) {
// console.log(
// 'ignoring duplicate friend',
// ref.displayName,
@@ -1436,14 +1396,14 @@ export const useFriendStore = defineStore('Friend', () => {
// );
continue;
}
friendLogTable.push({
result.push({
id: ref.userId,
displayName: ref.displayName,
created_at: ref.created_at
});
}
friendLogTable.sort(compareByCreatedAtAscending);
return friendLogTable;
result.sort(compareByCreatedAtAscending);
return result;
}
function parseFriendOrderBackup(friendLogTable, created_at, backupUserIds) {
@@ -1451,7 +1411,7 @@ export const useFriendStore = defineStore('Friend', () => {
const backupTable = [];
for (i = 0; i < backupUserIds.length; i++) {
const userId = backupUserIds[i];
const ctx = state.friends.get(userId);
const ctx = friends.value.get(userId);
if (ctx) {
backupTable.push({
id: ctx.id,
@@ -1510,7 +1470,7 @@ export const useFriendStore = defineStore('Friend', () => {
function applyFriendOrderBackup(userIdOrder) {
for (let i = 0; i < userIdOrder.length; i++) {
const userId = userIdOrder[i];
const ctx = state.friends.get(userId);
const ctx = friends.value.get(userId);
const ref = ctx?.ref;
if (!ref || ref.$friendNumber) {
continue;
@@ -1543,7 +1503,7 @@ export const useFriendStore = defineStore('Friend', () => {
ref.friendNumber = ++state.friendNumber;
friendLog.set(ref.userId, ref);
database.setFriendLogCurrent(ref);
const friendRef = state.friends.get(friendLogEntry.id);
const friendRef = friends.value.get(friendLogEntry.id);
if (friendRef?.ref) {
friendRef.ref.$friendNumber = ref.friendNumber;
}
@@ -1567,7 +1527,7 @@ export const useFriendStore = defineStore('Friend', () => {
async function initFriendsList() {
const userId = userStore.currentUser.id;
state.isRefreshFriendsLoading = true;
isRefreshFriendsLoading.value = true;
watchState.isFriendsLoaded = false;
friendLog = new Map();
initFriendLogHistoryTable();