import { useState, useRef, useEffect } from 'react' import { BrowserRouter as Router, Route, Routes, Navigate, useNavigate, Link } from 'react-router-dom' import { TbLayoutSidebarLeftCollapse, TbLayoutSidebarRightCollapse } from "react-icons/tb"; import { AiFillHome } from "react-icons/ai"; import { BiPodcast } from "react-icons/bi"; import { FaMicrophoneAlt } from "react-icons/fa"; import { MdDarkMode, MdLightMode } from "react-icons/md"; import { ImPodcast } from "react-icons/im"; import { RiChatVoiceAiFill } from "react-icons/ri"; import { FaUser, FaSignOutAlt } from "react-icons/fa"; import { PiGooglePodcastsLogo } from "react-icons/pi"; import { TiFlowSwitch } from "react-icons/ti"; import { SiNodemon } from "react-icons/si"; import React from 'react'; import Home from './pages/Home' import Podcasts from './pages/Podcasts' import Workflows from './pages/Workflows' import Demo from './pages/Demo' import WorkflowEditor from './components/WorkflowEditor' import UserModal from './components/UserModal' import Toast from './components/Toast' import './App.css' // Global toast context export const ToastContext = React.createContext({ toast: null, setToast: () => { } }); function App() { const [isOpen, setIsOpen] = useState(false); const [isDark, setIsDark] = useState(true); const [isLogin, setIsLogin] = useState(true); const [isAuthenticated, setIsAuthenticated] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [toast, setToast] = useState(null); const sidebarRef = useRef(null); // Check for token on initial load useEffect(() => { const token = localStorage.getItem('token'); if (token) { // Validate token by making a request to the backend const validateToken = async () => { try { const response = await fetch('http://localhost:8000/user/me', { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { setIsAuthenticated(true); console.log('User authenticated from stored token'); } else { // Token is invalid, remove it localStorage.removeItem('token'); setIsAuthenticated(false); console.log('Stored token is invalid, removed'); } } catch (error) { console.error('Error validating token:', error); // Don't remove token on network errors to allow offline access } }; validateToken(); } }, []); useEffect(() => { const handleClickOutside = (event) => { if (sidebarRef.current && !sidebarRef.current.contains(event.target)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const toggleSidebar = () => { setIsOpen(!isOpen); }; const toggleTheme = (e) => { e.preventDefault(); setIsDark(!isDark); document.body.style.backgroundColor = !isDark ? '#040511' : '#ffffff'; document.body.style.color = !isDark ? '#ffffff' : '#000000'; }; const toggleForm = () => { setIsLogin(!isLogin); }; const handleLogout = () => { localStorage.removeItem('token'); setIsAuthenticated(false); showToast('Logged out successfully', 'success'); }; const showToast = (message, type = 'success') => { setToast({ message, type }); }; const handleSubmit = async (e) => { e.preventDefault(); const formData = new FormData(e.target); const username = formData.get('username'); const password = formData.get('password'); try { const response = await fetch(`http://localhost:8000/${isLogin ? 'login' : 'signup'}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username, password }), }); if (response.ok) { const data = await response.json(); localStorage.setItem('token', data.access_token); setIsAuthenticated(true); showToast(`Successfully ${isLogin ? 'logged in' : 'signed up'}!`, 'success'); } else { const error = await response.json(); showToast(error.detail, 'error'); } } catch (error) { console.error('Error:', error); showToast('An error occurred during authentication', 'error'); } }; return ( <>
{!isAuthenticated ? (

PodCraft

One prompt to Podcast

{isLogin ? 'Login' : 'Sign Up'}

{isLogin ? "Don't have an account? " : "Already have an account? "} {isLogin ? 'Sign Up' : 'Login'}

) : ( } /> } /> } /> } /> } /> } /> )}
setIsModalOpen(false)} token={localStorage.getItem('token')} />
{toast && ( setToast(null)} /> )}
) } export default App