FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
LogLevelSelect.tsx
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
3
4import {
5 FormControl,
6 InputLabel,
7 MenuItem,
8 Select,
9 type SelectChangeEvent,
10} from '@mui/material';
11import type { SxProps, Theme } from '@mui/material/styles';
12import { invoke } from '@tauri-apps/api/core';
13import { useEffect, useState } from 'react';
14import {
15 type ConfigurableFersLogLevel,
16 type FersLogLevel,
17 isConfigurableFersLogLevel,
18 LOG_LEVEL_OPTIONS,
19 useFersLogStore,
20} from '@/stores/fersLogStore';
21import { useScenarioStore } from '@/stores/scenarioStore';
22
23interface LogLevelSelectProps {
24 id: string;
25 label?: string;
26 sx?: SxProps<Theme>;
27}
28
29const logLevelLabel = (level: ConfigurableFersLogLevel) =>
30 level === 'OFF' ? 'OFF (disabled)' : level;
31
32export default function LogLevelSelect({
33 id,
34 label = 'FERS Log Level',
35 sx,
36}: LogLevelSelectProps) {
37 const logLevel = useFersLogStore((state) => state.logLevel);
38 const setLogLevel = useFersLogStore((state) => state.setLogLevel);
39 const showError = useScenarioStore((state) => state.showError);
40 const [isPending, setIsPending] = useState(false);
41 const labelId = `${id}-label`;
42
43 useEffect(() => {
44 let active = true;
45
46 invoke<FersLogLevel>('get_log_level')
47 .then((level) => {
48 if (active && isConfigurableFersLogLevel(level)) {
49 setLogLevel(level);
50 }
51 })
52 .catch((error: unknown) => {
53 if (active) {
54 showError(`Failed to get FERS log level: ${String(error)}`);
55 }
56 });
57
58 return () => {
59 active = false;
60 };
61 }, [setLogLevel, showError]);
62
63 const handleChange = async (
64 event: SelectChangeEvent<ConfigurableFersLogLevel>
65 ) => {
66 const nextLevel = event.target.value as ConfigurableFersLogLevel;
67 const previousLevel = useFersLogStore.getState().logLevel;
68
69 setLogLevel(nextLevel);
70 setIsPending(true);
71 try {
72 await invoke<void>('set_log_level', { level: nextLevel });
73 } catch (error) {
74 setLogLevel(previousLevel);
75 showError(`Failed to set FERS log level: ${String(error)}`);
76 } finally {
77 setIsPending(false);
78 }
79 };
80
81 return (
82 <FormControl size="small" sx={sx}>
83 <InputLabel id={labelId}>{label}</InputLabel>
84 <Select
85 labelId={labelId}
86 id={id}
87 value={logLevel}
88 label={label}
89 onChange={handleChange}
90 disabled={isPending}
91 >
92 {LOG_LEVEL_OPTIONS.map((level) => (
93 <MenuItem key={level} value={level}>
94 {logLevelLabel(level)}
95 </MenuItem>
96 ))}
97 </Select>
98 </FormControl>
99 );
100}