feat: utenti page and poisson integration
parent
a87c87eb10
commit
7e99cfa9d7
@ -0,0 +1,54 @@
|
||||
import { useSignal } from '@preact/signals'
|
||||
import { useEffect } from 'preact/hooks'
|
||||
|
||||
type User = {
|
||||
uid: string
|
||||
gecos: string
|
||||
}
|
||||
|
||||
function applyPatches(users: User[]) {
|
||||
users.forEach(user => {
|
||||
// strip ",+" from the end of the gecos field
|
||||
user.gecos = user.gecos.replace(/,+$/, '')
|
||||
|
||||
// capitalize the first letter of each word
|
||||
user.gecos = user.gecos.replace(/\b\w/g, c => c.toUpperCase())
|
||||
})
|
||||
}
|
||||
|
||||
export const UtentiPage = () => {
|
||||
const utentiSignal = useSignal<User[]>([])
|
||||
|
||||
useEffect(() => {
|
||||
fetch('https://poisson.phc.dm.unipi.it/users.json')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
applyPatches(data)
|
||||
utentiSignal.value = data
|
||||
})
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<>
|
||||
<div class="search">
|
||||
<input type="text" placeholder="Cerca un utente Poisson..." />
|
||||
<span class="material-symbols-outlined">search</span>
|
||||
</div>
|
||||
<div class="search-results">
|
||||
{utentiSignal.value.map(user => (
|
||||
<div class="search-result">
|
||||
<div class="icon">
|
||||
<span class="material-symbols-outlined">person</span>
|
||||
</div>
|
||||
<div class="text">{user.gecos}</div>
|
||||
<div class="right">
|
||||
<a href={`https://poisson.phc.dm.unipi.it/~${user.uid}`}>
|
||||
<span class="material-symbols-outlined">globe</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
@ -1,42 +1,10 @@
|
||||
---
|
||||
import PageLayout from '../layouts/PageLayout.astro'
|
||||
|
||||
import { UtentiPage } from '../client/UtentiPage.tsx'
|
||||
---
|
||||
|
||||
<PageLayout pageTags="utenti">
|
||||
<h1>Utenti</h1>
|
||||
|
||||
<div class="search">
|
||||
<input type="text" />
|
||||
<span class="material-symbols-outlined">search</span>
|
||||
</div>
|
||||
|
||||
<div class="search-results">
|
||||
<div class="search-result">
|
||||
<div class="icon"><span class="material-symbols-outlined">person</span></div>
|
||||
<div class="text">Persona 1</div>
|
||||
<div class="right">
|
||||
<a href="#">
|
||||
<span class="material-symbols-outlined">globe</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-result">
|
||||
<span class="material-symbols-outlined">person</span>
|
||||
<div class="text">Persona 2</div>
|
||||
<div class="right">
|
||||
<a href="#">
|
||||
<span class="material-symbols-outlined">globe</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-result">
|
||||
<span class="material-symbols-outlined">person</span>
|
||||
<div class="text">Persona 3</div>
|
||||
<div class="right">
|
||||
<a href="#">
|
||||
<span class="material-symbols-outlined">globe</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<UtentiPage client:load />
|
||||
</PageLayout>
|
||||
|
Loading…
Reference in New Issue