src/hooks/auditorium/useAuditoriumGrid.tsx
import React, { useMemo } from "react";
import { GridPosition } from "types/grid";
import { UserProfilePicture } from "components/molecules/UserProfilePicture";
import { GetUserByPosition } from "../useGetUserByPosition";
export interface UseAuditoriumGridProps {
isUserAudioMuted: boolean;
rows: number;
columns: number;
getUserBySeat: GetUserByPosition;
checkIfSeat: (gridData: GridPosition) => boolean;
takeSeat: (gridData: GridPosition) => Promise<void> | undefined;
}
export const useAuditoriumGrid = ({
isUserAudioMuted,
rows,
columns,
checkIfSeat,
getUserBySeat,
takeSeat,
}: UseAuditoriumGridProps) =>
useMemo(
() =>
Array.from(Array(rows)).map((_, rowIndex) => (
<div key={rowIndex} className="Section__seats-row">
{Array.from(Array(columns)).map((_, columnIndex) => {
const user = getUserBySeat({
row: rowIndex,
column: columnIndex,
});
if (user) {
return (
<UserProfilePicture
key={columnIndex}
user={user}
containerClassName="Section__user-avatar"
isAudioEffectDisabled={isUserAudioMuted}
/>
);
}
const isSeat = checkIfSeat({ row: rowIndex, column: columnIndex });
if (isSeat) {
return (
<div
key={columnIndex}
className="Section__seat"
onClick={() =>
takeSeat({ row: rowIndex, column: columnIndex })
}
>
+
</div>
);
}
return <div key={columnIndex} className="Section__empty-circle" />;
})}
</div>
)),
[rows, columns, checkIfSeat, takeSeat, getUserBySeat, isUserAudioMuted]
);