Move more code to network.js

This commit is contained in:
Alessandro Pignotti 2025-03-11 19:45:00 +01:00
parent 0ec99ddf9d
commit b947a35dd2
2 changed files with 91 additions and 89 deletions

View File

@ -1,103 +1,18 @@
<script> <script>
import { networkData, startLogin } from '$lib/network.js' import { networkData, startLogin, updateButtonData } from '$lib/network.js'
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import PanelButton from './PanelButton.svelte'; import PanelButton from './PanelButton.svelte';
var dispatch = createEventDispatcher(); var dispatch = createEventDispatcher();
var connectionState = networkData.connectionState; var connectionState = networkData.connectionState;
var exitNode = networkData.exitNode; var exitNode = networkData.exitNode;
function handleConnect() { function handleConnect() {
connectionState.set("DOWNLOADING"); connectionState.set("DOWNLOADING");
dispatch('connect'); 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 updateButtonData(state) {
switch(state) {
case "DISCONNECTED":
return {
buttonText: "Connect to Tailscale",
isClickable: true,
clickHandler: handleConnect,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
case "DOWNLOADING":
return {
buttonText: "Loading IP stack...",
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
case "LOGINSTARTING":
return {
buttonText: "Starting Login...",
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
case "LOGINREADY":
return {
buttonText: "Login to Tailscale",
isClickable: true,
clickHandler: null,
clickUrl: networkData.loginUrl,
buttonTooltip: null,
rightClickHandler: null
};
case "CONNECTED":
return {
buttonText: `IP: ${networkData.currentIp}`,
isClickable: true,
clickHandler: null,
clickUrl: networkData.dashboardUrl,
buttonTooltip: "Right-click to copy",
rightClickHandler: handleCopyIP
};
case "IPCOPIED":
return {
buttonText: "Copied!",
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
default:
return {
buttonText: `Text for state: ${state}`,
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
}
}
let buttonData = null; let buttonData = null;
$: buttonData = updateButtonData($connectionState); $: buttonData = updateButtonData($connectionState, handleConnect);
</script> </script>
<h1 class="text-lg font-bold">Networking</h1> <h1 class="text-lg font-bold">Networking</h1>
<PanelButton buttonImage="assets/tailscale.svg" clickUrl={buttonData.clickUrl} clickHandler={buttonData.clickHandler} rightClickHandler={buttonData.rightClickHandler} buttonTooltip={buttonData.buttonTooltip} buttonText={buttonData.buttonText}> <PanelButton buttonImage="assets/tailscale.svg" clickUrl={buttonData.clickUrl} clickHandler={buttonData.clickHandler} rightClickHandler={buttonData.rightClickHandler} buttonTooltip={buttonData.buttonTooltip} buttonText={buttonData.buttonText}>

View File

@ -61,6 +61,93 @@ export async function startLogin()
return url; return url;
} }
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);
}
}
export function updateButtonData(state, handleConnect) {
switch(state) {
case "DISCONNECTED":
return {
buttonText: "Connect to Tailscale",
isClickable: true,
clickHandler: handleConnect,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
case "DOWNLOADING":
return {
buttonText: "Loading IP stack...",
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
case "LOGINSTARTING":
return {
buttonText: "Starting Login...",
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
case "LOGINREADY":
return {
buttonText: "Login to Tailscale",
isClickable: true,
clickHandler: null,
clickUrl: networkData.loginUrl,
buttonTooltip: null,
rightClickHandler: null
};
case "CONNECTED":
return {
buttonText: `IP: ${networkData.currentIp}`,
isClickable: true,
clickHandler: null,
clickUrl: networkData.dashboardUrl,
buttonTooltip: "Right-click to copy",
rightClickHandler: handleCopyIP
};
case "IPCOPIED":
return {
buttonText: "Copied!",
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
default:
return {
buttonText: `Text for state: ${state}`,
isClickable: false,
clickHandler: null,
clickUrl: null,
buttonTooltip: null,
rightClickHandler: null
};
}
}
export const networkInterface = { authKey: authKey, controlUrl: controlUrl, loginUrlCb: loginUrlCb, stateUpdateCb: stateUpdateCb, netmapUpdateCb: netmapUpdateCb }; export const networkInterface = { authKey: authKey, controlUrl: controlUrl, loginUrlCb: loginUrlCb, stateUpdateCb: stateUpdateCb, netmapUpdateCb: netmapUpdateCb };
export const networkData = { currentIp: null, connectionState: connectionState, exitNode: exitNode, loginUrl: null, dashboardUrl: dashboardUrl } export const networkData = { currentIp: null, connectionState: connectionState, exitNode: exitNode, loginUrl: null, dashboardUrl: dashboardUrl }