diff --git a/.gitignore b/.gitignore index d39eb1d2a80ebaf318efda96ed92ee8a35d18ad1..5eab1a953054b7ff8f1351fd806642aab6872ac2 100644 --- a/.gitignore +++ b/.gitignore @@ -138,4 +138,5 @@ npm-debug.log* yarn-debug.log* yarn-error.log* yarn.lock -.docz/ \ No newline at end of file +.docz/ +._.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 5a14922c2dcfce233562b1b292fdc162c061488a..39b360a1e7a8a396baf2b0b094867eaf1f0081a9 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,4 @@ yarn start [react calendar app](https://codesandbox.io/s/kkyvoj97pv?from-embed=&file=/src/index.js) +[Typescript cheatsheet](https://github.com/typescript-cheatsheets/react/blob/main/README.md#hooks) \ No newline at end of file diff --git a/package.json b/package.json index 99e22163dac6a4904005dfcd5ffbd20c7c02e327..fd27481a7b3b71e544d4793bce5f8c66fca1236b 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@hookform/devtools": "^2.2.1", "@material-ui/core": "^4.11.3", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", @@ -12,10 +13,13 @@ "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", "@types/react-router-dom": "^5.1.7", + "axios": "^0.21.1", "docz": "^2.3.1", "eslint-config-airbnb-typescript": "^12.3.1", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-hook-form": "^6.15.5", + "react-intl": "^5.15.5", "react-router-dom": "^5.2.0", "react-scripts": "4.0.3", "typescript": "^4.1.2" diff --git a/src/App.tsx b/src/App.tsx index 694bde22cb58786ad40a699c6ee61b0fa05d1e3d..458470b04401c6a1593bef169628b611cd9916d9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,15 +1,17 @@ import React, { FC } from 'react'; import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'; +import { HomePage } from './components/HomePage/HomePage'; import { AuthUser } from './components/AuthUser/AuthUser'; +import { LandingPage } from './components/LandingPage/LandingPage'; export const App: FC = () => ( <Router> - <Switch> - <Route path="/"> - <div data-testid="App"> - <AuthUser /> - </div> - </Route> - </Switch> + <div data-testid="App"> + <Switch> + <Route path="/auth" component={AuthUser} /> + <Route exact path="/" component={LandingPage} /> + <Route exact path="/home" component={HomePage} /> + </Switch> + </div> </Router> ); diff --git a/src/components/AuthUser/AuthUser.tsx b/src/components/AuthUser/AuthUser.tsx index a802575dadc71c3805fc994c76f4639ca05f6cb9..51621049d7d74beaf16d4e6a60f0933d454b2bdd 100644 --- a/src/components/AuthUser/AuthUser.tsx +++ b/src/components/AuthUser/AuthUser.tsx @@ -1,12 +1,17 @@ import React, { FC, useEffect } from 'react'; +import axios from 'axios'; import Container from '@material-ui/core/Container'; import { SignInForm } from './SignInForm/SignInForm'; export const AuthUser: FC = () => { useEffect(() => { - fetch('/api/web/csrf') - .then((response) => response.json()) - .then((data) => sessionStorage.setItem('token', data.token)); + axios + .get('api/web/csrf') + .then((response) => { + // Check this https://stackoverflow.com/questions/39254562/csrf-with-django-reactredux-using-axios + axios.defaults.headers.common['X-CSRFTOKEN'] = response.data.token; + }) + .catch((error) => error); }, []); return ( <Container maxWidth="sm"> diff --git a/src/components/AuthUser/SignInForm/InputField.tsx b/src/components/AuthUser/SignInForm/InputField.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a0093c9c7bacc5ab2a82c2a924b83e12100332f8 --- /dev/null +++ b/src/components/AuthUser/SignInForm/InputField.tsx @@ -0,0 +1,46 @@ +import React, { FC } from 'react'; +import { TextField } from '@material-ui/core'; +import { Control, Controller, FieldValues } from 'react-hook-form'; + +type Props = { + /** + * Name of the elemement. ex. email, password + */ + name: string; + label: string; + error: boolean; + errorMessage: string; + /** + * react-hook-form control + */ + control: Control<FieldValues> | undefined; + rules: Partial<unknown>; +}; + +export const InputField: FC<Props> = (props: Props) => { + const { name, label, error, errorMessage, control, rules } = props; + return ( + <Controller + name={name} + control={control} + rules={rules} + render={({ onChange, value }) => ( + <TextField + variant="outlined" + margin="normal" + required + fullWidth + id={name} + label={label} + name={name} + onChange={onChange} + value={value} + autoComplete={name} + autoFocus + error={error} + helperText={error && errorMessage} + /> + )} + /> + ); +}; diff --git a/src/components/AuthUser/SignInForm/SignInForm.tsx b/src/components/AuthUser/SignInForm/SignInForm.tsx index 344b6bfe2b02c9faee2b32f3d7babef32ca63a02..bdb8ad4c499af5173b5d9de5aedb4e55817093e8 100644 --- a/src/components/AuthUser/SignInForm/SignInForm.tsx +++ b/src/components/AuthUser/SignInForm/SignInForm.tsx @@ -1,8 +1,11 @@ -import React, { useState } from 'react'; +import React, { FC } from 'react'; +import axios from 'axios'; +import { SubmitHandler, useForm } from 'react-hook-form'; +import { useIntl } from 'react-intl'; import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; -import TextField from '@material-ui/core/TextField'; -import Button from '@material-ui/core/Button'; -import { isEmailValid } from './emailValidator'; +import { Button } from '@material-ui/core'; +import { DevTool } from '@hookform/devtools'; +import { InputField } from './InputField'; const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -21,68 +24,87 @@ const useStyles = makeStyles((theme: Theme) => }), ); -export const SignInForm: React.FC = () => { - interface formData { +// TODO: real time form validation +export const SignInForm: FC = () => { + interface FormData { email: string; password: string; - errors: Array<string>; } - const defaultValues: formData = { + const defaultValues: FormData = { email: '', password: '', - errors: [], }; - const [formValues, setFormValues] = useState<formData>(defaultValues); - const handleSubmit = (event: React.FormEvent): void => { - event.preventDefault(); - const errors: Array<string> = []; - if (!isEmailValid(formValues.email)) errors.push('email'); - }; + const { control, errors, handleSubmit } = useForm<FormData>({ + defaultValues, + }); + const onSubmit: SubmitHandler<FormData> = (values: FormData) => { + axios + .post('/api/web/login', { + values, + }) + .then((response) => { + // Handle server reponse + }) + .catch((error) => { + // Handle error + }); + }; + const intl = useIntl(); const classes = useStyles(); - return ( - <form className={classes.form} onSubmit={handleSubmit} data-testid="Form"> - <TextField - variant="outlined" - margin="normal" - required - fullWidth - id="email" - label="Email Address" - name="email" - autoComplete="email" - autoFocus - onChange={(event) => - setFormValues({ ...formValues, email: String(event.target.value) }) - } - /> - <TextField - variant="outlined" - margin="normal" - required - fullWidth - name="password" - label="Password" - type="password" - id="password" - autoComplete="current-password" - onChange={(event) => - setFormValues({ ...formValues, password: String(event.target.value) }) - } - /> - <Button - type="submit" - fullWidth - variant="contained" - color="primary" - data-testid="Submit" - className={classes.submit} + <> + <form + className={classes.form} + onSubmit={handleSubmit(onSubmit)} + data-testid="Form" > - Sign In - </Button> - </form> + <InputField + name="email" + control={control} + rules={{ + validate: (value: string) => + /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(value), + required: { + value: true, + message: intl.formatMessage({ id: 'email' }), + }, + }} + label={intl.formatMessage({ id: 'email' })} + error={!!errors.email} + errorMessage={intl.formatMessage({ id: 'email-error' })} + /> + + <InputField + name="password" + control={control} + rules={{ + minLength: 8, + maxLength: 60, + required: { + value: true, + message: intl.formatMessage({ id: 'password' }), + }, + }} + label={intl.formatMessage({ id: 'password' })} + error={!!errors.password} + errorMessage={intl.formatMessage({ id: 'password-error' })} + /> + + <Button + type="submit" + fullWidth + variant="contained" + color="primary" + data-testid="Submit" + className={classes.submit} + > + Sign In + </Button> + </form> + <DevTool control={control} /> {/* set up the dev tool */} + </> ); }; diff --git a/src/components/HomePage/HomePage.tsx b/src/components/HomePage/HomePage.tsx new file mode 100644 index 0000000000000000000000000000000000000000..99b3448459007f960afbfdacbfefac747d0e5d9a --- /dev/null +++ b/src/components/HomePage/HomePage.tsx @@ -0,0 +1,104 @@ +import React, { FC } from 'react'; +import { createStyles, Theme, makeStyles } from '@material-ui/core/styles'; +import Drawer from '@material-ui/core/Drawer'; +import AppBar from '@material-ui/core/AppBar'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import Toolbar from '@material-ui/core/Toolbar'; +import List from '@material-ui/core/List'; +import Typography from '@material-ui/core/Typography'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; + +const drawerWidth = 240; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + root: { + display: 'flex', + }, + appBar: { + zIndex: theme.zIndex.drawer + 1, + }, + drawer: { + width: drawerWidth, + flexShrink: 0, + }, + drawerPaper: { + width: drawerWidth, + }, + drawerContainer: { + overflow: 'auto', + }, + content: { + flexGrow: 1, + padding: theme.spacing(3), + }, + }), +); + +export const HomePage: FC = () => { + const classes = useStyles(); + + return ( + <div className={classes.root}> + <CssBaseline /> + <AppBar position="fixed" className={classes.appBar}> + <Toolbar> + <Typography variant="h6" noWrap> + Moveaid + </Typography> + </Toolbar> + </AppBar> + <Drawer + className={classes.drawer} + variant="permanent" + classes={{ + paper: classes.drawerPaper, + }} + > + <Toolbar /> + <div className={classes.drawerContainer}> + <List> + {['Reservation'].map((text) => ( + <ListItem button key={text}> + <ListItemText primary={text} /> + </ListItem> + ))} + </List> + </div> + </Drawer> + <main className={classes.content}> + <Toolbar /> + <Typography paragraph> + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Rhoncus + dolor purus non enim praesent elementum facilisis leo vel. Risus at + ultrices mi tempus imperdiet. Semper risus in hendrerit gravida rutrum + quisque non tellus. Convallis convallis tellus id interdum velit + laoreet id donec ultrices. Odio morbi quis commodo odio aenean sed + adipiscing. Amet nisl suscipit adipiscing bibendum est ultricies + integer quis. Cursus euismod quis viverra nibh cras. Metus vulputate + eu scelerisque felis imperdiet proin fermentum leo. Mauris commodo + quis imperdiet massa tincidunt. Cras tincidunt lobortis feugiat + vivamus at augue. At augue eget arcu dictum varius duis at consectetur + lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa sapien + faucibus et molestie ac. + </Typography> + <Typography paragraph> + Consequat mauris nunc congue nisi vitae suscipit. Fringilla est + ullamcorper eget nulla facilisi etiam dignissim diam. Pulvinar + elementum integer enim neque volutpat ac tincidunt. Ornare suspendisse + sed nisi lacus sed viverra tellus. Purus sit amet volutpat consequat + mauris. Elementum eu facilisis sed odio morbi. Euismod lacinia at quis + risus sed vulputate odio. Morbi tincidunt ornare massa eget egestas + purus viverra accumsan in. In hendrerit gravida rutrum quisque non + tellus orci ac. Pellentesque nec nam aliquam sem et tortor. Habitant + morbi tristique senectus et. Adipiscing elit duis tristique + sollicitudin nibh sit. Ornare aenean euismod elementum nisi quis + eleifend. Commodo viverra maecenas accumsan lacus vel facilisis. Nulla + posuere sollicitudin aliquam ultrices sagittis orci a. + </Typography> + </main> + </div> + ); +}; diff --git a/src/components/LandingPage/LandingPage.tsx b/src/components/LandingPage/LandingPage.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5567be0bdcc3aa06af023345824b31163ce6288a --- /dev/null +++ b/src/components/LandingPage/LandingPage.tsx @@ -0,0 +1,41 @@ +import React, { FC } from 'react'; + +export const LandingPage: FC = () => ( + <> + <section> + <h2>What is MoveAid?</h2> + + <p> + MoveAid is a project born in order to satisfy a specific problem. There + are many senior citizens who are not able to drive and move from a place + to another easily, because of this they sometimes need to take private + Taxis or public means of transport which could be expensive and not + simple. MoveAid wants to be the solution to this problem offering free + drives (carried out by voulunteers) for those who need them to reach + medical visit, to go to the supermarket or to satisfy any other need. + </p> + </section> + + <section> + <h2>How will MoveAid work?</h2> + + <p> + MoveAid will be the platform that will allow people to ask for a drive + (either by phone or online) and organizations of voulenteers to organise + and accept drives. + </p> + </section> + + <p> + <br /> + </p> + + <footer> + <p> + Authors: Alberto Defendi, Andrea Esposito, Marco Marinello, Francesco + Mazzini + </p> + <p>© 2021 - All right reserved</p> + </footer> + </> +); diff --git a/src/components/LandingPage/TeamPage.tsx b/src/components/LandingPage/TeamPage.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b0a945e8347fdc1b4c1027ea1cf3a03df91eb95d --- /dev/null +++ b/src/components/LandingPage/TeamPage.tsx @@ -0,0 +1,86 @@ +import React, { FC } from 'react'; + +export const TeamPage: FC = () => ( + <> + <section> + <h2>These are the students of the MoveAid project</h2> + + <div> + <h3>Alberto Defendi</h3> + <table> + <tr> + <td> </td> + <td> + <p> + Age: 19 <br /> + Role: Front End Developer + <br /> + Hobbys: Sports, maths + <br /> + </p> + </td> + </tr> + </table> + </div> + + <div> + <h3>Andrea Esposito</h3> + <table> + <tr> + <td> </td> + <td> + <p> + Age: 19 <br /> + Role: xxxxx + <br /> + Hobbys: xxxxxxxxx + <br /> + </p> + </td> + </tr> + </table> + </div> + + <div> + <h3>Marco Marinello</h3> + <table> + <tr> + <td> </td> + <td> + <p> + Age: 19 <br /> + Role: xxxxx + <br /> + Hobbys: xxxxxxxxx + <br /> + </p> + </td> + </tr> + </table> + </div> + + <div> + <h3>Francesco Mazzini</h3> + <table> + <tr> + <td> </td> + <td> + <p> + <strong>Age:</strong> 19 <br /> + <br /> + <strong>Role:</strong> Front End Developer + <br /> + <br /> + <strong>Hobbys:</strong> I like Graphic and Programing. + <br /> + I also like playing videogames, hanging out <br /> + with friends, watching tv series and <br /> + training in gym! + </p> + </td> + </tr> + </table> + </div> + </section> + </> +); diff --git a/src/components/LandingPage/assets/alberto.png b/src/components/LandingPage/assets/alberto.png new file mode 100644 index 0000000000000000000000000000000000000000..a4030b2bda405381ab60d5ba68b7ea7c057ebefe Binary files /dev/null and b/src/components/LandingPage/assets/alberto.png differ diff --git a/src/components/LandingPage/assets/logo04Circle.png b/src/components/LandingPage/assets/logo04Circle.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5a76b9f51d9580a7f6b6b78f076f0a4a821f48 Binary files /dev/null and b/src/components/LandingPage/assets/logo04Circle.png differ diff --git a/src/components/LandingPage/assets/pp.jpg b/src/components/LandingPage/assets/pp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..593205f4d623a459904abdcfb13c8517e4ccf666 Binary files /dev/null and b/src/components/LandingPage/assets/pp.jpg differ diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e8c0bb8188184ed1e0703c4c8f2a8419b0..0000000000000000000000000000000000000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/index.tsx b/src/index.tsx index bc4d4a8f3962b9d567a53d5191d2d81cc29dae00..0fccccb0ddf325834eeac345df5804ae6cae64ef 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,11 +1,17 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import './index.css'; +import { IntlProvider } from 'react-intl'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import MESSAGES_EN from './intl/en.json'; import { App } from './App'; ReactDOM.render( <React.StrictMode> - <App /> + <IntlProvider locale="en" messages={MESSAGES_EN}> + <CssBaseline /> + <App /> + </IntlProvider> + , </React.StrictMode>, document.getElementById('root'), ); diff --git a/src/intl/en.json b/src/intl/en.json new file mode 100644 index 0000000000000000000000000000000000000000..347550bbe2d981d469c98efa089b3f5a97b1aaed --- /dev/null +++ b/src/intl/en.json @@ -0,0 +1,6 @@ +{ + "email": "Email address", + "password": "Password", + "email-error": "Insert valid email address", + "password-error": "Insert valid password" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 28d326ad701ecc03222f109d83b70ff5c6c57cb4..a9e35e86bda131c31b8776ce06d60839c4108b07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1512,7 +1512,7 @@ "@emotion/utils" "0.11.3" "@emotion/weak-memoize" "0.2.5" -"@emotion/core@^10.0.14", "@emotion/core@^10.0.16": +"@emotion/core@^10.0.14", "@emotion/core@^10.0.16", "@emotion/core@^10.0.28": version "10.1.1" resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.1.1.tgz#c956c1365f2f2481960064bcb8c4732e5fb612c3" integrity sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA== @@ -1576,7 +1576,7 @@ "@emotion/serialize" "^0.11.15" "@emotion/utils" "0.11.3" -"@emotion/styled@^10.0.14": +"@emotion/styled@^10.0.14", "@emotion/styled@^10.0.27": version "10.0.27" resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf" integrity sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q== @@ -1629,6 +1629,59 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@formatjs/ecma402-abstract@1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.6.4.tgz#cff5ef03837fb6bae70b16d04940213c17e87884" + integrity sha512-ukFjGD9dLsxcD9D5AEshJqQElPQeUAlTALT/lzIV6OcYojyuU81gw/uXDUOrs6XW79jtOJwQDkLqHbCJBJMOTw== + dependencies: + tslib "^2.1.0" + +"@formatjs/icu-messageformat-parser@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-1.1.2.tgz#e0d41edcfd031c0627b0f40dfcce5883d765df5d" + integrity sha512-AgwoQ2XUL+bQ/v7t4TBJh9vsob8zXgfM3RNe3MvJBCVOEZ+9z8mszsqeae/DmJgLK6SDezJex5O9Vdiny58Pwg== + dependencies: + "@formatjs/ecma402-abstract" "1.6.4" + "@formatjs/icu-skeleton-parser" "1.1.1" + tslib "^2.1.0" + +"@formatjs/icu-skeleton-parser@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.1.1.tgz#b2c39a7817816d68d31272947dded970f6d1d1c7" + integrity sha512-hkRJhjr9G0IE730Kxwq65+rz/2fdCckSJTPrKmViMxLNtRmIt6Hx67tffElr9/QSlpzGlXw9XAMdFOa1ylRrJQ== + dependencies: + "@formatjs/ecma402-abstract" "1.6.4" + tslib "^2.1.0" + +"@formatjs/intl-displaynames@4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-4.0.12.tgz#9af9992e544aa96b32c3a4994d6fef878e0376c9" + integrity sha512-2f3nf5IcPYk2SCS83rJoV5y47OTL+YtHDa5G42KDgSA8ZgmgkN5OaYs3WF6a2RweMG9jp4LCTUmqS42LcAhJSw== + dependencies: + "@formatjs/ecma402-abstract" "1.6.4" + tslib "^2.1.0" + +"@formatjs/intl-listformat@5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-5.0.13.tgz#5b13057a12642089108ddf4316bab976319fd941" + integrity sha512-z4vZ5FX6dsL2fbO7NCmmJXKXH9p0gubzZVSsmCOUBIuy6rODLD8kE2LVnefd4wnXEJi5/fAnwGT2NMjirWa71g== + dependencies: + "@formatjs/ecma402-abstract" "1.6.4" + tslib "^2.1.0" + +"@formatjs/intl@1.9.5": + version "1.9.5" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.9.5.tgz#02bc32ab9e52b7f0201c964a696609b6d455cca2" + integrity sha512-PEvdDuppTHW23B4s1nzKCY1wku3HYEgmV2ip02RspSUKl8p3t/TCwb1/U3Qwhgj3EUsjYdiaF1uyMj61eChAow== + dependencies: + "@formatjs/ecma402-abstract" "1.6.4" + "@formatjs/icu-messageformat-parser" "1.1.2" + "@formatjs/intl-displaynames" "4.0.12" + "@formatjs/intl-listformat" "5.0.13" + fast-memoize "^2.5.2" + intl-messageformat "9.6.4" + tslib "^2.1.0" + "@graphql-tools/batch-execute@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-7.0.0.tgz#e79d11bd5b39f29172f6ec2eafa71103c6a6c85b" @@ -1805,6 +1858,18 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@hookform/devtools@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@hookform/devtools/-/devtools-2.2.1.tgz#2d88414d375199e193c2611b770b194b7752a623" + integrity sha512-VQh4kqwUOpz9LCDzIP0aJ4qnD/ob8Gp09L8gDy++9XtL66z6g8kbCynUvBrJm4qbCNdH0M7/Spm3AUjJqUuFlA== + dependencies: + "@emotion/core" "^10.0.28" + "@emotion/styled" "^10.0.27" + "@types/lodash" "^4.14.152" + little-state-machine "^3.0.1" + lodash "^4.17.15" + react-simple-animate "^3.3.8" + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -2662,6 +2727,14 @@ resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/html-minifier-terser@^5.0.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" @@ -2731,7 +2804,7 @@ dependencies: "@types/node" "*" -"@types/lodash@^4.14.92": +"@types/lodash@^4.14.152", "@types/lodash@^4.14.92": version "4.14.168" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== @@ -7639,7 +7712,7 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-memoize@^2.5.1: +fast-memoize@^2.5.1, fast-memoize@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== @@ -9877,6 +9950,15 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +intl-messageformat@9.6.4: + version "9.6.4" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.6.4.tgz#6ee964235c37b864359dc848b3dd5ea984cc8065" + integrity sha512-NCstnz4qiRYHRiFwAadptARV0XGv8dFtC6ZcDfjKlFePvyyQ9zkPXq28Tg7UPTfUZnOfGjnxgi0mMem/5/TbDw== + dependencies: + "@formatjs/icu-messageformat-parser" "1.1.2" + fast-memoize "^2.5.2" + tslib "^2.1.0" + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -11423,6 +11505,11 @@ listr2@^3.2.2: through "^2.3.8" wrap-ansi "^7.0.0" +little-state-machine@^3.0.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/little-state-machine/-/little-state-machine-3.1.4.tgz#b29c396f732976cc327a612ef9a7a53f3f3520ab" + integrity sha512-gYlLCj6oUME0NG34/2O0Ljy52qYYyYDJ5yiAuq2ijbaRlBKIqtQQkKkEYn0KfjYXCE693j+bdY22EyZin25Bhw== + load-cfg@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/load-cfg/-/load-cfg-2.1.0.tgz#230ef6950466df59be934363988d35eee48ce8b9" @@ -15135,6 +15222,11 @@ react-helmet-async@^1.0.4: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-hook-form@^6.15.5: + version "6.15.5" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-6.15.5.tgz#c2578f9ce6a6df7b33015587d40cd880dc13e2db" + integrity sha512-so2jEPYKdVk1olMo+HQ9D9n1hVzaPPFO4wsjgSeZ964R7q7CHsYRbVF0PGBi83FcycA5482WHflasdwLIUVENg== + react-hot-loader@^4.12.21: version "4.13.0" resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.13.0.tgz#c27e9408581c2a678f5316e69c061b226dc6a202" @@ -15149,6 +15241,21 @@ react-hot-loader@^4.12.21: shallowequal "^1.1.0" source-map "^0.7.3" +react-intl@^5.15.5: + version "5.15.5" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.15.5.tgz#a475445f7e9d9085040d622528ed18a082b03b5d" + integrity sha512-TdjMVU0xkH5hKonv/g5x2sD94iojErqlDMbLADsTmz1dgRDc6iLRP5b7mtp0//pkK/psrb283B8HL1wp1vhpiQ== + dependencies: + "@formatjs/ecma402-abstract" "1.6.4" + "@formatjs/icu-messageformat-parser" "1.1.2" + "@formatjs/intl" "1.9.5" + "@formatjs/intl-displaynames" "4.0.12" + "@formatjs/intl-listformat" "5.0.13" + "@types/hoist-non-react-statics" "^3.3.1" + hoist-non-react-statics "^3.3.2" + intl-messageformat "9.6.4" + tslib "^2.1.0" + react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -15288,6 +15395,11 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" +react-simple-animate@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/react-simple-animate/-/react-simple-animate-3.3.11.tgz#04bb03ffe707e4e7cab4e22a03a93f20415b39de" + integrity sha512-kt2SKJ4Gw3klTmRbik/9R741fPiVRVlxkXvV0c3uu8NqOtdc5ITis62WcdiKH6U5QhCjXNfLW9lrbQ4cAYujyA== + react-simple-code-editor@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.10.0.tgz#73e7ac550a928069715482aeb33ccba36efe2373" @@ -17820,7 +17932,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2, tslib@^2.0.0, tslib@^2.0.3, tslib@~2.1.0: +tslib@^2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==