import React, { useState, useEffect } from "react"; import { toast } from "react-toastify"; import theme from "../theme.jsx"; import { Paper, Tooltip, Typography, Divider, Button, ButtonGroup, Grid, Card, Chip, Switch, } from "@mui/material"; import { useNavigate, Link } from "react-router-dom"; import Priority from "../components/Priority.jsx"; //import { useAlert const Priorities = (props) => { const { globalUrl, userdata,clickedFromOrgTab, serverside, billingInfo, stripeKey, checkLogin, setAdminTab, setCurTab, notifications, setNotifications, } = props; const [showDismissed, setShowDismissed] = React.useState(false); const [showRead, setShowRead] = React.useState(false); const [appFramework, setAppFramework] = React.useState({}); const [selectedWorkflow, setSelectedWorkflow] = React.useState("NO HIGHLIGHT"); const [selectedExecutionId, setSelectedExecutionId] = React.useState("NO HIGHLIGHT"); let navigate = useNavigate(); useEffect(() => { getFramework() // Check "workflow" and "execution_id" in URL const urlParams = new URLSearchParams(window.location.search) const workflow = urlParams.get("workflow") const execution_id = urlParams.get("execution_id") if (execution_id !== null) { setSelectedExecutionId(execution_id) //toast.info("Execution-related notifications are highlighted.") } if (workflow !== null) { setSelectedWorkflow(workflow) toast.info("Workflow-related notifications are highlighted.") } }, []) if (userdata === undefined || userdata === null) { return } const getFramework = () => { fetch(globalUrl + "/api/v1/apps/frameworkConfiguration", { method: "GET", headers: { "Content-Type": "application/json", Accept: "application/json", }, credentials: "include", }) .then((response) => { if (response.status !== 200) { console.log("Status not 200 for framework!"); } return response.json(); }) .then((responseJson) => { if (responseJson.success === false) { setAppFramework({}) if (responseJson.reason !== undefined) { //toast("Failed loading: " + responseJson.reason) } else { //toast("Failed to load framework for your org.") } } else { setAppFramework(responseJson) } }) .catch((error) => { console.log("err in framework: ", error.toString()); }) } const clearNotifications = () => { // Don't really care about the logout toast("Clearing notifications") fetch(`${globalUrl}/api/v1/notifications/clear`, { credentials: "include", method: "GET", headers: { "Content-Type": "application/json", }, }) .then(function (response) { if (response.status !== 200) { console.log("Error in response"); } return response.json(); }) .then(function (responseJson) { if (responseJson.success === true) { // Reload the UI const newNotifications = notifications.map((notification) => { notification.read = true return notification }) setNotifications(newNotifications) setShowRead(true) } else { toast("Failed dismissing notifications. Please try again later."); } }) .catch((error) => { console.log("error in notification dismissal: ", error); //removeCookie("session_token", {path: "/"}) }); }; const dismissNotification = (alert_id, disabled) => { var notificationurl = `${globalUrl}/api/v1/notifications/${alert_id}/markasread` if (disabled === true) { notificationurl += "?disabled=true" } else if (disabled === false) { notificationurl += "?disabled=false" } fetch(notificationurl , { credentials: "include", method: "GET", headers: { "Content-Type": "application/json", }, }) .then(function (response) { if (response.status !== 200) { console.log("Error in response"); } return response.json(); }) .then(function (responseJson) { if (responseJson.success === true) { // Mark current one as read var newNotifications = notifications.map((notification) => { if (notification.id === alert_id) { notification.read = true } return notification }) if (disabled === true) { toast("Notification disabled, and will not be shown again.") newNotifications = newNotifications.map((notification) => { if (notification.id === alert_id) { notification.ignored = true } return notification }) console.log("NEW NOTIFICATIONS: ", newNotifications); } else if (disabled === false) { toast("Notification re-enabled successfully") newNotifications = newNotifications.map((notification) => { if (notification.id === alert_id) { notification.ignored = false } return notification }) } else { toast("Notification dismissed successfully") } //const newNotifications = notifications.filter( // (data) => data.id !== alert_id //) //console.log("NEW NOTIFICATIONS: ", newNotifications); if (setNotifications !== undefined && newNotifications !== undefined) { setNotifications(newNotifications) } } else { toast("Failed dismissing notification. Please try again later."); } }) .catch((error) => { console.log("error in notification dismissal: ", error); //removeCookie("session_token", {path: "/"}) }) } const notificationWidth = "100%" const imagesize = 22 const boxColor = "#86c142" const NotificationItem = (props) => { const {data} = props var image = ""; var orgName = ""; var orgId = ""; const highlighted = selectedExecutionId === "" && selectedWorkflow === "" ? false : data.reference_url === undefined || data.reference_url === null || data.reference_url.length === 0 ? false : data.reference_url.includes(selectedExecutionId) || data.reference_url.includes(selectedWorkflow) if (userdata.orgs !== undefined) { const foundOrg = userdata.orgs.find((org) => org.id === data["org_id"]); if (foundOrg !== undefined && foundOrg !== null) { //position: "absolute", bottom: 5, right: -5, const imageStyle = { width: imagesize, height: imagesize, pointerEvents: "none", marginLeft: data.creator_org !== undefined && data.creator_org.length > 0 ? 20 : 0, borderRadius: 10, border: foundOrg.id === userdata.active_org.id ? `3px solid ${boxColor}` : null, cursor: "pointer", marginRight: 10, }; image = foundOrg.image === "" ? ( {foundOrg.name} ) : ( {foundOrg.name} {}} /> ); orgName = foundOrg.name; orgId = foundOrg.id; } } return (
{data.amount === 1 && data.read === false ? : null} {data.ignored === true ? : null} {data.read === false ? : } {data.title}
{data.image !== undefined && data.image !== null && data.image.length > 0 ? {data.title} : null } {data.description}
{data.read === false ? ( ) : null} First seen: {new Date(data.created_at * 1000).toISOString().slice(0, 19)} Last seen: {new Date(data.updated_at * 1000).toISOString().slice(0, 19)} Times seen: {data.amount}
); } return (

Notifications

Notifications help you find potential problems with your workflows and apps.  Learn more
{ setShowRead(!showRead); }} />  Show read {notifications !== undefined && notifications !== null && notifications.length > 1 ? ( ) : null}
{notifications === null || notifications === undefined || notifications.length === 0 ? null :
{notifications.map((notification, index) => { if (showRead === false && notification.read === true) { return null } return ( ) })}
} {clickedFromOrgTab? null : }

Suggestions

Suggestions are tasks identified by Shuffle to help you discover ways to protect your and customers' company.
These range from simple configurations in Shuffle to Usecases you may have missed.  Learn more
{ setShowDismissed(!showDismissed); }} />  Show dismissed {userdata.priorities === null || userdata.priorities === undefined || userdata.priorities.length === 0 ? No Suggestions found : userdata.priorities.map((priority, index) => { if (showDismissed === false && priority.active === false) { return null } return ( ) }) }
) } export default Priorities;