Initial Commit
This commit is contained in:
+194
@@ -0,0 +1,194 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user