import { ClipboardCheckIcon, ClipboardIcon, LoaderCircle, TriangleAlert } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; import { useForm, usePage } from '@inertiajs/react'; import React, { FormEventHandler, useState } from 'react'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import InputError from '@/components/input-error'; import { Input } from '@/components/ui/input'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { ServerProvider } from '@/types/server-provider'; import CreateServerProvider from '@/pages/server-providers/create-server-provider'; import axios from 'axios'; import { Form, FormField, FormFields } from '@/components/ui/form'; import type { SharedData } from '@/types'; type CreateServerForm = { provider: string; server_provider: number; name: string; os: string; ip: string; port: number; region: string; plan: string; webserver: string; database: string; php: string; }; export default function CreateServer({ children }: { children: React.ReactNode }) { const page = usePage(); const form = useForm>({ provider: 'custom', server_provider: 0, name: '', os: '', ip: '', port: 22, region: '', plan: '', webserver: '', database: '', php: '', }); const submit: FormEventHandler = (e) => { e.preventDefault(); form.post(route('servers')); }; const [copySuccess, setCopySuccess] = useState(false); const copyToClipboard = () => { navigator.clipboard.writeText(page.props.publicKeyText).then(() => { setCopySuccess(true); setTimeout(() => { setCopySuccess(false); }, 2000); }); }; const [serverProviders, setServerProviders] = useState([]); const fetchServerProviders = async () => { const serverProviders = await axios.get(route('server-providers.all')); setServerProviders(serverProviders.data); }; const selectProvider = (provider: string) => { form.setData('provider', provider); form.clearErrors(); if (provider !== 'custom') { form.setData('server_provider', 0); form.setData('region', ''); form.setData('plan', ''); fetchServerProviders(); } }; const selectServerProvider = async (serverProvider: string) => { form.setData('server_provider', parseInt(serverProvider)); await fetchRegions(parseInt(serverProvider)); }; const [regions, setRegions] = useState<{ [key: string]: string }>({}); const fetchRegions = async (serverProvider: number) => { const regions = await axios.get(route('server-providers.regions', { serverProvider: serverProvider })); setRegions(regions.data); }; const selectRegion = async (region: string) => { form.setData('region', region); if (region !== '') { await fetchPlans(form.data.server_provider, region); } }; const [plans, setPlans] = useState<{ [key: string]: string }>({}); const fetchPlans = async (serverProvider: number, region: string) => { const plans = await axios.get(route('server-providers.plans', { serverProvider: serverProvider, region: region })); setPlans(plans.data); }; const selectPlan = (plan: string) => { form.setData('plan', plan); }; return ( {children} Create new server Fill in the details to create a new server.
{form.data.provider && form.data.provider !== 'custom' && (
item !== 'custom')} defaultProvider={form.data.provider} onProviderAdded={fetchServerProviders} />
)} {form.data.provider && form.data.provider !== 'custom' && (
)} {form.data.provider === 'custom' && ( <> Your server needs to have a new unused installation of supported operating systems and must have a root user. To get started, add our public key to /root/.ssh/authorized_keys file by running the bellow command on your server as root. )}
form.setData('name', e.target.value)} />
{form.data.provider === 'custom' && (
form.setData('ip', e.target.value)} /> form.setData('port', parseInt(e.target.value))} />
)}
); }