import {Button, ConfigProvider, Drawer, Flex, Layout, theme, Typography} from 'antd' import {Link, Navigate, Route, Routes, useLocation, useNavigate} from 'react-router-dom' import TextPage from './pages/TextPage' import DomainSearchPage from './pages/search/DomainSearchPage' import EntitySearchPage from './pages/search/EntitySearchPage' import TldPage from './pages/infrastructure/TldPage' import StatisticsPage from './pages/StatisticsPage' import WatchlistPage from './pages/tracking/WatchlistPage' import UserPage from './pages/UserPage' import type {PropsWithChildren} from 'react' import React, { useCallback, useEffect, useMemo, useState} from 'react' import {getConfiguration, getUser, type InstanceConfig} from './utils/api' import LoginPage from './pages/LoginPage' import ConnectorPage from './pages/tracking/ConnectorPage' import NotFoundPage from './pages/NotFoundPage' import useBreakpoint from './hooks/useBreakpoint' import {Sider} from './components/Sider' import {jt, t} from 'ttag' import {MenuOutlined} from '@ant-design/icons' import TrackedDomainPage from './pages/tracking/TrackedDomainPage' import IcannRegistrarPage from "./pages/infrastructure/IcannRegistrarPage" import type {AuthContextType} from "./contexts" import { AuthenticatedContext, ConfigurationContext} from "./contexts" const PROJECT_LINK = 'https://github.com/maelgangloff/domain-watchdog' const LICENSE_LINK = 'https://www.gnu.org/licenses/agpl-3.0.txt' const ProjectLink = Domain Watchdog const LicenseLink = AGPL-3.0-or-later function SiderWrapper(props: PropsWithChildren<{sidebarCollapsed: boolean, setSidebarCollapsed: (collapsed: boolean) => void}>): React.ReactElement { const {sidebarCollapsed, setSidebarCollapsed, children} = props const sm = useBreakpoint('sm') const location = useLocation() useEffect(() => { if (sm) { setSidebarCollapsed(false) } }, [location]) if (sm) { return setSidebarCollapsed(false)} closeIcon={null} styles={{body: {padding: 0, height: '100%', background: '#001529'}}} width='200px'> {children} } else { return {children} } } export default function App(): React.ReactElement { const navigate = useNavigate() const location = useLocation() const sm = useBreakpoint('sm') const [sidebarCollapsed, setSidebarCollapsed] = useState(false) const [isAuthenticated, setIsAuthenticated] = useState(false) const [configuration, setConfiguration] = useState(undefined) const [darkMode, setDarkMode] = useState(false) const windowQuery = window.matchMedia('(prefers-color-scheme:dark)') const authContextValue: AuthContextType = useMemo(() => ({ isAuthenticated, setIsAuthenticated }), [isAuthenticated]) const configContextValue = useMemo(() => ({ configuration, }), [configuration]) const darkModeChange = useCallback((event: MediaQueryListEvent) => { setDarkMode(event.matches) }, []) useEffect(() => { windowQuery.addEventListener('change', darkModeChange) return () => { windowQuery.removeEventListener('change', darkModeChange) } }, [windowQuery, darkModeChange]) useEffect(() => { setDarkMode(windowQuery.matches) getConfiguration().then(configuration => { setConfiguration(configuration) getUser().then(() => { setIsAuthenticated(true) if (location.pathname === '/login') navigate('/home') }).catch(() => { setIsAuthenticated(false) const pathname = location.pathname if(configuration.publicRdapLookupEnabled) return navigate('/search/domain') if (!['/login', '/tos', '/faq', '/privacy'].includes(pathname)) return navigate('/home') }) }) }, []) return ( {sm && }
}/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/> }/>
{jt`${ProjectLink} is an open source project distributed under the ${LicenseLink} license.`}
) }