diff --git a/client/src/components/forms/UserForm/index.tsx b/client/src/components/forms/UserForm/index.tsx index 898c17898a20b641b0d2ec01451ac47d87f8151e..69eadca8f653e9e0e4eabd1aa6bdc68a57ec833e 100644 --- a/client/src/components/forms/UserForm/index.tsx +++ b/client/src/components/forms/UserForm/index.tsx @@ -5,7 +5,7 @@ import TextInput from 'components/ui/TextInput'; import Button from 'components/ui/Button'; interface Props { - onSubmit?: (name?: string, email?: string,) => void; + onSubmit?: (name?: string, email?: string, avatar?: File) => void; user: User } @@ -21,15 +21,29 @@ function validateEmail(email?: string): string | null { } } +function validateAvatar(avatar?: File): string | null { + const validTypes = ['image/jpg', 'image/png', 'image/gif'] + if (avatar) { + if (validTypes.find((type) => type === avatar.type)) { + return null; + } else { + return 'Only files from type jpg, png or gif are allowed' + } + } else { + return null; + } +} + export default function UserForm({ user, onSubmit }: Props) { const [name, setName] = useState(user.realname); const [email, setEmail] = useState(user.email); + const [avatar, setAvatar] = useState<File>(); const handleSubmit = useCallback(async (e: FormEvent) => { e.preventDefault(); - if (validateEmail(email) === null) { - onSubmit?.(name, email); + if (validateEmail(email) === null || validateAvatar(avatar) === null) { + onSubmit?.(name, email, avatar); } - }, [onSubmit, name, email]); + }, [onSubmit, name, email, avatar]); return ( <form onSubmit={handleSubmit} className="user-form"> <div className="fields"> @@ -49,7 +63,11 @@ export default function UserForm({ user, onSubmit }: Props) { <div className="avatar-upload"> <div className="label">Avatar</div> <label htmlFor="avatar" className="avatar-field"> - <input type="file" id="avatar" name="avatar" /> + <input type="file" id="avatar" name="avatar" onChange={(e) => { + if (e.target.files && e.target.files.length > 0) { + setAvatar(e.target.files[0]) + } + }} /> </label> </div> </div> diff --git a/client/src/pages/Settings/index.tsx b/client/src/pages/Settings/index.tsx index 3097213b51fc04e84f5a6efcaceb4f7a46da39dc..204a830381fb189cfb4a518149834bd21bea31ec 100644 --- a/client/src/pages/Settings/index.tsx +++ b/client/src/pages/Settings/index.tsx @@ -1,6 +1,6 @@ import './settings.scss'; import { useCallback, useEffect, useState } from 'react'; -import { getCurrentUser, updateUser, User } from 'adapters/user'; +import { getCurrentUser, updateUser, updateUserImage, User } from 'adapters/user'; import LoadingScreen from 'components/ui/LoadingScreen'; import UserForm from 'components/forms/UserForm'; import { useHistory } from 'react-router'; @@ -14,12 +14,18 @@ export default function Settings() { }, []); - const handleSubmit = useCallback(async (name?: string, email?: string) => { + const handleSubmit = useCallback(async (name?: string, email?: string, avatar?: File) => { try { if (user && updateUser({realname: name, email })) { + if(avatar) { + console.log(avatar); + updateUserImage(avatar); + } history.push('/tasks'); } } catch (e) { + console.log(e); + } }, [history, user]); diff --git a/client/src/pages/Tasks/TaskStart/index.tsx b/client/src/pages/Tasks/TaskStart/index.tsx index 9489f19fa75d983e065f88f0dc63c9f27e4ce4b3..ee07faa285f0bd6b080076b3071253a79029e182 100644 --- a/client/src/pages/Tasks/TaskStart/index.tsx +++ b/client/src/pages/Tasks/TaskStart/index.tsx @@ -1,7 +1,6 @@ import './task-start.scss'; import Tag from 'components/ui/Tag'; import DetailGrid from 'components/layout/DetailGrid'; -import ButtonLink from 'components/navigation/ButtonLink'; import { useHistory, useParams } from 'react-router'; import { useEffect, useState } from 'react'; import { getTask, StatusColors, Task } from 'adapters/task';