mirror of
https://github.com/kkhattabi213/megafonias-react.git
synced 2026-01-30 09:13:40 +00:00
t32 profesor raul vazquez y botones canceladora, mas algunos cambios en UI
This commit is contained in:
49
backend/app.py
Normal file
49
backend/app.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
from flask import Flask, render_template, request, jsonify
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Datos de ejemplo (reemplaza con una base de datos)
|
||||||
|
datos = {
|
||||||
|
"Línea 1": [
|
||||||
|
"Zafra", "Julio Caro Baroja (Aqualon)", "Avda. Alemania (Esquina Ruiz de Alda)",
|
||||||
|
"Avda. Alemania (Plaza de Toros)", "Bda. Navidad", "Don Bosco",
|
||||||
|
"Plaza de los Dolores", "Barriada del Carmen", "Humilladero", "Cardeñas",
|
||||||
|
"Orden Baja", "Gonzalo de Berceo", "Plaza Niño Miguel", "Magnolia",
|
||||||
|
"Hospital JRJ", "Plaza las Amapolas", "Av. Andalucia (Castaño Robledo)",
|
||||||
|
"Monumento al Fútbol", "Relaciones Laborales (Universidad)",
|
||||||
|
"Vista Alegre-Universidad", "Centro Comercial Holea", "Cruce Romeralejo",
|
||||||
|
"Universidad. Avenida de las Artes", "Palacio de Deportes",
|
||||||
|
"Higueral (Fuerzas Armadas)", "Bda. José Antonio", "Isla Chica",
|
||||||
|
"Las Delicias", "El Árbol", "Gasolinera", "Estación de Ferrocarril",
|
||||||
|
"El punto", "Estación de Sevilla", "Nuevo Mercado"
|
||||||
|
],
|
||||||
|
"Línea 2": [
|
||||||
|
"Zafra", "Nuevo Mercado", "Villa de Madrid", "Avenida Italia",
|
||||||
|
"Estación de Sevilla", "El Punto", "Estación de Ferrocarril", "Juzgados",
|
||||||
|
"Barrio Obrero", "El Porvenir", "Las Delicias", "Isla Chica",
|
||||||
|
"Bda, José Antonio", "Fuerzas Armadas Los Rosales", "Palacio de Deporte",
|
||||||
|
"Ciencias de la Educación (Universidad)", "Biblioteca (Universidad)",
|
||||||
|
"Monumento al Fútbol", "Relaciones Laborales (Universidad)",
|
||||||
|
"Vista Alegre-Universidad", "Centro Comercial Holea", "Plaza las Amapolas",
|
||||||
|
"Hospital JRJ", "Magnolia", "Orden Alta", "Gonzalo de Berceo (Alto)",
|
||||||
|
"Gonzalo de Berceo (Bajo)", "Orden Baja", "Legión Española", "Cardeñas",
|
||||||
|
"Humilladero", "Bda. del Carmen", "Santa Lucía", "Santa Eulalia",
|
||||||
|
"Bda. Navidad", "Molino de la Vega", "Paseo de las Palmeras",
|
||||||
|
"Julio Caro Baroja (Aqualon)"
|
||||||
|
],
|
||||||
|
"Línea 131": ["Puente de Vallecas"]
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def index():
|
||||||
|
return render_template("index.html", datos=datos)
|
||||||
|
|
||||||
|
@app.route("/paradas")
|
||||||
|
def obtener_paradas():
|
||||||
|
linea = request.args.get("linea")
|
||||||
|
if linea and linea in datos:
|
||||||
|
return jsonify(datos[linea])
|
||||||
|
return jsonify([])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(debug=True)
|
||||||
Binary file not shown.
BIN
public/audio/T32-profesor_raúl_vázquez.wav
Normal file
BIN
public/audio/T32-profesor_raúl_vázquez.wav
Normal file
Binary file not shown.
BIN
public/audio/atencion_a_su_saldo.mp3
Normal file
BIN
public/audio/atencion_a_su_saldo.mp3
Normal file
Binary file not shown.
BIN
public/audio/hora_de_salida.mp3
Normal file
BIN
public/audio/hora_de_salida.mp3
Normal file
Binary file not shown.
BIN
public/audio/saldo_insuficiente.mp3
Normal file
BIN
public/audio/saldo_insuficiente.mp3
Normal file
Binary file not shown.
135
src/App.js
135
src/App.js
@@ -10,6 +10,7 @@ function App() {
|
|||||||
const [volume, setVolume] = useState(1);
|
const [volume, setVolume] = useState(1);
|
||||||
const audioRef = useRef(null);
|
const audioRef = useRef(null);
|
||||||
const [theme, setTheme] = useState('light');
|
const [theme, setTheme] = useState('light');
|
||||||
|
const [playing, setPlaying] = useState(false);
|
||||||
|
|
||||||
const datos = {
|
const datos = {
|
||||||
"Línea 1": [
|
"Línea 1": [
|
||||||
@@ -39,9 +40,9 @@ function App() {
|
|||||||
"Bda. Navidad", "Molino de la Vega", "Paseo de las Palmeras",
|
"Bda. Navidad", "Molino de la Vega", "Paseo de las Palmeras",
|
||||||
"Julio Caro Baroja (Aqualon)"
|
"Julio Caro Baroja (Aqualon)"
|
||||||
],
|
],
|
||||||
"Línea 131": ["Puente de Vallecas"]
|
"Línea 131": ["Puente de Vallecas"],
|
||||||
|
"Línea T32": ["Profesor Raúl Vázquez"]
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleLineaChange = (event) => {
|
const handleLineaChange = (event) => {
|
||||||
setLineaSeleccionada(event.target.value);
|
setLineaSeleccionada(event.target.value);
|
||||||
setParadaSeleccionada('');
|
setParadaSeleccionada('');
|
||||||
@@ -63,21 +64,27 @@ function App() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const reproducirAudio = () => {
|
const reproducirAudio = () => {
|
||||||
if (audio) {
|
if (audio && playing) {
|
||||||
audio.pause();
|
audio.pause();
|
||||||
}
|
setPlaying(false);
|
||||||
|
} else if (lineaSeleccionada && paradaSeleccionada) {
|
||||||
if (lineaSeleccionada && paradaSeleccionada) {
|
|
||||||
const playAudio = (audioFile) => {
|
const playAudio = (audioFile) => {
|
||||||
const nuevoAudio = new Audio(audioFile);
|
const nuevoAudio = new Audio(audioFile);
|
||||||
nuevoAudio.play().catch(error => {
|
nuevoAudio.play().catch(error => {
|
||||||
console.error("Error al reproducir audio:", error);
|
console.error("Error al reproducir audio:", error);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
nuevoAudio.onended = () => {
|
||||||
|
setPlaying(false);
|
||||||
|
};
|
||||||
|
|
||||||
return nuevoAudio;
|
return nuevoAudio;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const lineaSinEspacios = lineaSeleccionada.split(" ")[1] || lineaSeleccionada.split(" ")[0];
|
||||||
|
|
||||||
if (tipoParada === "noUsar") {
|
if (tipoParada === "noUsar") {
|
||||||
let paradaAudioFile = `/audio/${lineaSeleccionada.split(" ")[1]}-${paradaSeleccionada.toLowerCase().replace(/ /g, "_")}.wav`;
|
let paradaAudioFile = `/audio/${lineaSinEspacios}-${paradaSeleccionada.toLowerCase().replace(/ /g, "_")}.wav`;
|
||||||
const paradaAudio = playAudio(paradaAudioFile);
|
const paradaAudio = playAudio(paradaAudioFile);
|
||||||
setAudio(paradaAudio);
|
setAudio(paradaAudio);
|
||||||
audioRef.current = paradaAudio;
|
audioRef.current = paradaAudio;
|
||||||
@@ -89,19 +96,21 @@ function App() {
|
|||||||
paradaTipoAudio.volume = volume;
|
paradaTipoAudio.volume = volume;
|
||||||
|
|
||||||
paradaTipoAudio.onended = () => {
|
paradaTipoAudio.onended = () => {
|
||||||
let paradaAudioFile = `/audio/${lineaSeleccionada.split(" ")[1]}-${paradaSeleccionada.toLowerCase().replace(/ /g, "_")}.wav`;
|
let paradaAudioFile = `/audio/${lineaSinEspacios}-${paradaSeleccionada.toLowerCase().replace(/ /g, "_")}.wav`;
|
||||||
const paradaAudio = playAudio(paradaAudioFile);
|
const paradaAudio = playAudio(paradaAudioFile);
|
||||||
setAudio(paradaAudio);
|
setAudio(paradaAudio);
|
||||||
audioRef.current = paradaAudio;
|
audioRef.current = paradaAudio;
|
||||||
paradaAudio.volume = volume;
|
paradaAudio.volume = volume;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
setPlaying(true);
|
||||||
} else {
|
} else {
|
||||||
console.log("Por favor, selecciona una línea y una parada.");
|
console.log("Por favor, selecciona una línea y una parada.");
|
||||||
alert("Para reproducir el audio, selecciona una línea y una parada.");
|
alert("Para reproducir el audio, selecciona una línea y una parada.");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const reproducirColision = () => {
|
const reproducirColision = () => {
|
||||||
const audioColision = new Audio('/audio/colision.wav');
|
const audioColision = new Audio('/audio/colision.wav');
|
||||||
audioColision.play().catch(error => {
|
audioColision.play().catch(error => {
|
||||||
@@ -116,7 +125,8 @@ function App() {
|
|||||||
|
|
||||||
for (const linea in datos) {
|
for (const linea in datos) {
|
||||||
datos[linea].forEach(parada => {
|
datos[linea].forEach(parada => {
|
||||||
const audio = new Audio(`/audio/${parada.toLowerCase().replace(/ /g, "_")}.wav`);
|
const lineaSinEspacios = linea.split(" ")[1] || linea.split(" ")[0];
|
||||||
|
const audio = new Audio(`/audio/${lineaSinEspacios}-${parada.toLowerCase().replace(/ /g, "_")}.wav`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,12 +147,21 @@ function App() {
|
|||||||
setTheme(theme === 'light' ? 'dark' : 'light');
|
setTheme(theme === 'light' ? 'dark' : 'light');
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
const reproducirCanceladora = (audioNombre) => {
|
||||||
<div className="container">
|
const audioCanceladora = new Audio(`/audio/${audioNombre}.mp3`);
|
||||||
<h1>Aplicación de Megafonía</h1>
|
audioCanceladora.play().catch(error => {
|
||||||
|
console.error("Error al reproducir audio:", error);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
<div>
|
return (
|
||||||
<label htmlFor="linea">Línea:</label>
|
<div className="container mt-4">
|
||||||
|
<h1 className="mb-4">Aplicación de Megafonía</h1>
|
||||||
|
|
||||||
|
<div className="card mb-4">
|
||||||
|
<div className="card-body">
|
||||||
|
<div className="mb-3">
|
||||||
|
<label htmlFor="linea" className="form-label">Línea:</label>
|
||||||
<select id="linea" value={lineaSeleccionada} onChange={handleLineaChange} className="form-select">
|
<select id="linea" value={lineaSeleccionada} onChange={handleLineaChange} className="form-select">
|
||||||
<option value="">Selecciona una línea</option>
|
<option value="">Selecciona una línea</option>
|
||||||
{Object.keys(datos).map((linea) => (
|
{Object.keys(datos).map((linea) => (
|
||||||
@@ -152,7 +171,7 @@ function App() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="parada">Parada:</label>
|
<label htmlFor="parada" className="form-label">Parada:</label>
|
||||||
<select id="parada" value={paradaSeleccionada} onChange={handleParadaChange} className="form-select">
|
<select id="parada" value={paradaSeleccionada} onChange={handleParadaChange} className="form-select">
|
||||||
<option value="">Selecciona una parada</option>
|
<option value="">Selecciona una parada</option>
|
||||||
{datos[lineaSeleccionada]?.map((parada) => (
|
{datos[lineaSeleccionada]?.map((parada) => (
|
||||||
@@ -160,62 +179,64 @@ function App() {
|
|||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="card mb-4">
|
||||||
|
<div className="card-body">hora_de_salida.wav
|
||||||
|
<div className="mb-3">
|
||||||
<div className="d-flex flex-column">
|
<div className="d-flex flex-column">
|
||||||
<label>
|
<label className="form-check-label">
|
||||||
<input
|
<input type="radio" value="actual" checked={tipoParada === 'actual'} onChange={handleTipoParadaChange} className="form-check-input me-2" />
|
||||||
type="radio"
|
Parada actual
|
||||||
value="actual"
|
|
||||||
checked={tipoParada === 'actual'}
|
|
||||||
onChange={handleTipoParadaChange}
|
|
||||||
className="form-check-input"
|
|
||||||
/>
|
|
||||||
<span className="form-check-label">Parada actual</span>
|
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label className="form-check-label">
|
||||||
<input
|
<input type="radio" value="siguiente" checked={tipoParada === 'siguiente'} onChange={handleTipoParadaChange} className="form-check-input me-2" />
|
||||||
type="radio"
|
Parada siguiente
|
||||||
value="siguiente"
|
|
||||||
checked={tipoParada === 'siguiente'}
|
|
||||||
onChange={handleTipoParadaChange}
|
|
||||||
className="form-check-input"
|
|
||||||
/>
|
|
||||||
<span className="form-check-label">Parada siguiente</span>
|
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label className="form-check-label">
|
||||||
<input
|
<input type="radio" value="noUsar" checked={tipoParada === 'noUsar'} onChange={handleTipoParadaChange} className="form-check-input me-2" />
|
||||||
type="radio"
|
No usar
|
||||||
value="noUsar"
|
|
||||||
checked={tipoParada === 'noUsar'}
|
|
||||||
onChange={handleTipoParadaChange}
|
|
||||||
className="form-check-input"
|
|
||||||
/>
|
|
||||||
<span className="form-check-label">No usar</span>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="volume">Volumen:</label>
|
<label htmlFor="volume" className="form-label">Volumen:</label>
|
||||||
<input
|
<input type="range" id="volume" min="0" max="1" step="0.1" value={volume} onChange={handleVolumeChange} className="form-range" />
|
||||||
type="range"
|
</div>
|
||||||
id="volume"
|
</div>
|
||||||
min="0"
|
|
||||||
max="1"
|
|
||||||
step="0.1"
|
|
||||||
value={volume}
|
|
||||||
onChange={handleVolumeChange}
|
|
||||||
className="form-range"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button onClick={reproducirAudio} className="btn btn-primary">Reproducir</button>
|
<div className="d-grid gap-2">
|
||||||
<button onClick={toggleTheme} className="btn btn-secondary mt-3">
|
<button onClick={reproducirAudio} className="btn btn-primary" disabled={!lineaSeleccionada || !paradaSeleccionada}>
|
||||||
|
{playing ? "Detener" : "Reproducir"}
|
||||||
|
</button>
|
||||||
|
<button onClick={toggleTheme} className="btn btn-secondary">
|
||||||
Cambiar tema a {theme === 'light' ? 'oscuro' : 'claro'}
|
Cambiar tema a {theme === 'light' ? 'oscuro' : 'claro'}
|
||||||
</button>
|
</button>
|
||||||
|
<button onClick={reproducirColision} className="btn btn-danger">Anti-Colisión</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button onClick={reproducirColision} className="btn btn-danger mt-3 fixed-bottom">
|
|
||||||
Anti-Colisión
|
<div className="card mb-4">
|
||||||
|
<div className="card-body">
|
||||||
|
<h5 className="card-title">Canceladora</h5>
|
||||||
|
<div className="d-grid gap-2">
|
||||||
|
<button onClick={() => reproducirCanceladora('hora_de_salida')} className="btn btn-primary">
|
||||||
|
Hora de Salida
|
||||||
</button>
|
</button>
|
||||||
|
<button onClick={() => reproducirCanceladora('atencion_a_su_saldo')} className="btn btn-primary">
|
||||||
|
Atención a su Saldo
|
||||||
|
</button>
|
||||||
|
<button onClick={() => reproducirCanceladora('saldo_insuficiente')} className="btn btn-primary">
|
||||||
|
Saldo Insuficiente
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user