This commit is contained in:
pa
2026-02-03 20:54:32 +09:00
parent 8decb568fe
commit 20457ff082
19 changed files with 421 additions and 435 deletions
+3 -7
View File
@@ -1,6 +1,6 @@
<script setup> <script setup>
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'; import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import { ArrowUp } from 'lucide-vue-next'; import { ArrowUp } from 'lucide-vue-next';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
@@ -122,8 +122,7 @@
<Teleport v-if="teleportTarget" :to="teleportTarget"> <Teleport v-if="teleportTarget" :to="teleportTarget">
<Transition name="back-to-top"> <Transition name="back-to-top">
<div v-if="visible" :style="wrapperStyle"> <div v-if="visible" :style="wrapperStyle">
<TooltipProvider v-if="tooltip"> <Tooltip v-if="tooltip">
<Tooltip>
<TooltipTrigger as-child> <TooltipTrigger as-child>
<Button <Button
size="icon" size="icon"
@@ -138,7 +137,6 @@
{{ tooltipText }} {{ tooltipText }}
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
<Button <Button
v-else v-else
@@ -155,8 +153,7 @@
<Transition v-else name="back-to-top"> <Transition v-else name="back-to-top">
<div v-if="visible" :style="wrapperStyle"> <div v-if="visible" :style="wrapperStyle">
<TooltipProvider v-if="tooltip"> <Tooltip v-if="tooltip">
<Tooltip>
<TooltipTrigger as-child> <TooltipTrigger as-child>
<Button <Button
size="icon" size="icon"
@@ -171,7 +168,6 @@
{{ tooltipText }} {{ tooltipText }}
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
<Button <Button
v-else v-else
+4 -1
View File
@@ -59,7 +59,7 @@ export const useFeedStore = defineStore('Feed', () => {
init(); init();
function feedSearch(row) { function feedSearch(row) {
const value = feedTable.value.search.toUpperCase(); const value = feedTable.value.search.trim().toUpperCase();
if (!value) { if (!value) {
return true; return true;
} }
@@ -140,6 +140,7 @@ export const useFeedStore = defineStore('Feed', () => {
feedTable.value.vip feedTable.value.vip
); );
feedTable.value.loading = true; feedTable.value.loading = true;
try {
let vipList = []; let vipList = [];
if (feedTable.value.vip) { if (feedTable.value.vip) {
vipList = Array.from(friendStore.localFavoriteFriends.values()); vipList = Array.from(friendStore.localFavoriteFriends.values());
@@ -158,8 +159,10 @@ export const useFeedStore = defineStore('Feed', () => {
); );
feedTableData.value = []; feedTableData.value = [];
feedTableData.value = [...feedTableData.value, ...rows]; feedTableData.value = [...feedTableData.value, ...rows];
} finally {
feedTable.value.loading = false; feedTable.value.loading = false;
} }
}
function addFeed(feed) { function addFeed(feed) {
notificationStore.queueFeedNoty(feed); notificationStore.queueFeedNoty(feed);
+4 -1
View File
@@ -397,6 +397,7 @@ export const useGameLogStore = defineStore('GameLog', () => {
gameLogTable.value.vip gameLogTable.value.vip
); );
gameLogTable.value.loading = true; gameLogTable.value.loading = true;
try {
let vipList = []; let vipList = [];
if (gameLogTable.value.vip) { if (gameLogTable.value.vip) {
vipList = Array.from(friendStore.localFavoriteFriends.values()); vipList = Array.from(friendStore.localFavoriteFriends.values());
@@ -422,8 +423,10 @@ export const useGameLogStore = defineStore('GameLog', () => {
row.isFavorite = gameLogIsFavorite(row); row.isFavorite = gameLogIsFavorite(row);
} }
gameLogTableData.value = rows; gameLogTableData.value = rows;
} finally {
gameLogTable.value.loading = false; gameLogTable.value.loading = false;
} }
}
function addGameLog(entry) { function addGameLog(entry) {
entry.isFriend = gameLogIsFriend(entry); entry.isFriend = gameLogIsFriend(entry);
@@ -475,7 +478,7 @@ export const useGameLogStore = defineStore('GameLog', () => {
} }
function gameLogSearch(row) { function gameLogSearch(row) {
const value = gameLogTable.value.search.toUpperCase(); const value = gameLogTable.value.search.trim().toUpperCase();
if (!value) { if (!value) {
return true; return true;
} }
+14 -8
View File
@@ -145,7 +145,9 @@
:model-value="group.visibility === visibility" :model-value="group.visibility === visibility"
indicator-position="right" indicator-position="right"
@select="handleVisibilitySelection(group, visibility)"> @select="handleVisibilitySelection(group, visibility)">
<span>{{ t(`view.favorite.visibility.${visibility}`) }}</span> <span>{{
t(`view.favorite.visibility.${visibility}`)
}}</span>
</DropdownMenuCheckboxItem> </DropdownMenuCheckboxItem>
</DropdownMenuSubContent> </DropdownMenuSubContent>
</DropdownMenuPortal> </DropdownMenuPortal>
@@ -536,6 +538,7 @@
import { Badge } from '../../components/ui/badge'; import { Badge } from '../../components/ui/badge';
import { Slider } from '../../components/ui/slider'; import { Slider } from '../../components/ui/slider';
import { Switch } from '../../components/ui/switch'; import { Switch } from '../../components/ui/switch';
import { debounce } from '../../shared/utils';
import { useFavoritesCardScaling } from './composables/useFavoritesCardScaling.js'; import { useFavoritesCardScaling } from './composables/useFavoritesCardScaling.js';
import AvatarExportDialog from './dialogs/AvatarExportDialog.vue'; import AvatarExportDialog from './dialogs/AvatarExportDialog.vue';
@@ -570,7 +573,6 @@
favoriteAvatarGroups, favoriteAvatarGroups,
localAvatarFavorites, localAvatarFavorites,
selectedFavoriteAvatars, selectedFavoriteAvatars,
avatarImportDialogInput,
isFavoriteLoading, isFavoriteLoading,
localAvatarFavoriteGroups localAvatarFavoriteGroups
} = storeToRefs(favoriteStore); } = storeToRefs(favoriteStore);
@@ -582,7 +584,7 @@
newLocalAvatarFavoriteGroup, newLocalAvatarFavoriteGroup,
localAvatarFavoritesList, localAvatarFavoritesList,
refreshFavorites, refreshFavorites,
getLocalWorldFavorites, getLocalAvatarFavorites,
handleFavoriteGroup, handleFavoriteGroup,
checkInvalidLocalAvatars, checkInvalidLocalAvatars,
removeInvalidLocalAvatars removeInvalidLocalAvatars
@@ -979,7 +981,7 @@
function handleGroupClick(type, key) { function handleGroupClick(type, key) {
if (hasSearchInput.value) { if (hasSearchInput.value) {
avatarFavoriteSearch.value = ''; avatarFavoriteSearch.value = '';
searchAvatarFavorites(''); doSearchAvatarFavorites('');
} }
selectGroup(type, key, { userInitiated: true }); selectGroup(type, key, { userInitiated: true });
} }
@@ -1031,7 +1033,7 @@
function handleRefreshFavorites() { function handleRefreshFavorites() {
refreshFavorites(); refreshFavorites();
getLocalWorldFavorites(); getLocalAvatarFavorites();
} }
function handleVisibilitySelection(group, visibility) { function handleVisibilitySelection(group, visibility) {
@@ -1264,7 +1266,7 @@
.catch(() => {}); .catch(() => {});
} }
function searchAvatarFavorites(value) { function doSearchAvatarFavorites(value) {
if (typeof value === 'string') { if (typeof value === 'string') {
avatarFavoriteSearch.value = value; avatarFavoriteSearch.value = value;
} }
@@ -1274,6 +1276,7 @@
return; return;
} }
const results = []; const results = [];
const seen = new Set();
localAvatarFavoriteGroups.value.forEach((group) => { localAvatarFavoriteGroups.value.forEach((group) => {
const favorites = localAvatarFavorites.value[group]; const favorites = localAvatarFavorites.value[group];
if (!favorites) { if (!favorites) {
@@ -1289,7 +1292,8 @@
return; return;
} }
if (ref.name.toLowerCase().includes(search) || ref.authorName.toLowerCase().includes(search)) { if (ref.name.toLowerCase().includes(search) || ref.authorName.toLowerCase().includes(search)) {
if (!results.some((r) => r.id === ref.id)) { if (!seen.has(ref.id)) {
seen.add(ref.id);
results.push(ref); results.push(ref);
} }
} }
@@ -1306,13 +1310,15 @@
return; return;
} }
if (ref.name.toLowerCase().includes(search) || ref.authorName.toLowerCase().includes(search)) { if (ref.name.toLowerCase().includes(search) || ref.authorName.toLowerCase().includes(search)) {
if (!results.some((r) => r.id === ref.id)) { if (!seen.has(ref.id)) {
seen.add(ref.id);
results.push(ref); results.push(ref);
} }
} }
}); });
avatarFavoriteSearchResults.value = results; avatarFavoriteSearchResults.value = results;
} }
const searchAvatarFavorites = debounce(doSearchAvatarFavorites, 200);
async function refreshLocalAvatarFavorites() { async function refreshLocalAvatarFavorites() {
if (refreshingLocalFavorites.value) { if (refreshingLocalFavorites.value) {
+7 -4
View File
@@ -148,7 +148,9 @@
:model-value="group.visibility === visibility" :model-value="group.visibility === visibility"
indicator-position="right" indicator-position="right"
@select="handleVisibilitySelection(group, visibility)"> @select="handleVisibilitySelection(group, visibility)">
<span>{{ t(`view.favorite.visibility.${visibility}`) }}</span> <span>{{
t(`view.favorite.visibility.${visibility}`)
}}</span>
</DropdownMenuCheckboxItem> </DropdownMenuCheckboxItem>
</DropdownMenuSubContent> </DropdownMenuSubContent>
</DropdownMenuPortal> </DropdownMenuPortal>
@@ -325,12 +327,12 @@
} from '../../components/ui/select'; } from '../../components/ui/select';
import { useAppearanceSettingsStore, useFavoriteStore, useModalStore, useUserStore } from '../../stores'; import { useAppearanceSettingsStore, useFavoriteStore, useModalStore, useUserStore } from '../../stores';
import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../../components/ui/resizable'; import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../../components/ui/resizable';
import { debounce, userImage } from '../../shared/utils';
import { Badge } from '../../components/ui/badge'; import { Badge } from '../../components/ui/badge';
import { Slider } from '../../components/ui/slider'; import { Slider } from '../../components/ui/slider';
import { Switch } from '../../components/ui/switch'; import { Switch } from '../../components/ui/switch';
import { favoriteRequest } from '../../api'; import { favoriteRequest } from '../../api';
import { useFavoritesCardScaling } from './composables/useFavoritesCardScaling.js'; import { useFavoritesCardScaling } from './composables/useFavoritesCardScaling.js';
import { userImage } from '../../shared/utils';
import FavoritesFriendItem from './components/FavoritesFriendItem.vue'; import FavoritesFriendItem from './components/FavoritesFriendItem.vue';
import FriendExportDialog from './dialogs/FriendExportDialog.vue'; import FriendExportDialog from './dialogs/FriendExportDialog.vue';
@@ -683,12 +685,12 @@
function handleGroupClick(type, key) { function handleGroupClick(type, key) {
if (hasSearchInput.value) { if (hasSearchInput.value) {
friendFavoriteSearch.value = ''; friendFavoriteSearch.value = '';
searchFriendFavorites(''); doSearchFriendFavorites('');
} }
selectGroup(type, key); selectGroup(type, key);
} }
function searchFriendFavorites(searchTerm) { function doSearchFriendFavorites(searchTerm) {
const search = searchTerm.trim().toLowerCase(); const search = searchTerm.trim().toLowerCase();
if (search.length < 3) { if (search.length < 3) {
friendFavoriteSearchResults.value = []; friendFavoriteSearchResults.value = [];
@@ -703,6 +705,7 @@
}); });
friendFavoriteSearchResults.value = filtered; friendFavoriteSearchResults.value = filtered;
} }
const searchFriendFavorites = debounce(doSearchFriendFavorites, 200);
function toggleFriendSelection(id, value) { function toggleFriendSelection(id, value) {
if (value) { if (value) {
+8 -4
View File
@@ -148,7 +148,9 @@
:model-value="group.visibility === visibility" :model-value="group.visibility === visibility"
indicator-position="right" indicator-position="right"
@select="handleVisibilitySelection(group, visibility)"> @select="handleVisibilitySelection(group, visibility)">
<span>{{ t(`view.favorite.visibility.${visibility}`) }}</span> <span>{{
t(`view.favorite.visibility.${visibility}`)
}}</span>
</DropdownMenuCheckboxItem> </DropdownMenuCheckboxItem>
</DropdownMenuSubContent> </DropdownMenuSubContent>
</DropdownMenuPortal> </DropdownMenuPortal>
@@ -470,6 +472,7 @@
import { Badge } from '../../components/ui/badge'; import { Badge } from '../../components/ui/badge';
import { Slider } from '../../components/ui/slider'; import { Slider } from '../../components/ui/slider';
import { Switch } from '../../components/ui/switch'; import { Switch } from '../../components/ui/switch';
import { debounce } from '../../shared/utils';
import { useFavoritesCardScaling } from './composables/useFavoritesCardScaling.js'; import { useFavoritesCardScaling } from './composables/useFavoritesCardScaling.js';
import FavoritesWorldItem from './components/FavoritesWorldItem.vue'; import FavoritesWorldItem from './components/FavoritesWorldItem.vue';
@@ -813,7 +816,7 @@
type: 'cards', type: 'cards',
key: `local:${activeLocalGroupName.value}:${index}`, key: `local:${activeLocalGroupName.value}:${index}`,
items: items.slice(index, index + safeColumns).map((favorite) => ({ items: items.slice(index, index + safeColumns).map((favorite) => ({
key: favorite.id ?? favorite.worldId ?? favorite.name ?? `${index}:${Math.random()}`, key: favorite.id ?? favorite.worldId ?? favorite.name ?? `${activeLocalGroupName.value}:${index}`,
favorite favorite
})) }))
}); });
@@ -939,7 +942,7 @@
function handleGroupClick(type, key) { function handleGroupClick(type, key) {
if (hasSearchInput.value) { if (hasSearchInput.value) {
worldFavoriteSearch.value = ''; worldFavoriteSearch.value = '';
searchWorldFavorites(''); doSearchWorldFavorites('');
} }
selectGroup(type, key, { userInitiated: true }); selectGroup(type, key, { userInitiated: true });
} }
@@ -1171,7 +1174,7 @@
.catch(() => {}); .catch(() => {});
} }
function searchWorldFavorites(worldFavoriteSearch) { function doSearchWorldFavorites(worldFavoriteSearch) {
const search = worldFavoriteSearch.trim().toLowerCase(); const search = worldFavoriteSearch.trim().toLowerCase();
if (search.length < 3) { if (search.length < 3) {
worldFavoriteSearchResults.value = []; worldFavoriteSearchResults.value = [];
@@ -1186,6 +1189,7 @@
}); });
worldFavoriteSearchResults.value = filtered; worldFavoriteSearchResults.value = filtered;
} }
const searchWorldFavorites = debounce(doSearchWorldFavorites, 200);
function handleVisibilitySelection(group, visibility) { function handleVisibilitySelection(group, visibility) {
const menuKey = remoteGroupMenuKey(group.key); const menuKey = remoteGroupMenuKey(group.key);
+2 -5
View File
@@ -5,7 +5,6 @@ import { Button } from '../../components/ui/button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
TooltipProvider,
TooltipTrigger TooltipTrigger
} from '../../components/ui/tooltip'; } from '../../components/ui/tooltip';
import { import {
@@ -24,6 +23,7 @@ const { t } = i18n.global;
const expandedRow = ({ row }) => { const expandedRow = ({ row }) => {
const original = row.original; const original = row.original;
const type = original.type; const type = original.type;
const { showFullscreenImageDialog } = useGalleryStore();
if (type === 'GPS') { if (type === 'GPS') {
return ( return (
<div class="pl-5 text-sm"> <div class="pl-5 text-sm">
@@ -81,7 +81,6 @@ const expandedRow = ({ row }) => {
} }
if (type === 'Avatar') { if (type === 'Avatar') {
const { showFullscreenImageDialog } = useGalleryStore();
return ( return (
<div class="pl-5 text-sm"> <div class="pl-5 text-sm">
<div class="flex items-center"> <div class="flex items-center">
@@ -243,7 +242,6 @@ export const columns = [
const longText = formatDateFilter(createdAt, 'long'); const longText = formatDateFilter(createdAt, 'long');
return ( return (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span>{shortText}</span> <span>{shortText}</span>
@@ -252,7 +250,6 @@ export const columns = [
<span>{longText}</span> <span>{longText}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
); );
} }
}, },
@@ -280,7 +277,7 @@ export const columns = [
const original = row.original; const original = row.original;
return ( return (
<span <span
class="cursor-pointer pr-2.5 cursor-pointer" class="cursor-pointer pr-2.5"
onClick={() => showUserDialog(original.userId)} onClick={() => showUserDialog(original.userId)}
> >
{original.displayName} {original.displayName}
-3
View File
@@ -3,7 +3,6 @@ import { Button } from '../../components/ui/button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
TooltipProvider,
TooltipTrigger TooltipTrigger
} from '../../components/ui/tooltip'; } from '../../components/ui/tooltip';
import { ArrowRight, ArrowUpDown, Trash2, X } from 'lucide-vue-next'; import { ArrowRight, ArrowUpDown, Trash2, X } from 'lucide-vue-next';
@@ -49,7 +48,6 @@ export const createColumns = ({ onDelete, onDeletePrompt }) => {
const longText = formatDateFilter(createdAt, 'long'); const longText = formatDateFilter(createdAt, 'long');
return ( return (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span>{shortText}</span> <span>{shortText}</span>
@@ -58,7 +56,6 @@ export const createColumns = ({ onDelete, onDeletePrompt }) => {
<span>{longText}</span> <span>{longText}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
); );
} }
}, },
@@ -3,7 +3,7 @@
<div class="friend-card__header"> <div class="friend-card__header">
<div> <div>
<Avatar class="friend-card__avatar" :style="{ width: `${avatarSize}px`, height: `${avatarSize}px` }"> <Avatar class="friend-card__avatar" :style="{ width: `${avatarSize}px`, height: `${avatarSize}px` }">
<AvatarImage :src="userImage(props.friend.ref, true)" /> <AvatarImage :src="userImage(friend.ref, true)" />
<AvatarFallback>{{ avatarFallback }}</AvatarFallback> <AvatarFallback>{{ avatarFallback }}</AvatarFallback>
</Avatar> </Avatar>
</div> </div>
+1 -8
View File
@@ -4,7 +4,6 @@ import { Button } from '../../components/ui/button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
TooltipProvider,
TooltipTrigger TooltipTrigger
} from '../../components/ui/tooltip'; } from '../../components/ui/tooltip';
import { ArrowUpDown, FileText, Trash2, X } from 'lucide-vue-next'; import { ArrowUpDown, FileText, Trash2, X } from 'lucide-vue-next';
@@ -65,7 +64,6 @@ export const createColumns = ({ getCreatedAt, onDelete, onDeletePrompt }) => {
const longText = formatDateFilter(createdAt, 'long'); const longText = formatDateFilter(createdAt, 'long');
return ( return (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span>{shortText}</span> <span>{shortText}</span>
@@ -74,7 +72,6 @@ export const createColumns = ({ getCreatedAt, onDelete, onDeletePrompt }) => {
<span>{longText}</span> <span>{longText}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
); );
} }
}, },
@@ -275,7 +272,6 @@ export const createColumns = ({ getCreatedAt, onDelete, onDeletePrompt }) => {
</button> </button>
) : null} ) : null}
{canShowPrevious ? ( {canShowPrevious ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -292,13 +288,10 @@ export const createColumns = ({ getCreatedAt, onDelete, onDeletePrompt }) => {
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span> <span>
{t( {t('dialog.previous_instances.info')}
'dialog.previous_instances.info'
)}
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
</div> </div>
); );
-3
View File
@@ -3,7 +3,6 @@ import { Button } from '../../components/ui/button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
TooltipProvider,
TooltipTrigger TooltipTrigger
} from '../../components/ui/tooltip'; } from '../../components/ui/tooltip';
import { ArrowUpDown, Trash2, X } from 'lucide-vue-next'; import { ArrowUpDown, Trash2, X } from 'lucide-vue-next';
@@ -50,7 +49,6 @@ export const createColumns = ({ onDelete, onDeletePrompt }) => {
const longText = formatDateFilter(createdAt, 'long'); const longText = formatDateFilter(createdAt, 'long');
return ( return (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span>{shortText}</span> <span>{shortText}</span>
@@ -59,7 +57,6 @@ export const createColumns = ({ onDelete, onDeletePrompt }) => {
<span>{longText}</span> <span>{longText}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
); );
} }
}, },
+2 -1
View File
@@ -438,7 +438,8 @@
.catch((err) => { .catch((err) => {
handleNotificationHide({ params }); handleNotificationHide({ params });
notificationRequest.hideNotificationV2(params.notificationId); notificationRequest.hideNotificationV2(params.notificationId);
throw err; console.error('Notification response failed', err);
toast.error('Error');
}); });
} }
+3 -30
View File
@@ -4,7 +4,6 @@ import { Button } from '../../components/ui/button';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
TooltipProvider,
TooltipTrigger, TooltipTrigger,
TooltipWrapper TooltipWrapper
} from '../../components/ui/tooltip'; } from '../../components/ui/tooltip';
@@ -129,7 +128,6 @@ export const createColumns = ({
const longText = formatDateFilter(createdAt, 'long'); const longText = formatDateFilter(createdAt, 'long');
return ( return (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span>{shortText}</span> <span>{shortText}</span>
@@ -138,7 +136,6 @@ export const createColumns = ({
<span>{longText}</span> <span>{longText}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
); );
} }
}, },
@@ -164,15 +161,12 @@ export const createColumns = ({
) { ) {
return ( return (
<Badge variant="outline" class="text-muted-foreground"> <Badge variant="outline" class="text-muted-foreground">
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span <span
class="cursor-pointer" class="cursor-pointer"
onClick={() => onClick={() =>
showWorldDialog( showWorldDialog(original.location)
original.location
)
} }
> >
{label} {label}
@@ -189,7 +183,6 @@ export const createColumns = ({
) : null} ) : null}
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
</Badge> </Badge>
); );
} }
@@ -197,15 +190,12 @@ export const createColumns = ({
if (original.link) { if (original.link) {
return ( return (
<Badge variant="outline" class="text-muted-foreground"> <Badge variant="outline" class="text-muted-foreground">
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span <span
class="cursor-pointer" class="cursor-pointer"
onClick={() => onClick={() =>
openNotificationLink( openNotificationLink(original.link)
original.link
)
} }
> >
{label} {label}
@@ -215,7 +205,6 @@ export const createColumns = ({
<span>{original.linkText}</span> <span>{original.linkText}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
</Badge> </Badge>
); );
} }
@@ -548,7 +537,6 @@ export const createColumns = ({
!original.$isExpired ? ( !original.$isExpired ? (
<span class="inline-flex items-center gap-2"> <span class="inline-flex items-center gap-2">
{original.type === 'friendRequest' ? ( {original.type === 'friendRequest' ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -571,11 +559,9 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
{original.type === 'invite' ? ( {original.type === 'invite' ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -598,13 +584,11 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
{original.type === 'requestInvite' ? ( {original.type === 'requestInvite' ? (
<span class="inline-flex items-center"> <span class="inline-flex items-center">
{canInvite() ? ( {canInvite() ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -627,9 +611,7 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -652,7 +634,6 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
</span> </span>
) : null} ) : null}
@@ -687,10 +668,9 @@ export const createColumns = ({
); );
return ( return (
<TooltipProvider <Tooltip
key={`${response.text}:${response.type}`} key={`${response.text}:${response.type}`}
> >
<Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
type="button" type="button"
@@ -706,13 +686,11 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
); );
}) })
: null} : null}
{showDecline ? ( {showDecline ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -745,11 +723,9 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
{original.type === 'group.queueReady' ? ( {original.type === 'group.queueReady' ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -780,12 +756,10 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
</span> </span>
) : null} ) : null}
{showDeleteLog ? ( {showDeleteLog ? (
<TooltipProvider>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -816,7 +790,6 @@ export const createColumns = ({
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider>
) : null} ) : null}
</div> </div>
); );
@@ -75,7 +75,8 @@
await inviteMessagesRequest await inviteMessagesRequest
.editInviteMessage(params, messageType, slot) .editInviteMessage(params, messageType, slot)
.catch((err) => { .catch((err) => {
throw err; console.error('Invite response message update failed', err);
toast.error('Error');
}) })
.then((args) => { .then((args) => {
if (args.json[slot].message === I.messageSlot.message) { if (args.json[slot].message === I.messageSlot.message) {
@@ -96,7 +97,8 @@
notificationRequest notificationRequest
.sendInviteResponsePhoto(params, I.invite.id) .sendInviteResponsePhoto(params, I.invite.id)
.catch((err) => { .catch((err) => {
throw err; console.error('Invite response photo failed', err);
toast.error('Error');
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
@@ -112,7 +114,8 @@
notificationRequest notificationRequest
.sendInviteResponse(params, I.invite.id) .sendInviteResponse(params, I.invite.id)
.catch((err) => { .catch((err) => {
throw err; console.error('Invite response failed', err);
toast.error('Error');
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
@@ -61,7 +61,8 @@
notificationRequest notificationRequest
.sendInviteResponsePhoto(params, D.invite.id) .sendInviteResponsePhoto(params, D.invite.id)
.catch((err) => { .catch((err) => {
throw err; console.error('Invite response photo failed', err);
toast.error(t('message.error'));
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
@@ -77,7 +78,8 @@
notificationRequest notificationRequest
.sendInviteResponse(params, D.invite.id) .sendInviteResponse(params, D.invite.id)
.catch((err) => { .catch((err) => {
throw err; console.error('Invite response failed', err);
toast.error('Error');
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
+15 -10
View File
@@ -31,12 +31,12 @@
}}</span> }}</span>
<span v-if="!item.ref.isFriend" class="block truncate text-xs"></span> <span v-if="!item.ref.isFriend" class="block truncate text-xs"></span>
<span <span
v-else-if="item.ref.state === 'offline'" v-else-if="item.ref.state === 'active'"
class="block truncate text-xs" class="block truncate text-xs"
>{{ t('side_panel.search_result_active') }}</span >{{ t('side_panel.search_result_active') }}</span
> >
<span <span
v-else-if="item.ref.state === 'active'" v-else-if="item.ref.state === 'offline'"
class="block truncate text-xs" class="block truncate text-xs"
>{{ t('side_panel.search_result_offline') }}</span >{{ t('side_panel.search_result_offline') }}</span
> >
@@ -120,7 +120,7 @@
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useFriendStore, useGroupStore, useSearchStore } from '../../stores'; import { useFriendStore, useGroupStore, useSearchStore } from '../../stores';
import { userImage } from '../../shared/utils'; import { debounce, userImage } from '../../shared/utils';
import FriendsSidebar from './components/FriendsSidebar.vue'; import FriendsSidebar from './components/FriendsSidebar.vue';
import GroupsSidebar from './components/GroupsSidebar.vue'; import GroupsSidebar from './components/GroupsSidebar.vue';
@@ -139,13 +139,18 @@
const quickSearchQuery = ref(''); const quickSearchQuery = ref('');
const isQuickSearchOpen = ref(false); const isQuickSearchOpen = ref(false);
watch( const runQuickSearch = debounce((value) => {
quickSearchQuery, quickSearchRemoteMethod(value);
(value) => { }, 200);
quickSearchRemoteMethod(String(value ?? ''));
}, watch(quickSearchQuery, (value) => {
{ immediate: true } const query = String(value ?? '').trim();
); if (!query) {
quickSearchRemoteMethod('');
return;
}
runQuickSearch(query);
});
function handleQuickSearchSelect(value) { function handleQuickSearchSelect(value) {
if (!value) { if (!value) {
@@ -68,6 +68,9 @@
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import Location from '@/components/Location.vue';
import Timer from '@/components/Timer.vue';
import { useAppearanceSettingsStore, useFriendStore, useUserStore } from '../../../stores'; import { useAppearanceSettingsStore, useFriendStore, useUserStore } from '../../../stores';
import { userImage, userStatusClass } from '../../../shared/utils'; import { userImage, userStatusClass } from '../../../shared/utils';
@@ -74,7 +74,7 @@
</template> </template>
<template v-else-if="item.row.type === 'friend-item'"> <template v-else-if="item.row.type === 'friend-item'">
<friend-item <FriendItem
:friend="item.row.friend" :friend="item.row.friend"
:style="item.row.itemStyle" :style="item.row.itemStyle"
:is-group-by-instance="item.row.isGroupByInstance" /> :is-group-by-instance="item.row.isGroupByInstance" />
@@ -161,7 +161,7 @@
width: 100%; width: 100%;
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
padding: 0 12x 0 12px; padding: 0 12px;
} }
.date { .date {