Skip to content

Commit f0dc72f

Browse files
authored
Merge pull request #41 from TaloDev/develop
Release 0.11.0
2 parents aa8bfa6 + 9651a78 commit f0dc72f

27 files changed

+415
-420
lines changed

.env.development

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ TAILWIND_DISABLE_TOUCH=true
22

33
SNOWPACK_PUBLIC_API_URL=http://localhost:3000/
44

5-
SENTRY_DSN=
6-
SENTRY_ENV=dev
5+
SNOWPACK_PUBLIC_SENTRY_DSN=
6+
SNOWPACK_PUBLIC_SENTRY_ENV=dev

.env.production

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
SNOWPACK_PUBLIC_API_URL=${API_URL}
22

3-
SENTRY_DSN=https://b857733793ac4aacb2b7c5d36873a1ba@o406248.ingest.sentry.io/5273330
4-
SENTRY_ENV=prod
3+
SNOWPACK_PUBLIC_SENTRY_DSN=https://b857733793ac4aacb2b7c5d36873a1ba@o406248.ingest.sentry.io/5273330
4+
SNOWPACK_PUBLIC_SENTRY_ENV=prod

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
},
99
"dependencies": {
1010
"@hookform/resolvers": "^2.8.8",
11-
"@sentry/react": "^6.19.3",
12-
"@sentry/tracing": "^6.19.3",
11+
"@sentry/react": "^6.19.6",
1312
"@tabler/icons": "^1.60.0",
1413
"@tippyjs/react": "^4.2.5",
1514
"axios": "^0.26.0",
@@ -67,5 +66,5 @@
6766
"lint-staged": {
6867
"*.{js,jsx}": "eslint --fix"
6968
},
70-
"version": "0.10.0"
69+
"version": "0.11.0"
7170
}

