Initial Commit

This commit is contained in:
2026-07-17 15:24:20 -04:00
commit 0ca889ad49
34 changed files with 5533 additions and 0 deletions
+194
View File
@@ -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);
}