import {Link, useNavigate, useParams} from "react-router-dom"; import {useCallback, useContext, useEffect, useState} from "react"; import {LocaleContext} from "shared/locale"; import { Box, Button, CircularProgress, styled, } from "@material-ui/core"; import * as React from "react"; import RouteForm from "./route-form"; import {KeyboardArrowLeft, Save} from "@material-ui/icons"; import {TextField} from "@mui/material"; const ButtonBar = styled(Box)((props) => ({ "& > button": { marginRight: props.theme.spacing(1) } })); export default function RouteEditView(props) { const {api, showDialog} = props; const {routeId} = useParams(); const navigate = useNavigate(); const isNewRoute = routeId === "new"; const {translate: L, requestModules, currentLocale} = useContext(LocaleContext); // data const [routeTest, setRouteTest] = useState(""); const [fetchRoute, setFetchRoute] = useState(!isNewRoute); const [route, setRoute] = useState(isNewRoute ? { pattern: "", type: "", target: "", extra: "", exact: true, active: true } : null); // ui const [routeTestResult, setRouteTestResult] = useState(false); const [isSaving, setSaving] = useState(false); useEffect(() => { requestModules(props.api, ["general"], currentLocale).then(data => { if (!data.success) { props.showDialog("Error fetching translations: " + data.msg); } }); }, [currentLocale]); useEffect(() => { if (routeTest?.trim()) { props.api.testRoute(route.pattern, routeTest, route.exact).then(data => { if (!data.success) { props.showDialog("Error testing route: " + data.msg); } else { setRouteTestResult(data.match); } }); } else { setRouteTestResult(false); } }, [routeTest]); const onFetchRoute = useCallback((force = false) => { if (!isNewRoute && (force || fetchRoute)) { setFetchRoute(false); api.getRoute(routeId).then((res) => { if (!res.success) { showDialog(res.msg, L("Error fetching route")); navigate("/admin/routes"); } else { setRoute(res.route); } }); } }, [api, showDialog, fetchRoute, isNewRoute, routeId, route]); const onSave = useCallback(() => { if (!isSaving) { setSaving(true); let args = [route.pattern, route.type, route.target, route.extra, route.exact, route.active]; if (isNewRoute) { api.addRoute(...args).then(res => { setSaving(false); if (res.success) { navigate("/admin/routes/" + res.routeId); } else { showDialog(res.msg, L("Error saving route")); } }); } else { args = [routeId, ...args]; api.updateRoute(...args).then(res => { setSaving(false); if (!res.success) { showDialog(res.msg, L("Error saving route")); } }); } } }, [api, route, isSaving, isNewRoute, routeId]); useEffect(() => { if (!isNewRoute) { onFetchRoute(true); } }, []); if (route === null) { return } return
  1. Home
  2. Routes
  3. {isNewRoute ? "New" : "Edit"}

{L(isNewRoute ? "Create new Route" : "Edit Route")}

{L("Validate Route")}
setRouteTest(e.target.value)} variant={"outlined"} size={"small"} fullWidth={true} placeholder={L("Enter a path to test the route…")} />
                Match: {JSON.stringify(routeTestResult)}
            
}