diff --git a/apps/web/src/components/nav/AddPlayerButton.tsx b/apps/web/src/components/nav/AddPlayerButton.tsx new file mode 100644 index 00000000..6545ed0f --- /dev/null +++ b/apps/web/src/components/nav/AddPlayerButton.tsx @@ -0,0 +1,155 @@ +import React from 'react' + +interface Player { + id: number + name: string + emoji: string +} + +interface AddPlayerButtonProps { + inactivePlayers: Player[] + shouldEmphasize: boolean + onAddPlayer: (playerId: number) => void +} + +export function AddPlayerButton({ inactivePlayers, shouldEmphasize, onAddPlayer }: AddPlayerButtonProps) { + const [showPopover, setShowPopover] = React.useState(false) + const popoverRef = React.useRef(null) + + // Close popover when clicking outside + React.useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) { + setShowPopover(false) + } + } + + if (showPopover) { + document.addEventListener('mousedown', handleClickOutside) + return () => document.removeEventListener('mousedown', handleClickOutside) + } + }, [showPopover]) + + const handleAddPlayerClick = (playerId: number) => { + onAddPlayer(playerId) + setShowPopover(false) + } + + if (!shouldEmphasize || inactivePlayers.length === 0) { + return null + } + + return ( +
+ + + {/* Add Player Popover */} + {showPopover && ( +
+
+ Add Player +
+
+ {inactivePlayers.map(player => ( + + ))} +
+
+ )} +
+ ) +} \ No newline at end of file