From 800e7f390cb16b702ccfd8f56fc14e182ffecc32 Mon Sep 17 00:00:00 2001 From: Kseninia Mikhaylova Date: Thu, 27 Jun 2024 11:16:37 +0300 Subject: [PATCH] on click outside --- front/components.d.ts | 1 + front/src/components/Promo/load_models.vue | 17 ++++--- front/src/components/Promo/main.vue | 51 +------------------ front/src/components/Promo/sidebar.vue | 59 ++++++++++++++++++++++ front/src/index.d.ts | 7 ++- front/src/stores/promo_sidebar.ts | 2 +- 6 files changed, 80 insertions(+), 57 deletions(-) create mode 100644 front/src/components/Promo/sidebar.vue diff --git a/front/components.d.ts b/front/components.d.ts index fda6c94..fcab68f 100644 --- a/front/components.d.ts +++ b/front/components.d.ts @@ -29,5 +29,6 @@ declare module 'vue' { RandomIcon: typeof import('./src/components/RandomIcon.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + Sidebar: typeof import('./src/components/Promo/sidebar.vue')['default'] } } diff --git a/front/src/components/Promo/load_models.vue b/front/src/components/Promo/load_models.vue index 341c3b9..506c33f 100644 --- a/front/src/components/Promo/load_models.vue +++ b/front/src/components/Promo/load_models.vue @@ -89,16 +89,21 @@ const clickEvent = (event: MouseEvent) => { pointer.x = x pointer.y = y raycaster.value.setFromCamera(new Vector2(pointer.x, pointer.y), camera.value); - + const intersects = raycaster.value.intersectObjects(clickable_objects.value); const names = intersects.map(el => el.object.name ?? false).filter(Boolean) if (names.length) { - const clicks = clickable.value.filter(el=>names.includes(el.object_name)) + const clicks = clickable.value.find(el => names.includes(el.object_name)) + if (!clicks) return + const sidebar_data = { + title: clicks.name, + description: clicks.description + } as PromoSidebarData + if (clicks?.target) { + sidebar_data.target = clicks.target.toString() + } sidebar.open() - sidebar.setData({ - title: clicks[0].name, - description: clicks[0].description - }) + sidebar.setData(sidebar_data) } console.timeEnd('raycaster') } diff --git a/front/src/components/Promo/main.vue b/front/src/components/Promo/main.vue index e0f4763..0e271d4 100644 --- a/front/src/components/Promo/main.vue +++ b/front/src/components/Promo/main.vue @@ -6,12 +6,9 @@ import { Vector3 } from 'three'; import { TresCanvas } from '@tresjs/core'; import { CameraControls, useProgress, StatsGl } from '@tresjs/cientos' - import Env from './env.vue' import LoadModels from './load_models.vue' -import { usePromoSidebar } from '../../stores/promo_sidebar'; - -const sidebar = usePromoSidebar() +import Sidebar from './sidebar.vue' const _v = new Vector3(); const onChange = (e: any) => { @@ -67,17 +64,7 @@ const point_light = reactive({ - + \ No newline at end of file diff --git a/front/src/components/Promo/sidebar.vue b/front/src/components/Promo/sidebar.vue new file mode 100644 index 0000000..87de16c --- /dev/null +++ b/front/src/components/Promo/sidebar.vue @@ -0,0 +1,59 @@ + + + \ No newline at end of file diff --git a/front/src/index.d.ts b/front/src/index.d.ts index a4ec45c..ec528d1 100644 --- a/front/src/index.d.ts +++ b/front/src/index.d.ts @@ -31,9 +31,14 @@ interface clickableAreaType { source: number; target: number; } -interface PromoSidebar{ +interface PromoSidebar { title: string description: string loading: boolean is_open: boolean +} +interface PromoSidebarData { + title: string + description: string + target?: string } \ No newline at end of file diff --git a/front/src/stores/promo_sidebar.ts b/front/src/stores/promo_sidebar.ts index 9714fe9..5fcbb4a 100644 --- a/front/src/stores/promo_sidebar.ts +++ b/front/src/stores/promo_sidebar.ts @@ -14,7 +14,7 @@ export const usePromoSidebar = defineStore('promo_sidebar', { this.is_open = true this.loading = true }, - setData(data: { title: string, description: string }) { + setData(data: PromoSidebarData) { const { title, description } = data this.title = title this.description = description