import type { User } from 'oidc-client-ts'; import { useEffect, useState } from 'react'; import './App.css'; import { AppSidebar } from './AppSidebar'; import { getUser, handleCallback, logout } from './auth/authService'; import ActiveQuery from './components/ActiveQuery'; import AlertError from './components/AlertError'; import LoginModal from './components/LoginModal'; import { Map } from './components/Map'; import { Parameters, type ParameterValues } from './components/Parameters'; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from './components/ui/breadcrumb'; import { Button } from './components/ui/button'; import { Separator } from './components/ui/separator'; import { SidebarInset, SidebarProvider, SidebarTrigger } from './components/ui/sidebar'; const fetchData = async (user: User, baseQueyrUri: string, parameters: ParameterValues, method: string = 'GET') => { const accessToken = user.access_token; const queryString = new URLSearchParams(); queryString.append('listing_type', parameters.listing_type) if (parameters.min_bedrooms) { queryString.append('min_bedrooms', parameters.min_bedrooms.toString()); } if (parameters.max_bedrooms) { queryString.append('max_bedrooms', parameters.max_bedrooms.toString()) } if (parameters.max_price) { queryString.append("max_price", parameters.max_price.toString()); } if (parameters.min_price) { queryString.append("min_price", parameters.min_price.toString()); } if (parameters.min_sqm) { queryString.append("min_sqm", parameters.min_sqm.toString()); } if (parameters.last_seen_days) { queryString.append("last_seen_days", parameters.last_seen_days.toString()); } const response = await fetch(baseQueyrUri + '?' + queryString, { method: method, headers: { 'Authorization': `Bearer ${accessToken}`, // Pass the token 'Content-Type': 'application/json', }, } ); if (!response.ok) { throw new Error('Error: ' + response.status); } const data: Response = await response.json(); return data; }; function App() { const [listingData, setListingData] = useState({}); const [taskID, setTaskID] = useState(null); const [user, setUser] = useState(null); const [isParametersModalOpen, setIsParametersModalOpen] = useState(true); const [queryParameters, setQueryParameters] = useState(null); const [submitError, setSubmitError] = useState(null); const [alertDialogIsOpen, setAlertDialogIsOpen] = useState(false); useEffect(() => { // Check if this is a callback from Authentik (after login) if (window.location.pathname === '/callback') { handleCallback().then(() => { window.location.href = '/'; // Redirect to home after login }); return; } // Load user data getUser().then(setUser); }, []); if (!user) { return } const onSubmit = async (action: 'fetch-data' | 'visualize', parameters: ParameterValues) => { // Fetch listing data setQueryParameters(parameters) setIsParametersModalOpen(false) let data = null; if (action === 'visualize') { try { data = await fetchData(user, "/api/listing_geojson", parameters); } catch (error) { // @ts-expect-error setSubmitError(error.message) setAlertDialogIsOpen(true) } if (data) { setListingData(data); } } else if (action === 'fetch-data') { try { data = await fetchData(user, "/api/refresh_listings", parameters, 'POST'); } catch (error) { // @ts-expect-error setSubmitError(error.message) setAlertDialogIsOpen(true) } if (data) { // @ts-expect-error setTaskID(data.task_id) } } console.log(data) } return ( <>
Building Your Application Data Fetching

Welcome, {user.profile.name}!

{Object.keys(listingData).length > 0 &&
}
) } export default App