mirror of
https://github.com/Drop-OSS/drop.git
synced 2025-11-20 19:51:09 +10:00
Rearchitecture for v0.4.0 (#197)
* feat: database redist support * feat: rearchitecture of database schemas, migration reset, and #180 * feat: import redists * fix: giantbomb logging bug * feat: partial user platform support + statusMessage -> message * feat: add user platform filters to store view * fix: sanitize svg uploads ... copilot suggested this I feel dirty. * feat: beginnings of platform & redist management * feat: add server side redist patching * fix: update drop-base commit * feat: import of custom platforms & file extensions * fix: redelete platform * fix: remove platform * feat: uninstall commands, new R UI * checkpoint: before migrating to nuxt v4 * update to nuxt 4 * fix: fixes for Nuxt v4 update * fix: remaining type issues * feat: initial feedback to import other kinds of versions * working commit * fix: lint * feat: redist import
This commit is contained in:
76
app/components/GameCarousel.vue
Normal file
76
app/components/GameCarousel.vue
Normal file
@ -0,0 +1,76 @@
|
||||
<template>
|
||||
<div ref="currentComponent">
|
||||
<ClientOnly fallback-tag="span">
|
||||
<VueCarousel :items-to-show="singlePage" :items-to-scroll="singlePage">
|
||||
<VueSlide
|
||||
v-for="(game, gameIdx) in games"
|
||||
:key="gameIdx"
|
||||
class="justify-start"
|
||||
>
|
||||
<GamePanel
|
||||
:game="game"
|
||||
:href="game ? `/store/${game.id}` : undefined"
|
||||
:show-title-description="showGamePanelTextDecoration"
|
||||
/>
|
||||
</VueSlide>
|
||||
|
||||
<template #addons>
|
||||
<VueNavigation />
|
||||
</template>
|
||||
</VueCarousel>
|
||||
<template #fallback>
|
||||
<div
|
||||
class="flex flex-nowrap flex-row overflow-hidden whitespace-nowrap"
|
||||
>
|
||||
<SkeletonCard
|
||||
v-for="index in 10"
|
||||
:key="index"
|
||||
:loading="true"
|
||||
class="mr-3 flex-none"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</ClientOnly>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { GameModel } from "~~/prisma/client/models";
|
||||
import type { SerializeObject } from "nitropack";
|
||||
|
||||
const props = defineProps<{
|
||||
items: Array<SerializeObject<GameModel>>;
|
||||
min?: number;
|
||||
width?: number;
|
||||
}>();
|
||||
|
||||
const { showGamePanelTextDecoration } = await $dropFetch(`/api/v1/settings`);
|
||||
|
||||
const currentComponent = ref<HTMLDivElement>();
|
||||
|
||||
const min = computed(() => Math.max(props.min ?? 8, props.items.length));
|
||||
const games: Ref<Array<SerializeObject<GameModel> | undefined>> = computed(() =>
|
||||
Array(min.value)
|
||||
.fill(0)
|
||||
.map((_, i) => props.items[i]),
|
||||
);
|
||||
|
||||
const singlePage = ref(2);
|
||||
const sizeOfCard = 192 + 10;
|
||||
|
||||
const handleResize = () => {
|
||||
singlePage.value =
|
||||
(props.width ??
|
||||
currentComponent.value?.parentElement?.clientWidth ??
|
||||
window.innerWidth) / sizeOfCard;
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
handleResize();
|
||||
window.addEventListener("resize", handleResize);
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener("resize", handleResize);
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user