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.
160 lines
4.4 KiB
160 lines
4.4 KiB
import React, { useState } from 'react'; |
|
import './light.css'; |
|
import moment from 'moment-timezone'; |
|
import { Button, Container, Header, Table } from 'semantic-ui-react'; |
|
import { BasicTable, staticUrl, useIsMobile } from './utils.js'; |
|
|
|
export function Cards(props) { |
|
const { user, token } = props; |
|
const [open, setOpen] = useState(false); |
|
const isMobile = useIsMobile(); |
|
|
|
const cardStatus = (c) => c.active_status === 'card_active' ? 'Yes' : 'No'; |
|
const card = user.cards[0]; |
|
|
|
return ( |
|
<Container> |
|
<Header size='large'>Cards / Access</Header> |
|
|
|
<Header size='medium'>Your Cards</Header> |
|
|
|
{user.member.card_photo ? |
|
<p> |
|
<a href={staticUrl + '/' + user.member.card_photo} target='_blank'> |
|
View your card image. |
|
</a> |
|
</p> |
|
: |
|
<p>Upload a photo to generate a card image.</p> |
|
} |
|
|
|
{user.cards.length ? |
|
user.cards.length > 1 ? |
|
<Table basic='very'> |
|
{!isMobile && <Table.Header> |
|
<Table.Row> |
|
<Table.HeaderCell>Number</Table.HeaderCell> |
|
<Table.HeaderCell>Notes</Table.HeaderCell> |
|
<Table.HeaderCell>Last Scan</Table.HeaderCell> |
|
<Table.HeaderCell>Active</Table.HeaderCell> |
|
</Table.Row> |
|
</Table.Header>} |
|
|
|
<Table.Body> |
|
{user.cards.map(x => |
|
<Table.Row key={x.id}> |
|
<Table.Cell>{x.card_number}</Table.Cell> |
|
<Table.Cell>{isMobile && 'Notes: '}{x.notes}</Table.Cell> |
|
<Table.Cell> |
|
{isMobile && 'Last Scan: '}{x.last_seen ? |
|
x.last_seen > '2021-11-14T02:01:35.415685Z' ? |
|
moment.utc(x.last_seen).tz('America/Edmonton').format('lll') |
|
: |
|
moment.utc(x.last_seen).tz('America/Edmonton').format('ll') |
|
: |
|
'Unknown' |
|
} |
|
</Table.Cell> |
|
<Table.Cell>{isMobile && 'Active: '}{cardStatus(x)}</Table.Cell> |
|
</Table.Row> |
|
)} |
|
</Table.Body> |
|
</Table> |
|
: |
|
<BasicTable> |
|
<Table.Body> |
|
<Table.Row> |
|
<Table.Cell>Number:</Table.Cell> |
|
<Table.Cell>{card.card_number}</Table.Cell> |
|
</Table.Row> |
|
<Table.Row> |
|
<Table.Cell>Notes:</Table.Cell> |
|
<Table.Cell>{card.notes}</Table.Cell> |
|
</Table.Row> |
|
<Table.Row> |
|
<Table.Cell>Last Seen:</Table.Cell> |
|
<Table.Cell> |
|
{card.last_seen ? |
|
card.last_seen > '2021-11-14T02:01:35.415685Z' ? |
|
moment.utc(card.last_seen).tz('America/Edmonton').format('lll') |
|
: |
|
moment.utc(card.last_seen).tz('America/Edmonton').format('ll') |
|
: |
|
'Unknown' |
|
} |
|
</Table.Cell> |
|
</Table.Row> |
|
<Table.Row> |
|
<Table.Cell>Active:</Table.Cell> |
|
<Table.Cell>{cardStatus(card)}</Table.Cell> |
|
</Table.Row> |
|
</Table.Body> |
|
</BasicTable> |
|
: |
|
<p>No cards yet! Ask a director for one after you are vetted.</p> |
|
} |
|
|
|
{!!user.door_code && <React.Fragment> |
|
<Header size='medium'>Door Alarm Code</Header> |
|
|
|
<p>Only share this with vetted Protospace members:</p> |
|
|
|
<p>{user.door_code}</p> |
|
</React.Fragment>} |
|
|
|
{!!user.wifi_pass && <React.Fragment> |
|
<Header size='medium'>Wi-Fi Password</Header> |
|
|
|
<p>Only share this with Protospace members and guests:</p> |
|
|
|
<p>{user.wifi_pass}</p> |
|
</React.Fragment>} |
|
|
|
<Header size='medium'>API Key</Header> |
|
|
|
<p>Don't share this with anyone! Treat it like your password:</p> |
|
|
|
{open ? |
|
<React.Fragment> |
|
<p>{token}</p> |
|
|
|
<Header size='small'>API Docs</Header> |
|
|
|
<p> |
|
To learn how to use this, refer to the API docs: |
|
<br /> |
|
<a href='https://docs.my.protospace.ca/api.html' target='_blank' rel='noopener noreferrer' aria-label='link to our API docs'> |
|
https://docs.my.protospace.ca/api.html |
|
</a> |
|
</p> |
|
|
|
<Header size='small'>API Examples</Header> |
|
|
|
<p>Get your user info with Bash (curl):</p> |
|
|
|
<p><code>$ curl -H "Authorization: Token {token}" https://api.my.protospace.ca/user/</code></p> |
|
|
|
<p>Get your user info with Python 3 (and requests):</p> |
|
|
|
<code> |
|
import json, requests<br/> |
|
<br /> |
|
SECRET_API_KEY = '{token}'<br /> |
|
<br /> |
|
headers = {'{'}'Authorization': 'Token '+SECRET_API_KEY{'}'}<br /> |
|
r = requests.get('https://api.my.protospace.ca/user/', headers=headers)<br /> |
|
<br /> |
|
print(json.dumps(r.json(), indent=4))<br /> |
|
</code> |
|
</React.Fragment> |
|
: |
|
<p> |
|
<Button onClick={() => setOpen(true)}> |
|
Show Secret |
|
</Button> |
|
</p> |
|
} |
|
</Container> |
|
); |
|
}; |
|
|
|
|