diff --git a/components/MemberCard.tsx b/components/MemberCard.tsx index 477242d..62f1288 100644 --- a/components/MemberCard.tsx +++ b/components/MemberCard.tsx @@ -1,4 +1,4 @@ -type MemberCardProps = { +export type MemberCardProps = { id: string icon: string name: string @@ -22,26 +22,3 @@ export function MemberCard( ) } - -export const memberMock: MemberCardProps[] = Array(50).fill(undefined).map( - (_, index) => { - return { - name: `Michel ${randomLastName()}`, - groups: ['FabManager', 'Étudiant'], - icon: `url("https://thispersondoesnotexist.com/")`, - id: String(index), - } - }, -) - -function randomLastName() { - const randomArray = Math.round(Math.random() * 1e8).toString().split('').map( - Number, - ) - - const [first, ...tail] = randomArray.map((number) => - String.fromCodePoint(number + 97) - ) - - return [first.toLocaleUpperCase(), ...tail].join('') -} diff --git a/islands/MemberCardList.tsx b/islands/MemberCardList.tsx new file mode 100644 index 0000000..4db3ade --- /dev/null +++ b/islands/MemberCardList.tsx @@ -0,0 +1,60 @@ +import { MemberCard } from ':components/MemberCard.tsx' +import CardList from ':islands/CardList.tsx' +import type { Ref } from 'preact' + +export default function MemberCardList( + { limit, filters, usePlaceholder, useObserver }: { + filters?: [string, string][] + limit?: number + usePlaceholder?: boolean + useObserver?: boolean + }, +) { + const query = new URL('members/fetchAll', 'https://null/') + filters?.forEach((filter) => query.searchParams.set(...filter)) + + const apiRoute = `${query.pathname}${query.search}` + + if (usePlaceholder) { + return ( + + ) + } + + return ( + + ) +} + +function Placeholder({ ref }: { ref?: Ref | undefined }) { + return ( +
+

Chargement ...

+
+ ) +} + +function Fallback() { + return ( +
+

Pas d'utilisateur

+
+ ) +} diff --git a/src/members/mod.ts b/src/members/mod.ts new file mode 100644 index 0000000..1ffceef --- /dev/null +++ b/src/members/mod.ts @@ -0,0 +1,45 @@ +import { MemberCardProps } from ':components/MemberCard.tsx' +import { db } from ':src/db/mod.ts' +import { Db, Ref, User } from '@cohabit/ressources_manager/mod.ts' + +export async function fetchCarnet(login: string): Promise { + try { + const response = await fetch( + `https://git.cohabit.fr/${login}/.carnet/raw/branch/main/index.md`, + ) + + if (!response.ok) { + throw new Error(`[${response.status}] "${response.statusText}"`) + } + + return response.text() + } catch (error) { + return `# Carnet introuvable\n\`\`\`js\n${String(error)}\n\`\`\`` + } +} + +const resolver = Ref.dbResolver(db) + +export async function userToMemberCardProps(user: User) { + const groupNames = user.groups.map(async (group) => { + const resolved = await group.ref(resolver) + return resolved.name + }) + + return { + name: user.name, + groups: await Promise.all(groupNames), + icon: `url("${user.avatar}")`, + id: user.uuid, + } +} + +export function dbToMemberCardProps( + db: Db, +): AsyncIterableIterator { + const memberList = db.ressource.user + .list() + .map(userToMemberCardProps) + + return memberList as AsyncIterableIterator +}