Skip to content
Snippets Groups Projects
Commit eb2e1ee0 authored by Léo Banno-Cloutier's avatar Léo Banno-Cloutier
Browse files

jams-react-client: add PolicyDataContext

Change-Id: I315a0b4c71661e1b7c9fd4e3f9261e4e7ad68078
parent 7a450ae5
No related branches found
No related tags found
No related merge requests found
...@@ -4,5 +4,6 @@ ...@@ -4,5 +4,6 @@
.dockerignore .dockerignore
**/node_modules **/node_modules
**/target
jams jams
...@@ -10,6 +10,7 @@ import Box from "@material-ui/core/Box"; ...@@ -10,6 +10,7 @@ import Box from "@material-ui/core/Box";
import EditBlueprintPermissions from "./EditBlueprintPermissions"; import EditBlueprintPermissions from "./EditBlueprintPermissions";
import EditBlueprintConfiguration from "./EditBlueprintConfiguration"; import EditBlueprintConfiguration from "./EditBlueprintConfiguration";
import EditBlueprintUi from "./EditBlueprintUi"; import EditBlueprintUi from "./EditBlueprintUi";
import { PolicyDataContextProvider } from "./PolicyDataContext";
import { infoColor } from "assets/jss/material-dashboard-react.js"; import { infoColor } from "assets/jss/material-dashboard-react.js";
...@@ -78,6 +79,7 @@ export default function Blueprint({ blueprintName }) { ...@@ -78,6 +79,7 @@ export default function Blueprint({ blueprintName }) {
</Tabs> </Tabs>
</AppBar> </AppBar>
<PolicyDataContextProvider blueprintName={blueprintName}>
<TabPanel value={openedTab} index={0}> <TabPanel value={openedTab} index={0}>
<EditBlueprintPermissions blueprintName={blueprintName} /> <EditBlueprintPermissions blueprintName={blueprintName} />
</TabPanel> </TabPanel>
...@@ -87,6 +89,7 @@ export default function Blueprint({ blueprintName }) { ...@@ -87,6 +89,7 @@ export default function Blueprint({ blueprintName }) {
<TabPanel value={openedTab} index={2}> <TabPanel value={openedTab} index={2}>
<EditBlueprintUi blueprintName={blueprintName} /> <EditBlueprintUi blueprintName={blueprintName} />
</TabPanel> </TabPanel>
</PolicyDataContextProvider>
</div> </div>
); );
} }
import React, { useEffect, useState } from "react"; import React, { useContext, useState } from "react";
import clsx from "clsx"; import clsx from "clsx";
// @material-ui/core components // @material-ui/core components
...@@ -41,6 +41,7 @@ import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react.js"; ...@@ -41,6 +41,7 @@ import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react.js";
import BlueprintSnackbar from "components/Snackbar/BlueprintSnackbar"; import BlueprintSnackbar from "components/Snackbar/BlueprintSnackbar";
import CustomPopupState from "components/CustomPopupState/CustomPopupState"; import CustomPopupState from "components/CustomPopupState/CustomPopupState";
import { PolicyDataContext } from "./PolicyDataContext";
const styles = (theme) => ({ const styles = (theme) => ({
...dashboardStyle, ...dashboardStyle,
...@@ -158,214 +159,30 @@ const StyledRadio = (props) => { ...@@ -158,214 +159,30 @@ const StyledRadio = (props) => {
export default function EditBlueprintConfiguration(props) { export default function EditBlueprintConfiguration(props) {
const classes = useStyles(); const classes = useStyles();
const { policyData, updatePolicyData, snackbar, setSnackbar } = useContext(
const [videoEnabled, setVideoEnabled] = useState(true); PolicyDataContext
const [publicInCalls, setPublicInCalls] = useState(true);
const [autoAnswer, setAutoAnswer] = useState(false);
const [peerDiscovery, setPeerDiscovery] = useState(true);
const [rendezVous, setRendezVous] = useState(false);
const [selectedTurnOption, setSelectedTurnOption] = useState("defaultTurn");
const [selectedDHTProxyOption, setSelectedDHTProxyOption] = useState(
"defaultDHTProxy"
); );
const [upnpEnabled, setUpnpEnabled] = useState(true);
const [turnEnabled, setTurnEnabled] = useState(true);
const [turnServer, setTurnServer] = useState("turn.jami.net");
const [turnServerUserName, setTurnServerUserName] = useState("ring");
const [turnServerPassword, setTurnServerPassword] = useState("ring");
const [proxyEnabled, setProxyEnabled] = useState(false);
const [proxyServer, setProxyServer] = useState("dhtproxy.jami.net");
const [dhtProxyListUrl, setDhtProxyListUrl] = useState("");
const [turnPassowrdVisible, setTurnPasswordVisible] = useState(false);
const [uiCustomization, setUiCustomization] = useState("");
const [open, setOpen] = useState(false);
const [message, setMessage] = useState(false);
const [severity, setSeverity] = useState("success");
const [getRequestDone, setGetRequestDone] = useState(false);
useEffect(() => {
axios(
configApiCall(
api_path_blueprints + "?name=" + props.blueprintName,
"GET",
null,
null
)
)
.then((response) => {
let policyData = JSON.parse(response.data.policyData);
setVideoEnabled(policyData["videoEnabled"]);
setPublicInCalls(policyData["publicInCalls"]);
setAutoAnswer(policyData["autoAnswer"]);
setPeerDiscovery(policyData["peerDiscovery"]);
setRendezVous(policyData["rendezVous"]);
setUiCustomization(policyData["uiCustomization"]);
setUpnpEnabled(policyData["upnpEnabled"]);
if (policyData["turnEnabled"] === true) {
setSelectedTurnOption("customTurn");
setTurnEnabled(policyData["turnEnabled"]);
setTurnServer(policyData["turnServer"]);
setTurnServerUserName(policyData["turnServerUserName"]);
setTurnServerPassword(policyData["turnServerPassword"]);
} else if (policyData["turnEnabled"] === false) {
setSelectedTurnOption("disabledTurn");
setTurnEnabled(false);
} else {
setSelectedTurnOption("defaultTurn");
}
if (policyData["proxyEnabled"] === true) {
setSelectedDHTProxyOption("customDHTProxy");
setProxyEnabled(policyData["proxyEnabled"]);
setProxyServer(policyData["proxyServer"]);
setDhtProxyListUrl(policyData["dhtProxyListUrl"]);
} else if (policyData["proxyEnabled"] === false) {
setSelectedDHTProxyOption("disabledDHTProxy");
setTurnEnabled(false);
} else {
setSelectedDHTProxyOption("defaultDHTProxy");
}
})
.catch((error) => {
console.log(
"Error fetching blueprint permissions : " +
props.username +
" " +
error
);
})
.finally(() => {
setGetRequestDone(true);
});
}, [props.blueprintName, props.username]);
const handleUpdateConfiguration = (field, value, selectedOptions = []) => { const {
// if the get request is not done yet, don't update the configuration upnpEnabled,
if (!getRequestDone) {
return;
}
let data = { selectedTurnOption,
videoEnabled: videoEnabled, turnServer,
publicInCalls: publicInCalls, turnServerUserName,
autoAnswer: autoAnswer,
peerDiscovery: peerDiscovery,
accountDiscovery: peerDiscovery,
accountPublish: peerDiscovery,
rendezVous: rendezVous,
upnpEnabled: upnpEnabled,
turnEnabled: turnEnabled,
turnServer: turnServer,
turnServerUserName: turnServerUserName,
turnServerPassword: turnServerPassword,
proxyEnabled: proxyEnabled,
proxyServer: proxyServer,
dhtProxyListUrl: dhtProxyListUrl,
uiCustomization: uiCustomization,
};
data[field] = value; selectedDHTProxyOption,
proxyServer,
dhtProxyListUrl,
} = policyData;
selectedOptions.forEach((selectedOption) => { const [turnPasswordVisible, setTurnPasswordVisible] = useState(false);
if (selectedOption === "defaultTurn") {
delete data.turnEnabled;
delete data.turnServer;
delete data.turnServerUserName;
delete data.turnServerPassword;
}
if (selectedOption === "defaultDHTProxy") {
delete data.proxyEnabled;
delete data.proxyServer;
delete data.dhtProxyListUrl;
}
if (selectedOption === "customTurn") {
data.turnEnabled = true;
}
if (selectedOption === "customDHTProxy") {
data.proxyEnabled = true;
}
if (selectedOption === "disabledTurn") {
data.turnEnabled = false;
}
if (selectedOption === "disabledDHTProxy") {
data.proxyEnabled = false;
}
});
axios(
configApiCall(
api_path_blueprints + "?name=" + props.blueprintName,
"PUT",
data,
null
)
)
.then((response) => {
setOpen(false);
setSeverity("success");
setOpen(true);
setMessage(
i18next.t(
"updated_blueprint_configuration_successfully",
"Blueprint configuration successfully updated."
)
);
})
.catch((error) => {
setOpen(false);
setSeverity("error");
setOpen(true);
setMessage(
i18next.t(
"error_updating_blueprint_configuration",
"Error occurred while updating blueprint configuration."
) +
error +
"!"
);
});
};
const handleTurnChangedOption = (event) => { const handleTurnChangedOption = (event) => {
setSelectedTurnOption(event.target.value); updatePolicyData("selectedTurnOption", event.target.value);
if (event.target.value === "customTurn") {
setTurnEnabled(true);
handleUpdateConfiguration("turnEnabled", true, [
event.target.value,
selectedDHTProxyOption,
]);
} else {
setTurnEnabled(false);
handleUpdateConfiguration("turnEnabled", false, [
event.target.value,
selectedDHTProxyOption,
]);
}
}; };
const handleDHTProxyChangedOption = (event) => { const handleDHTProxyChangedOption = (event) => {
setSelectedDHTProxyOption(event.target.value); updatePolicyData("selectedDHTProxyOption", event.target.value);
if (event.target.value === "customDHTProxy") {
setProxyEnabled(true);
handleUpdateConfiguration("proxyEnabled", true, [
selectedTurnOption,
event.target.value,
]);
} else {
setProxyEnabled(false);
handleUpdateConfiguration("proxyEnabled", false, [
selectedTurnOption,
event.target.value,
]);
}
}; };
const handleMouseDownPassword = () => { const handleMouseDownPassword = () => {
...@@ -410,12 +227,7 @@ export default function EditBlueprintConfiguration(props) { ...@@ -410,12 +227,7 @@ export default function EditBlueprintConfiguration(props) {
checked={upnpEnabled} checked={upnpEnabled}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setUpnpEnabled(e.target.checked); updatePolicyData("upnpEnabled", e.target.checked);
handleUpdateConfiguration(
"upnpEnabled",
e.target.checked,
[selectedTurnOption, selectedDHTProxyOption]
);
}} }}
name="upnpEnabled" name="upnpEnabled"
inputProps={{ "aria-label": "secondary checkbox" }} inputProps={{ "aria-label": "secondary checkbox" }}
...@@ -482,12 +294,7 @@ export default function EditBlueprintConfiguration(props) { ...@@ -482,12 +294,7 @@ export default function EditBlueprintConfiguration(props) {
</InputAdornment> </InputAdornment>
} }
onChange={(e) => { onChange={(e) => {
setTurnServer(e.target.value); updatePolicyData("turnServer", e.target.value);
handleUpdateConfiguration(
"turnServer",
e.target.value,
["customTurn", selectedDHTProxyOption]
);
}} }}
/> />
</FormControl> </FormControl>
...@@ -517,11 +324,9 @@ export default function EditBlueprintConfiguration(props) { ...@@ -517,11 +324,9 @@ export default function EditBlueprintConfiguration(props) {
</InputAdornment> </InputAdornment>
} }
onChange={(e) => { onChange={(e) => {
setTurnServerUserName(e.target.value); updatePolicyData(
handleUpdateConfiguration(
"turnServerUserName", "turnServerUserName",
e.target.value, e.target.value
["customTurn", selectedDHTProxyOption]
); );
}} }}
/> />
...@@ -544,10 +349,9 @@ export default function EditBlueprintConfiguration(props) { ...@@ -544,10 +349,9 @@ export default function EditBlueprintConfiguration(props) {
)} )}
</InputLabel> </InputLabel>
<Input <Input
disabled={!turnEnabled}
id="turnServerPassword" id="turnServerPassword"
placeholder="****" placeholder="****"
type={turnPassowrdVisible ? "text" : "password"} type={turnPasswordVisible ? "text" : "password"}
startAdornment={ startAdornment={
<InputAdornment position="start"> <InputAdornment position="start">
<VpnKeyOutlinedIcon /> <VpnKeyOutlinedIcon />
...@@ -559,7 +363,7 @@ export default function EditBlueprintConfiguration(props) { ...@@ -559,7 +363,7 @@ export default function EditBlueprintConfiguration(props) {
onMouseDown={handleMouseDownPassword} onMouseDown={handleMouseDownPassword}
onMouseUp={handleMouseUpPassword} onMouseUp={handleMouseUpPassword}
> >
{turnPassowrdVisible ? ( {turnPasswordVisible ? (
<VisibilityIcon /> <VisibilityIcon />
) : ( ) : (
<VisibilityOffIcon /> <VisibilityOffIcon />
...@@ -567,11 +371,9 @@ export default function EditBlueprintConfiguration(props) { ...@@ -567,11 +371,9 @@ export default function EditBlueprintConfiguration(props) {
</IconButton> </IconButton>
} }
onChange={(e) => { onChange={(e) => {
setTurnServerPassword(e.target.value); updatePolicyData(
handleUpdateConfiguration(
"turnServerPassword", "turnServerPassword",
e.target.value, e.target.value
["customTurn", selectedDHTProxyOption]
); );
}} }}
/> />
...@@ -647,12 +449,7 @@ export default function EditBlueprintConfiguration(props) { ...@@ -647,12 +449,7 @@ export default function EditBlueprintConfiguration(props) {
</InputAdornment> </InputAdornment>
} }
onChange={(e) => { onChange={(e) => {
setProxyServer(e.target.value); updatePolicyData("proxyServer", e.target.value);
handleUpdateConfiguration(
"proxyServer",
e.target.value,
[selectedTurnOption, "customDHTProxy"]
);
}} }}
/> />
</FormControl> </FormControl>
...@@ -682,11 +479,9 @@ export default function EditBlueprintConfiguration(props) { ...@@ -682,11 +479,9 @@ export default function EditBlueprintConfiguration(props) {
</InputAdornment> </InputAdornment>
} }
onChange={(e) => { onChange={(e) => {
setDhtProxyListUrl(e.target.value); updatePolicyData(
handleUpdateConfiguration(
"dhtProxyListUrl", "dhtProxyListUrl",
e.target.value, e.target.value
[selectedTurnOption, "customDHTProxy"]
); );
}} }}
/> />
......
import React, { useEffect, useState } from "react"; import React, { useContext, useEffect, useState } from "react";
import { Link, useHistory } from "react-router-dom"; import { Link, useHistory } from "react-router-dom";
import axios from "axios"; import axios from "axios";
import i18next from "i18next"; import i18next from "i18next";
...@@ -41,10 +41,9 @@ import auth from "../../auth"; ...@@ -41,10 +41,9 @@ import auth from "../../auth";
import configApiCall from "../../api"; import configApiCall from "../../api";
import { import {
api_path_get_user_directory_search, api_path_get_user_directory_search,
api_path_get_ns_name_from_addr,
api_path_get_user_profile,
} from "../../globalUrls"; } from "../../globalUrls";
import { PolicyDataContext } from "./PolicyDataContext";
const styles = { const styles = {
...dashboardStyle, ...dashboardStyle,
...@@ -103,39 +102,26 @@ const styles = { ...@@ -103,39 +102,26 @@ const styles = {
const useStyles = makeStyles(styles); const useStyles = makeStyles(styles);
export default function EditBlueprintPermissions(props) { export default function EditBlueprintPermissions(props) {
const classes = useStyles(); const classes = useStyles();
const history = useHistory(); const history = useHistory();
const { policyData, updatePolicyData, snackbar, setSnackbar } = useContext(
PolicyDataContext
);
const [openDrawer, setOpenDrawer] = useState(false); const [openDrawer, setOpenDrawer] = useState(false);
const [users, setUsers] = useState([]); const [users, setUsers] = useState([]);
const [blueprintModerators, setBlueprintModerators] = useState([]);
const [videoEnabled, setVideoEnabled] = useState(true);
const [publicInCalls, setPublicInCalls] = useState(true);
const [autoAnswer, setAutoAnswer] = useState(false);
const [peerDiscovery, setPeerDiscovery] = useState(true);
const [rendezVous, setRendezVous] = useState(false);
const [defaultModerators, setDefaultModerators] = useState("");
const [upnpEnabled, setUpnpEnabled] = useState(true);
const [turnEnabled, setTurnEnabled] = useState(true);
const [turnServer, setTurnServer] = useState("turn.jami.net");
const [turnServerUserName, setTurnServerUserName] = useState("ring");
const [turnServerPassword, setTurnServerPassword] = useState("ring");
const [proxyEnabled, setProxyEnabled] = useState(false);
const [proxyServer, setProxyServer] = useState("dhtproxy.jami.net");
const [dhtProxyListUrl, setDhtProxyListUrl] = useState("");
const [allowLookup, setAllowLookup] = useState(true);
const [uiCustomization, setUiCustomization] = useState("");
const [open, setOpen] = useState(false); const {
const [message, setMessage] = useState(false); videoEnabled,
const [severity, setSeverity] = useState("success"); publicInCalls,
autoAnswer,
peerDiscovery,
rendezVous,
blueprintModerators,
allowLookup,
} = policyData;
const searchUsers = (value) => { const searchUsers = (value) => {
axios( axios(
...@@ -147,14 +133,16 @@ export default function EditBlueprintPermissions(props) { ...@@ -147,14 +133,16 @@ export default function EditBlueprintPermissions(props) {
) )
) )
.then((response) => { .then((response) => {
let profiles = []; if (response.status === 204) {
setUsers([]);
return;
}
const profilesResults = response.data.profiles; const profilesResults = response.data.profiles;
profilesResults.forEach((profile) => { const usernames = users.map((user) => user.username);
let existingUser = false;
users.forEach((user) => { const profiles = profilesResults.filter((profile) => {
if (profile.username === user.username) existingUser = true; return !usernames.includes(profile.username);
});
if (!existingUser) profiles.push(profile);
}); });
setUsers(profiles); setUsers(profiles);
}) })
...@@ -169,167 +157,17 @@ export default function EditBlueprintPermissions(props) { ...@@ -169,167 +157,17 @@ export default function EditBlueprintPermissions(props) {
useEffect(() => { useEffect(() => {
searchUsers(); searchUsers();
}, []);
axios(
configApiCall(
api_path_blueprints + "?name=" + props.blueprintName,
"GET",
null,
null
)
)
.then((response) => {
let policyData = JSON.parse(response.data.policyData);
setVideoEnabled(policyData["videoEnabled"]);
setPublicInCalls(policyData["publicInCalls"]);
setAutoAnswer(policyData["autoAnswer"]);
setPeerDiscovery(policyData["peerDiscovery"]);
setRendezVous(policyData["rendezVous"]);
setDefaultModerators(policyData["defaultModerators"]);
setUpnpEnabled(policyData["upnpEnabled"]);
setTurnEnabled(policyData["turnEnabled"]);
setTurnServer(policyData["turnServer"]);
setTurnServerUserName(policyData["turnServerUserName"]);
setTurnServerPassword(policyData["turnServerPassword"]);
setProxyEnabled(policyData["proxyEnabled"]);
setProxyServer(policyData["proxyServer"]);
setDhtProxyListUrl();
setAllowLookup(policyData["allowLookup"]);
setUiCustomization(policyData["uiCustomization"]);
policyData["defaultModerators"].split("/").forEach((id) => {
if (id !== "undefined" && id !== "") {
axios(
configApiCall(api_path_get_ns_name_from_addr + id),
null,
null
).then((usernameResponse) => {
let username = usernameResponse.data.name;
axios(
configApiCall(api_path_get_user_profile + username),
null,
null
).then((userProfileResponse) => {
let userProfiles = blueprintModerators;
userProfileResponse.data["id"] = id;
userProfiles.push(userProfileResponse.data);
setBlueprintModerators(userProfiles);
// This state update is added to refresh the list of moderators
setOpenDrawer(true);
setOpenDrawer(false);
});
});
}
});
})
.catch((error) => {
console.log(
"Error fetching blueprint permissions : " +
props.blueprintName +
" " +
error
);
});
}, [props.blueprintName]);
const handleUpdatePermissions = (field, value) => {
let data = {
videoEnabled: videoEnabled,
publicInCalls: publicInCalls,
autoAnswer: autoAnswer,
peerDiscovery: peerDiscovery,
accountDiscovery: peerDiscovery,
accountPublish: peerDiscovery,
rendezVous: rendezVous,
defaultModerators: defaultModerators,
upnpEnabled: upnpEnabled,
turnEnabled: turnEnabled,
turnServer: turnServer,
turnServerUserName: turnServerUserName,
turnServerPassword: turnServerPassword,
proxyEnabled: proxyEnabled,
proxyServer: proxyServer,
dhtProxyListUrl: dhtProxyListUrl,
allowLookup: allowLookup,
uiCustomization: uiCustomization,
};
if (field === "peerDiscovery") {
data.peerDiscovery = value;
data.accountDiscovery = value;
data.accountPublish = value;
} else {
data[field] = value;
}
if (turnEnabled === undefined) {
delete data.turnEnabled;
delete data.turnServer;
delete data.turnServerUserName;
delete data.turnServerPassword;
}
if (proxyEnabled === undefined) {
delete data.proxyEnabled;
delete data.proxyServer;
delete data.dhtProxyListUrl;
}
axios(
configApiCall(
api_path_blueprints + "?name=" + props.blueprintName,
"PUT",
data,
null
)
)
.then((response) => {
setOpen(false);
setSeverity("success");
setOpen(true);
setMessage(
i18next.t(
"updated_blueprint_permissions_successfully",
"Blueprint permissions successfully updated."
)
);
})
.catch((error) => {
setOpen(false);
setSeverity("error");
setOpen(true);
setMessage(
i18next.t(
"error_updating_blueprint_permissions",
"Error occurred while updating blueprint permissions."
) +
error +
"!"
);
});
};
const addModeratorToBlueprint = (user) => { const addModeratorToBlueprint = (user) => {
handleUpdatePermissions( updatePolicyData("blueprintModerators", [...blueprintModerators, user]);
"defaultModerators",
defaultModerators + user.id + "/"
);
setDefaultModerators(defaultModerators + user.id + "/");
let newBlueprintModerators = blueprintModerators;
newBlueprintModerators.push(user);
setBlueprintModerators(newBlueprintModerators);
}; };
const removeModeratorFromBlueprint = (user) => { const removeModeratorFromBlueprint = (user) => {
let newDefaultModerators = defaultModerators.replace(user.id + "/", ""); const newBlueprintModerators = blueprintModerators.filter(
handleUpdatePermissions("defaultModerators", newDefaultModerators); (moderator) => moderator.id !== user.id
setDefaultModerators(newDefaultModerators); );
let newBlueprintModerators = blueprintModerators; updatePolicyData("blueprintModerators", newBlueprintModerators);
newBlueprintModerators.splice(newBlueprintModerators.indexOf(user), 1);
setBlueprintModerators(newBlueprintModerators);
}; };
return ( return (
...@@ -377,8 +215,7 @@ export default function EditBlueprintPermissions(props) { ...@@ -377,8 +215,7 @@ export default function EditBlueprintPermissions(props) {
checked={videoEnabled} checked={videoEnabled}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setVideoEnabled(e.target.checked); updatePolicyData(
handleUpdatePermissions(
"videoEnabled", "videoEnabled",
e.target.checked e.target.checked
); );
...@@ -405,8 +242,7 @@ export default function EditBlueprintPermissions(props) { ...@@ -405,8 +242,7 @@ export default function EditBlueprintPermissions(props) {
checked={publicInCalls} checked={publicInCalls}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setPublicInCalls(e.target.checked); updatePolicyData(
handleUpdatePermissions(
"publicInCalls", "publicInCalls",
e.target.checked e.target.checked
); );
...@@ -433,8 +269,7 @@ export default function EditBlueprintPermissions(props) { ...@@ -433,8 +269,7 @@ export default function EditBlueprintPermissions(props) {
checked={autoAnswer} checked={autoAnswer}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setAutoAnswer(e.target.checked); updatePolicyData(
handleUpdatePermissions(
"autoAnswer", "autoAnswer",
e.target.checked e.target.checked
); );
...@@ -466,8 +301,7 @@ export default function EditBlueprintPermissions(props) { ...@@ -466,8 +301,7 @@ export default function EditBlueprintPermissions(props) {
checked={peerDiscovery} checked={peerDiscovery}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setPeerDiscovery(e.target.checked); updatePolicyData(
handleUpdatePermissions(
"peerDiscovery", "peerDiscovery",
e.target.checked e.target.checked
); );
...@@ -502,8 +336,7 @@ export default function EditBlueprintPermissions(props) { ...@@ -502,8 +336,7 @@ export default function EditBlueprintPermissions(props) {
checked={allowLookup} checked={allowLookup}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setAllowLookup(e.target.checked); updatePolicyData(
handleUpdatePermissions(
"allowLookup", "allowLookup",
e.target.checked e.target.checked
); );
...@@ -542,8 +375,7 @@ export default function EditBlueprintPermissions(props) { ...@@ -542,8 +375,7 @@ export default function EditBlueprintPermissions(props) {
checked={rendezVous} checked={rendezVous}
color="primary" color="primary"
onChange={(e) => { onChange={(e) => {
setRendezVous(e.target.checked); updatePolicyData("rendezVous", e.target.checked);
handleUpdatePermissions("rendezVous", e.target.checked);
}} }}
name="rendezVous" name="rendezVous"
inputProps={{ "aria-label": "secondary checkbox" }} inputProps={{ "aria-label": "secondary checkbox" }}
......
import React, { useEffect, useState } from "react"; import React, { useContext, useState } from "react";
import { makeStyles } from "@material-ui/core/styles"; import { makeStyles } from "@material-ui/core/styles";
import Grid from "@material-ui/core/Grid"; import Grid from "@material-ui/core/Grid";
...@@ -14,28 +14,16 @@ import GridContainer from "components/Grid/GridContainer.js"; ...@@ -14,28 +14,16 @@ import GridContainer from "components/Grid/GridContainer.js";
import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react.js"; import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react.js";
import { api_path_blueprints, api_path_get_image, api_path_post_image } from "../../globalUrls"; import { api_path_get_image, api_path_post_image } from "../../globalUrls";
import dashboardStyle from "assets/jss/material-dashboard-react/views/dashboardStyle.js"; import dashboardStyle from "assets/jss/material-dashboard-react/views/dashboardStyle.js";
import i18next from "i18next"; import i18next from "i18next";
import CustomUiPreview from "components/CustomUiPreview/CustomUiPreview"; import CustomUiPreview from "components/CustomUiPreview/CustomUiPreview";
import EditBlueprintUiForm from "./EditBlueprintUiForm"; import EditBlueprintUiForm from "./EditBlueprintUiForm";
import configApiCall from "api"; import { DEFAULT_UI_CUSTOMIZATION } from "./policyData.constants";
import axios from "axios"; import { PolicyDataContext } from "./PolicyDataContext";
const DEFAULT_UI_CUSTOMIZATION = {
hasTitle: true,
customTitle: "",
hasDescription: true,
customDescription: "",
hasTips: false,
hasBackgroundCustom: false,
customBackgroundColor: "",
customBackgroundImageUrl: "",
hasLogo: true,
customLogoImageUrl: "",
};
const styles = { const styles = {
...dashboardStyle, ...dashboardStyle,
...@@ -105,89 +93,23 @@ const useStyles = makeStyles(styles); ...@@ -105,89 +93,23 @@ const useStyles = makeStyles(styles);
export default function EditBlueprintUi({ blueprintName }) { export default function EditBlueprintUi({ blueprintName }) {
const classes = useStyles(); const classes = useStyles();
const [policyData, setPolicyData] = useState({ const { policyData, updatePolicyData, snackbar, setSnackbar } = useContext(
uiCustomization: DEFAULT_UI_CUSTOMIZATION, PolicyDataContext
}); );
let { uiCustomization } = policyData; const { uiCustomization } = policyData;
const setUiCustomization = (ui) => { const setUiCustomization = (ui) => {
setPolicyData({ ...policyData, uiCustomization: ui }); updatePolicyData("uiCustomization", ui);
}; };
const [oldUiCustomization, setOldUiCustomization] = useState(uiCustomization); const [oldUiCustomization, setOldUiCustomization] = useState(uiCustomization);
const [opacity, setOpacity] = useState(0); const [opacity, setOpacity] = useState(0);
const [open, setOpen] = useState(false);
const [message, setMessage] = useState(false);
const [severity, setSeverity] = useState("success");
const [bgFile, setBgFile] = useState(null);
const [logoFile, setLogoFile] = useState(null);
useEffect(() => {
axios(
configApiCall(
api_path_blueprints + "?name=" + blueprintName,
"GET",
null,
null
)
)
.then((response) => {
let policyDataResponse = JSON.parse(response.data.policyData);
policyDataResponse.uiCustomization = JSON.parse(
policyDataResponse.uiCustomization
);
setPolicyData(policyDataResponse);
const { uiCustomization: uiCustomizationResponse } = policyDataResponse;
if (uiCustomizationResponse) {
if (
uiCustomizationResponse.customBackgroundImageUrl &&
uiCustomizationResponse.hasBackgroundCustom
) {
//Get the name of the file from the url
let urlParts = uiCustomizationResponse.customBackgroundImageUrl.split(
"/"
);
if (urlParts.length) {
setBgFile(urlParts[urlParts.length - 1]);
}
}
if (
uiCustomizationResponse.customLogoImageUrl &&
uiCustomizationResponse.hasLogo
) {
//Get the name of the file from the url
let urlParts = uiCustomizationResponse.customLogoImageUrl.split(
"/"
);
if (urlParts.length) {
setLogoFile(urlParts[urlParts.length - 1]);
}
}
// refresh the preview
setOldUiCustomization(uiCustomizationResponse);
console.log("Found ui customization in the policy data");
} else {
setUiCustomization(DEFAULT_UI_CUSTOMIZATION);
console.log("Did not find ui customization in the policy data");
}
})
.catch((error) => {
setUiCustomization(DEFAULT_UI_CUSTOMIZATION);
console.log(
`Error fetching blueprint permissions : ${blueprintName} ${error}`
);
});
}, [blueprintName]);
const handleUpdateUi = (field, value) => { const handleUpdateUi = (field, value) => {
const newUiCustomization = { ...uiCustomization, [field]: value }; const newUiCustomization = { ...uiCustomization, [field]: value };
const newUi = newUiCustomization.isCustomizationEnabled
? newUiCustomization
: DEFAULT_UI_CUSTOMIZATION;
if (field === "title" || field === "description" || field === "backgroundColor") { if (field === "title" || field === "description" || field === "backgroundColor") {
// Don't fade in for those fields // Don't fade in for those fields
...@@ -197,44 +119,12 @@ export default function EditBlueprintUi({ blueprintName }) { ...@@ -197,44 +119,12 @@ export default function EditBlueprintUi({ blueprintName }) {
// then the old preview is updated, and the preview on top fades out // then the old preview is updated, and the preview on top fades out
setOpacity(1); setOpacity(1);
setTimeout(() => { setTimeout(() => {
setOldUiCustomization(newUiCustomization); setOldUiCustomization(newUi);
setOpacity(0); setOpacity(0);
}, 250); }, 250);
} }
axios( updatePolicyData("uiCustomization", newUiCustomization);
configApiCall(
api_path_blueprints + "?name=" + blueprintName,
"PUT",
{ ...policyData, uiCustomization: JSON.stringify(newUiCustomization) },
null
)
)
.then(() => {
setOpen(false);
setSeverity("success");
setOpen(true);
setMessage(
i18next.t(
"updated_blueprint_permissions_successfully",
"Blueprint permissions successfully updated."
)
);
})
.catch((error) => {
console.error(error);
setOpen(false);
setSeverity("error");
setOpen(true);
setMessage(
i18next.t(
"error_updating_blueprint_permissions",
"Error occurred while updating blueprint permissions."
) +
error +
"!"
);
});
}; };
const handleImgDrop = (acceptedFiles, imgType) => { const handleImgDrop = (acceptedFiles, imgType) => {
...@@ -260,7 +150,6 @@ export default function EditBlueprintUi({ blueprintName }) { ...@@ -260,7 +150,6 @@ export default function EditBlueprintUi({ blueprintName }) {
backgroundUrl: newUrl, backgroundUrl: newUrl,
backgroundColor: "", backgroundColor: "",
}); });
setBgFile(acceptedFiles[0].name);
handleUpdateUi("backgroundUrl", newUrl); handleUpdateUi("backgroundUrl", newUrl);
} else if (imgType === "logo") { } else if (imgType === "logo") {
let newUrl = let newUrl =
...@@ -273,7 +162,6 @@ export default function EditBlueprintUi({ blueprintName }) { ...@@ -273,7 +162,6 @@ export default function EditBlueprintUi({ blueprintName }) {
...uiCustomization, ...uiCustomization,
logoUrl: newUrl, logoUrl: newUrl,
}); });
setLogoFile(acceptedFiles[0].name);
handleUpdateUi("logoUrl", newUrl); handleUpdateUi("logoUrl", newUrl);
} }
}) })
...@@ -282,34 +170,6 @@ export default function EditBlueprintUi({ blueprintName }) { ...@@ -282,34 +170,6 @@ export default function EditBlueprintUi({ blueprintName }) {
}); });
}; };
const handleDeleteLogo = (e) => {
setLogoFile(null);
setUiCustomization({
...uiCustomization,
customLogoImageUrl: null,
});
e.stopPropagation();
};
const handleDeleteBg = (e) => {
setBgFile(null);
setUiCustomization({
...uiCustomization,
customBackgroundImageUrl: null,
});
e.preventDefault();
e.stopPropagation();
};
const handleColorChange = (color) => {
setUiCustomization({
...uiCustomization,
customBackgroundColor: color.hex,
customBackgroundImageUrl: null,
});
setBgFile(null);
};
return ( return (
<div> <div>
<BlueprintSnackbar snackbar={snackbar} setSnackbar={setSnackbar} /> <BlueprintSnackbar snackbar={snackbar} setSnackbar={setSnackbar} />
...@@ -339,7 +199,7 @@ export default function EditBlueprintUi({ blueprintName }) { ...@@ -339,7 +199,7 @@ export default function EditBlueprintUi({ blueprintName }) {
> >
<CustomUiPreview <CustomUiPreview
opacity={opacity} opacity={opacity}
uiCustomization={policyData.uiCustomization} uiCustomization={uiCustomization}
/> />
<CustomUiPreview <CustomUiPreview
isOldPreview isOldPreview
...@@ -349,16 +209,10 @@ export default function EditBlueprintUi({ blueprintName }) { ...@@ -349,16 +209,10 @@ export default function EditBlueprintUi({ blueprintName }) {
</Grid> </Grid>
<Grid item xs={12} sm={12} md={12}> <Grid item xs={12} sm={12} md={12}>
<EditBlueprintUiForm <EditBlueprintUiForm
uiCustomization={policyData.uiCustomization} uiCustomization={uiCustomization}
setUiCustomization={setUiCustomization} setUiCustomization={setUiCustomization}
handleUpdateUi={handleUpdateUi} handleUpdateUi={handleUpdateUi}
handleImgDrop={handleImgDrop} handleImgDrop={handleImgDrop}
setLogoFile={setLogoFile}
handleDeleteLogo={handleDeleteLogo}
bgFile={bgFile}
setBgFile={setBgFile}
handleDeleteBg={handleDeleteBg}
handleColorChange={handleColorChange}
/> />
</Grid> </Grid>
</Grid> </Grid>
......
import React, { createContext, useEffect, useState } from "react";
import axios from "axios";
import configApiCall from "../../api";
import { api_path_blueprints } from "../../globalUrls";
import { parsePolicyData } from "./parsePolicyData";
import { _updatePolicyData } from "./updatePolicyData";
import { DEFAULT_POLICY_DATA } from "./policyData.constants";
export const PolicyDataContext = createContext(null);
export const PolicyDataContextProvider = ({ blueprintName, children }) => {
const [policyData, setPolicyData] = useState(DEFAULT_POLICY_DATA);
const [snackbar, setSnackbar] = useState({
open: false,
severity: "success",
message: "",
});
useEffect(() => {
axios(
configApiCall(
api_path_blueprints + "?name=" + blueprintName,
"GET",
null,
null
)
)
.then((response) => {
console.log("GET", response.data.policyData);
return parsePolicyData(response.data.policyData);
})
.then((policyData) => {
console.log("PARSED", policyData);
setPolicyData(policyData);
})
.catch((error) => {
console.log("Error fetching blueprint permissions : " + error);
});
}, [blueprintName]);
const updatePolicyData = (field, value) => {
_updatePolicyData(
blueprintName,
policyData,
setPolicyData,
field,
value,
setSnackbar
);
};
return (
<PolicyDataContext.Provider
value={{ policyData, updatePolicyData, snackbar, setSnackbar }}
>
{children}
</PolicyDataContext.Provider>
);
};
import axios from "axios";
import configApiCall from "../../api";
import {
api_path_get_ns_name_from_addr,
api_path_get_user_profile,
} from "../../globalUrls";
import { DEFAULT_UI_CUSTOMIZATION } from "./policyData.constants";
const getModerators = async (defaultModerators) => {
const moderators = [];
const ids = defaultModerators.split("/").filter((id) => id !== "");
for (const id of ids) {
const usernameResponse = await axios(
configApiCall(api_path_get_ns_name_from_addr + id, "GET", null, null)
);
const username = usernameResponse.data.name;
const userProfileResponse = await axios(
configApiCall(api_path_get_user_profile + username, "GET", null, null)
);
userProfileResponse.data["id"] = id;
moderators.push(userProfileResponse.data);
}
return moderators;
};
const setConfigurationSettings = (policyData) => {
const { turnEnabled, proxyEnabled } = policyData;
if (turnEnabled === true) {
policyData.selectedTurnOption = "customTurn";
} else if (turnEnabled === false) {
policyData.selectedTurnOption = "disabledTurn";
} else {
policyData.selectedTurnOption = "defaultTurn";
}
delete policyData.turnEnabled;
if (proxyEnabled === true) {
policyData.selectedDHTProxyOption = "customDHTProxy";
} else if (proxyEnabled === false) {
policyData.selectedDHTProxyOption = "disabledDHTProxy";
} else {
policyData.selectedDHTProxyOption = "defaultDHTProxy";
}
delete policyData.proxyEnabled;
return policyData;
};
const setCustomizationSettings = (policyData) => {
if (!policyData.uiCustomization) {
policyData.uiCustomization = DEFAULT_UI_CUSTOMIZATION;
return policyData;
}
const result = JSON.parse(policyData.uiCustomization);
const ui = { isCustomizationEnabled: true };
ui.hasTitle = result.title !== "";
ui.title = result.title;
ui.hasDescription = result.description !== "";
ui.description = result.description;
ui.hasTips = result.hasTips;
if (result.backgroundType === "default") {
ui.hasBackground = false;
} else if (result.backgroundType === "color") {
ui.hasBackground = true;
ui.backgroundColor = result.backgroundColorOrUrl;
} else if (result.backgroundType === "image") {
ui.hasBackground = true;
ui.backgroundUrl = result.backgroundColorOrUrl;
}
// Get the name of the file from the url
ui.hasLogo = result.logoUrl !== "";
if (ui.hasLogo) {
ui.logoUrl = result.logoUrl;
}
policyData.uiCustomization = ui;
return policyData;
};
export const parsePolicyData = async (data) => {
let policyData = JSON.parse(data);
policyData.blueprintModerators = await getModerators(
policyData.defaultModerators
);
delete policyData.defaultModerators;
policyData = setConfigurationSettings(policyData);
policyData = setCustomizationSettings(policyData);
return policyData;
};
export const DEFAULT_UI_CUSTOMIZATION = {
isCustomizationEnabled: false,
hasTitle: true,
title: "",
hasDescription: true,
description: "",
hasTips: false,
hasBackground: false,
backgroundColor: "",
backgroundUrl: "",
hasLogo: true,
logoUrl: "",
};
export const DEFAULT_POLICY_DATA = {
videoEnabled: true,
publicInCalls: false,
autoAnswer: false,
peerDiscovery: true,
allowLookup: true,
rendezVous: false,
blueprintModerators: [],
upnpEnabled: true,
selectedTurnOption: "defaultTurn",
turnServer: "turn.jami.net",
turnServerUserName: "ring",
turnServerPassword: "ring",
selectedDHTProxyOption: "defaultDHTProxy",
proxyServer: "dhtproxy.jami.net",
dhtProxyListUrl: "",
uiCustomization: DEFAULT_UI_CUSTOMIZATION,
};
import axios from "axios";
import i18next from "i18next";
import configApiCall from "api";
import { api_path_blueprints } from "globalUrls";
import { debounce } from "lodash";
const updatePerms = (data, field, value) => {
data.defaultModerators = data.blueprintModerators
.map((moderator) => moderator.id)
.join("/");
delete data.blueprintModerators;
if (field === "peerDiscovery") {
data.accountDiscovery = value;
data.accountPublish = value;
}
return data;
};
const updateConfig = (data) => {
const { selectedTurnOption, selectedDHTProxyOption } = data;
// if undefined, it means we want the default values
if (selectedTurnOption !== "customTurn") {
delete data.turnServer;
delete data.turnServerUserName;
delete data.turnServerPassword;
}
if (selectedDHTProxyOption !== "customDHTProxy") {
delete data.proxyServer;
delete data.dhtProxyListUrl;
}
if (selectedTurnOption === "customTurn") {
data.turnEnabled = true;
} else if (selectedTurnOption === "disabledTurn") {
data.turnEnabled = false;
}
delete data.selectedTurnOption;
if (selectedDHTProxyOption === "customDHTProxy") {
data.proxyEnabled = true;
} else if (selectedDHTProxyOption === "disabledDHTProxy") {
data.proxyEnabled = false;
}
delete data.selectedDHTProxyOption;
return data;
};
const updateUiCustomization = (data) => {
if (data.uiCustomization.isCustomizationEnabled === false) {
return data;
}
const {
hasTitle,
title,
hasDescription,
description,
hasTips,
hasBackground,
backgroundColor,
backgroundUrl,
hasLogo,
logoUrl,
} = data.uiCustomization;
const ui = {};
if (hasTitle === false) {
ui.title = "";
} else if (title !== "") {
ui.title = title;
}
if (hasDescription === false) {
ui.description = "";
} else if (description !== "") {
ui.description = description;
}
ui.areTipsEnabled = hasTips;
if (hasBackground === false) {
ui.backgroundType = "default";
} else if (backgroundUrl !== "") {
ui.backgroundType = "image";
ui.backgroundColorOrUrl = backgroundUrl;
} else if (backgroundColor !== "") {
ui.backgroundType = "color";
ui.backgroundColorOrUrl = backgroundColor;
} else {
ui.backgroundType = "default";
}
if (hasLogo === false) {
ui.logoUrl = "";
} else if (logoUrl !== "") {
ui.logoUrl = logoUrl;
}
console.log("updateUiCustomization", ui);
data.uiCustomization = JSON.stringify(ui);
return data;
};
const sendPutRequest = (blueprintName, data, setSnackbar) => {
console.log("PUT", data);
axios(
configApiCall(
api_path_blueprints + "?name=" + blueprintName,
"PUT",
data,
null
)
)
.then((response) => {
const message = i18next.t(
"updated_blueprint_permissions_successfully",
"Blueprint permissions successfully updated."
);
setSnackbar({
open: true,
severity: "success",
message,
});
})
.catch((error) => {
const msg = i18next.t(
"error_updating_blueprint_permissions",
"Error occurred while updating blueprint permissions."
);
setSnackbar({
open: true,
severity: "error",
message: `${msg} ${error}!`,
});
});
};
const debouncedSendPutRequest = debounce(sendPutRequest, 200, {
trailing: true,
});
export const _updatePolicyData = (
blueprintName,
policyData,
setPolicyData,
field,
value,
setSnackbar
) => {
setPolicyData((state) => ({ ...state, [field]: value }));
let data = { ...policyData, [field]: value };
data = updatePerms(data, field, value);
data = updateConfig(data);
data = updateUiCustomization(data);
console.log("updatePolicyData", { field, value });
debouncedSendPutRequest(blueprintName, data, setSnackbar);
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment