You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
5.8 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. import icon_usb from "../assets/icon_usb.svg";
  2. import icon_bluetooth from "../assets/icon_bluetooth.svg";
  3. import icon_charging from "../assets/icon-charging.svg";
  4. import icon_avatar from "../assets/icon_avatar.svg";
  5. import icon_logout from "../assets/icon_logout.svg";
  6. import {
  7. UndoOutlined
  8. } from '@ant-design/icons';
  9. import check_mark from "../assets/check_mark.svg";
  10. import { useState, useEffect } from "react";
  11. import { Dropdown, MenuProps, message, Popover } from "antd";
  12. import { logout } from "../services/user/user";
  13. import { useNavigate } from "react-router";
  14. import { useAppDispatch, useAppSelector } from "../utils/hooks";
  15. import { updateUser } from "../store/features/contextSlice";
  16. import "./bluetooth.scss";
  17. import { update } from "../services/ktj/org";
  18. export default function Header() {
  19. const navigate = useNavigate();
  20. const dispatch = useAppDispatch();
  21. const deviceInfo = useAppSelector(store => store.context.device);
  22. // const deviceState = useAppSelector(store => store.context.device);
  23. const userInfo = useAppSelector(store => store.context.user.loginUser);
  24. const [power, setPower] = useState(deviceInfo.power.toFixed())//deviceInfo.power.toFixed()
  25. const [powerColor, setPowerColor] = useState('bluetooth-battery')
  26. //获取当前websocet的状态
  27. const showBlueImg = () => {
  28. if (deviceInfo.isConnected && deviceInfo.connectedType === "BLE_CHANNEL") {
  29. return (
  30. <Popover content={getBtBlueContent()} title="" trigger="click">
  31. <section className="bg-white rounded-md h-9 w-10 flex justify-center items-center mr-3">
  32. <img src={icon_bluetooth} alt="" className="h-6" />
  33. </section>
  34. </Popover>
  35. );
  36. }
  37. return null;
  38. };
  39. const showUsbImg = () => {
  40. if (deviceInfo.isConnected && deviceInfo.connectedType === "UART_CHANNEL") {
  41. return (
  42. <Popover content={getBtContent()} title="" trigger="click">
  43. <section className="bg-white rounded-md h-9 w-10 flex justify-center items-center mr-3">
  44. <img src={icon_usb} alt="" className="h-6" />
  45. </section>
  46. </Popover>
  47. );
  48. }
  49. return null;
  50. };
  51. useEffect(() => {
  52. if (userInfo.nickname || userInfo.account) {
  53. let name = userInfo.nickname || userInfo.account
  54. setNickname(name);
  55. } else {
  56. const user = localStorage.getItem("user");
  57. if (user) {
  58. let userData = JSON.parse(user || "");
  59. setNickname(userData.nickname || userData.account);
  60. }
  61. }
  62. }, [userInfo.nickname, userInfo.account]);
  63. useEffect(() => {
  64. if(deviceInfo.power > 20){
  65. setPowerColor('bluetooth-battery')
  66. }
  67. if(deviceInfo.power <= 20){
  68. setPowerColor('bluetooth-battery-red')
  69. }
  70. if(deviceInfo.flag === 1){
  71. setPowerColor('bluetooth-battery-green')
  72. }
  73. }, [deviceInfo.power])
  74. //同步科天健基础数据
  75. const onSyncKTJData = () => {
  76. update()
  77. }
  78. const [messageApi, contextHolder] = message.useMessage();
  79. const [nickname, setNickname] = useState<string>();
  80. const items: MenuProps["items"] = [
  81. {
  82. key: "1",
  83. icon: <UndoOutlined style={{color:"rgb(62 99 203)",fontSize:"18px"}}/>,
  84. label: "同步数据",
  85. onClick: () => onSyncKTJData(),
  86. },
  87. {
  88. key: "2",
  89. label: "退出登录",
  90. icon: <img src={icon_logout} alt="icon" className="w-5" />,
  91. onClick: () => {
  92. logout({}).then(res => {
  93. if (res.status !== 0) {
  94. messageApi.error(res.data.info);
  95. } else {
  96. localStorage.setItem("user", "");
  97. dispatch(
  98. updateUser({
  99. loginFlag: false,
  100. loginUser: {},
  101. })
  102. );
  103. navigate("/login");
  104. }
  105. });
  106. },
  107. },
  108. ];
  109. const getBtBlueContent = () => {
  110. return (
  111. <div>
  112. <div>
  113. <div className="bluetooth_c">
  114. <img src={check_mark} alt="" className="ext-base ml-2 h-4" />
  115. <div className="ml-[10px]"></div>
  116. </div>
  117. <div className="pl-[15px]">
  118. <div className="mt-[1rem] ml-[1.6rem]">sn码{deviceInfo.sn}</div>
  119. </div>
  120. </div>
  121. </div>
  122. );
  123. };
  124. //设备已连接
  125. const getBtContent = () => {
  126. return (
  127. <div>
  128. <div>
  129. <div className="bluetooth_c">
  130. <img src={check_mark} alt="" className="ext-base ml-2 h-4" />
  131. <div className="ml-[10px]"></div>
  132. </div>
  133. <div className="pl-[15px]">
  134. <div className="mt-[1rem] ml-[1.6rem]">sn码{deviceInfo.sn}</div>
  135. </div>
  136. </div>
  137. </div>
  138. );
  139. };
  140. return (
  141. <>
  142. {contextHolder}
  143. <div className="bg-[--bgColor] h-full flex justify-end items-center">
  144. {deviceInfo.isConnected && (
  145. <>
  146. <section className=" rounded-md h-9 mr-4 flex items-center bg-white gap-2 pl-4">
  147. <span className="w-[94px]">{deviceInfo.temperature.toFixed(1)} </span>
  148. <span className="w-[120px]">X轴倾斜{deviceInfo.inclinatorX}</span>
  149. <span className="w-[120px]">Y轴倾斜{deviceInfo.inclinatorY}</span>
  150. </section>
  151. <section className="bg-white rounded-md h-9 w-12 relative mr-3 flex justify-center items-center">
  152. <div className={`${powerColor} flex justify-center items-center`}>
  153. <div className="power-process" style={{width: `${power}%`}}>
  154. <div style={{"position": "relative","top": "-1.6rem"}}>{power}%</div>
  155. </div>
  156. {deviceInfo.flag === 1 &&
  157. <div className="power-charging">
  158. <img
  159. src={icon_charging}
  160. width="15"
  161. alt=""
  162. />
  163. </div>
  164. }
  165. {/* <div className='power-value'>{power}%</div> */}
  166. </div>
  167. {/* <p className="text-primary text-xs">{deviceInfo.power.toFixed()}%</p> */}
  168. </section>
  169. </>
  170. )}
  171. {showBlueImg()}
  172. {showUsbImg()}
  173. <div className="mr-8 flex items-center min-w-[5rem]">
  174. <Dropdown menu={{ items }} trigger={["click"]}>
  175. <section className="flex items-center">
  176. <img src={icon_avatar} alt="" className="h-8" />
  177. <p className="text-base ml-2">{nickname || "未登录"}</p>
  178. </section>
  179. </Dropdown>
  180. </div>
  181. </div>
  182. </>
  183. );
  184. }