diff --git a/gui/src/components/WidgetsComponent.tsx b/gui/src/components/WidgetsComponent.tsx index be0912a6f6..0843871c23 100644 --- a/gui/src/components/WidgetsComponent.tsx +++ b/gui/src/components/WidgetsComponent.tsx @@ -1,4 +1,4 @@ -import { Localized } from '@fluent/react'; +import { Localized, useLocalization } from '@fluent/react'; import { BVHButton } from './BVHButton'; import { ClearDriftCompensationButton } from './ClearDriftCompensationButton'; import { TrackingPauseButton } from './TrackingPauseButton'; @@ -25,6 +25,7 @@ export function WidgetsComponent() { useState(false); const { trackers } = useAppContext(); const { statuses } = useStatusContext(); + const { l10n } = useLocalization(); const unprioritizedStatuses = useMemo( () => Object.values(statuses).filter((status) => !status.prioritized), [statuses] @@ -56,7 +57,7 @@ export function WidgetsComponent() { {unprioritizedStatuses.map((status) => ( diff --git a/gui/src/components/home/Home.tsx b/gui/src/components/home/Home.tsx index c6a3955543..3d553f6f98 100644 --- a/gui/src/components/home/Home.tsx +++ b/gui/src/components/home/Home.tsx @@ -14,6 +14,7 @@ import { import { useMemo } from 'react'; import { WarningBox } from '../commons/TipBox'; import { HeadsetIcon } from '../commons/icon/HeadsetIcon'; +import classNames from 'classnames'; const DONT_REPEAT_STATUSES = [StatusData.StatusTrackerReset]; @@ -48,14 +49,20 @@ export function Home() {
-
+
status.prioritized) + .length === 0 && 'hidden' + )} + > {filteredStatuses .filter(([, status]) => status.prioritized) .map(([, status]) => ( {`Warning, you should fix ${StatusData[status.dataType]}`} diff --git a/gui/src/hooks/status-system.ts b/gui/src/hooks/status-system.ts index 42de416ecf..4050224034 100644 --- a/gui/src/hooks/status-system.ts +++ b/gui/src/hooks/status-system.ts @@ -1,5 +1,6 @@ import { createContext, useEffect, useReducer, useContext } from 'react'; import { + BodyPart, RpcMessage, StatusData, StatusMessageT, @@ -15,6 +16,7 @@ import { import { useWebsocketAPI } from './websocket-api'; import { FluentVariable } from '@fluent/bundle'; import { FlatDeviceTracker } from './app'; +import { ReactLocalization } from '@fluent/react'; type StatusSystemStateAction = | StatusSystemStateFixedAction @@ -114,7 +116,8 @@ export function useStatusContext() { export function parseStatusToLocale( status: StatusMessageT, - trackers: FlatDeviceTracker[] | null + trackers: FlatDeviceTracker[] | null, + l10n: ReactLocalization ): Record { switch (status.dataType) { case StatusData.NONE: @@ -140,11 +143,21 @@ export function parseStatusToLocale( tracker?.trackerId?.trackerNum == data.trackerId.trackerNum && tracker?.trackerId?.deviceId?.id == data.trackerId.deviceId.id ); - if (typeof tracker?.tracker.info?.customName !== 'string') return {}; - - return { - trackerName: tracker.tracker.info?.customName, - }; + if (!tracker) + return { + trackerName: 'unknown', + }; + const name = tracker.tracker.info?.customName + ? tracker.tracker.info?.customName + : tracker.tracker.info?.bodyPart + ? l10n.getString('body_part-' + BodyPart[tracker.tracker.info?.bodyPart]) + : tracker.tracker.info?.displayName || 'unknown'; + if (typeof name !== 'string') { + return { + trackerName: new TextDecoder().decode(name), + }; + } + return { trackerName: name }; } } } @@ -166,6 +179,13 @@ export function trackerStatusRelated( data.trackerId?.deviceId?.id === tracker.trackerId?.deviceId?.id ); } + case StatusData.StatusTrackerError: { + const data = status.data as StatusTrackerErrorT; + return ( + data.trackerId?.trackerNum == tracker.trackerId?.trackerNum && + data.trackerId?.deviceId?.id === tracker.trackerId?.deviceId?.id + ); + } default: return false; }