Vite + Vue 3 + DaisyUI SPA (project picker + Slack avatar member grid) with a TypeScript/Node (Hono) backend proxying Napta + Slack, SQLite avatar cache via node:sqlite, and docker-compose for Coolify deploy.
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import type { Member, Project } from "./types.ts"
|
|
|
|
// Demo data served when live Napta/Slack credentials are not configured. Lets
|
|
// the UI render a realistic team grid out of the box. imageUrl is null so the
|
|
// frontend shows initials avatars (the same fallback used for real members who
|
|
// have no Slack match).
|
|
|
|
export const fixtureProjects: Project[] = [
|
|
{ id: "demo-apollo", name: "Apollo Platform", clientName: "Acme Corp" },
|
|
{ id: "demo-zephyr", name: "Zephyr Mobile App", clientName: "Globex" },
|
|
]
|
|
|
|
function member(
|
|
id: string,
|
|
firstName: string,
|
|
lastName: string,
|
|
role: string,
|
|
): Member {
|
|
return {
|
|
id,
|
|
firstName,
|
|
lastName,
|
|
role,
|
|
email: `${firstName}.${lastName}@example.com`.toLowerCase(),
|
|
imageUrl: null,
|
|
slackMatched: false,
|
|
}
|
|
}
|
|
|
|
const membersByProject: Record<string, Member[]> = {
|
|
"demo-apollo": [
|
|
member("1", "Ada", "Lovelace", "Tech Lead"),
|
|
member("2", "Alan", "Turing", "Backend Engineer"),
|
|
member("3", "Grace", "Hopper", "Engineering Manager"),
|
|
member("4", "Katherine", "Johnson", "Data Scientist"),
|
|
member("5", "Dennis", "Ritchie", "Platform Engineer"),
|
|
],
|
|
"demo-zephyr": [
|
|
member("6", "Margaret", "Hamilton", "Product Owner"),
|
|
member("7", "Linus", "Torvalds", "Mobile Lead"),
|
|
member("8", "Barbara", "Liskov", "iOS Engineer"),
|
|
],
|
|
}
|
|
|
|
export function fixtureMembers(projectId: string): Member[] {
|
|
return membersByProject[projectId] ?? []
|
|
}
|