import React, { useState, useEffect, useLayoutEffect, useContext } from 'react'; import { useNavigate } from 'react-router-dom'; import { Grid, Card, CardContent, Typography, Box, CardMedia, IconButton, Snackbar, Alert } from '@mui/material'; import { UserContext } from '../contexts/UserContext'; import PersonAddIcon from '@mui/icons-material/PersonAdd'; import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; import axios from 'axios'; import ConfirmDialog from './ConfirmDialog'; const Dashboard = () => { const { user, setUser } = useContext(UserContext); const [guilds, setGuilds] = useState([]); const [botStatus, setBotStatus] = useState({}); const [snackbarOpen, setSnackbarOpen] = useState(false); const [snackbarMessage, setSnackbarMessage] = useState(''); const [dialogOpen, setDialogOpen] = useState(false); const [selectedGuild, setSelectedGuild] = useState(null); const navigate = useNavigate(); useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const userParam = urlParams.get('user'); const guildsParam = urlParams.get('guilds'); if (userParam && guildsParam) { const parsedUser = JSON.parse(decodeURIComponent(userParam)); const parsedGuilds = JSON.parse(decodeURIComponent(guildsParam)); localStorage.setItem('user', JSON.stringify(parsedUser)); localStorage.setItem('guilds', JSON.stringify(parsedGuilds)); setUser(parsedUser); setGuilds(parsedGuilds); // Clean the URL window.history.replaceState({}, document.title, "/dashboard"); } else { const storedUser = localStorage.getItem('user'); const storedGuilds = localStorage.getItem('guilds'); if (storedUser && storedGuilds) { setUser(JSON.parse(storedUser)); setGuilds(JSON.parse(storedGuilds)); } } }, [setUser]); useEffect(() => { const fetchBotStatus = async () => { const statusPromises = guilds.map(async (guild) => { try { const response = await axios.get(`http://localhost:3002/api/servers/${guild.id}/bot-status`); return { guildId: guild.id, isBotInServer: response.data.isBotInServer }; } catch (error) { console.error(`Error fetching bot status for guild ${guild.id}:`, error); return { guildId: guild.id, isBotInServer: false }; } }); const results = await Promise.all(statusPromises); const newBotStatus = results.reduce((acc, curr) => { acc[curr.guildId] = curr.isBotInServer; return acc; }, {}); setBotStatus(newBotStatus); }; if (guilds.length > 0) { fetchBotStatus(); } }, [guilds]); useLayoutEffect(() => { const scrollPosition = sessionStorage.getItem('scrollPosition'); if (scrollPosition) { window.scrollTo(0, parseInt(scrollPosition)); sessionStorage.removeItem('scrollPosition'); } }, []); const handleCardClick = (guild) => { sessionStorage.setItem('scrollPosition', window.scrollY); navigate(`/server/${guild.id}`, { state: { guild } }); }; const handleInviteBot = async (e, guild) => { e.stopPropagation(); const clientId = '1423377662055026840'; // Hardcoded client ID from user request const permissions = 8; // Administrator const inviteUrl = `https://discord.com/api/oauth2/authorize?client_id=${clientId}&permissions=${permissions}&scope=bot%20applications.commands&guild_id=${guild.id}&disable_guild_select=true`; window.open(inviteUrl, '_blank', 'noopener,noreferrer'); }; const handleLeaveBot = (e, guild) => { e.stopPropagation(); setSelectedGuild(guild); setDialogOpen(true); }; const handleConfirmLeave = async () => { if (!selectedGuild) return; try { await axios.post(`http://localhost:3002/api/servers/${selectedGuild.id}/leave`); setBotStatus(prevStatus => ({ ...prevStatus, [selectedGuild.id]: false })); setSnackbarMessage('Bot has left the server.'); setSnackbarOpen(true); } catch (error) { console.error('Error leaving server:', error); setSnackbarMessage('Failed to make the bot leave the server.'); setSnackbarOpen(true); } setDialogOpen(false); setSelectedGuild(null); }; const handleSnackbarClose = (event, reason) => { if (reason === 'clickaway') { return; } setSnackbarOpen(false); }; return (