Skip to content

Commit d776869

Browse files
authored
Merge pull request #161 from TaloDev/develop
Release 0.25.1
2 parents 368f685 + 029b549 commit d776869

File tree

15 files changed

+416
-550
lines changed

15 files changed

+416
-550
lines changed

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
},
1212
"dependencies": {
1313
"@dinero.js/currencies": "^2.0.0-alpha.11",
14-
"@hookform/resolvers": "^2.8.8",
14+
"@hookform/resolvers": "^3.0.0",
1515
"@sentry/react": "^7.0.0",
1616
"@tabler/icons-react": "^2.1.2",
1717
"@tippyjs/react": "^4.2.5",
1818
"axios": "^1.2.1",
1919
"classnames": "^2.3.2",
2020
"date-fns": "^2.29.3",
2121
"dinero.js": "^2.0.0-alpha.11",
22-
"framer-motion": "^10.0.0",
22+
"framer-motion": "^10.9.1",
2323
"lodash-es": "^4.17.21",
2424
"prop-types": "^15.7.2",
2525
"querystring": "^0.2.1",
@@ -28,7 +28,7 @@
2828
"react-day-picker": "^8.3.5",
2929
"react-dom": "^18.2.0",
3030
"react-focus-lock": "^2.9.2",
31-
"react-hook-form": "^7.42.1",
31+
"react-hook-form": "^7.43.8",
3232
"react-required-if": "^1.0.3",
3333
"react-router-dom": "^6.7.0",
3434
"react-select": "^5.7.0",
@@ -37,7 +37,7 @@
3737
"spinners-react": "^1.0.6",
3838
"swr": "^2.0.0",
3939
"use-debounce": "^9.0.0",
40-
"yup": "^0.32.11"
40+
"yup": "^1.0.2"
4141
},
4242
"devDependencies": {
4343
"@testing-library/cypress": "^9.0.0",
@@ -71,7 +71,7 @@
7171
"lint-staged": {
7272
"*.{js,jsx}": "eslint --fix"
7373
},
74-
"version": "0.25.0",
74+
"version": "0.25.1",
7575
"engines": {
7676
"node": "16.x"
7777
}

renovate.json

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,18 @@
22
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
33
"extends": [
44
"config:base"
5-
]
5+
],
6+
"packageRules": [
7+
{
8+
"matchDepTypes": ["devDependencies"],
9+
"matchUpdateTypes": ["minor", "patch"],
10+
"automerge": true
11+
},
12+
{
13+
"matchDepTypes": ["dependencies"],
14+
"matchUpdateTypes": ["patch"],
15+
"enabled": false
16+
}
17+
],
18+
"platformAutomerge": true
619
}

