'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 (
<>
Loading guilds...
} {error &&Error: {error}
} {!loading && guilds.length === 0 && (No guilds found. Invite AleeBot to your server.
)}ID: {guild.id} - Members: {guild.members || 'N/A'}