diff --git a/docker/build-dev.sh b/docker/build-dev.sh
old mode 100644
new mode 100755
index 13c7f964..0b723671
--- a/docker/build-dev.sh
+++ b/docker/build-dev.sh
@@ -1,3 +1,3 @@
#!/bin/bash
-docker build -t dispatcharr/dispatcharr:dev ..
+docker build -t dispatcharr/dispatcharr:dev -f Dockerfile ..
diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml
index f9035512..214c47da 100644
--- a/docker/docker-compose.dev.yml
+++ b/docker/docker-compose.dev.yml
@@ -3,13 +3,13 @@ services:
# build:
# context: ..
# dockerfile: docker/Dockerfile.dev
- image: dispatcharr/dispatcharr
+ image: dispatcharr/dispatcharr:dev
container_name: dispatcharr_dev
ports:
- "5656:5656"
- 9191:9191
volumes:
- - /home/ghost/code/Dispatcharr:/app
+ - ../:/app
environment:
- DISPATCHARR_ENV=dev
- DB_ENGINE=sqlite
diff --git a/frontend/package.json b/frontend/package.json
index 7a599852..38affdfe 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -30,7 +30,7 @@
"zustand": "^5.0.3"
},
"scripts": {
- "start": "react-scripts start",
+ "start": "PORT=9191 react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
@@ -54,5 +54,5 @@
"last 1 safari version"
]
},
- "proxy": "http://host.docker.internal:5656"
+ "proxy": "http://localhost:5656"
}
diff --git a/frontend/src/App.js b/frontend/src/App.js
index 914e13ac..257e209a 100644
--- a/frontend/src/App.js
+++ b/frontend/src/App.js
@@ -28,6 +28,7 @@ import Settings from './pages/Settings';
import StreamProfiles from './pages/StreamProfiles';
import useAuthStore from './store/auth';
import logo from './images/logo.png';
+import Alert from './components/Alert';
// NEW: import the floating PiP component
import FloatingVideo from './components/FloatingVideo';
@@ -110,8 +111,8 @@ const App = () => {
flexDirection: 'column',
ml: `${open ? drawerWidth : miniDrawerWidth}px`,
transition: 'width 0.3s, margin-left 0.3s',
- // height: '100vh',
backgroundColor: '#495057',
+ height: '100%',
}}
>
{
+ {/* Global Snackbar for system-wide messages */}
+
+
{/* Always-available floating video; remains visible across page changes */}
diff --git a/frontend/src/components/Alert.js b/frontend/src/components/Alert.js
new file mode 100644
index 00000000..8f625364
--- /dev/null
+++ b/frontend/src/components/Alert.js
@@ -0,0 +1,26 @@
+import React, { useState } from 'react';
+import { Snackbar, Alert, Button } from '@mui/material';
+import useAlertStore from '../store/alerts';
+
+const AlertPopup = () => {
+ const { open, message, severity, hideAlert } = useAlertStore();
+
+ const handleClose = () => {
+ hideAlert();
+ };
+
+ return (
+
+
+ {message}
+
+
+ );
+};
+
+export default AlertPopup;
diff --git a/frontend/src/components/forms/UserAgent.js b/frontend/src/components/forms/UserAgent.js
index 6f5f80c4..db13429f 100644
--- a/frontend/src/components/forms/UserAgent.js
+++ b/frontend/src/components/forms/UserAgent.js
@@ -1,5 +1,5 @@
// Modal.js
-import React, { useEffect } from "react";
+import React, { useEffect } from 'react';
import {
TextField,
Button,
@@ -9,22 +9,23 @@ import {
DialogTitle,
DialogContent,
DialogActions,
-} from "@mui/material";
-import { useFormik } from "formik";
-import * as Yup from "yup";
-import API from "../../api";
+} from '@mui/material';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import API from '../../api';
+import useSettingsStore from '../../store/settings';
const UserAgent = ({ userAgent = null, isOpen, onClose }) => {
const formik = useFormik({
initialValues: {
- user_agent_name: "",
- user_agent: "",
- description: "",
+ user_agent_name: '',
+ user_agent: '',
+ description: '',
is_active: true,
},
validationSchema: Yup.object({
- user_agent_name: Yup.string().required("Name is required"),
- user_agent: Yup.string().required("User-Agent is required"),
+ user_agent_name: Yup.string().required('Name is required'),
+ user_agent: Yup.string().required('User-Agent is required'),
}),
onSubmit: async (values, { setSubmitting, resetForm }) => {
if (userAgent?.id) {
@@ -60,8 +61,8 @@ const UserAgent = ({ userAgent = null, isOpen, onClose }) => {