index.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /* eslint-disable jsx-a11y/iframe-has-title */
  2. import { RootState } from "@/store";
  3. import { modelItem } from "@/types";
  4. import { useEffect, useRef, useState } from "react";
  5. import { useSelector } from "react-redux";
  6. import musicImg from "@/assets/img/music.png";
  7. import musicImgAc from "@/assets/img/musicAc.png";
  8. import styles from "./index.module.scss";
  9. import { baseURL } from "@/utils/http";
  10. type props = {
  11. modelId: number;
  12. closeModel: () => void;
  13. };
  14. export default function ModelM({ modelId, closeModel }: props) {
  15. const { modelInfo } = useSelector((state: RootState) => state.homeStore);
  16. const { list } = modelInfo;
  17. const [info, setInfo] = useState({} as modelItem);
  18. const closeModelFu = () => {
  19. setInfo({} as modelItem);
  20. setMusic(false);
  21. closeModel();
  22. };
  23. useEffect(() => {
  24. if (modelId) {
  25. const info = list.filter((v) => v.id === modelId)[0];
  26. setInfo(info);
  27. setMusic(true);
  28. setTimeout(() => {
  29. musicPlayFu(true);
  30. }, 500);
  31. }
  32. // eslint-disable-next-line react-hooks/exhaustive-deps
  33. }, [modelId]);
  34. // 控制模型放大缩小和复位
  35. const ifrBoxRef = useRef<any>(null);
  36. const modelChangeFu = (val: number) => {
  37. const dom = ifrBoxRef.current;
  38. if (dom && dom.contentWindow && dom.contentWindow.webview) {
  39. if (val === 1) dom.contentWindow.webview.zoomIn(); // 放大
  40. else if (val === 2) dom.contentWindow.webview.zoomOut(); // 缩小
  41. else dom.contentWindow.webview.resetView(); // 复位
  42. }
  43. };
  44. // 控制音乐播放暂停
  45. const musicRef = useRef<HTMLAudioElement>(null);
  46. const [music, setMusic] = useState(false);
  47. const musicPlayFu = (flag: boolean) => {
  48. const dom = musicRef.current;
  49. if (dom) {
  50. if (flag) {
  51. // 打开音乐
  52. setMusic(true);
  53. dom.play();
  54. dom.addEventListener(
  55. "ended",
  56. function () {
  57. setMusic(false);
  58. },
  59. false
  60. );
  61. } else {
  62. // 关闭音乐
  63. setMusic(false);
  64. dom.pause();
  65. }
  66. }
  67. };
  68. return (
  69. <div className={styles.ModelM}>
  70. {/* 音频 */}
  71. {info.audioPath ? (
  72. <audio src={baseURL + info.audioPath} ref={musicRef}></audio>
  73. ) : null}
  74. {/* 模型盒子 */}
  75. <div className="ifrBox">
  76. {info.fileName ? (
  77. <iframe
  78. ref={ifrBoxRef}
  79. src={`model.html?m=${info.fileName}`}
  80. frameBorder="no"
  81. ></iframe>
  82. ) : null}
  83. </div>
  84. {/* 名字 */}
  85. <div className="model_title">{info.name}</div>
  86. {/* 下边介绍 */}
  87. <div className="rightTxt">
  88. {info.description ? (
  89. <div
  90. className="model_txt"
  91. dangerouslySetInnerHTML={{ __html: info.description }}
  92. ></div>
  93. ) : (
  94. <div className="model_txt">暂无信息</div>
  95. )}
  96. <div className="model_floo">
  97. <div className="model_sortRow">
  98. 类别:
  99. <p>{info.dictTextureName ? info.dictTextureName : "(空)"}</p>
  100. </div>
  101. <div className="model_ageRow">
  102. 年代:
  103. <p>{info.dictAgeName ? info.dictAgeName : "(空)"}</p>
  104. </div>
  105. </div>
  106. {
  107. <div className="model_size">
  108. 尺寸:{info.sizeLength ? info.sizeLength : "(空)"}
  109. </div>
  110. }
  111. </div>
  112. {/* 底部按钮 */}
  113. <div className="flootBtnBox">
  114. <div
  115. className="flootRow flootRow1"
  116. onClick={() => modelChangeFu(1)}
  117. ></div>
  118. <div
  119. className="flootRow flootRow2"
  120. onClick={() => modelChangeFu(2)}
  121. ></div>
  122. {info.audioPath ? (
  123. <div className="flootRow flootRowM">
  124. {music ? (
  125. <img src={musicImgAc} alt="" onClick={() => musicPlayFu(false)} />
  126. ) : (
  127. <img src={musicImg} alt="" onClick={() => musicPlayFu(true)} />
  128. )}
  129. </div>
  130. ) : null}
  131. <div
  132. className="flootRow flootRow4"
  133. onClick={() => modelChangeFu(3)}
  134. ></div>
  135. <div
  136. className="flootRow flootRow3"
  137. onClick={() => closeModelFu()}
  138. ></div>
  139. </div>
  140. </div>
  141. );
  142. }