diff --git a/client/src/Pages/Account/TabProfile.tsx b/client/src/Pages/Account/TabProfile.tsx
index 540a5b8b5..6b05e0082 100644
--- a/client/src/Pages/Account/TabProfile.tsx
+++ b/client/src/Pages/Account/TabProfile.tsx
@@ -1,10 +1,12 @@
import { Stack, Box } from "@mui/material";
-import { useTranslation } from "react-i18next";
-import { useForm, Controller } from "react-hook-form";
-import { useSelector, useDispatch } from "react-redux";
import { ConfigBox } from "@/Components/v2/design-elements";
import { TextField, Button } from "@/Components/v2/inputs";
import { ImageUpload } from "@/Components/v2/inputs";
+
+import { useTheme } from "@mui/material";
+import { useTranslation } from "react-i18next";
+import { useForm, Controller } from "react-hook-form";
+import { useSelector, useDispatch } from "react-redux";
import { useProfileForm } from "@/Hooks/useProfileForm";
import { usePatch } from "@/Hooks/UseApi";
import { setUser } from "@/Features/Auth/authSlice";
@@ -13,6 +15,7 @@ import type { RootState } from "@/Types/state";
import type { User } from "@/Types/User";
export const TabProfile = () => {
+ const theme = useTheme();
const { t } = useTranslation();
const dispatch = useDispatch();
const user = useSelector((state: RootState) => state.auth?.user);
@@ -71,74 +74,66 @@ export const TabProfile = () => {
};
return (
- <>
-
+
+ (
+
+ )}
+ />
+ (
+
+ )}
+ />
+
+ }
+ />
+
+ }
+ />
+
- >
+ {t("common.buttons.save")}
+
+
);
};
diff --git a/server/src/controllers/authController.ts b/server/src/controllers/authController.ts
index 165bec056..d6fe6aeff 100755
--- a/server/src/controllers/authController.ts
+++ b/server/src/controllers/authController.ts
@@ -74,7 +74,6 @@ class AuthController {
editUser = async (req: Request, res: Response, next: NextFunction) => {
try {
await editUserBodyValidation.validateAsync(req.body);
-
const updatedUser = await this.userService.editUser(req.body, req.file, req.user);
res.status(200).json({
diff --git a/server/src/repositories/users/MongoUsersRepository.ts b/server/src/repositories/users/MongoUsersRepository.ts
index 023e8aefb..fde134a33 100644
--- a/server/src/repositories/users/MongoUsersRepository.ts
+++ b/server/src/repositories/users/MongoUsersRepository.ts
@@ -98,10 +98,11 @@ class MongoUsersRepository implements IUsersRepository {
updateById = async (id: string, patch: Partial, file?: Express.Multer.File | null): Promise => {
const candidateUser = { ...patch };
+ let unsetFields: Record | undefined;
if (ParseBoolean(candidateUser.deleteProfileImage) === true) {
- candidateUser.profileImage = undefined;
- candidateUser.avatarImage = undefined;
+ unsetFields = { profileImage: 1, avatarImage: 1 };
+ delete candidateUser.deleteProfileImage;
} else if (file) {
// 1. Save the full size image
candidateUser.profileImage = {
@@ -114,13 +115,14 @@ class MongoUsersRepository implements IUsersRepository {
candidateUser.avatarImage = avatar;
}
- const updatedUser = await UserModel.findOneAndUpdate(
- { _id: id },
- candidateUser,
- { new: true } // Returns updated user instead of pre-update user
- )
- .select("-password")
- .select("-profileImage");
+ delete candidateUser.deleteProfileImage;
+
+ const updateQuery: Record = { $set: candidateUser };
+ if (unsetFields) {
+ updateQuery.$unset = unsetFields;
+ }
+
+ const updatedUser = await UserModel.findOneAndUpdate({ _id: id }, updateQuery, { new: true }).select("-password").select("-profileImage");
if (!updatedUser) {
throw new AppError({ message: "User not found", service: SERVICE_NAME, status: 404 });
}
diff --git a/server/src/validation/joi.ts b/server/src/validation/joi.ts
index c1e945961..f72addc5e 100755
--- a/server/src/validation/joi.ts
+++ b/server/src/validation/joi.ts
@@ -60,7 +60,7 @@ const editUserBodyValidation = joi.object({
profileImage: joi.any(),
newPassword: joi.string().min(8).pattern(passwordPattern),
password: joi.string().min(8).pattern(passwordPattern),
- deleteProfileImage: joi.boolean(),
+ deleteProfileImage: joi.alternatives().try(joi.boolean(), joi.string().valid("true", "false")),
});
const recoveryValidation = joi.object({