import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; import { PiAvatarComponent, PiCardCenterContentDirective, PiCardComponent, PiCardTopContentDirective, PiChipComponent, PiTextColorDirective, PiTextSmallDirective, PiTextViewerLinkComponent, PiTextWeightBoldDirective, } from '@pi/ui'; import type { Copy } from '../core/copy'; import type { PublicMember } from '../core/api.types'; @Component({ selector: 'app-member-card', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ PiCardComponent, PiCardTopContentDirective, PiCardCenterContentDirective, PiAvatarComponent, PiChipComponent, PiTextViewerLinkComponent, PiTextSmallDirective, PiTextColorDirective, PiTextWeightBoldDirective, ], template: `

@if (member().path; as path) { {{ member().name }} } @else { {{ member().name }} }

@if (member().role || member().headline; as subtitle) {

{{ subtitle }}

}
@if (member().is_founder) { } @if (!member().is_current) { }
@if (links().length > 0) { }
`, }) export class MemberCard { readonly member = input.required(); readonly copy = input.required(); protected readonly links = computed(() => memberLinks(this.member()).slice(0, 3)); } /** A member's links, GitHub first when there is a username for it. */ export function memberLinks(member: PublicMember): { label: string; url: string }[] { const entries = Object.entries(member.links ?? {}).map(([label, url]) => ({ label, url, })); // The username is handed over separately, so build the URL rather than // hope somebody also filled the links map in. if (member.github_username && !entries.some((link) => link.label === 'github')) { entries.unshift({ label: 'github', url: `https://github.com/${member.github_username}`, }); } return entries; }