From 2c783bdb703e4ad69c9f3f846c2c9e6a527ccc80 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Tue, 25 Mar 2025 17:23:30 -0400 Subject: Implemented admin dashboard --- web/src/app/guilds/page.js | 314 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 web/src/app/guilds/page.js (limited to 'web/src/app/guilds') diff --git a/web/src/app/guilds/page.js b/web/src/app/guilds/page.js new file mode 100644 index 0000000..23ec00d --- /dev/null +++ b/web/src/app/guilds/page.js @@ -0,0 +1,314 @@ +'use client'; +import { useState, useEffect } from "react"; +import { fetchWithAuth } from "@/utils/api"; +import Link from "next/link"; +import Card from "@/app/components/Card"; +import Navbar from "@/app/components/Navbar"; + +export default function Guilds() { + const [guilds, setGuilds] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [clientId, setClientId] = useState(null); + const [selectedGuild, setSelectedGuild] = useState(null); + const [showModal, setShowModal] = useState(false); + const [formData, setFormData] = useState({ + guildID: '', + logChannelID: '', + suggestionsChannelID: '', + qotdChannelID: '', + qotdToggle: false, + ollamaEnabled: false + }); + const [formMessage, setFormMessage] = useState(null); + + useEffect(() => { + const fetchData = async () => { + try { + // Fetch guilds + const guildsResponse = await fetchWithAuth('/api/servers'); + if (!guildsResponse.ok) { + throw new Error('Failed to fetch guilds'); + } + const guildsData = await guildsResponse.json(); + setGuilds(guildsData); + + // Fetch client ID + const apiUrl = localStorage.getItem('apiUrl') || ''; + const versionResponse = await fetch(`${apiUrl}/api/version`); + if (!versionResponse.ok) { + throw new Error('Failed to fetch version data'); + } + const versionData = await versionResponse.json(); + setClientId(versionData.client_id); + } catch (err) { + setError(err.message); + } finally { + setLoading(false); + } + }; + + fetchData(); + }, []); + + const handleLeaveServer = async (serverId) => { + if (window.confirm('Are you sure you want to leave this server?')) { + try { + const response = await fetchWithAuth(`/api/leave`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + id: serverId + }) + }); + + if (!response.ok) { + throw new Error('Failed to leave server'); + } + + // Remove server from list + setGuilds(guilds.filter(guild => guild.id !== serverId)); + + // Close modal if the guild was selected + if (selectedGuild === serverId) { + closeModal(); + } + } catch (err) { + setError(err.message); + } + } + }; + + const handleGuildSelect = async (guildId) => { + try { + setSelectedGuild(guildId); + const response = await fetchWithAuth(`/api/settings/guilds/${guildId}`); + + if (!response.ok) { + throw new Error('Failed to fetch guild settings'); + } + + const data = await response.json(); + setFormData({ + guildID: data.settings.guildID || '', + logChannelID: data.settings.logChannelID || '', + suggestionsChannelID: data.settings.suggestionsChannelID || '', + qotdChannelID: data.settings.qotdChannelID || '', + qotdToggle: data.settings.qotdToggle || false, + ollamaEnabled: data.settings.ollamaEnabled || false + }); + setShowModal(true); + } catch (err) { + setError(err.message); + setFormData({ + guildID: guildId, + logChannelID: '', + suggestionsChannelID: '', + qotdChannelID: '', + qotdToggle: false, + ollamaEnabled: false + }); + setShowModal(true); + } + }; + + const handleInputChange = (e) => { + const { name, value, type, checked } = e.target; + setFormData({ + ...formData, + [name]: type === 'checkbox' ? checked : value + }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setFormMessage(null); + + try { + const response = await fetchWithAuth(`/api/settings/guilds/${selectedGuild}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(formData) + }); + + if (!response.ok) { + throw new Error('Failed to update guild settings'); + } + + setFormMessage({ + type: 'success', + text: 'Settings updated successfully' + }); + + // Clear message after 3 seconds + setTimeout(() => { + setFormMessage(null); + }, 3000); + } catch (err) { + setFormMessage({ + type: 'error', + text: err.message + }); + } + }; + + const closeModal = () => { + setShowModal(false); + setSelectedGuild(null); + setFormMessage(null); + }; + + return ( + <> + +
+

Guilds

+ + {loading &&

Loading guilds...

} + {error &&

Error: {error}

} + + {!loading && guilds.length === 0 && ( +

No guilds found. Invite AleeBot to your server.

+ )} + +
+ {guilds.map(guild => ( + +

{guild.name}

+

ID: {guild.id} - Members: {guild.members || 'N/A'}

+
+ +
+
+ ))} +
+ +
+ + Invite + +
+
+ + {/* Settings Modal */} + {showModal && ( +
+
+
+

+ Guild Settings: {guilds.find(g => g.id === selectedGuild)?.name} +

+ +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + {formMessage && ( +
+ {formMessage.text} +
+ )} + +
+ + +
+
+
+
+ )} + + ); +} -- cgit v1.2.3