4 changed files with 210 additions and 2 deletions
-
170web/components/dashboard/ReceiveSMS.tsx
-
2web/pages/dashboard.tsx
-
5web/services/gatewayService.ts
-
35web/store/deviceSlice.ts
@ -0,0 +1,170 @@ |
|||
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) { |
|||
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>message</Th> |
|||
<Th>received at</Th> |
|||
</Tr> |
|||
</Thead> |
|||
<Tbody> |
|||
{receivedSMSListLoading && ( |
|||
<Tr> |
|||
<Td colSpan={3} textAlign='center'> |
|||
<Spinner size='lg' /> |
|||
</Td> |
|||
</Tr> |
|||
)} |
|||
|
|||
{!receivedSMSListLoading && |
|||
receivedSMSListData.length == 0 && ( |
|||
<Td colSpan={3} 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' maxW='300px'> |
|||
{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> |
|||
</> |
|||
) |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue