App.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <script setup lang="ts">
  2. import { onMounted, ref, h, computed, unref, watchEffect } from "vue";
  3. import { createApp } from "/@/hooks/userApp";
  4. import tagView from "/@/components/custom/tagView.vue";
  5. import LoadingLogo from "/@/components/basic/loading.vue";
  6. import MiniMap from "/@/components/basic/miniMap.vue";
  7. import FloorplanView from "/@/components/basic/floorplan.vue";
  8. import { useSceneStore } from "/@/store/modules/scene";
  9. import type { FloorsType } from "/@/store/modules/scene";
  10. import { useAppStore } from "./store/modules/app";
  11. import Guideline from "/@/components/basic/guide.vue";
  12. import ChatRoom from "/@/components/chatRoom/index.vue";
  13. import browser from "/@/utils/browser";
  14. const sceneStore = useSceneStore();
  15. const appStore = useAppStore();
  16. const dataLoaded = ref(false);
  17. const scene$ = ref<Nullable<HTMLElement>>(null);
  18. const refMiniMap = ref<Nullable<string>>(null);
  19. const flying = computed(() => appStore.flying);
  20. const player = computed(() => appStore.player);
  21. const metadata = computed(() => sceneStore.metadata);
  22. const mode = computed(() => appStore.mode);
  23. const controls = computed(() => {
  24. return metadata.value.controls;
  25. });
  26. const floorplanViewShow = computed(() => {
  27. return (
  28. Boolean(controls.value.showDollhouse) &&
  29. Boolean(controls.value.showFloorplan) &&
  30. mode.value !== "panorama"
  31. );
  32. });
  33. const show = ref(false);
  34. watchEffect(() => {
  35. console.warn("mode", mode);
  36. });
  37. onMounted(async () => {
  38. const app = await createApp({
  39. dom: scene$.value as HTMLElement,
  40. num: browser.getURLParam("m") || "KK-t-gpAaKxXhE9",
  41. mobile: true,
  42. });
  43. // SDK初始化
  44. app.use("MinMap", { theme: { camera_fillStyle: "#ED5D18" } });
  45. app.use("Tag");
  46. app.use("TourPlayer");
  47. app.use("TagView", {
  48. render(data) {
  49. if (data.media["image"] && data.media["image"].length) {
  50. return h(tagView, {
  51. sid: data.sid,
  52. url: app.resource.getUserResourceURL(data.media["image"][0].src),
  53. content: data.content,
  54. title: data.title,
  55. });
  56. }
  57. return `<span class="tag-icon animate" style="display:none"></span>`;
  58. },
  59. });
  60. app.use("TourPlayer");
  61. app.render();
  62. // SDK初始化结束
  63. // SDK global Event start
  64. app.Scene.on("ready", () => {
  65. show.value = true;
  66. });
  67. app.Scene.on("loaded", (pano) => {
  68. refMiniMap.value = "[xui_min_map]";
  69. appStore.setFloorId(pano.floorIndex);
  70. // store.commit("setFloorId", pano.floorIndex);
  71. // store.commit("rtc/setShowdaogou", true);
  72. // if (browser.getURLParam("roomId") && browser.getURLParam("vruserId") && browser.getURLParam("name")) {
  73. // store.commit("showShoppingguide", true);
  74. // }
  75. });
  76. app.store.on("metadata", (metadata: KankanMetaDataType) => {
  77. sceneStore.load(metadata);
  78. if (!metadata.controls.showMap) {
  79. app.MinMap.hide(true);
  80. }
  81. dataLoaded.value = true;
  82. });
  83. app.store.on("floorcad", ({ floors }: { floors: FloorsType[] }) => {
  84. if (floors?.length) {
  85. sceneStore.loadFloorData(floors);
  86. }
  87. });
  88. app.Camera.on("mode.beforeChange", ({ toMode, floorIndex, fromMode }) => {
  89. appStore.setMode(toMode);
  90. if (toMode != "dollhouse") {
  91. appStore.setFloorId(floorIndex);
  92. }
  93. if (fromMode) {
  94. appStore.setFlying(true);
  95. }
  96. });
  97. app.Camera.on("mode.afterChange", () => {
  98. appStore.setFlying(false);
  99. });
  100. app.Camera.on("flying.started", () => {
  101. appStore.setFlying(true);
  102. });
  103. app.Camera.on("flying.ended", ({ targetPano }) => {
  104. appStore.setFlying(false);
  105. appStore.setFloorId(targetPano.id);
  106. });
  107. });
  108. // SDK global Event end
  109. // method
  110. const changeMode = (name: string) => {
  111. if (!flying.value) {
  112. appStore.setMode(name);
  113. } else {
  114. appStore.setMode(name);
  115. }
  116. };
  117. </script>
  118. <template>
  119. <LoadingLogo :thumb="true" />
  120. <!-- 引导页 -->
  121. <Guideline />
  122. <div class="ui-view-layout" :class="{ show: show }">
  123. <div class="scene" ref="scene$"></div>
  124. <template v-if="dataLoaded">
  125. <!-- 小地图 start -->
  126. <MiniMap
  127. :show="!!unref(refMiniMap) && player.showWidgets"
  128. :show-dollhouse="Boolean(controls.showDollhouse)"
  129. :to="refMiniMap"
  130. @change-mode="changeMode"
  131. />
  132. <!-- 小地图 end -->
  133. <!-- 平面图 start -->
  134. <FloorplanView
  135. :show="floorplanViewShow"
  136. :mode="mode"
  137. @change-mode="changeMode"
  138. />
  139. <!-- 平面图 end -->
  140. <ChatRoom />
  141. </template>
  142. </div>
  143. </template>
  144. <style lang="scss">
  145. @import "./app.scss";
  146. </style>