|
|
|
import { useEffect, useState } from 'react';
|
|
|
|
import { httpGet } from '../lib/http';
|
|
|
|
import { useAuth } from '../hooks/use-auth';
|
|
|
|
import { pageProgressMessage } from '../stores/page';
|
|
|
|
import { useToast } from '../hooks/use-toast';
|
|
|
|
import { type UserTeamItem } from './TeamDropdown/TeamDropdown';
|
|
|
|
|
|
|
|
export function TeamsList() {
|
|
|
|
const [teamList, setTeamList] = useState<UserTeamItem[]>([]);
|
|
|
|
const user = useAuth();
|
|
|
|
const toast = useToast();
|
|
|
|
async function getAllTeam() {
|
|
|
|
const { response, error } = await httpGet<UserTeamItem[]>(
|
|
|
|
`${import.meta.env.PUBLIC_API_URL}/v1-get-user-teams`
|
|
|
|
);
|
|
|
|
if (error || !response) {
|
|
|
|
toast.error(error?.message || 'Something went wrong');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setTeamList(response);
|
|
|
|
}
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
getAllTeam().finally(() => {
|
|
|
|
pageProgressMessage.set('');
|
|
|
|
});
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="relative mx-auto max-w-[500px]">
|
|
|
|
<div className="w-full px-2 py-2">
|
|
|
|
<div className={'mb-8 hidden md:block'}>
|
|
|
|
<h2 className={'text-3xl font-bold sm:text-4xl'}>Teams</h2>
|
|
|
|
<p className="mt-2 text-gray-400">
|
|
|
|
Here are the teams you are part of
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<ul className="mb-3 flex flex-col gap-1">
|
|
|
|
<li>
|
|
|
|
<a
|
|
|
|
className="flex w-full cursor-pointer items-center justify-between gap-2 truncate rounded border p-2 text-sm font-medium hover:border-gray-300 hover:bg-gray-50"
|
|
|
|
href="/account"
|
|
|
|
>
|
|
|
|
<span className="flex flex-grow items-center gap-2">
|
|
|
|
<img
|
|
|
|
src={
|
|
|
|
user?.avatar
|
|
|
|
? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${
|
|
|
|
user?.avatar
|
|
|
|
}`
|
|
|
|
: '/images/default-avatar.png'
|
|
|
|
}
|
|
|
|
alt={user?.name || ''}
|
|
|
|
className="h-6 w-6 rounded-full"
|
|
|
|
/>
|
|
|
|
<span className="truncate">Personal Account</span>
|
|
|
|
</span>
|
|
|
|
<span>→</span>
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
{teamList.map((team) => {
|
|
|
|
let pageLink = '';
|
|
|
|
if (team.status === 'invited') {
|
|
|
|
pageLink = `/respond-invite?i=${team.memberId}`;
|
|
|
|
} else if (team.status === 'joined') {
|
|
|
|
pageLink = `/team/activity?t=${team._id}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<li key={team._id}>
|
|
|
|
<a
|
|
|
|
className="flex w-full cursor-pointer items-center justify-between gap-2 rounded border p-2 text-sm font-medium hover:border-gray-300 hover:bg-gray-50"
|
|
|
|
href={pageLink}
|
|
|
|
>
|
|
|
|
<span className="flex flex-grow items-center gap-2">
|
|
|
|
<img
|
|
|
|
src={
|
|
|
|
team.avatar
|
|
|
|
? `${import.meta.env.PUBLIC_AVATAR_BASE_URL}/${
|
|
|
|
team.avatar
|
|
|
|
}`
|
|
|
|
: '/images/default-avatar.png'
|
|
|
|
}
|
|
|
|
alt={team.name || ''}
|
|
|
|
className="h-6 w-6 rounded-full"
|
|
|
|
/>
|
|
|
|
<span className="truncate">{team.name}</span>
|
|
|
|
</span>
|
|
|
|
<span>→</span>
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</ul>
|
|
|
|
<a
|
|
|
|
className="inline-flex w-full items-center justify-center rounded-lg bg-black p-2 py-3 text-sm font-medium text-white outline-none focus:ring-2 focus:ring-black focus:ring-offset-1 disabled:bg-gray-400"
|
|
|
|
href="/team/new"
|
|
|
|
>
|
|
|
|
<span className="mr-2">+</span>
|
|
|
|
<span>New Team</span>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|