73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import React from 'react';
|
|
import { Box } from '@mui/material';
|
|
import { QrCode, AcUnit, AccessTime } from '@mui/icons-material';
|
|
import styled from 'styled-components';
|
|
|
|
interface SlotProps {
|
|
data: SlotData;
|
|
onSelect: (slot: SlotData) => void;
|
|
isSelected: boolean;
|
|
}
|
|
|
|
export interface SlotData {
|
|
id: string;
|
|
occupied: boolean;
|
|
needsRefill: boolean;
|
|
timeUntilRefill: string;
|
|
}
|
|
|
|
const SlotContainer = styled(Box)<{ occupied: boolean, isSelected: boolean }>`
|
|
width: 90px;
|
|
height: 180px;
|
|
margin: 10px;
|
|
background-color: ${(props) => (props.occupied ? '#f0f0f0' : '#ffffff')};
|
|
border: ${(props) => (props.isSelected ? '3px solid blue' : '2px solid #aaaaaa')};
|
|
border-radius: 5px;
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 10px;
|
|
box-sizing: border-box;
|
|
cursor: pointer;
|
|
position: relative;
|
|
`;
|
|
|
|
const SlotNumber = styled.div`
|
|
font-size: 20px;
|
|
font-weight: bold;
|
|
`;
|
|
|
|
const QrCodeIcon = styled(QrCode)`
|
|
font-size: 40px;
|
|
color: #aaaaaa;
|
|
`;
|
|
|
|
const RefillIcon = styled(AcUnit)`
|
|
font-size: 20px;
|
|
color: #1e88e5;
|
|
margin-top: auto;
|
|
`;
|
|
|
|
const ClockIcon = styled(AccessTime)`
|
|
font-size: 20px;
|
|
color: #ff6f00;
|
|
`;
|
|
|
|
const Slot: React.FC<SlotProps> = ({ data, onSelect, isSelected }) => {
|
|
return (
|
|
<SlotContainer occupied={data.occupied} onClick={() => onSelect(data)} isSelected={isSelected}>
|
|
<SlotNumber>{data.id}</SlotNumber>
|
|
<QrCodeIcon />
|
|
{data.occupied && (
|
|
<>
|
|
{data.needsRefill && <RefillIcon titleAccess="Needs Refill" />}
|
|
<ClockIcon titleAccess={`Time until refill: ${data.timeUntilRefill}`} />
|
|
</>
|
|
)}
|
|
</SlotContainer>
|
|
);
|
|
}
|
|
|
|
export default Slot; |