You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.3 KiB
React

import { render } from 'preact'
import { useEffect, useState } from 'preact/hooks'
import { AdminPanel } from './pages/Admin.jsx'
import { ApiKeys } from './pages/ApiKeys.jsx'
import { Icon } from './components/Icon.jsx'
import { Login } from './pages/Login.jsx'
import { Store, useStore } from './context.jsx'
import { changeCase, useRouter, useUser } from './util.jsx'
import { Dashboard } from './pages/Dashboard.jsx'
import { showToast, Toasts } from './components/Toasts.jsx'
import { Sidebar } from './components/Sidebar.jsx'
import { MainContent } from './components/MainContent.jsx'
const App = () => {
const [id, route, routeParams] = useRouter({
index: {
pattern: '/',
name: 'Dashboard',
},
login: {
pattern: '/login',
name: 'Login',
},
admin: {
pattern: '/admin',
name: 'Admin',
},
apiKeys: {
pattern: '/api-keys',
name: 'API Keys',
},
buckets: {
pattern: '/buckets',
name: 'Buckets',
},
bucket: {
pattern: '/buckets/:bucket',
name: 'Bucket',
},
})
2 years ago
if (id === 'unknown') {
location.href = '/'
}
const user = useUser(user => {
if (id !== 'login' && user !== 'admin') {
location.href = '/login'
}
2 years ago
if (id === 'login' && user === 'admin') {
location.href = '/'
}
})
const [toasts, setToasts] = useState([])
const [sidebarVisibile, setSidebarVisible] = useState(true)
const [buckets, setBuckets] = useState([])
useEffect(() => {
fetch('/api/buckets')
.then(res => res.json())
.then(value => setBuckets(value))
}, [])
const context = {
// Auth
user,
// Sidebar
sidebarVisibile,
setSidebarVisible,
buckets,
// Toasts
toasts,
setToasts,
showToast: showToast(toasts, setToasts),
// Routing
route: {
...route,
id,
params: routeParams,
},
}
return (
<Store.Provider value={context}>
<Sidebar />
<MainContent />
<Toasts />
</Store.Provider>
)
}
render(<App />, document.querySelector('main'))