58 lines
1.0 KiB
Vue
58 lines
1.0 KiB
Vue
<script lang="ts" setup>
|
|
|
|
// import
|
|
|
|
import useHomeData from "~/composables/api/home/useHomeData";
|
|
|
|
// type
|
|
|
|
export type LoadingOverlayProvideType = {
|
|
showLoadingOverlay: Ref<boolean>,
|
|
changeLoadingOverlay: (value: boolean) => void,
|
|
}
|
|
|
|
// state
|
|
|
|
const { suspense } = useHomeData();
|
|
|
|
const showLoadingOverlay = ref(true);
|
|
|
|
// method
|
|
|
|
const changeLoadingOverlay = (value: boolean) => {
|
|
showLoadingOverlay.value = value;
|
|
};
|
|
|
|
// provide / inject
|
|
|
|
provide("loadingOverlay", {
|
|
showLoadingOverlay,
|
|
changeLoadingOverlay
|
|
});
|
|
|
|
// ssr
|
|
|
|
const response = await suspense();
|
|
|
|
if (response.isError) {
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: `Landing error : ${response.error.message}`
|
|
});
|
|
}
|
|
|
|
</script>
|
|
|
|
<template>
|
|
<div class="w-full">
|
|
<LoadingOverlay />
|
|
<Hero />
|
|
<Preview />
|
|
<ProductsShowcase />
|
|
<ProductsSlider title="محصولات پرفروش" />
|
|
<Categories />
|
|
<Brands />
|
|
<MostRecentComments />
|
|
<LatestStories />
|
|
</div>
|
|
</template> |