import { FC, ReactElement, useState } from 'react'; import { Button, Input, Select } from '@imphnen-frontend-service/ui/atoms'; import { Link, useNavigate } from 'react-router'; import { useTeams, useJoinTeam, useMyTeams, ETeamVisibility, joinTeamSchema, TJoinTeamForm } from '@imphnen-frontend-service/service'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import INDONESIAN_CITIES_DATA from '../../../constants/cities'; const INDONESIAN_CITIES = ['All Cities', ...INDONESIAN_CITIES_DATA]; const BrowseTeamsPage: FC = (): ReactElement => { const navigate = useNavigate(); const [search, setSearch] = useState(''); const [selectedCity, setSelectedCity] = useState('All Cities'); const [selectedTeamId, setSelectedTeamId] = useState(null); const [showJoinModal, setShowJoinModal] = useState(false); const { data: teamsData, isLoading } = useTeams({ search, city: selectedCity === 'All Cities' ? undefined : selectedCity, visibility: ETeamVisibility.PUBLIC, }); const { data: myTeamsData } = useMyTeams(); const { mutateAsync: joinTeam, isPending: isJoining } = useJoinTeam(); const form = useForm({ resolver: zodResolver(joinTeamSchema), mode: 'all', }); const teams = teamsData?.data || []; const myTeams = myTeamsData?.data || []; // Helper function to check if user is a member of a team const isMyTeam = (teamId: string) => { return myTeams.some((team: any) => team.id === teamId); }; const handleJoinRequest = (teamId: string) => { setSelectedTeamId(teamId); setShowJoinModal(true); }; const onSubmit = form.handleSubmit(async (data) => { if (!selectedTeamId) return; try { await joinTeam({ teamId: selectedTeamId, data }); setShowJoinModal(false); form.reset(); setSelectedTeamId(null); } catch (error) { console.error('Failed to send join request:', error); } }); return (
{/* Header */}

Browse Teams

Find and join teams looking for members

{/* Filters */}
setSearch(e.target.value)} className="h-12" />
{/* Teams List */} {isLoading ? (

Loading teams...

) : teams.length === 0 ? (

No teams found

Try adjusting your filters

) : (
{teams.map((team) => (
{team.name}
{team.logo ? ( {team.name} ) : (
👥
)}

{team.name}

📍 {team.city}

👥 {team.members?.length || 0} members

{team.description}

{isMyTeam(team.id) ? ( ) : ( <> {myTeams.length === 0 && (team.members?.length || 0) < 5 && ( )} )}
))}
)}
{/* Join Request Modal */} {showJoinModal && (

Request to Join Team

Send a message to the team leader explaining why you want to join