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.

123 lines
3.6 KiB

5 months ago
5 months ago
5 months ago
4 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 React, { useEffect } from 'react';
  2. import { Outlet, useLocation, useNavigate } from 'react-router';
  3. import { SafeArea, TabBar } from 'antd-mobile';
  4. import icon_1_s from './assets/tabIcon/icon_tab1_s.svg';
  5. import icon_1_u from './assets/tabIcon/icon_tab1_u.svg';
  6. import icon_2_s from './assets/tabIcon/icon_tab2_s.svg';
  7. import icon_2_u from './assets/tabIcon/icon_tab2_u.svg';
  8. import icon_3_s from './assets/tabIcon/icon_tab3_s.svg';
  9. import icon_3_u from './assets/tabIcon/icon_tab3_u.svg';
  10. import icon_4_s from './assets/tabIcon/icon_tab4_s.svg';
  11. import icon_4_u from './assets/tabIcon/icon_tab4_u.svg';
  12. import { appWebview, bridgeOb, emitBridgeEvent, registerBridgeFunc } from './utils/bridge';
  13. import { useAppDispatch, useAppSelector } from './utils/hooks';
  14. import { addNewPoint, updateTaskState } from './store/features/measureSlice';
  15. import { updateBleList, updateDevice, updateSyncProgress } from './store/features/contextSlice';
  16. import { createWebSocket, sharedWsUrl } from './services/socket';
  17. import { fetchRailTypes } from './store/features/baseData';
  18. const BottomBar = () => {
  19. const navigate = useNavigate();
  20. const location = useLocation();
  21. const { pathname } = location;
  22. const setRouteActive = (value: string) => {
  23. navigate(value, { replace: true });
  24. };
  25. const tabs = [
  26. {
  27. key: '/home/measure',
  28. title: '测量',
  29. icon_s: icon_1_s,
  30. icon_n: icon_1_u,
  31. },
  32. // {
  33. // key: '/home/setting',
  34. // title: '设置',
  35. // icon_s: icon_2_s,
  36. // icon_n: icon_2_u,
  37. // },
  38. {
  39. key: '/home/bluetooth',
  40. title: '蓝牙',
  41. icon_s: icon_3_s,
  42. icon_n: icon_3_u,
  43. },
  44. {
  45. key: '/home/mine',
  46. title: '我的',
  47. icon_s: icon_4_s,
  48. icon_n: icon_4_u,
  49. },
  50. ];
  51. return (
  52. <TabBar activeKey={pathname} onChange={(value) => setRouteActive(value)}>
  53. {tabs.map((item) => (
  54. <TabBar.Item
  55. key={item.key}
  56. icon={(active: boolean) =>
  57. active ? <img src={item.icon_s} alt="icon" /> : <img src={item.icon_n} alt="icon" />
  58. }
  59. title={item.title}
  60. />
  61. ))}
  62. </TabBar>
  63. );
  64. };
  65. function App() {
  66. const dispatch = useAppDispatch();
  67. const baseState = useAppSelector((state) => state.baseData);
  68. if (baseState.railTypes.length === 0) {
  69. dispatch(fetchRailTypes());
  70. }
  71. useEffect(() => {
  72. const subscription = bridgeOb.subscribe((datagram) => {
  73. if (datagram.type === 'measure-event') {
  74. dispatch(updateTaskState(datagram.data));
  75. } else if (datagram.type === 'measure-point') {
  76. dispatch(addNewPoint(datagram.data));
  77. } else if (datagram.type === 'peripheral-status') {
  78. dispatch(updateDevice(datagram.data));
  79. } else if (datagram.type === 'ble-list') {
  80. dispatch(updateBleList(datagram.data));
  81. } else if (datagram.type === 'sync-progress') {
  82. dispatch(updateSyncProgress(datagram.data));
  83. }
  84. });
  85. return () => subscription.unsubscribe();
  86. }, [dispatch]);
  87. useEffect(() => {
  88. // registerBridgeFunc();
  89. if (appWebview) {
  90. registerBridgeFunc();
  91. } else {
  92. //连接websocket
  93. const wsClient = createWebSocket(sharedWsUrl);
  94. const subscription = wsClient.dataOb.subscribe((data) => {
  95. emitBridgeEvent(data);
  96. });
  97. wsClient.connect();
  98. return () => subscription.unsubscribe();
  99. }
  100. }, []);
  101. return (
  102. <div className="App">
  103. <SafeArea position="top" />
  104. <div>
  105. <Outlet />
  106. </div>
  107. <div className="border-t border-[#ebebeb]">
  108. <BottomBar />
  109. </div>
  110. <SafeArea position="bottom" />
  111. </div>
  112. );
  113. }
  114. export default App;