panel.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <template>
  2. <div class="panel" :class="{ show }" v-if="panelShow">
  3. <!-- 暂时隐藏 33729 -->
  4. <span class="icon" @click="handlePlayTours" v-if="hasTours && false">
  5. <Icon type="play" />
  6. </span>
  7. <!-- <span class="icon" @click="handleDetail">
  8. <Icon type="detail" />
  9. </span> -->
  10. <span class="icon" @click="showScenes = !showScenes" v-if="sceneList.length > 1">
  11. <Icon type="scene" />
  12. </span>
  13. <span class="icon" v-if="hasMusic" @click="handleMusic">
  14. <Icon type="music_on" v-if="!isPlayMusic" />
  15. <Icon type="music_off" v-else />
  16. </span>
  17. <span class="ctrl" :class="{ show }" @click="show = !show">
  18. <Icon type="arrows" />
  19. </span>
  20. </div>
  21. <audio id="music" loop :src="musicURL" v-if="musicURL?.length"> </audio>
  22. <SceneList v-if="showScenes" @close="showScenes = false" @change-scene="changeScene" />
  23. </template>
  24. <script setup lang="ts">
  25. import SceneList from '/@/components/chatRoom/sceneList.vue';
  26. //import { useMusicPlayer } from "@/utils/sound";
  27. // import { changeScene } from "@/store/room";
  28. import Icon from '/@/components/basic/icon/index.vue';
  29. import { computed, onMounted, ref, unref, watchEffect } from 'vue';
  30. import { useRoom } from '/@/hooks/useRoom';
  31. import { useTourPlayer } from '/@/hooks/userTourPlayer';
  32. import { useSceneStore } from '/@/store/modules/scene';
  33. // import { useAppStore } from '/@/store/modules/app';
  34. const { initialRoom, changeScene, sceneList } = useRoom();
  35. const sceneStore = useSceneStore();
  36. // const appStore = useAppStore();
  37. // const hasMusic = computed(
  38. // () => sceneStore.metadata.music?.length || sceneStore.metadata.musicFile?.length,
  39. // );
  40. const hasMusic = computed(() => sceneStore.metadata.music?.length);
  41. const musicURL = computed(() => sceneStore.musicURL);
  42. const show = ref(false);
  43. const isPlayMusic = ref(false);
  44. watchEffect(() => {
  45. console.log('hasMusic', hasMusic, musicURL);
  46. });
  47. onMounted(() => {
  48. initialRoom();
  49. });
  50. const showScenes = ref(false);
  51. const { hasTours } = useTourPlayer();
  52. // const panelShow = computed(
  53. // () => unref(hasTours) || unref(sceneList).length > 1 || unref(hasMusic),
  54. // );
  55. const panelShow = computed(() => unref(sceneList).length > 1 || unref(hasMusic));
  56. console.log('panelShow', unref(panelShow));
  57. function handlePlayTours() {
  58. const { player, playing } = useTourPlayer();
  59. if (!unref(playing)) {
  60. player.play();
  61. } else {
  62. player.pause();
  63. }
  64. }
  65. function handleMusic() {
  66. const useMusicPlayer: HTMLAudioElement | null = document.getElementById(
  67. 'music',
  68. ) as HTMLAudioElement;
  69. if (!unref(isPlayMusic)) {
  70. useMusicPlayer && useMusicPlayer.play();
  71. isPlayMusic.value = true;
  72. } else {
  73. useMusicPlayer && useMusicPlayer.pause();
  74. isPlayMusic.value = false;
  75. }
  76. }
  77. // const handleDetail = () => {
  78. // if (appStore.isShowIntroPanel) {
  79. // appStore.setShowIntroPanel(false);
  80. // } else {
  81. // appStore.setShowIntroPanel(true);
  82. // }
  83. // };
  84. </script>
  85. <style lang="scss" scoped>
  86. .panel {
  87. position: fixed;
  88. top: calc(100% - 90px);
  89. left: 0;
  90. z-index: 22;
  91. height: 44px;
  92. background: rgba(0, 0, 0, 0.5);
  93. border-radius: 0px 24px 24px 0px;
  94. border: 1px solid rgba(255, 255, 255, 0.1);
  95. padding-right: 30px;
  96. display: flex;
  97. align-items: center;
  98. justify-content: space-evenly;
  99. // width: 110px;
  100. transform: translateX(calc(-100% + 30px));
  101. &.show {
  102. transform: translateX(0);
  103. }
  104. > .icon {
  105. margin: 0 10px;
  106. }
  107. }
  108. .icon {
  109. font-size: 24px;
  110. height: 1em;
  111. color: #fff;
  112. &.active {
  113. color: #ed5d18;
  114. }
  115. }
  116. .ctrl {
  117. position: absolute;
  118. right: 10px;
  119. top: 50%;
  120. transform: translateY(-50%) rotateZ(180deg);
  121. font-size: 12px;
  122. &.show {
  123. transform: translateY(-50%);
  124. }
  125. }
  126. </style>