Uniformize success/error alerts across forms
This commit is contained in:
13
src/components/Alert.jsx
Normal file
13
src/components/Alert.jsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
export default function Alert({ type = 'info', children }) {
|
||||||
|
const base = 'p-2 mb-2 rounded';
|
||||||
|
const types = {
|
||||||
|
success: 'bg-green-600 text-white',
|
||||||
|
error: 'bg-red-600 text-white',
|
||||||
|
info: 'bg-gray-200',
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<div className={`${base} ${types[type] || types.info}`}>{children}</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { get, post } from '../api';
|
import { get, post } from '../api';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
const Connectivity = () => {
|
const Connectivity = () => {
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
@@ -45,20 +46,20 @@ const Connectivity = () => {
|
|||||||
// Salvar configuração Wi-Fi
|
// Salvar configuração Wi-Fi
|
||||||
const saveWifi = async () => {
|
const saveWifi = async () => {
|
||||||
try {
|
try {
|
||||||
await post('/api/v1/config/wifi', wifiConfig); // Envia as configurações de Wi-Fi para o servidor
|
await post('/api/v1/config/wifi', wifiConfig);
|
||||||
setWifiMsg('Configuração Wi-Fi gravada!');
|
setWifiMsg('Alterações guardadas com sucesso!');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setWifiMsg('Erro ao gravar Wi-Fi.');
|
setWifiMsg('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Salvar configuração MQTT
|
// Salvar configuração MQTT
|
||||||
const saveMqtt = async () => {
|
const saveMqtt = async () => {
|
||||||
try {
|
try {
|
||||||
await post('/api/v1/config/mqtt', mqttConfig); // Envia as configurações de MQTT para o servidor
|
await post('/api/v1/config/mqtt', mqttConfig);
|
||||||
setMqttMsg('Configuração MQTT gravada!');
|
setMqttMsg('Alterações guardadas com sucesso!');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setMqttMsg('Erro ao gravar MQTT.');
|
setMqttMsg('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ const Connectivity = () => {
|
|||||||
|
|
||||||
|
|
||||||
<h2 className="text-xl font-semibold mt-4">Configuração Wi-Fi</h2>
|
<h2 className="text-xl font-semibold mt-4">Configuração Wi-Fi</h2>
|
||||||
{wifiMsg && <div className="p-2 bg-gray-200 rounded mb-2">{wifiMsg}</div>}
|
{wifiMsg && <Alert type={wifiMsg.startsWith('Erro') ? 'error' : 'success'}>{wifiMsg}</Alert>}
|
||||||
<form className="flex flex-col gap-4" onSubmit={e => { e.preventDefault(); saveWifi(); }}>
|
<form className="flex flex-col gap-4" onSubmit={e => { e.preventDefault(); saveWifi(); }}>
|
||||||
|
|
||||||
|
|
||||||
@@ -113,7 +114,7 @@ const Connectivity = () => {
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<h2 className="text-xl font-semibold mt-6">Configuração MQTT</h2>
|
<h2 className="text-xl font-semibold mt-6">Configuração MQTT</h2>
|
||||||
{mqttMsg && <div className="p-2 bg-gray-200 rounded mb-2">{mqttMsg}</div>}
|
{mqttMsg && <Alert type={mqttMsg.startsWith('Erro') ? 'error' : 'success'}>{mqttMsg}</Alert>}
|
||||||
<form className="flex flex-col gap-4" onSubmit={e => { e.preventDefault(); saveMqtt(); }}>
|
<form className="flex flex-col gap-4" onSubmit={e => { e.preventDefault(); saveMqtt(); }}>
|
||||||
<div>
|
<div>
|
||||||
<label className="flex items-center gap-2">
|
<label className="flex items-center gap-2">
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { get, post } from '../api';
|
import { get, post } from '../api';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
export default function ElectricalNetwork() {
|
export default function ElectricalNetwork() {
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
@@ -40,17 +41,17 @@ export default function ElectricalNetwork() {
|
|||||||
try {
|
try {
|
||||||
const body = { monitor, alerts, security, loadBalancing, solar };
|
const body = { monitor, alerts, security, loadBalancing, solar };
|
||||||
await post('/api/v1/config/electrical', body);
|
await post('/api/v1/config/electrical', body);
|
||||||
setMsg('Configuração gravada com sucesso!');
|
setMsg('Alterações guardadas com sucesso!');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Erro ao salvar configuração:', err);
|
console.error('Erro ao salvar configuração:', err);
|
||||||
setError('Erro ao gravar configuração.');
|
setError('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title="Rede Elétrica">
|
<PageLayout title="Rede Elétrica">
|
||||||
{msg && <div className="p-2 mb-2 bg-green-600 text-white rounded">{msg}</div>}
|
{msg && <Alert type="success">{msg}</Alert>}
|
||||||
{error && <div className="p-2 mb-2 bg-red-600 text-white rounded">{error}</div>}
|
{error && <Alert type="error">{error}</Alert>}
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<p>A carregar...</p>
|
<p>A carregar...</p>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { get, post } from '../api';
|
import { get, post } from '../api';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
export default function LoadBalancing() {
|
export default function LoadBalancing() {
|
||||||
const [enabled, setEnabled] = useState(false);
|
const [enabled, setEnabled] = useState(false);
|
||||||
@@ -37,7 +38,7 @@ export default function LoadBalancing() {
|
|||||||
devices: selectedDevices,
|
devices: selectedDevices,
|
||||||
};
|
};
|
||||||
await post('/api/v1/config/load-balancing', config);
|
await post('/api/v1/config/load-balancing', config);
|
||||||
setMsg('Configuração de Load Balancing salva com sucesso!');
|
setMsg('Alterações guardadas com sucesso!');
|
||||||
} catch {
|
} catch {
|
||||||
setError('Erro ao salvar configuração de Load Balancing.');
|
setError('Erro ao salvar configuração de Load Balancing.');
|
||||||
}
|
}
|
||||||
@@ -68,8 +69,8 @@ export default function LoadBalancing() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title="Configuração de Load Balancing">
|
<PageLayout title="Configuração de Load Balancing">
|
||||||
{msg && <div className="p-2 mb-2 bg-green-600 text-white rounded">{msg}</div>}
|
{msg && <Alert type="success">{msg}</Alert>}
|
||||||
{error && <div className="p-2 mb-2 bg-red-600 text-white rounded">{error}</div>}
|
{error && <Alert type="error">{error}</Alert>}
|
||||||
|
|
||||||
<form className="flex flex-col gap-4" onSubmit={saveConfig}>
|
<form className="flex flex-col gap-4" onSubmit={saveConfig}>
|
||||||
{/* Controle de Ativação/Desativação */}
|
{/* Controle de Ativação/Desativação */}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { get, post } from '../api';
|
import { get, post } from '../api';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
export default function Mqtt() {
|
export default function Mqtt() {
|
||||||
const [config, setConfig] = useState({
|
const [config, setConfig] = useState({
|
||||||
@@ -28,16 +29,16 @@ export default function Mqtt() {
|
|||||||
setError('');
|
setError('');
|
||||||
try {
|
try {
|
||||||
await post('/api/v1/config/mqtt', config);
|
await post('/api/v1/config/mqtt', config);
|
||||||
setMsg('Configuração gravada com sucesso!');
|
setMsg('Alterações guardadas com sucesso!');
|
||||||
} catch {
|
} catch {
|
||||||
setError('Erro ao gravar configuração.');
|
setError('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title="Configuração MQTT">
|
<PageLayout title="Configuração MQTT">
|
||||||
{msg && <div className="p-2 mb-2 bg-green-600 text-white rounded">{msg}</div>}
|
{msg && <Alert type="success">{msg}</Alert>}
|
||||||
{error && <div className="p-2 mb-2 bg-red-600 text-white rounded">{error}</div>}
|
{error && <Alert type="error">{error}</Alert>}
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<p>A carregar...</p>
|
<p>A carregar...</p>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { get, post } from '../api';
|
import { get, post } from '../api';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
const OCPP = () => {
|
const OCPP = () => {
|
||||||
const [status, setStatus] = useState(null);
|
const [status, setStatus] = useState(null);
|
||||||
@@ -36,9 +37,9 @@ const OCPP = () => {
|
|||||||
setMsg('');
|
setMsg('');
|
||||||
try {
|
try {
|
||||||
await post('/api/v1/config/ocpp', config);
|
await post('/api/v1/config/ocpp', config);
|
||||||
setMsg('Configuração gravada com sucesso!');
|
setMsg('Alterações guardadas com sucesso!');
|
||||||
} catch {
|
} catch {
|
||||||
setMsg('Erro ao gravar configuração.');
|
setMsg('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ const OCPP = () => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{msg && <div className="p-2 mb-2 bg-gray-200 rounded">{msg}</div>}
|
{msg && <Alert type={msg.startsWith('Erro') ? 'error' : 'success'}>{msg}</Alert>}
|
||||||
<form className="flex flex-col gap-4" onSubmit={e => { e.preventDefault(); save(); }}>
|
<form className="flex flex-col gap-4" onSubmit={e => { e.preventDefault(); save(); }}>
|
||||||
<div>
|
<div>
|
||||||
<label className="block mb-1" htmlFor="ocpp-url">Servidor:</label>
|
<label className="block mb-1" htmlFor="ocpp-url">Servidor:</label>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
const Settings = () => {
|
const Settings = () => {
|
||||||
// Estados para armazenar os valores dos sliders e caixas de entrada
|
// Estados para armazenar os valores dos sliders e caixas de entrada
|
||||||
@@ -57,19 +58,19 @@ const Settings = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
setMsg('Configurações de energia atualizadas com sucesso!');
|
setMsg('Alterações guardadas com sucesso!');
|
||||||
} else {
|
} else {
|
||||||
setError('Erro ao atualizar configurações');
|
setError('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
setError('Erro ao atualizar configurações');
|
setError('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title="Definições de Energia">
|
<PageLayout title="Definições de Energia">
|
||||||
{msg && <div className="p-2 mb-2 bg-green-600 text-white rounded">{msg}</div>}
|
{msg && <Alert type="success">{msg}</Alert>}
|
||||||
{error && <div className="p-2 mb-2 bg-red-600 text-white rounded">{error}</div>}
|
{error && <Alert type="error">{error}</Alert>}
|
||||||
|
|
||||||
<form className="flex flex-col gap-4" onSubmit={handleSubmit}>
|
<form className="flex flex-col gap-4" onSubmit={handleSubmit}>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { get, post } from '../api';
|
import { get, post } from '../api';
|
||||||
import PageLayout from '../components/PageLayout';
|
import PageLayout from '../components/PageLayout';
|
||||||
|
import Alert from '../components/Alert';
|
||||||
|
|
||||||
export default function Wifi() {
|
export default function Wifi() {
|
||||||
const [config, setConfig] = useState({ ssid: '', password: '' });
|
const [config, setConfig] = useState({ ssid: '', password: '' });
|
||||||
@@ -36,15 +37,15 @@ export default function Wifi() {
|
|||||||
const save = async () => {
|
const save = async () => {
|
||||||
try {
|
try {
|
||||||
await post('/api/v1/config/wifi', config);
|
await post('/api/v1/config/wifi', config);
|
||||||
setMsg('Configuração gravada com sucesso!');
|
setMsg('Alterações guardadas com sucesso!');
|
||||||
} catch {
|
} catch {
|
||||||
setMsg('Erro ao gravar.');
|
setMsg('Erro ao guardar alterações.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title="Configuração Wi-Fi">
|
<PageLayout title="Configuração Wi-Fi">
|
||||||
{msg && <div className="p-2 mb-2 bg-gray-200 rounded">{msg}</div>}
|
{msg && <Alert type={msg.startsWith('Erro') ? 'error' : 'success'}>{msg}</Alert>}
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<p>A carregar...</p>
|
<p>A carregar...</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user