From f418231b6b2f5e030a0d2dcc390c314602b1f740 Mon Sep 17 00:00:00 2001
From: Anton Tananaev <anton@traccar.org>
Date: Sat, 6 Apr 2024 09:22:10 -0700
Subject: Move modern to the top

---
 src/settings/components/BaseCommandView.jsx | 79 +++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)
 create mode 100644 src/settings/components/BaseCommandView.jsx

(limited to 'src/settings/components/BaseCommandView.jsx')

diff --git a/src/settings/components/BaseCommandView.jsx b/src/settings/components/BaseCommandView.jsx
new file mode 100644
index 00000000..bb70c3b9
--- /dev/null
+++ b/src/settings/components/BaseCommandView.jsx
@@ -0,0 +1,79 @@
+import React, { useEffect, useState } from 'react';
+import { useSelector } from 'react-redux';
+import {
+  TextField, FormControlLabel, Checkbox,
+} from '@mui/material';
+import { useTranslation } from '../../common/components/LocalizationProvider';
+import SelectField from '../../common/components/SelectField';
+import { prefixString } from '../../common/util/stringUtils';
+import useCommandAttributes from '../../common/attributes/useCommandAttributes';
+
+const BaseCommandView = ({ deviceId, item, setItem }) => {
+  const t = useTranslation();
+
+  const textEnabled = useSelector((state) => state.session.server.textEnabled);
+
+  const availableAttributes = useCommandAttributes(t);
+
+  const [attributes, setAttributes] = useState([]);
+
+  useEffect(() => {
+    if (item && item.type) {
+      setAttributes(availableAttributes[item.type] || []);
+    } else {
+      setAttributes([]);
+    }
+  }, [availableAttributes, item]);
+
+  return (
+    <>
+      <SelectField
+        value={item.type}
+        onChange={(e) => setItem({ ...item, type: e.target.value, attributes: {} })}
+        endpoint={deviceId ? `/api/commands/types?${new URLSearchParams({ deviceId }).toString()}` : '/api/commands/types'}
+        keyGetter={(it) => it.type}
+        titleGetter={(it) => t(prefixString('command', it.type))}
+        label={t('sharedType')}
+      />
+      {attributes.map(({ key, name, type }) => {
+        if (type === 'boolean') {
+          return (
+            <FormControlLabel
+              control={(
+                <Checkbox
+                  checked={item.attributes[key]}
+                  onChange={(e) => {
+                    const updateItem = { ...item, attributes: { ...item.attributes } };
+                    updateItem.attributes[key] = e.target.checked;
+                    setItem(updateItem);
+                  }}
+                />
+              )}
+              label={name}
+            />
+          );
+        }
+        return (
+          <TextField
+            type={type === 'number' ? 'number' : 'text'}
+            value={item.attributes[key]}
+            onChange={(e) => {
+              const updateItem = { ...item, attributes: { ...item.attributes } };
+              updateItem.attributes[key] = type === 'number' ? Number(e.target.value) : e.target.value;
+              setItem(updateItem);
+            }}
+            label={name}
+          />
+        );
+      })}
+      {textEnabled && (
+        <FormControlLabel
+          control={<Checkbox checked={item.textChannel} onChange={(event) => setItem({ ...item, textChannel: event.target.checked })} />}
+          label={t('commandSendSms')}
+        />
+      )}
+    </>
+  );
+};
+
+export default BaseCommandView;
-- 
cgit v1.2.3

