This commit is contained in:
pa
2026-03-26 17:41:45 +09:00
parent 62a54922e7
commit c504c71191
8 changed files with 64 additions and 61 deletions

View File

@@ -218,7 +218,8 @@ export function updateFriendship(ref) {
previousDisplayName: ctx.displayName,
friendNumber: ref.$friendNumber
};
friendLogTable.value.data.push(friendLogHistoryDisplayName);
// Sentry: VRCX-WEB-2A7
friendLogTable.value?.data.push(friendLogHistoryDisplayName);
database.addFriendLogHistory(friendLogHistoryDisplayName);
notificationStore.queueFriendLogNoty(friendLogHistoryDisplayName);
sharedFeedStore.addEntry(friendLogHistoryDisplayName);

View File

@@ -577,7 +577,6 @@ async function handleUserUpdate(ref, props) {
export async function refreshUserDialogAvatars(fileId) {
const userStore = useUserStore();
const avatarStore = useAvatarStore();
const t = i18n.global.t;
const D = userStore.userDialog;
const userId = D.id;

View File

@@ -570,7 +570,7 @@
"context_menu": {
"view_details": "View Details",
"hide_friend": "Hide from Graph",
"refresh_mutuals": "Refresh Their Mutuals",
"refresh_mutuals": "Refresh Mutuals",
"confirm_non_friend_title": "Not a Friend",
"confirm_non_friend_message": "This user is no longer your friend. Do you still want to fetch their mutual friends data?",
"refresh_success": "Mutual friends data updated for {name}",

View File

@@ -945,6 +945,8 @@
if (!sigmaInstance) {
sigmaInstance = new Sigma(graph, container, {
// Sentry: VRCX-WEB-2EG
allowInvalidContainer: true,
renderLabels: true,
labelRenderedSizeThreshold: DEFAULT_LABEL_THRESHOLD,
labelColor: { color: labelColor },

View File

@@ -1,51 +1,48 @@
<template>
<UserContextMenu
:user-id="friend.id"
:state="friend.state"
:location="friend.ref?.location">
<Card
class="friend-card x-hover-card hover:bg-muted relative"
:style="cardStyle"
@click="showUserDialog(friend.id)">
<div class="friend-card__header grid items-center mb-1.75">
<div>
<Avatar :style="{ width: `${avatarSize}px`, height: `${avatarSize}px` }">
<AvatarImage :src="userImage(friend.ref, true)" />
<AvatarFallback>
<User class="text-muted-foreground" :size="Math.max(16, 20 * cardScale)" />
</AvatarFallback>
</Avatar>
</div>
<span
class="friend-card__status-dot absolute rounded-full pointer-events-none"
:class="statusDotClass"></span>
<div
class="friend-card__name font-semibold leading-[1.3] overflow-hidden text-ellipsis whitespace-nowrap ml-2"
:title="friend.name">
{{ friend.name }}
</div>
<UserContextMenu :user-id="friend.id" :state="friend.state" :location="friend.ref?.location">
<Card
class="friend-card x-hover-card hover:bg-muted relative"
:style="cardStyle"
@click="showUserDialog(friend.id)">
<div class="friend-card__header grid items-center mb-1.75">
<div>
<Avatar :style="{ width: `${avatarSize}px`, height: `${avatarSize}px` }">
<AvatarImage :src="userImage(friend.ref, true)" />
<AvatarFallback>
<User class="text-muted-foreground" :size="Math.max(16, 20 * cardScale)" />
</AvatarFallback>
</Avatar>
</div>
<div class="friend-card__body grid">
<div
class="friend-card__signature flex items-center overflow-hidden text-ellipsis whitespace-nowrap text-muted-foreground"
:title="friend.ref?.statusDescription">
<Pencil v-if="friend.ref?.statusDescription" class="h-3.5 w-3.5 mr-0.5" style="opacity: 0.7" />
{{ friend.ref?.statusDescription || '&nbsp;' }}
</div>
<div
v-if="displayInstanceInfo"
@click.stop
class="friend-card__world flex items-center justify-start box-border max-w-full min-w-0 overflow-hidden"
:title="friend.worldName">
<Location
class="friend-card__location flex w-full overflow-hidden leading-[1.3] wrap-break-word text-center"
:location="friend.ref?.location"
:traveling="friend.ref?.travelingToLocation"
enable-context-menu
link />
</div>
<span
class="friend-card__status-dot absolute rounded-full pointer-events-none"
:class="statusDotClass"></span>
<div
class="friend-card__name font-semibold leading-[1.3] overflow-hidden text-ellipsis whitespace-nowrap ml-2"
:title="friend.name">
{{ friend.name }}
</div>
</Card>
</div>
<div class="friend-card__body grid">
<div
class="friend-card__signature flex items-center overflow-hidden text-ellipsis whitespace-nowrap text-muted-foreground"
:title="friend.ref?.statusDescription">
<Pencil v-if="friend.ref?.statusDescription" class="h-3.5 w-3.5 mr-0.5" style="opacity: 0.7" />
{{ friend.ref?.statusDescription || '&nbsp;' }}
</div>
<div
v-if="displayInstanceInfo"
@click.stop
class="friend-card__world flex items-center justify-start box-border max-w-full min-w-0 overflow-hidden"
:title="friend.worldName">
<Location
class="friend-card__location flex w-full overflow-hidden leading-[1.3] wrap-break-word text-center"
:location="friend.ref?.location"
:traveling="friend.ref?.travelingToLocation"
enable-context-menu
link />
</div>
</div>
</Card>
</UserContextMenu>
</template>
@@ -92,18 +89,17 @@
paddingBottom: `${36 * props.cardScale * props.cardSpacing}px !important`
}));
const statusDotClass = computed(() => {
const status = userStatusClass(props.friend.ref, props.friend.pendingOffline);
if (status.joinme) {
if (status?.joinme) {
return 'friend-card__status-dot--join';
}
if (status.online) {
if (status?.online) {
return 'friend-card__status-dot--online';
}
// sometimes appearing and sometimes disappearing
if (status.active) {
if (status?.active) {
const friendStatus = props.friend.status;
if (friendStatus === 'join me') {
return 'friend-card__status-dot--active-join';
@@ -116,13 +112,13 @@
}
return 'friend-card__status-dot--active';
}
if (status.askme) {
if (status?.askme) {
return 'friend-card__status-dot--ask';
}
if (status.busy) {
if (status?.busy) {
return 'friend-card__status-dot--busy';
}
if (status.offline) {
if (status?.offline) {
return 'friend-card__status-dot--offline';
}

View File

@@ -72,15 +72,17 @@ export const createColumns = ({
const { isGameRunning } = storeToRefs(useGameStore());
const { isNotificationExpired } = useNotificationStore();
const { cachedInstances } = storeToRefs(useInstanceStore());
const { cachedInstances } = useInstanceStore();
const canInvite = () => {
const location = lastLocation.value?.location;
return (
Boolean(location) && isGameRunning.value && checkCanInvite(location, {
Boolean(location) &&
isGameRunning.value &&
checkCanInvite(location, {
currentUserId: currentUser.value?.id,
lastLocationStr: lastLocation.value?.location,
cachedInstances: cachedInstances.value
cachedInstances: cachedInstances
})
);
};

View File

@@ -109,12 +109,13 @@
import { groupRequest } from '../../../api';
import { processBulk } from '../../../services/request';
import { useGroupStore } from '../../../stores';
import { showGroupDialog } from '@/coordinators/groupCoordinator';
import GroupCalendarEventCard from '../components/GroupCalendarEventCard.vue';
import GroupCalendarMonth from '../components/GroupCalendarMonth.vue';
import configRepository from '../../../services/config';
const { applyGroupEvent, showGroupDialog } = useGroupStore();
const { applyGroupEvent } = useGroupStore();
const { t } = useI18n();

View File

@@ -126,7 +126,9 @@ export default defineConfig(({ mode }) => {
},
sourcemaps: {
assets: './build/html/**',
filesToDeleteAfterUpload: './build/html/**/*.js.map'
filesToDeleteAfterUpload:
'./build/html/**/*.js.map',
ignore: []
}
})
)
@@ -179,7 +181,7 @@ export default defineConfig(({ mode }) => {
copyPublicDir: true,
reportCompressedSize: false,
chunkSizeWarningLimit: 5000,
sourcemap: buildAndUploadSourceMaps,
sourcemap: buildAndUploadSourceMaps ? 'hidden' : false,
assetsInlineLimit(filePath) {
if (isFont(filePath)) return 0;
return 40960;