index.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* eslint-disable jsx-a11y/iframe-has-title */
  2. import React, { useMemo, useRef, useState } from "react";
  3. import styles from "./index.module.scss";
  4. import { baseUrl } from "@/index";
  5. import { InfoRowType } from "@/types";
  6. import history from "@/utils/history";
  7. import { SwapRightOutlined } from "@ant-design/icons";
  8. import classNames from "classnames";
  9. const iconArr = [
  10. { id: 2, name: "放大" },
  11. { id: 3, name: "缩小" },
  12. { id: 4, name: "复位" },
  13. ];
  14. type Props = {
  15. info: InfoRowType;
  16. type: "C2ArchitecInfo" | "D2BuildInfo";
  17. };
  18. function ArcOrBuildInfoM({ info, type }: Props) {
  19. // 模型的ref
  20. const ifrRefNew = useRef<any>(null);
  21. const modelChangeFu = (val: number) => {
  22. const dom = ifrRefNew.current;
  23. if (dom && dom.contentWindow && dom.contentWindow.webview) {
  24. if (val === 2) dom.contentWindow.webview.zoomIn(); // 放大
  25. else if (val === 3) dom.contentWindow.webview.zoomOut(); // 缩小
  26. else dom.contentWindow.webview.resetView(); // 复位
  27. }
  28. };
  29. // 文字介绍
  30. const [txtShow, setTxtShow] = useState(false);
  31. // 全屏
  32. const [full, setFull] = useState(false);
  33. // 是否没有大场景也没有构件
  34. const isFullBox = useMemo(() => {
  35. let flag = false;
  36. if (
  37. !info.code &&
  38. (!info.isBuild || (info.isBuild && info.isBuild.length === 0))
  39. ) {
  40. flag = true;
  41. }
  42. return flag;
  43. }, [info.code, info.isBuild]);
  44. return (
  45. <div
  46. className={styles.ArcOrBuildInfoM}
  47. style={{ backgroundImage: `url(${baseUrl}/C2ArchitecInfo/bg2.jpg)` }}
  48. >
  49. {/* 返回按钮 */}
  50. <div className="AMback" onClick={() => history.go(-1)} hidden={full}>
  51. <img src={`${baseUrl}/C2ArchitecInfo/icon_back.png`} alt="" />
  52. </div>
  53. {/* 主体模型 */}
  54. <div
  55. className={classNames(
  56. "AMtop",
  57. full ? "AMtopFull" : "",
  58. isFullBox ? "AMtopFull2" : ""
  59. )}
  60. >
  61. {/* 名字 */}
  62. <div className="AMtopName">{info.name}</div>
  63. {/* 模型 */}
  64. <iframe
  65. ref={ifrRefNew}
  66. src={`/model.html?m=${info.id}&n=new&r=${type}`}
  67. frameBorder="0"
  68. ></iframe>
  69. {/* 右侧按钮 */}
  70. <div className="AMtopBtn">
  71. {/* 打开介绍 */}
  72. <div
  73. hidden={!info.txt}
  74. className={classNames(
  75. "AMtopBtnRow AMtopBtnRow1",
  76. txtShow ? "AMtopBtnRow1Ac" : ""
  77. )}
  78. onClick={() => setTxtShow(!txtShow)}
  79. ></div>
  80. {iconArr.map((v) => (
  81. <div
  82. onClick={() => modelChangeFu(v.id)}
  83. className={`AMtopBtnRow AMtopBtnRow${v.id}`}
  84. key={v.id}
  85. ></div>
  86. ))}
  87. {/* 全屏 */}
  88. <div
  89. hidden={isFullBox}
  90. onClick={() => {
  91. const dom = ifrRefNew.current;
  92. if (dom && dom.contentWindow && dom.contentWindow.modelLoding)
  93. setFull(!full);
  94. }}
  95. className={classNames(
  96. "AMtopBtnRow AMtopBtnRow5",
  97. full ? "AMtopBtnRow5Ac" : ""
  98. )}
  99. ></div>
  100. </div>
  101. </div>
  102. {/* 底部按钮 */}
  103. <div className="AMbtn" hidden={full}>
  104. {info.isBuild ? (
  105. <>
  106. {info.isBuild.map((v) => (
  107. <div
  108. className="AMbtnRow"
  109. key={v.id}
  110. onClick={() => history.push(`/buildInfo?id=${v.id}`)}
  111. >
  112. <div>
  113. {v.name[0]}&emsp;{v.name[1]}
  114. </div>
  115. </div>
  116. ))}
  117. </>
  118. ) : null}
  119. {/* 去大场景 */}
  120. {type === "C2ArchitecInfo" && info.code ? (
  121. <div
  122. className="AMtoVr"
  123. onClick={() => history.push(`/scene?id=${info.code}`)}
  124. >
  125. 室内VR
  126. <p>
  127. <SwapRightOutlined />
  128. </p>
  129. </div>
  130. ) : null}
  131. </div>
  132. {/* 文字介绍 */}
  133. <div
  134. className={classNames("AMtxt", txtShow ? "AMtxtAc" : "")}
  135. style={{ backgroundImage: `url(${baseUrl}/C2ArchitecInfo/tab.png)` }}
  136. >
  137. <h3>
  138. 简介 {/* 右侧关闭按钮 */}
  139. <img
  140. onClick={() => setTxtShow(false)}
  141. className="AMtxtClose"
  142. src={`${baseUrl}/C2ArchitecInfo/icon_cancel.png`}
  143. alt=""
  144. />
  145. </h3>
  146. <div className="AMtxtLine">
  147. <img src={`${baseUrl}/C1Architec/line.png`} alt="" />
  148. </div>
  149. <div className="AMtxtCon">
  150. <div
  151. dangerouslySetInnerHTML={{
  152. __html: info.txt ? info.txt : "暂无介绍",
  153. }}
  154. ></div>
  155. </div>
  156. </div>
  157. </div>
  158. );
  159. }
  160. const MemoArcOrBuildInfoM = React.memo(ArcOrBuildInfoM);
  161. export default MemoArcOrBuildInfoM;