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
193 lines
5.8 KiB
import icon_usb from "../assets/icon_usb.svg";
|
|
import icon_bluetooth from "../assets/icon_bluetooth.svg";
|
|
import icon_charging from "../assets/icon-charging.svg";
|
|
import icon_avatar from "../assets/icon_avatar.svg";
|
|
import icon_logout from "../assets/icon_logout.svg";
|
|
import {
|
|
UndoOutlined
|
|
} from '@ant-design/icons';
|
|
import check_mark from "../assets/check_mark.svg";
|
|
import { useState, useEffect } from "react";
|
|
import { Dropdown, MenuProps, message, Popover } from "antd";
|
|
import { logout } from "../services/user/user";
|
|
import { useNavigate } from "react-router";
|
|
import { useAppDispatch, useAppSelector } from "../utils/hooks";
|
|
import { updateUser } from "../store/features/contextSlice";
|
|
import "./bluetooth.scss";
|
|
import { update } from "../services/ktj/org";
|
|
export default function Header() {
|
|
const navigate = useNavigate();
|
|
const dispatch = useAppDispatch();
|
|
const deviceInfo = useAppSelector(store => store.context.device);
|
|
// const deviceState = useAppSelector(store => store.context.device);
|
|
const userInfo = useAppSelector(store => store.context.user.loginUser);
|
|
const [power, setPower] = useState(deviceInfo.power.toFixed())//deviceInfo.power.toFixed()
|
|
const [powerColor, setPowerColor] = useState('bluetooth-battery')
|
|
//获取当前websocet的状态
|
|
|
|
const showBlueImg = () => {
|
|
if (deviceInfo.isConnected && deviceInfo.connectedType === "BLE_CHANNEL") {
|
|
return (
|
|
<Popover content={getBtBlueContent()} title="" trigger="click">
|
|
<section className="bg-white rounded-md h-9 w-10 flex justify-center items-center mr-3">
|
|
<img src={icon_bluetooth} alt="" className="h-6" />
|
|
</section>
|
|
</Popover>
|
|
);
|
|
}
|
|
return null;
|
|
};
|
|
const showUsbImg = () => {
|
|
if (deviceInfo.isConnected && deviceInfo.connectedType === "UART_CHANNEL") {
|
|
return (
|
|
<Popover content={getBtContent()} title="" trigger="click">
|
|
<section className="bg-white rounded-md h-9 w-10 flex justify-center items-center mr-3">
|
|
<img src={icon_usb} alt="" className="h-6" />
|
|
</section>
|
|
</Popover>
|
|
);
|
|
}
|
|
return null;
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (userInfo.nickname || userInfo.account) {
|
|
let name = userInfo.nickname || userInfo.account
|
|
setNickname(name);
|
|
} else {
|
|
const user = localStorage.getItem("user");
|
|
if (user) {
|
|
let userData = JSON.parse(user || "");
|
|
setNickname(userData.nickname || userData.account);
|
|
}
|
|
}
|
|
}, [userInfo.nickname, userInfo.account]);
|
|
|
|
useEffect(() => {
|
|
if(deviceInfo.power > 20){
|
|
setPowerColor('bluetooth-battery')
|
|
}
|
|
if(deviceInfo.power <= 20){
|
|
setPowerColor('bluetooth-battery-red')
|
|
}
|
|
if(deviceInfo.flag === 1){
|
|
setPowerColor('bluetooth-battery-green')
|
|
}
|
|
}, [deviceInfo.power])
|
|
|
|
//同步科天健基础数据
|
|
const onSyncKTJData = () => {
|
|
update()
|
|
}
|
|
|
|
const [messageApi, contextHolder] = message.useMessage();
|
|
const [nickname, setNickname] = useState<string>();
|
|
const items: MenuProps["items"] = [
|
|
{
|
|
key: "1",
|
|
icon: <UndoOutlined style={{color:"rgb(62 99 203)",fontSize:"18px"}}/>,
|
|
label: "同步数据",
|
|
onClick: () => onSyncKTJData(),
|
|
},
|
|
{
|
|
key: "2",
|
|
label: "退出登录",
|
|
icon: <img src={icon_logout} alt="icon" className="w-5" />,
|
|
onClick: () => {
|
|
logout({}).then(res => {
|
|
if (res.status !== 0) {
|
|
messageApi.error(res.data.info);
|
|
} else {
|
|
localStorage.setItem("user", "");
|
|
dispatch(
|
|
updateUser({
|
|
loginFlag: false,
|
|
loginUser: {},
|
|
})
|
|
);
|
|
navigate("/login");
|
|
}
|
|
});
|
|
},
|
|
},
|
|
];
|
|
|
|
const getBtBlueContent = () => {
|
|
return (
|
|
<div>
|
|
<div>
|
|
<div className="bluetooth_c">
|
|
<img src={check_mark} alt="" className="ext-base ml-2 h-4" />
|
|
<div className="ml-[10px]">蓝牙已连接</div>
|
|
</div>
|
|
<div className="pl-[15px]">
|
|
<div className="mt-[1rem] ml-[1.6rem]">sn码:{deviceInfo.sn}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
//设备已连接
|
|
const getBtContent = () => {
|
|
return (
|
|
<div>
|
|
<div>
|
|
<div className="bluetooth_c">
|
|
<img src={check_mark} alt="" className="ext-base ml-2 h-4" />
|
|
<div className="ml-[10px]">设备已连接</div>
|
|
</div>
|
|
<div className="pl-[15px]">
|
|
<div className="mt-[1rem] ml-[1.6rem]">sn码:{deviceInfo.sn}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
return (
|
|
<>
|
|
{contextHolder}
|
|
<div className="bg-[--bgColor] h-full flex justify-end items-center">
|
|
{deviceInfo.isConnected && (
|
|
<>
|
|
<section className=" rounded-md h-9 mr-4 flex items-center bg-white gap-2 pl-4">
|
|
<span className="w-[94px]">温度:{deviceInfo.temperature.toFixed(1)}℃ </span>
|
|
<span className="w-[120px]">X轴倾斜:{deviceInfo.inclinatorX}</span>
|
|
<span className="w-[120px]">Y轴倾斜:{deviceInfo.inclinatorY}</span>
|
|
</section>
|
|
<section className="bg-white rounded-md h-9 w-12 relative mr-3 flex justify-center items-center">
|
|
|
|
<div className={`${powerColor} flex justify-center items-center`}>
|
|
<div className="power-process" style={{width: `${power}%`}}>
|
|
<div style={{"position": "relative","top": "-1.6rem"}}>{power}%</div>
|
|
</div>
|
|
{deviceInfo.flag === 1 &&
|
|
<div className="power-charging">
|
|
<img
|
|
src={icon_charging}
|
|
width="15"
|
|
alt=""
|
|
/>
|
|
</div>
|
|
}
|
|
{/* <div className='power-value'>{power}%</div> */}
|
|
</div>
|
|
{/* <p className="text-primary text-xs">{deviceInfo.power.toFixed()}%</p> */}
|
|
</section>
|
|
</>
|
|
)}
|
|
{showBlueImg()}
|
|
{showUsbImg()}
|
|
<div className="mr-8 flex items-center min-w-[5rem]">
|
|
<Dropdown menu={{ items }} trigger={["click"]}>
|
|
<section className="flex items-center">
|
|
<img src={icon_avatar} alt="" className="h-8" />
|
|
<p className="text-base ml-2">{nickname || "未登录"}</p>
|
|
</section>
|
|
</Dropdown>
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|