import { ActionIcon, Badge, Divider, Menu, Space, Title, Tooltip } from '@mantine/core'; import React, { useState } from 'react'; import { FaPlay, FaStop } from 'react-icons/fa'; import { porthijack, Service } from '../utils'; import style from "./index.module.scss"; import YesNoModal from '../../YesNoModal'; import { errorNotify, okNotify } from '../../../js/utils'; import { BsArrowRepeat, BsTrashFill } from 'react-icons/bs'; import { BiRename } from 'react-icons/bi' import RenameForm from './RenameForm'; import ChangeDestination from './ChangeDestination'; import PortInput from '../../PortInput'; import { useForm } from '@mantine/form'; import { MenuDropDownWithButton } from '../../MainLayout'; function ServiceRow({ service }:{ service:Service }) { let status_color = service.active ? "teal": "red" const [buttonLoading, setButtonLoading] = useState(false) const [tooltipStopOpened, setTooltipStopOpened] = useState(false); const [deleteModal, setDeleteModal] = useState(false) const [renameModal, setRenameModal] = useState(false) const [changeDestModal, setChangeDestModal] = useState(false) const portInputRef = React.createRef() const form = useForm({ initialValues: { proxy_port:service.proxy_port }, validate:{ proxy_port: (value) => (value > 0 && value < 65536)? null : "Invalid proxy port" } }) const onChangeProxyPort = ({proxy_port}:{proxy_port:number}) => { if (proxy_port === service.proxy_port) return if (proxy_port > 0 && proxy_port < 65536 && proxy_port !== service.public_port){ porthijack.changedestination(service.service_id, service.ip_dst, proxy_port).then( res => { if (res.status === "ok"){ okNotify(`Service ${service.name} destination port has changed in ${ proxy_port }`, `Successfully changed destination port`) }else{ errorNotify(`Error while changing the destination port of ${service.name}`,`Error: ${res.status}`) } }).catch( err => { errorNotify("Request for changing port failed!",`Error: [ ${err} ]`) }) }else{ form.setFieldValue("proxy_port", service.proxy_port) errorNotify(`Error while changing the destination port of ${service.name}`,`Insert a valid port number`) } } const stopService = async () => { setButtonLoading(true) await porthijack.servicestop(service.service_id).then(res => { if(!res){ okNotify(`Service ${service.name} stopped successfully!`,`The service on ${service.public_port} has been stopped!`) }else{ errorNotify(`An error as occurred during the stopping of the service ${service.public_port}`,`Error: ${res}`) } }).catch(err => { errorNotify(`An error as occurred during the stopping of the service ${service.public_port}`,`Error: ${err}`) }) setButtonLoading(false); } const startService = async () => { setButtonLoading(true) await porthijack.servicestart(service.service_id).then(res => { if(!res){ okNotify(`Service ${service.name} started successfully!`,`The service on ${service.public_port} has been started!`) }else{ errorNotify(`An error as occurred during the starting of the service ${service.public_port}`,`Error: ${res}`) } }).catch(err => { errorNotify(`An error as occurred during the starting of the service ${service.public_port}`,`Error: ${err}`) }) setButtonLoading(false) } const deleteService = () => { porthijack.servicedelete(service.service_id).then(res => { if (!res){ okNotify("Service delete complete!",`The service ${service.name} 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}`) }) } return <>
{service.name}
Status: {service.active?"ENABLED":"DISABLED"} {service.proto}
FROM {service.ip_src} : {service.public_port}
TO {service.ip_dst} :
portInputRef.current?.blur())}> {onChangeProxyPort({proxy_port:parseInt(e.target.value)})}} ref={portInputRef} {...form.getInputProps("proxy_port")} />
Rename service } onClick={()=>setRenameModal(true)}>Change service name Change destination } onClick={()=>setChangeDestModal(true)}>Change hijacking destination Danger zone } onClick={()=>setDeleteModal(true)}>Delete Service setTooltipStopOpened(false)} onBlur={() => setTooltipStopOpened(false)} onMouseEnter={() => setTooltipStopOpened(true)} onMouseLeave={() => setTooltipStopOpened(false)}>

setDeleteModal(false) } action={deleteService} opened={deleteModal} /> setRenameModal(false)} opened={renameModal} service={service} /> setChangeDestModal(false)} opened={changeDestModal} service={service} /> } export default ServiceRow;