194 lines
5.9 KiB
JavaScript
194 lines
5.9 KiB
JavaScript
const { invoke } = window.__TAURI__.core;
|
|
|
|
let connected = false;
|
|
let timerStart = null;
|
|
let timerInterval = null;
|
|
|
|
const appIdInput = document.getElementById("appId");
|
|
const statusInput = document.getElementById("statusInput");
|
|
const detailsInput = document.getElementById("detailsInput");
|
|
const showTimeCheck = document.getElementById("showTime");
|
|
const connectBtn = document.getElementById("connectBtn");
|
|
const setBtn = document.getElementById("setBtn");
|
|
const clearBtn = document.getElementById("clearBtn");
|
|
const statusDot = document.getElementById("statusDot");
|
|
const statusLabel = document.getElementById("statusLabel");
|
|
const previewTitle = document.getElementById("previewTitle");
|
|
const previewStatus = document.getElementById("previewStatus");
|
|
const previewDetails = document.getElementById("previewDetails");
|
|
const previewTime = document.getElementById("previewTime");
|
|
|
|
async function toggleConnection() {
|
|
if (connected) {
|
|
try {
|
|
await invoke("disconnect");
|
|
setConnected(false);
|
|
toast("Disconnected", "neutral");
|
|
} catch (e) {
|
|
toast(e, "error");
|
|
}
|
|
} else {
|
|
const appId = appIdInput.value.trim();
|
|
if (!appId) {
|
|
toast("Paste your Application ID first", "error");
|
|
appIdInput.focus();
|
|
return;
|
|
}
|
|
connectBtn.textContent = "Connecting…";
|
|
connectBtn.disabled = true;
|
|
try {
|
|
await invoke("connect", { appId });
|
|
setConnected(true);
|
|
toast("Connected to Discord", "success");
|
|
} catch (e) {
|
|
toast(e, "error");
|
|
} finally {
|
|
connectBtn.disabled = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function setConnected(state) {
|
|
connected = state;
|
|
connectBtn.textContent = state ? "Disconnect" : "Connect";
|
|
statusDot.className = `status-dot ${state ? "on" : "off"}`;
|
|
statusLabel.textContent = state ? "Connected" : "Disconnected";
|
|
setBtn.disabled = !state;
|
|
clearBtn.disabled = !state;
|
|
appIdInput.disabled = state;
|
|
|
|
if (state) {
|
|
timerStart = Date.now();
|
|
startTimer();
|
|
} else {
|
|
stopTimer();
|
|
timerStart = null;
|
|
}
|
|
}
|
|
|
|
async function setActivity() {
|
|
const status = statusInput.value.trim();
|
|
const details = detailsInput.value.trim();
|
|
const showTime = showTimeCheck.checked;
|
|
const hours = parseInt(document.getElementById("elapsedHours").value) || 0;
|
|
const mins = parseInt(document.getElementById("elapsedMins").value) || 0;
|
|
const elapsedSeconds = (hours * 3600) + (mins * 60);
|
|
|
|
try {
|
|
await invoke("set_activity", { status, details, showTime, elapsedSeconds });
|
|
if (elapsedSeconds > 0) {
|
|
timerStart = Date.now() - (elapsedSeconds * 1000);
|
|
}
|
|
updatePreview(status, details, showTime);
|
|
toast("Status updated", "success");
|
|
} catch (e) {
|
|
toast(e, "error");
|
|
}
|
|
}
|
|
|
|
async function clearActivity() {
|
|
try {
|
|
await invoke("clear_activity");
|
|
resetPreview();
|
|
toast("Presence cleared", "neutral");
|
|
} catch (e) {
|
|
toast(e, "error");
|
|
}
|
|
}
|
|
|
|
function updatePreview(status, details, showTime) {
|
|
previewTitle.textContent = appIdInput.value ? "Your App Name" : "—";
|
|
|
|
if (status) {
|
|
previewStatus.textContent = status;
|
|
previewStatus.classList.remove("hidden");
|
|
} else {
|
|
previewStatus.classList.add("hidden");
|
|
}
|
|
|
|
if (details) {
|
|
previewDetails.textContent = details;
|
|
previewDetails.classList.remove("hidden");
|
|
} else {
|
|
previewDetails.classList.add("hidden");
|
|
}
|
|
|
|
if (showTime) {
|
|
previewTime.classList.remove("hidden");
|
|
} else {
|
|
previewTime.classList.add("hidden");
|
|
}
|
|
}
|
|
|
|
function resetPreview() {
|
|
previewTitle.textContent = "—";
|
|
previewStatus.classList.add("hidden");
|
|
previewDetails.classList.add("hidden");
|
|
previewTime.classList.add("hidden");
|
|
}
|
|
|
|
statusInput.addEventListener("input", () => {
|
|
if (previewStatus.textContent || statusInput.value) {
|
|
previewStatus.textContent = statusInput.value || "";
|
|
previewStatus.classList.toggle("hidden", !statusInput.value);
|
|
}
|
|
});
|
|
detailsInput.addEventListener("input", () => {
|
|
if (previewDetails.textContent || detailsInput.value) {
|
|
previewDetails.textContent = detailsInput.value || "";
|
|
previewDetails.classList.toggle("hidden", !detailsInput.value);
|
|
}
|
|
});
|
|
|
|
statusInput.addEventListener("keydown", (e) => { if (e.key === "Enter" && connected) setActivity(); });
|
|
detailsInput.addEventListener("keydown", (e) => { if (e.key === "Enter" && connected) setActivity(); });
|
|
appIdInput.addEventListener("keydown", (e) => { if (e.key === "Enter" && !connected) toggleConnection(); });
|
|
|
|
function startTimer() {
|
|
stopTimer();
|
|
timerInterval = setInterval(() => {
|
|
if (!timerStart) return;
|
|
const elapsed = Math.floor((Date.now() - timerStart) / 1000);
|
|
const h = Math.floor(elapsed / 3600);
|
|
const m = Math.floor((elapsed % 3600) / 60);
|
|
const s = elapsed % 60;
|
|
const parts = [];
|
|
if (h > 0) parts.push(String(h).padStart(2, "0"));
|
|
parts.push(String(m).padStart(2, "0"));
|
|
parts.push(String(s).padStart(2, "0"));
|
|
previewTime.textContent = parts.join(":") + " elapsed";
|
|
}, 1000);
|
|
}
|
|
|
|
function stopTimer() {
|
|
if (timerInterval) {
|
|
clearInterval(timerInterval);
|
|
timerInterval = null;
|
|
}
|
|
}
|
|
|
|
function openHelp() {
|
|
document.getElementById("helpModal").classList.remove("hidden");
|
|
}
|
|
|
|
function closeHelp() {
|
|
document.getElementById("helpModal").classList.add("hidden");
|
|
}
|
|
|
|
document.addEventListener("keydown", (e) => {
|
|
if (e.key === "Escape") closeHelp();
|
|
});
|
|
|
|
function toast(msg, type = "neutral") {
|
|
const container = document.getElementById("toastContainer");
|
|
const colors = {
|
|
success: "bg-emerald-900/80 border-emerald-700/50 text-emerald-200",
|
|
error: "bg-rose-900/80 border-rose-700/50 text-rose-200",
|
|
neutral: "bg-surface-700/90 border-surface-600/50 text-slate-300",
|
|
};
|
|
const el = document.createElement("div");
|
|
el.className = `toast text-xs px-4 py-2 rounded-lg border backdrop-blur-sm ${colors[type] || colors.neutral}`;
|
|
el.textContent = msg;
|
|
container.appendChild(el);
|
|
setTimeout(() => el.remove(), 2600);
|
|
} |