|
@@ -1,11 +1,102 @@
|
|
<script>
|
|
<script>
|
|
- var currentIp = null;
|
|
|
|
|
|
+ import { networkData, startLogin } from '$lib/network.js'
|
|
|
|
+ import { createEventDispatcher } from 'svelte';
|
|
|
|
+ var dispatch = createEventDispatcher();
|
|
|
|
+ var connectionState = networkData.connectionState;
|
|
|
|
+ function handleConnect() {
|
|
|
|
+ connectionState.set("DOWNLOADING");
|
|
|
|
+ dispatch('connect');
|
|
|
|
+ }
|
|
|
|
+ async function handleCopyIP(event)
|
|
|
|
+ {
|
|
|
|
+ // To prevent the default contexmenu from showing up when right-clicking..
|
|
|
|
+ event.preventDefault();
|
|
|
|
+ // Copy the IP to the clipboard.
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ await window.navigator.clipboard.writeText(networkData.currentIp)
|
|
|
|
+ connectionState.set("IPCOPIED");
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ connectionState.set("CONNECTED");
|
|
|
|
+ }, 2000);
|
|
|
|
+ }
|
|
|
|
+ catch(msg)
|
|
|
|
+ {
|
|
|
|
+ console.log("Copy ip to clipboard: Error: " + msg);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function getButtonText(state)
|
|
|
|
+ {
|
|
|
|
+ switch(state)
|
|
|
|
+ {
|
|
|
|
+ case "DISCONNECTED":
|
|
|
|
+ return "Connect to Tailscale";
|
|
|
|
+ case "DOWNLOADING":
|
|
|
|
+ return "Loading IP stack...";
|
|
|
|
+ case "LOGINSTARTING":
|
|
|
|
+ return "Starting Login...";
|
|
|
|
+ case "LOGINREADY":
|
|
|
|
+ return "Login to Tailscale";
|
|
|
|
+ case "CONNECTED":
|
|
|
|
+ return `IP: ${networkData.currentIp}`;
|
|
|
|
+ case "IPCOPIED":
|
|
|
|
+ return "Copied!";
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return `Text for state: ${state}`;
|
|
|
|
+ }
|
|
|
|
+ function isClickableState(state)
|
|
|
|
+ {
|
|
|
|
+ switch(state)
|
|
|
|
+ {
|
|
|
|
+ case "DISCONNECTED":
|
|
|
|
+ case "LOGINREADY":
|
|
|
|
+ case "CONNECTED":
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ function getClickHandler(state)
|
|
|
|
+ {
|
|
|
|
+ switch(state)
|
|
|
|
+ {
|
|
|
|
+ case "DISCONNECTED":
|
|
|
|
+ return handleConnect;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ function getClickUrl(state)
|
|
|
|
+ {
|
|
|
|
+ switch(state)
|
|
|
|
+ {
|
|
|
|
+ case "LOGINREADY":
|
|
|
|
+ return networkData.loginUrl;
|
|
|
|
+ case "CONNECTED":
|
|
|
|
+ return networkData.dashboardUrl;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ function getButtonTooltip(state)
|
|
|
|
+ {
|
|
|
|
+ switch(state)
|
|
|
|
+ {
|
|
|
|
+ case "CONNECTED":
|
|
|
|
+ return "Right-click to copy";
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ function getRightClickHandler(state)
|
|
|
|
+ {
|
|
|
|
+ switch(state)
|
|
|
|
+ {
|
|
|
|
+ case "CONNECTED":
|
|
|
|
+ return handleCopyIP;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
</script>
|
|
</script>
|
|
<h1 class="text-lg font-bold">Networking</h1>
|
|
<h1 class="text-lg font-bold">Networking</h1>
|
|
-{#if currentIp === null}
|
|
|
|
- <p class="bg-neutral-700 hover:bg-neutral-500 p-2 rounded-md cursor-pointer"><img src="assets/tailscale.svg" class="inline w-8"/><span class="ml-1">Connect to Tailscale</span></p>
|
|
|
|
-{:else}
|
|
|
|
- <p>Current IP: {currentIp}</p>
|
|
|
|
-{/if}
|
|
|
|
|
|
+<a href={getClickUrl($connectionState)} target="_blank" on:click={getClickHandler($connectionState)} on:contextmenu={getRightClickHandler($connectionState)}><p class="bg-neutral-700 p-2 rounded-md {isClickableState($connectionState) ? "hover:bg-neutral-500 cursor-pointer" : ""}" title={getButtonTooltip($connectionState)}><img src="assets/tailscale.svg" class="inline w-8"/><span class="ml-1">{getButtonText($connectionState)}</span></p></a>
|
|
<p>WebVM can connect to the Internet via Tailscale</p>
|
|
<p>WebVM can connect to the Internet via Tailscale</p>
|
|
<p>Using Tailscale is required since browser do not support TCP/UDP sockets (yet!)</p>
|
|
<p>Using Tailscale is required since browser do not support TCP/UDP sockets (yet!)</p>
|