src/App.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { useState, useEffect, lazy, Suspense } from 'react'
22
import { Redirect, Route, Switch, useHistory } from 'react-router-dom'
3+
import * as Sentry from '@sentry/react'
34
import { useRecoilState, useRecoilValue } from 'recoil'
45
import refreshAccess from './api/refreshAccess'
56
import userState from './state/userState'
@@ -52,6 +53,8 @@ const App = () => {
5253
const accessToken = res.data.accessToken
5354
AuthService.setToken(accessToken)
5455
setUser(res.data.user)
56+
57+
Sentry.setUser({ id: res.data.user.id, username: res.data.user.username })
5558
} catch (err) {
5659
console.log('User doesn\'t have a session')
5760
setActiveGame(null)

src/components/NavBar.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ import { IconMenu2 } from '@tabler/icons'
1010
import MobileMenu from './MobileMenu'
1111
import Button from './Button'
1212
import ServicesLink from './ServicesLink'
13+
import * as Sentry from '@sentry/react'
1314

1415
const NavBar = () => {
1516
const activeGame = useRecoilValue(activeGameState)
1617
const [showMobileMenu, setShowMobileMenu] = useState(false)
1718

1819
const onLogoutClick = async () => {
1920
try {
21+
Sentry.configureScope((scope) => scope.setUser(null))
22+
2023
await logout()
2124
} catch (err) {
2225
console.warn('Logout failed:', err.message)

src/components/ServicesLink.jsx

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import LinkButton from './LinkButton'
88
import routes from '../constants/routes'
99
import userState from '../state/userState'
1010
import { useRecoilValue } from 'recoil'
11+
import Tippy from '@tippyjs/react'
1112

1213
function ServicesLink() {
1314
const user = useRecoilValue(userState)
@@ -66,30 +67,43 @@ function ServicesLink() {
6667
]
6768

6869
return (
69-
<li className='relative'>
70-
<LinkButton onClick={() => setShowServicesMenu(!showServicesMenu)}>
71-
<div className='flex sm:flex-row-reverse items-center'>
72-
Services
73-
<IconCaretDown size={20} className={classNames('ml-1 sm:ml-0 sm:mr-1 fill-current transform transition-transform', { 'rotate-180': showServicesMenu })} />
70+
<li>
71+
<Tippy
72+
placement='bottom-start'
73+
visible={showServicesMenu}
74+
onClickOutside={() => setShowServicesMenu(false)}
75+
offset={[0, 10]}
76+
interactive={true}
77+
arrow={false}
78+
theme='bare'
79+
content={(
80+
<ul className='w-full sm:w-[480px] grid grid-cols-2 gap-2 bg-gray-800 border border-gray-700 p-2 rounded text-white transition-all'>
81+
{services.filter(({ route }) => canViewPage(user, route)).map(({ name, desc, icon: Icon, route }) => (
82+
<li key={name}>
83+
{showServicesMenu &&
84+
<RouterLink to={route} className={classNames('group block p-4 rounded transition-colors hover:bg-gray-700 focus:bg-gray-700 space-y-2', focusStyle)}>
85+
<p className='font-bold text-white group-hover:text-indigo-300 group-focus:text-indigo-300'>
86+
<Icon size={18} className='inline-block mb-1 mr-1' />
87+
{name}
88+
</p>
89+
<p className='text-gray-300 text-sm group-hover:text-white group-focus:text-white'>{desc}</p>
90+
</RouterLink>
91+
}
92+
{!showServicesMenu && <div className='h-[80px]' />}
93+
</li>
94+
))}
95+
</ul>
96+
)}
97+
>
98+
<div>
99+
<LinkButton onClick={() => setShowServicesMenu(!showServicesMenu)}>
100+
<div className='flex sm:flex-row-reverse items-center'>
101+
Services
102+
<IconCaretDown size={20} className={classNames('ml-1 sm:ml-0 sm:mr-1 fill-current transform transition-transform', { 'rotate-180': showServicesMenu })} />
103+
</div>
104+
</LinkButton>
74105
</div>
75-
</LinkButton>
76-
77-
<ul className={classNames('w-full sm:w-[480px] grid grid-cols-2 gap-2 absolute top-0 pointer-events-none opacity-0 bg-gray-800 border border-gray-700 p-2 rounded text-white transition-all', { '!top-10 z-50 opacity-100 filter drop-shadow-md !pointer-events-auto': showServicesMenu })}>
78-
{services.filter(({ route }) => canViewPage(user, route)).map(({ name, desc, icon: Icon, route }) => (
79-
<li key={name}>
80-
{showServicesMenu &&
81-
<RouterLink to={route} className={classNames('group block p-4 rounded transition-colors hover:bg-gray-700 focus:bg-gray-700 space-y-2', focusStyle)}>
82-
<p className='font-bold text-white group-hover:text-indigo-300 group-focus:text-indigo-300'>
83-
<Icon size={18} className='inline-block mb-1 mr-1' />
84-
{name}
85-
</p>
86-
<p className='text-gray-300 text-sm group-hover:text-white group-focus:text-white'>{desc}</p>
87-
</RouterLink>
88-
}
89-
{!showServicesMenu && <div className='h-[80px]' />}
90-
</li>
91-
))}
92-
</ul>
106+
</Tippy>
93107
</li>
94108
)
95109
}

src/components/tables/Table.jsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react'
2+
import PropTypes from 'prop-types'
3+
import TableHeader from './TableHeader'
4+
5+
export default function Table({ columns, children }) {
6+
return (
7+
<div className='overflow-x-scroll'>
8+
<table className='table-auto w-full'>
9+
<TableHeader columns={columns} />
10+
{children}
11+
</table>
12+
</div>
13+
)
14+
}
15+
16+
Table.propTypes = {
17+
columns: PropTypes.arrayOf(PropTypes.string).isRequired,
18+
children: PropTypes.node.isRequired
19+
}

src/constants/userTypes.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export default {
2-
DEV: 0,
2+
OWNER: 0,
33
ADMIN: 1,
4-
DEMO: 2
4+
DEV: 2,
5+
DEMO: 3
56
}

src/index.jsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@ import App from './App'
66
import { RecoilRoot } from 'recoil'
77
import { BrowserRouter } from 'react-router-dom'
88
import * as Sentry from '@sentry/react'
9-
import { BrowserTracing } from '@sentry/tracing'
109

1110
Sentry.init({
12-
dsn: import.meta.env.SENTRY_DSN,
13-
environment: import.meta.env.SENTRY_ENV,
14-
integrations: [new BrowserTracing()],
15-
tracesSampleRate: 1.0
11+
dsn: import.meta.env.SNOWPACK_PUBLIC_SENTRY_DSN,
12+
environment: import.meta.env.SNOWPACK_PUBLIC_SENTRY_ENV
1613
})
1714

1815
ReactDOM.render(

src/modals/NewGame.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Modal from '../components/Modal'
44
import TextInput from '../components/TextInput'
55
import Button from '../components/Button'
66
import createGame from '../api/createGame'
7-
import { useRecoilState } from 'recoil'
7+
import { useRecoilState, useSetRecoilState } from 'recoil'
88
import activeGameState from '../state/activeGameState'
99
import userState from '../state/userState'
1010
import buildError from '../utils/buildError'
@@ -15,7 +15,7 @@ const NewGame = (props) => {
1515
const [name, setName] = useState('')
1616
const [isLoading, setLoading] = useState(false)
1717
const [user, setUser] = useRecoilState(userState)
18-
const [, setActiveGame] = useRecoilState(activeGameState)
18+
const setActiveGame = useSetRecoilState(activeGameState)
1919
const [error, setError] = useState(null)
2020

2121
const onCreateClick = async (e) => {

0 commit comments

Comments
 (0)