import React, { Component } from "react"; import { Icon } from 'semantic-ui-react' import Import from '../Modal/importer' import { random_colour, random_emoji } from "../../helper/visual"; import "../../css/dist/output.css" import {BsArrowLeftShort} from 'react-icons/bs'; import {ReactComponent as ReactLogo} from '../../images/logo.svg' import chattyImage from '../../images/chatty.png'; // Import the image export default class Navbar extends Component{ constructor(props){ super(props) this.temp_host = 0 this.deleteNode = props.onDelete this.state = { open : true, menu : [], colour : props.colour || [], text : "", name : "", emoji : props.emoji || [], mode : false, modal : false, error : false, proxmoxVncInfo: null // Added missing state for Proxmox VNC info } } componentDidMount(){ this.fetch_classes() } fetch_classes = async () => { try { setInterval( async () => { await fetch("http://localhost:2000/api/open/ports", { method: 'GET', mode : 'cors',}) .then(response => response.json()) .then(data => { this.handelTabs(this.state.menu,data, data) this.setState({menu : data}) }) .catch(error => {console.log(error)}) },1000); }catch(e){ console.log(e) } } appendStreamNode = async (type) => { const pattern = { local : new RegExp('^https?://(localhost)(:[0-9]+)?(/)?$'), share : new RegExp('^https?://(?:[a-zA-Z0-9]+\\.gradio\\.live)/?$'), huggingFace: new RegExp('^https?://([a-zA-Z0-9-]+\\.hf\\.space)/?$'), proxmoxVNC: new RegExp('^wss?://([a-zA-Z0-9-]+\\.yourdomain\\.com)/?$') // Regex pattern for Proxmox VNC URLs } if (this.state.name.length > 20 || this.state.text === ""|| this.state.menu.findIndex(element => {return element.name.toLowerCase() === this.state.name.toLowerCase() || element.host.includes(this.state.text) }) !== -1 || this.state.text.includes(" ") || (!pattern.local.test(this.state.text) && !pattern.share.test(this.state.text) && !pattern.huggingFace.test(this.state.text) && !pattern.proxmoxVNC.test(this.state.text))){ this.setState({ 'text': '', 'name': '', 'error': true}) return } fetch(this.state.text, {method: "GET", mode: 'no-cors'}).then((re) => { fetch("http://localhost:2000/api/append/port", {method: 'POST', mode : 'cors', headers : { 'Content-Type' : 'application/json' }, body: JSON.stringify({file : "", kwargs : { type : type }, name : this.state.name === "" ?`temp_class_${this.temp_host++}` : `${this.state.name}`, port: 0 , host : this.state.text}) }).then(resp => { this.setState({'text': "",'name' : "",'error' : false,'modal' : false }) }).catch(() => this.setState({'text': '', 'name' : '', 'error' : true, })) }).catch((err)=> this.setState({'text': '','name' : '', 'error' : true,})) } renderProxmoxVncTab = () => { const { proxmoxVncInfo } = this.state; if (!proxmoxVncInfo) return null; return (