From eee8cc120f5a3401ea14947ee4e582e8137602af Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Fri, 22 Aug 2025 09:56:38 -0400 Subject: [PATCH 1/7] Replace v-progress loaders with skeletons --- .../components/Details/BackgroundHeader.vue | 32 +++++++++---------- .../common/Game/Dialog/MatchRom.vue | 31 ++++++++---------- .../components/common/Navigation/ScanBtn.vue | 6 ++-- .../src/components/common/SearchCover.vue | 23 +++++-------- frontend/src/components/common/ViewLoader.vue | 19 ----------- 5 files changed, 40 insertions(+), 71 deletions(-) delete mode 100644 frontend/src/components/common/ViewLoader.vue diff --git a/frontend/src/components/Details/BackgroundHeader.vue b/frontend/src/components/Details/BackgroundHeader.vue index f50164628..e6004792a 100644 --- a/frontend/src/components/Details/BackgroundHeader.vue +++ b/frontend/src/components/Details/BackgroundHeader.vue @@ -20,40 +20,40 @@ const unmatchedCoverImage = computed(() => - + + diff --git a/frontend/src/components/common/Game/Dialog/MatchRom.vue b/frontend/src/components/common/Game/Dialog/MatchRom.vue index b6a96859a..d30bddd43 100644 --- a/frontend/src/components/common/Game/Dialog/MatchRom.vue +++ b/frontend/src/components/common/Game/Dialog/MatchRom.vue @@ -2,12 +2,13 @@ import type { SearchRomSchema } from "@/__generated__"; import GameCard from "@/components/common/Game/Card/Base.vue"; import RDialog from "@/components/common/RDialog.vue"; -import romApi from "@/services/api/rom"; +import Skeleton from "@/components/common/Game/Card/Skeleton.vue"; import EmptyManualMatch from "@/components/common/EmptyStates/EmptyManualMatch.vue"; import storeGalleryView from "@/stores/galleryView"; import storeHeartbeat from "@/stores/heartbeat"; import storeRoms, { type SimpleRom } from "@/stores/roms"; import storePlatforms from "@/stores/platforms"; +import romApi from "@/services/api/rom"; import type { Events } from "@/types/emitter"; import type { Emitter } from "mitt"; import { computed, inject, onBeforeUnmount, ref } from "vue"; @@ -490,15 +491,10 @@ onBeforeUnmount(() => { cover > @@ -580,19 +576,18 @@ onBeforeUnmount(() => { diff --git a/frontend/src/components/common/ViewLoader.vue b/frontend/src/components/common/ViewLoader.vue deleted file mode 100644 index 2af6bbfdd..000000000 --- a/frontend/src/components/common/ViewLoader.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - From 5a4da397a953636825394aa46f9906cbb0975d3a Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Fri, 22 Aug 2025 10:28:23 -0400 Subject: [PATCH 2/7] add skeleton loaders to homepage --- .../components/Details/RetroAchievements.vue | 19 ++-- .../src/components/Home/PlatformsSkeleton.vue | 51 ++++++++++ ...etonLoader.vue => RecentAddedSkeleton.vue} | 0 frontend/src/views/Home.vue | 96 ++++++++++--------- 4 files changed, 112 insertions(+), 54 deletions(-) create mode 100644 frontend/src/components/Home/PlatformsSkeleton.vue rename frontend/src/components/Home/{RecentSkeletonLoader.vue => RecentAddedSkeleton.vue} (100%) diff --git a/frontend/src/components/Details/RetroAchievements.vue b/frontend/src/components/Details/RetroAchievements.vue index 81b212f6f..be94d12b4 100644 --- a/frontend/src/components/Details/RetroAchievements.vue +++ b/frontend/src/components/Details/RetroAchievements.vue @@ -117,27 +117,30 @@ onMounted(() => { buffer-opacity="0.6" :buffer-value="achievementsPercentage" height="32" - >

+ > +

{{ Math.max( Math.ceil(achievementsPercentage), Math.ceil(achievementsPercentageHardcore), ) }}% -

+

+ {{ t("rom.show-earned-only") }} + + {{ t("rom.show-earned-only") }} + +import RSection from "@/components/common/RSection.vue"; +import Skeleton from "@/components/common/Game/Card/Skeleton.vue"; +import { views } from "@/utils"; +import { ref } from "vue"; +import { isNull } from "lodash"; +import { useI18n } from "vue-i18n"; + +const { t } = useI18n(); +const storedPlatforms = localStorage.getItem("settings.gridPlatforms"); +const gridPlatforms = ref( + isNull(storedPlatforms) ? false : storedPlatforms === "true", +); + + + + diff --git a/frontend/src/components/Home/RecentSkeletonLoader.vue b/frontend/src/components/Home/RecentAddedSkeleton.vue similarity index 100% rename from frontend/src/components/Home/RecentSkeletonLoader.vue rename to frontend/src/components/Home/RecentAddedSkeleton.vue diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index b95b1c075..60cbeb0e3 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -5,7 +5,8 @@ import { useI18n } from "vue-i18n"; import Stats from "@/components/Home/Stats.vue"; import Collections from "@/components/Home/Collections.vue"; import Platforms from "@/components/Home/Platforms.vue"; -import RecentSkeletonLoader from "@/components/Home/RecentSkeletonLoader.vue"; +import PlatformsSkeleton from "@/components/Home/PlatformsSkeleton.vue"; +import RecentAddedSkeleton from "@/components/Home/RecentAddedSkeleton.vue"; import RecentAdded from "@/components/Home/RecentAdded.vue"; import ContinuePlaying from "@/components/Home/ContinuePlaying.vue"; import EmptyHome from "@/components/Home/EmptyHome.vue"; @@ -16,8 +17,7 @@ import storeRoms from "@/stores/roms"; const { t } = useI18n(); const romsStore = storeRoms(); -const { recentRoms, continuePlayingRoms: recentPlayedRoms } = - storeToRefs(romsStore); +const { recentRoms, continuePlayingRoms } = storeToRefs(romsStore); const platformsStore = storePlatforms(); const { filledPlatforms } = storeToRefs(platformsStore); const collectionsStore = storeCollections(); @@ -45,28 +45,16 @@ const fetchingContinuePlaying = ref(false); const isEmpty = computed( () => + !fetchingRecentAdded.value && + !fetchingContinuePlaying.value && recentRoms.value.length === 0 && - recentPlayedRoms.value.length === 0 && + continuePlayingRoms.value.length === 0 && filledPlatforms.value.length === 0 && filteredCollections.value.length === 0 && filteredVirtualCollections.value.length === 0 && filteredSmartCollections.value.length === 0, ); -const showRecentSkeleton = computed( - () => - showRecentRoms && - fetchingRecentAdded.value && - recentRoms.value.length === 0, -); - -const showContinuePlayingSkeleton = computed( - () => - showContinuePlaying && - fetchingContinuePlaying.value && - recentPlayedRoms.value.length === 0, -); - const fetchRecentRoms = async (): Promise => { try { fetchingRecentAdded.value = true; @@ -102,63 +90,79 @@ onMounted(async () => {