diff --git a/api/src/graphql/users.sdl.js b/api/src/graphql/users.sdl.js index 44fe21a..a72a9a3 100644 --- a/api/src/graphql/users.sdl.js +++ b/api/src/graphql/users.sdl.js @@ -35,6 +35,7 @@ export const schema = gql` type Mutation { createUser(input: CreateUserInput!): User! updateUser(id: String!, input: UpdateUserInput!): User! + updateUserByUserName(userName: String!, input: UpdateUserInput!): User! deleteUser(id: String!): User! } ` diff --git a/api/src/services/users/users.js b/api/src/services/users/users.js index 5e4522b..cde157a 100644 --- a/api/src/services/users/users.js +++ b/api/src/services/users/users.js @@ -29,6 +29,13 @@ export const updateUser = ({ id, input }) => { }) } +export const updateUserByUserName = ({ userName, input }) => { + return db.user.update({ + data: input, + where: { userName }, + }) +} + export const deleteUser = ({ id }) => { return db.user.delete({ where: { id }, diff --git a/web/src/components/EditUser2Cell/EditUser2Cell.js b/web/src/components/EditUser2Cell/EditUser2Cell.js index 07656aa..caba9fa 100644 --- a/web/src/components/EditUser2Cell/EditUser2Cell.js +++ b/web/src/components/EditUser2Cell/EditUser2Cell.js @@ -1,3 +1,5 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' import UserProfile from 'src/components/UserProfile' export const QUERY = gql` @@ -14,6 +16,15 @@ export const QUERY = gql` } ` +const UPDATE_USER_MUTATION = gql` + mutation UpdateUserMutation($userName: String!, $input: UpdateUserInput!) { + updateUserByUserName(userName: $userName, input: $input) { + id + userName + } + } +` + export const Loading = () =>
Loading...
export const Empty = () =>
Empty
@@ -21,5 +32,23 @@ export const Empty = () =>
Empty
export const Failure = ({ error }) =>
Error: {error.message}
export const Success = ({ user }) => { - return + const { addMessage } = useFlash() + const [updateUser, { loading, error }] = useMutation(UPDATE_USER_MUTATION, { + onCompleted: ({updateUserByUserName}) => { + navigate(routes.user2({userName: updateUserByUserName.userName})) + addMessage('User updated.', { classes: 'rw-flash-success' }) + }, + }) + + const onSave = (userName, input) => { + updateUser({ variables: { userName, input } }) + } + + return } diff --git a/web/src/components/ImageUploader/ImageUploader.js b/web/src/components/ImageUploader/ImageUploader.js index 819b236..22a1196 100644 --- a/web/src/components/ImageUploader/ImageUploader.js +++ b/web/src/components/ImageUploader/ImageUploader.js @@ -23,7 +23,6 @@ export default function ImageUploader({ onImageUpload, imageUrl, aspectRatio, cl }); async function handleImageUpload() { const croppedFile = await getCroppedImg(imageObj, crop, 'avatar') - console.log(croppedFile) const imageData = new FormData(); imageData.append('upload_preset', CLOUDINARY_UPLOAD_PRESET); imageData.append('file', croppedFile); @@ -54,7 +53,7 @@ export default function ImageUploader({ onImageUpload, imageUrl, aspectRatio, cl
{cloudinaryId && isEditable && } {isEditable && } {(cloudinaryId || !isEditable) &&
diff --git a/web/src/components/UserProfile/UserProfile.js b/web/src/components/UserProfile/UserProfile.js index 62bf827..6239111 100644 --- a/web/src/components/UserProfile/UserProfile.js +++ b/web/src/components/UserProfile/UserProfile.js @@ -1,14 +1,21 @@ -import {Fragment} from 'react' +import {useState, useEffect} from 'react' +import { navigate, routes } from '@redwoodjs/router' +import Editor from "rich-markdown-editor"; + import ImageUploader from 'src/components/ImageUploader' import Button from 'src/components/Button' -import Editor from "rich-markdown-editor"; import ProfileTextInput from 'src/components/ProfileTextInput' -const UserProfile = ({user, isEditable}) => { - console.log(isEditable) - const {userName, email} = user - const editableTextFields = {userName, name: email} // TODO add name field to user +const UserProfile = ({user, isEditable, loading, onSave, error}) => { + const [input, setInput] = useState({ + userName: user.userName, + email: user.email, + bio: user.bio, + image: user.image, + }) + const {userName, email} = input + const editableTextFields = {userName, email} // TODO add name field to user return ( <>
@@ -16,16 +23,23 @@ const UserProfile = ({user, isEditable}) => {
setInput({ + ...input, + image, + })} aspectRatio={1} isEditable={isEditable} imageUrl={user.image === 'abc' ? '': user.image} />
- + setInput({ + ...input, + ...textFields, + })} isEditable={isEditable}/> {isEditable ? - : // TODO replace pencil with a save icon - + : // TODO replace pencil with a save icon + }
@@ -35,6 +49,10 @@ const UserProfile = ({user, isEditable}) => { setInput({ + ...input, + bio: bioFn(), + })} />