You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
4.6 KiB
170 lines
4.6 KiB
import {
|
|
Alert,
|
|
AlertIcon,
|
|
Grid,
|
|
GridItem,
|
|
Spinner,
|
|
Stack,
|
|
Tab,
|
|
TabList,
|
|
TabPanel,
|
|
TabPanels,
|
|
Table,
|
|
TableContainer,
|
|
Tabs,
|
|
Tbody,
|
|
Td,
|
|
Th,
|
|
Thead,
|
|
Tr,
|
|
} from '@chakra-ui/react'
|
|
import { useEffect, useMemo, useState } from 'react'
|
|
import { useSelector } from 'react-redux'
|
|
import {
|
|
fetchReceivedSMSList,
|
|
selectDeviceList,
|
|
selectReceivedSMSList,
|
|
} from '../../store/deviceSlice'
|
|
import { useAppDispatch } from '../../store/hooks'
|
|
import { selectAuthUser } from '../../store/authSlice'
|
|
|
|
export default function ReceiveSMS() {
|
|
return (
|
|
<>
|
|
<Grid
|
|
templateColumns={{ base: 'repeat(1, 1fr)', md: 'repeat(3, 1fr)' }}
|
|
gap={6}
|
|
>
|
|
<GridItem colSpan={2}>
|
|
<ReceivedSMSList />
|
|
</GridItem>
|
|
<GridItem colSpan={1}>
|
|
<ReceiveSMSNotifications />
|
|
</GridItem>
|
|
</Grid>
|
|
</>
|
|
)
|
|
}
|
|
|
|
const ReceiveSMSNotifications = () => {
|
|
return (
|
|
<Stack spacing={3}>
|
|
<Alert status='success'>
|
|
<AlertIcon />
|
|
You can now receive SMS and view them in the dashboard, or retreive them
|
|
via the API
|
|
</Alert>
|
|
|
|
<Alert status='warning'>
|
|
<AlertIcon />
|
|
To receive SMS, you need to have an active device that has receive SMS
|
|
option enabled <small>(Turn on the switch in the app)</small>
|
|
</Alert>
|
|
|
|
<Alert status='info'>
|
|
<AlertIcon />
|
|
Webhooks will be available soon 😉
|
|
</Alert>
|
|
</Stack>
|
|
)
|
|
}
|
|
|
|
const ReceivedSMSList = () => {
|
|
const dispatch = useAppDispatch()
|
|
|
|
const [tabIndex, setTabIndex] = useState(0)
|
|
|
|
const { loading: receivedSMSListLoading, data: receivedSMSListData } =
|
|
useSelector(selectReceivedSMSList)
|
|
const deviceList = useSelector(selectDeviceList)
|
|
|
|
const authUser = useSelector(selectAuthUser)
|
|
|
|
const activeDeviceId = useMemo(() => {
|
|
return deviceList[tabIndex]?._id
|
|
}, [tabIndex, deviceList])
|
|
|
|
useEffect(() => {
|
|
if (authUser && activeDeviceId) {
|
|
dispatch(fetchReceivedSMSList(activeDeviceId))
|
|
}
|
|
}, [dispatch, authUser, activeDeviceId])
|
|
|
|
if (!receivedSMSListLoading && (!deviceList || deviceList.length == 0)) {
|
|
return (
|
|
<Alert status='warning'>
|
|
<AlertIcon />
|
|
You dont have any devices yet. Please register a device to receive SMS
|
|
</Alert>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Tabs isLazy={false} index={tabIndex} onChange={setTabIndex}>
|
|
<TabList>
|
|
{deviceList.map(({ _id, brand, model }) => (
|
|
<Tab key={_id}>{`${brand} ${model}`}</Tab>
|
|
))}
|
|
</TabList>
|
|
<TabPanels>
|
|
{deviceList.map(({ _id, brand, model }) => (
|
|
<TabPanel key={_id}>
|
|
<TableContainer>
|
|
<Table variant='striped'>
|
|
<Thead>
|
|
<Tr>
|
|
<Th>sender</Th>
|
|
<Th colSpan={4}>message</Th>
|
|
<Th>received at</Th>
|
|
</Tr>
|
|
</Thead>
|
|
<Tbody>
|
|
{receivedSMSListLoading && (
|
|
<Tr>
|
|
<Td colSpan={6} textAlign='center'>
|
|
<Spinner size='lg' />
|
|
</Td>
|
|
</Tr>
|
|
)}
|
|
|
|
{!receivedSMSListLoading &&
|
|
receivedSMSListData.length == 0 && (
|
|
<Td colSpan={6} textAlign='center'>
|
|
No SMS received
|
|
</Td>
|
|
)}
|
|
|
|
{!receivedSMSListLoading &&
|
|
receivedSMSListData.length > 0 &&
|
|
receivedSMSListData.map(
|
|
({ _id, sender, message, receivedAt }) => (
|
|
<Tr key={_id}>
|
|
<Td>{sender}</Td>
|
|
<Td whiteSpace='pre-wrap' colSpan={4}>
|
|
{message}
|
|
</Td>
|
|
<Td>
|
|
{new Date(receivedAt).toLocaleString('en-US', {
|
|
month: 'long',
|
|
day: 'numeric',
|
|
year: 'numeric',
|
|
hour: 'numeric',
|
|
minute: 'numeric',
|
|
hour12: true,
|
|
})}
|
|
</Td>
|
|
<Td></Td>
|
|
</Tr>
|
|
)
|
|
)}
|
|
</Tbody>
|
|
</Table>
|
|
</TableContainer>
|
|
</TabPanel>
|
|
))}
|
|
</TabPanels>
|
|
</Tabs>
|
|
</>
|
|
)
|
|
}
|