Migrate backend to Porto architecture and fix minor bugs

- Fully transitioned the backend to the Porto architectural pattern
- Improved code organization and maintainability
- Fixed minor bugs and inconsistencies
This commit is contained in:
F4ilji
2025-05-12 08:47:43 +05:00
parent 76deaf75f3
commit c01016a154
620 changed files with 16218 additions and 6073 deletions
@@ -1,19 +1,17 @@
<template>
<div v-if="isServer && serverSideBuilder">
<component :is="serverSideBuilder" :blocks="blocks" />
</div>
<div v-else>
<transition name="fade" mode="out-in">
<PageSkeleton v-if="loading" key="skeleton" />
<div class="space-y-6" v-else key="content">
<component
v-for="(block, index) in blocks"
:key="index"
:is="getComponent(block.type)"
:block="block"
/>
</div>
</transition>
<transition name="fade" mode="out-in">
<PageSkeleton v-if="loading" key="skeleton" />
<div class="space-y-6" v-else key="content">
<component
v-for="(block, index) in blocks"
:key="index"
:is="getComponent(block.type)"
:block="block"
/>
</div>
</transition>
<div v-if="isServer">
<ServerSideBuilder :blocks="blocks" />
</div>
</template>
@@ -23,11 +21,11 @@ import PageSkeleton from "@/componentss/shared/builder/pageBuilder/skeletons/Pag
import ServerSideBuilder from "@/componentss/shared/builder/pageBuilder/ServerSideBuilder.vue";
export default {
name: "Builder",
components: {ServerSideBuilder, PageSkeleton},
data() {
return {
loading: true,
name: "Builder",
components: {ServerSideBuilder, PageSkeleton},
data() {
return {
loading: true,
isServer: typeof window === 'undefined',
serverSideBuilder: null,
componentMap: {
@@ -49,34 +47,34 @@ export default {
slider: () => import('@/componentss/features/sliders/shared/SliderBlock.vue')
},
};
},
methods: {
async loadAllComponents() {
// Создайте массив промисов для загрузки всех компонентов
const promises = Object.values(this.componentMap).map(load => load());
},
methods: {
async loadAllComponents() {
// Создайте массив промисов для загрузки всех компонентов
const promises = Object.values(this.componentMap).map(load => load());
// Дождитесь завершения всех загрузок
await Promise.all(promises);
this.loading = false; // Установите флаг загрузки в false
},
getComponent(type) {
return defineAsyncComponent(this.componentMap[type] || null);
},
},
props: {
blocks: {
type: Object,
required: true,
},
},
async created() {
// Дождитесь завершения всех загрузок
await Promise.all(promises);
this.loading = false; // Установите флаг загрузки в false
},
getComponent(type) {
return defineAsyncComponent(this.componentMap[type] || null);
},
},
props: {
blocks: {
type: Object,
required: true,
},
},
async created() {
if (this.isServer) {
// Динамически импортируем только на сервере
const module = await import('@/componentss/shared/builder/pageBuilder/ServerSideBuilder.vue');
this.serverSideBuilder = module.default;
}
await this.loadAllComponents(); // Загрузить все компоненты при создании
},
await this.loadAllComponents(); // Загрузить все компоненты при создании
},
}
</script>
@@ -1,5 +1,5 @@
<template>
<div role="status" class="space-y-2.5 animate-pulse w-full">
<div class="space-y-2.5 animate-pulse w-full">
<div v-for="slide in 16" :key="slide" class="flex items-center w-full">
<div
class="h-2.5 rounded-full"