import { ActionIcon, Badge, Box, Divider, Grid, Menu, Space, Title, Tooltip } from '@mantine/core'; import { useState } from 'react'; import { FaPause, FaPlay, FaStop } from 'react-icons/fa'; import { MdOutlineArrowForwardIos } from "react-icons/md" import YesNoModal from '../../YesNoModal'; import { errorNotify, isMediumScreen, okNotify } from '../../../js/utils'; import { BsArrowRepeat, BsTrashFill } from 'react-icons/bs'; import { TbNumbers } from 'react-icons/tb'; import { BiRename } from 'react-icons/bi' import ChangePortModal from './ChangePortModal'; import RenameForm from './RenameForm'; import { regexproxy, Service } from '../utils'; import { MenuDropDownWithButton } from '../../MainLayout'; //"status":"stop"/"wait"/"active"/"pause", function ServiceRow({ service, onClick }:{ service:Service, onClick?:()=>void }) { let status_color = "gray"; switch(service.status){ case "stop": status_color = "red"; break; case "wait": status_color = "yellow"; break; case "active": status_color = "teal"; break; case "pause": status_color = "cyan"; break; } const [stopModal, setStopModal] = useState(false); const [buttonLoading, setButtonLoading] = useState(false) const [tooltipStopOpened, setTooltipStopOpened] = useState(false); const [deleteModal, setDeleteModal] = useState(false) const [changePortModal, setChangePortModal] = useState(false) const [choosePortModal, setChoosePortModal] = useState(false) const [renameModal, setRenameModal] = useState(false) const isMedium = isMediumScreen() const stopService = async () => { setButtonLoading(true) await regexproxy.servicestop(service.id).then(res => { if(!res){ okNotify(`Service ${service.id} stopped successfully!`,`The service ${service.name} has been stopped!`) }else{ errorNotify(`An error as occurred during the stopping of the service ${service.id}`,`Error: ${res}`) } }).catch(err => { errorNotify(`An error as occurred during the stopping of the service ${service.id}`,`Error: ${err}`) }) setButtonLoading(false); } const startService = async () => { setButtonLoading(true) await regexproxy.servicestart(service.id).then(res => { if(!res){ okNotify(`Service ${service.id} started successfully!`,`The service ${service.name} has been started!`) }else{ errorNotify(`An error as occurred during the starting of the service ${service.id}`,`Error: ${res}`) } }).catch(err => { errorNotify(`An error as occurred during the starting of the service ${service.id}`,`Error: ${err}`) }) setButtonLoading(false) } const pauseService = async () => { setButtonLoading(true) await regexproxy.servicepause(service.id).then(res => { if(!res){ okNotify(`Service ${service.id} paused successfully!`,`The service ${service.name} has been paused (Transparent mode)!`) }else{ errorNotify(`An error as occurred during the pausing of the service ${service.id}`,`Error: ${res}`) } }).catch(err => { errorNotify(`An error as occurred during the pausing of the service ${service.id}`,`Error: ${err}`) }) setButtonLoading(false) } const deleteService = () => { regexproxy.servicedelete(service.id).then(res => { if (!res){ okNotify("Service delete complete!",`The service ${service.id} has been deleted!`) }else errorNotify("An error occurred while deleting a service",`Error: ${res}`) }).catch(err => { errorNotify("An error occurred while deleting a service",`Error: ${err}`) }) } const changePort = () => { regexproxy.serviceregenport(service.id).then(res => { if (!res){ okNotify("Service port regeneration completed!",`The service ${service.id} has changed the internal port!`) }else errorNotify("An error occurred while changing the internal service port",`Error: ${res}`) }).catch(err => { errorNotify("An error occurred while changing the internal service port",`Error: ${err}`) }) } return <> {service.name} :{service.public_port} {service.internal_port} {"->"} {service.public_port} {!isMedium?:null} {!isMedium?:<>} Status: {service.status} Regex: {service.n_regex} Connections Blocked: {service.n_packets} {isMedium?:<>} Rename service } onClick={()=>setRenameModal(true)}>Change service name Change ports } onClick={()=>setChoosePortModal(true)}>Change port } onClick={()=>setChangePortModal(true)}>Regen proxy port Danger zone } onClick={()=>setDeleteModal(true)}>Delete Service {["pause","wait"].includes(service.status)? setStopModal(true)} size="xl" radius="md" variant="filled" disabled={service.status === "stop"} aria-describedby="tooltip-stop-id" onFocus={() => setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}> : } {onClick? :null} {!isMedium?<>:null} {setStopModal(false);}} action={stopService} opened={stopModal} /> setDeleteModal(false) } action={deleteService} opened={deleteModal} /> setChangePortModal(false)} action={changePort} opened={changePortModal} /> setChoosePortModal(false)} opened={choosePortModal} /> setRenameModal(false)} opened={renameModal} service={service} /> } export default ServiceRow;