src/components/billing/PricingPlanTile.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export default function PricingPlanTile({ plan, displayInterval, custom, current
8686
<Button
8787
variant={isUpgrade() ? undefined : 'grey'}
8888
onClick={onChangePlanClick}
89-
className='w-40'
89+
className='!w-40'
9090
icon={isUpgrade() && <IconArrowUp />}
9191
isLoading={planLoading === plan.id}
9292
disabled={Boolean(planLoading)}

src/components/toast/ToastProvider.test.jsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ describe('<ToastProvider />', () => {
3636
)
3737

3838
expect(await screen.findByText('Hello!')).toBeInTheDocument()
39-
await waitForElementToBeRemoved(screen.queryByText('Hello!'))
4039
})
4140

4241
it('should trigger multiple toasts', async () => {
@@ -48,7 +47,5 @@ describe('<ToastProvider />', () => {
4847

4948
await waitForElementToBeRemoved(() => screen.queryByText('Hello!'))
5049
expect(screen.getByText('Hello again!')).toBeInTheDocument()
51-
52-
await waitForElementToBeRemoved(screen.queryByText('Hello again!'))
5350
})
5451
})

src/components/toggles/DevDataToggle.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ function DevDataToggle() {
2727
onFocus={() => setFocus(true)}
2828
onBlur={() => setFocus(false)}
2929
onChange={() => setInnerEnabled(!innerEnabled)}
30+
checked={innerEnabled}
3031
/>
3132

3233
<label
@@ -41,7 +42,7 @@ function DevDataToggle() {
4142
initial={false}
4243
transition={{ duration: 0.2 }}
4344
className='h-full w-8 rounded-md relative'
44-
onAnimationComplete={() => setIncludeDevData(innerEnabled)}
45+
onAnimationStart={() => setIncludeDevData(innerEnabled)}
4546
>
4647
<motion.span {...sharedIconProps} animate={{ opacity: innerEnabled ? 1 : 0 }}>
4748
<IconCheck size={24} stroke={3} />

src/components/toggles/Toggle.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ function Toggle({ id, enabled, onToggle, disabled, inputRef }) {
3030
onBlur={() => setFocus(false)}
3131
onChange={() => setInnerEnabled(!innerEnabled)}
3232
disabled={disabled}
33-
checked={enabled}
33+
checked={innerEnabled}
3434
/>
3535

3636
<motion.label
@@ -50,7 +50,7 @@ function Toggle({ id, enabled, onToggle, disabled, inputRef }) {
5050
initial={false}
5151
transition={{ duration: 0.2 }}
5252
className='h-8 w-8 rounded-full relative shadow !bg-white border border-gray-200'
53-
onAnimationComplete={() => onToggle(innerEnabled)}
53+
onAnimationStart={() => onToggle(innerEnabled)}
5454
/>
5555
</motion.label>
5656
</>

src/components/toggles/__tests__/Toggle.test.jsx

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,33 @@
1-
import { useEffect, useState } from 'react'
21
import { render, screen, waitFor } from '@testing-library/react'
32
import userEvent from '@testing-library/user-event'
43
import Toggle from '../Toggle'
54

65
describe('<Toggle />', () => {
7-
// eslint-disable-next-line react/prop-types
8-
function ToggleDummy({ toggleMock, enabled, ...otherProps }) {
9-
const [isEnabled, setEnabled] = useState(enabled ?? false)
10-
11-
useEffect(() => toggleMock(isEnabled), [isEnabled])
12-
13-
return (
14-
<Toggle id='test' enabled={isEnabled} onToggle={setEnabled} {...otherProps} />
15-
)
16-
}
17-
186
it('should correctly toggle between states', async () => {
197
const toggleMock = vi.fn()
8+
render(<Toggle id='test' enabled={false} onToggle={toggleMock} />)
209

21-
render(<ToggleDummy toggleMock={toggleMock} />)
10+
const { click } = userEvent.setup()
2211

23-
await userEvent.click(screen.getByRole('checkbox'))
24-
await waitFor(() => expect(toggleMock).toHaveBeenLastCalledWith(true))
12+
await click(screen.getByRole('checkbox'))
13+
await waitFor(() => expect(screen.getByRole('checkbox')).toBeChecked())
14+
expect(toggleMock).toHaveBeenLastCalledWith(true)
2515

26-
await userEvent.click(screen.getByRole('checkbox'))
27-
await waitFor(() => expect(toggleMock).toHaveBeenLastCalledWith(false))
16+
await click(screen.getByRole('checkbox'))
17+
await waitFor(() => expect(screen.getByRole('checkbox')).not.toBeChecked())
18+
expect(toggleMock).toHaveBeenLastCalledWith(false)
2819
})
2920

3021
it('should correctly render the disabled state', () => {
31-
render(<ToggleDummy toggleMock={vi.fn()} disabled={true} />)
22+
render(<Toggle id='test' enabled={false} disabled={true} onToggle={vi.fn()} />)
23+
3224
expect(screen.getByRole('checkbox')).toBeDisabled()
3325
expect(screen.getByRole('checkbox')).not.toBeChecked()
3426
})
3527

3628
it('should correctly render a toggled disabled state', async () => {
37-
render(<ToggleDummy toggleMock={vi.fn()} enabled={true} disabled={true} />)
29+
render(<Toggle id='test' enabled={true} disabled={true} onToggle={vi.fn()} />)
30+
3831
expect(screen.getByRole('checkbox')).toBeDisabled()
3932
await waitFor(() => expect(screen.getByRole('checkbox')).toBeChecked())
4033
})

src/modals/NewInvite.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import { yupResolver } from '@hookform/resolvers/yup'
1111
import createInvite from '../api/createInvite'
1212
import Select from '../components/Select'
1313
import userTypes from '../constants/userTypes'
14+
import emailRegex from '../utils/validation/emailRegex'
1415

1516
const validationSchema = yup.object({
16-
email: yup.string().email().label('Email').required(),
17+
email: yup.string().matches(emailRegex, 'Please enter a valid email address').label('Email').required(),
1718
userType: yup.object().label('User type').required()
1819
})
1920

src/modals/StatDetails.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import deleteStat from '../api/deleteStat'
1515
import { useForm } from 'react-hook-form'
1616
import * as yup from 'yup'
1717
import { yupResolver } from '@hookform/resolvers/yup'
18-
import nullableNumber from '../utils/nullableNumber'
18+
import nullableNumber from '../utils/validation/nullableNumber'
1919
import canPerformAction, { permissionBasedActions } from '../utils/canPerformAction'
2020

2121
const StatDetails = ({ modalState, mutate, editingStat }) => {

src/pages/ForgotPassword.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import { useForm } from 'react-hook-form'
1313
import requestNewPassword from '../api/requestNewPassword'
1414
import { IconCheck } from '@tabler/icons-react'
1515
import AlertBanner from '../components/AlertBanner'
16+
import emailRegex from '../utils/validation/emailRegex'
1617

1718
const validationSchema = yup.object({
18-
email: yup.string().label('Email').email('Please enter a valid email address').required()
19+
email: yup.string().label('Email').matches(emailRegex, 'Please enter a valid email address').required()
1920
})
2021

2122
export default function ForgotPassword() {

0 commit comments

Comments
 (0)