index.tsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /* eslint-disable jsx-a11y/iframe-has-title */
  2. import React, { useEffect, useRef, useState } from "react";
  3. import styles from "./index.module.scss";
  4. import { baseUrl } from "@/index";
  5. import history, { modelUrl } from "@/utils/history";
  6. import classNames from "classnames";
  7. import { InfoRowType } from "@/types";
  8. import { getUrlHashFu } from "@/utils/data";
  9. import { useLocation } from "react-router-dom";
  10. const iconArr = [
  11. { id: 2, name: "放大" },
  12. { id: 3, name: "缩小" },
  13. { id: 4, name: "复位" },
  14. ];
  15. type Props = {
  16. info: InfoRowType;
  17. type: "C2ArchitecInfo" | "D2BuildInfo";
  18. };
  19. function ArcOrBuildInfo({ info, type }: Props) {
  20. // 嵌套 四维看看 iframe 返回的问题
  21. const location = useLocation();
  22. const [back2, setBack2] = useState("");
  23. useEffect(() => {
  24. const query = new URLSearchParams(location.search);
  25. const back2 = query.get("back2");
  26. setBack2(back2!);
  27. setBack2(back2!);
  28. }, [location.search]);
  29. // 模型的ref
  30. const ifrRefNew = useRef<any>(null);
  31. const modelChangeFu = (val: number) => {
  32. const dom = ifrRefNew.current;
  33. if (dom && dom.contentWindow && dom.contentWindow.webview) {
  34. if (val === 2) dom.contentWindow.webview.zoomIn(); // 放大
  35. else if (val === 3) dom.contentWindow.webview.zoomOut(); // 缩小
  36. else dom.contentWindow.webview.resetView(); // 复位
  37. }
  38. };
  39. // 点击对比
  40. const [oldShow, setOldShow] = useState(false);
  41. useEffect(() => {
  42. if (oldShow) setOldFlag(true);
  43. }, [oldShow]);
  44. const [oldFlag, setOldFlag] = useState(false);
  45. // 点击全屏
  46. const [full, setFull] = useState(false);
  47. return (
  48. <div
  49. className={styles.ArcOrBuildInfo}
  50. style={{ backgroundImage: `url(${baseUrl}/C2ArchitecInfo/pc/bg.jpg)` }}
  51. >
  52. {/* 左下方的按钮 */}
  53. <div className="C2leftBtn">
  54. <div
  55. className="C2lRow"
  56. onClick={() => (back2 ? history.push(back2) : history.go(-1))}
  57. >
  58. 返回
  59. </div>
  60. {info.isBuild ? (
  61. <>
  62. {info.isBuild.map((v) => (
  63. <div
  64. className="C2lRow"
  65. key={v.id}
  66. onClick={() => history.push(`/buildInfo?id=${v.id}`)}
  67. >
  68. {v.name}
  69. </div>
  70. ))}
  71. </>
  72. ) : null}
  73. </div>
  74. {/* 左边信息 */}
  75. <div className="C2left">
  76. <div className="C2left1">{info.name}</div>
  77. <div
  78. className="C2left2"
  79. dangerouslySetInnerHTML={{ __html: info.txt }}
  80. ></div>
  81. </div>
  82. {/* 右边模型 */}
  83. <div
  84. className={classNames("C2right", full ? "C2rightAc" : "")}
  85. style={{
  86. backgroundImage: full
  87. ? `url(${baseUrl}/C2ArchitecInfo/pc/bg.jpg)`
  88. : "",
  89. }}
  90. >
  91. <iframe
  92. ref={ifrRefNew}
  93. src={`${modelUrl}model.html?m=${info.id}&n=new&r=${type}`}
  94. frameBorder="0"
  95. ></iframe>
  96. {/* VR漫游按钮 */}
  97. {type === "C2ArchitecInfo" && info.code ? (
  98. <div
  99. hidden={full}
  100. className="C2rToScene"
  101. onClick={() => getUrlHashFu(info.code, "scene")}
  102. >
  103. VR漫游
  104. </div>
  105. ) : null}
  106. {/* 右侧的功能按钮 */}
  107. <div className="C2rBtn">
  108. {/* 是否有对比 */}
  109. {info.isOld ? (
  110. <div
  111. hidden={full}
  112. onClick={() => setOldShow(!oldShow)}
  113. className={classNames(
  114. "C2rBtnRow",
  115. "C2rBtnRow1",
  116. oldShow ? "C2rBtnRow1Ac" : ""
  117. )}
  118. title={oldShow ? "退出对比" : "对比"}
  119. ></div>
  120. ) : null}
  121. {iconArr.map((v) => (
  122. <div
  123. onClick={() => modelChangeFu(v.id)}
  124. className={classNames("C2rBtnRow", "C2rBtnRow" + v.id)}
  125. key={v.id}
  126. title={v.name}
  127. ></div>
  128. ))}
  129. {/* 全屏 */}
  130. <div
  131. onClick={() => {
  132. const dom = ifrRefNew.current;
  133. if (dom && dom.contentWindow && dom.contentWindow.modelLoding)
  134. setFull(!full);
  135. }}
  136. className={classNames(
  137. "C2rBtnRow",
  138. "C2rBtnRow5",
  139. full ? "C2rBtnRow5Ac" : ""
  140. )}
  141. title={full ? "退出全屏" : "全屏"}
  142. ></div>
  143. </div>
  144. </div>
  145. {/* 点击对比打开的元素 */}
  146. {oldFlag ? (
  147. <div
  148. className={classNames(
  149. "C2openOld",
  150. oldShow ? "C2openOldShow" : "",
  151. info.isOld && info.isOld.loc === "横" ? "C2openOldShu" : ""
  152. )}
  153. >
  154. <div className="C2openOldMain">
  155. {info.isOld ? (
  156. <>
  157. <div className="C2openTit">{info.isOld.name}</div>
  158. {/* 线 */}
  159. <div className="C2openLine"></div>
  160. {/* 模型或者图片 */}
  161. {info.isOld.type === "model" ? (
  162. <iframe
  163. src={`${modelUrl}/model.html?m=${info.id}&n=old&r=${type}`}
  164. frameBorder="0"
  165. ></iframe>
  166. ) : (
  167. <img src={`${baseUrl}/${type}/${info.id}/old.png`} alt="" />
  168. )}
  169. </>
  170. ) : null}
  171. </div>
  172. <div className="C2openClose" onClick={() => setOldShow(false)}></div>
  173. </div>
  174. ) : null}
  175. </div>
  176. );
  177. }
  178. const MemoArcOrBuildInfo = React.memo(ArcOrBuildInfo);
  179. export default MemoArcOrBuildInfo;