Browse Source

fix: validation users

stage
Vitalik 3 months ago
parent
commit
1fbae7b04b
  1. 7
      src/containers/Profile/components/form-user/hooks/use-profile-form.hook.ts
  2. 10
      src/containers/Profile/config/errorsKey.ts
  3. 182
      src/containers/User/components/FormUser/index.tsx
  4. 159
      src/containers/User/hooks/use-create-edit-user.hook.ts
  5. 3
      src/services/domain/users.service.ts
  6. 64
      src/shared/helpers/api.helpers.ts

7
src/containers/Profile/components/form-user/hooks/use-profile-form.hook.ts

@ -233,6 +233,7 @@ export const useProfileForm = ({ @@ -233,6 +233,7 @@ export const useProfileForm = ({
// });
}
};
const validatePersonalPhoneNumber = async (value) => {
if (!value) return;
const telPersonal = value.match(/\d/g).join("");
@ -297,6 +298,12 @@ export const useProfileForm = ({ @@ -297,6 +298,12 @@ export const useProfileForm = ({
} else {
simpleDispatch(new isVisibleModal({ isVisibleModal: false }));
if (updateProfile.email) {
updateProfile.email = updateProfile.email.toLowerCase();
setValue("email", updateProfile.email);
}
await accountService.updateAccount(
updateProfile,
profile.id,

10
src/containers/Profile/config/errorsKey.ts

@ -2,24 +2,24 @@ export const errorsKey = { @@ -2,24 +2,24 @@ export const errorsKey = {
email: {
key: "email_exist",
exist: null,
description: "Така пошта вже існує"
description: "Така пошта вже існує",
},
phone_number: {
key: "user_already_exists",
exist: null,
description: "Такий телефон вже існує"
description: "Такий телефон вже існує",
},
personalPhone_number: {
key: "personal_phone_number_exist",
exist: null,
description: "Такий телефон вже існує"
description: "Такий телефон вже існує",
},
login_exist: {
key: "login_exist",
exist: null,
description: "Такий логін вже існує"
description: "Такий логін вже існує",
},
default_err: false
default_err: false,
};

182
src/containers/User/components/FormUser/index.tsx

@ -527,185 +527,3 @@ export const FormUser = (props: IProps) => { @@ -527,185 +527,3 @@ export const FormUser = (props: IProps) => {
</form>
);
};
// class FormUser1 extends Component<any> {
// // constructor(props) {
// // super(props)
// // this.state = {
// // image: null,
// // activeTab: '1',
// // groups: [],
// // activeTabError: false,
// // offsetWidth: '100%'
// // }
// // this.myForm = React.createRef()
// // this.refAvatarImg = React.createRef()
// // }
// // componentWillMount() {
// // getGroups().then(groups => this.setState({ groups }))
// // }
// // componentDidMount() {
// // this.setState({
// // offsetWidth: this.myForm.current.offsetWidth
// // })
// // }
// // componentWillReceiveProps(nextProps) {
// // }
// // componentWillUnmount() {
// // }
// // submit = (values) => {
// // let { profile, initialValues } = this.props;
// // if (!values.groups) {
// // values.groups = null;
// // // values.permissions = [];
// // }
// // if (values.id) {
// // this.props.updateUser(values.id, _.cloneDeep(values), this.state.image, profile.id).then((result) => {
// // this.props.getUsers(this.props.filter);
// // if ((profile.id != values.id) && (values.password || initialValues.phone != values.phone)) {
// // this.props.logoutUser(values.id);
// // } else if ((profile.id == values.id) && (values.password || initialValues.phone != values.phone)) {
// // this.props.logout();
// // this.props.logoutUser(values.id);
// // }
// // if (result.status) {
// // this.props.showModal(false);
// // }
// // });
// // } else {
// // this.props.createUser(values, this.state.image).then((result) => {
// // if (result.status) {
// // this.props.showModal(false);
// // }
// // });
// // }
// // }
// // onChangeGroup = (value) => {
// // if (!value) {
// // this.props.change('permissions', []);
// // } else {
// // this.state.groups.forEach(item => {
// // if (item.id == value) {
// // this.props.change('permissions', item.permissions);
// // }
// // })
// // }
// // }
// // toggle = (tab) => {
// // const { activeTab } = this.state;
// // if (activeTab !== tab) {
// // this.setState({
// // activeTab: tab,
// // });
// // }
// // };
// // deleteAvatar = () => {
// // const { initialValues, profile } = this.props;
// // const { image } = this.state;
// // if (image) {
// // this.setState({ image: null });
// // if (this.refAvatarImg.current && this.refAvatarImg.current.setDefaultImg) {
// // this.refAvatarImg.current.setDefaultImg();
// // }
// // if (initialValues.avatar) {
// // this.props.deleteAvatar(initialValues.id, profile.id)
// // }
// // } else if (initialValues.avatar) {
// // this.props.deleteAvatar(initialValues.id, profile.id)
// // }
// // }
// // render() {
// // let { handleSubmit, factory, users, returForm, initialValues, submitting, submitFailed, profile } = this.props;
// // if (submitFailed && !this.state.activeTabError) {
// // this.state.activeTabError = true;
// // this.toggle('1');
// // }
// // let { activeTab } = this.state;
// // let btnSendDisabled = true;
// // if (returForm.email && returForm.password && returForm.phone && returForm.login && returForm.name && returForm.password == returForm.password_confirm) {
// // btnSendDisabled = false;
// // }
// // return (
// // <div></div>
// // )
// // }
// }
// const warn = (values, props) => {
// const warnings = {};
// const { users, initialValues } = props;
// if (initialValues.id) {
// users.some(user => {
// if (user.name == values.name && initialValues.id != user.id) {
// warnings.name = 'Користувач з таким ПІБ вже існує'
// }
// })
// } else {
// users.some(user => {
// if (user.name == values.name) {
// warnings.name = 'Користувач з таким ПІБ вже існує'
// }
// })
// }
// return warnings
// let error = validationFields(fields, values);
// if (tmp_phone.length < 11 || tmp_phone.length > 12) {
// error.phone = 'Невірно введений телефон'
// }
// }
// }
// if (values.password && values.password != values.password_confirm) {
// error.password_confirm = 'Паролі не співпадають'
// }
// if (values.password && values.password.length < 7) {
// error.password = 'Паролі має містити більше 6 символів'
// }
// if (initialValues.id) {
// users.some(user => {
// if (user.login == values.login && initialValues.id != user.id) {
// error.login = 'Користувач з таким логіном вже існує'
// }
// if (user.email == values.email && initialValues.id != user.id) {
// error.email = 'Користувач з таким email вже існує'
// }
// if (user.phone == values.phone && initialValues.id != user.id) {
// error.phone = 'Користувач з таким телефоном вже існує'
// }
// })
// } else {
// users.some(user => {
// if (user.login == values.login) {
// error.login = 'Користувач з таким логіном вже існує'
// }
// if (user.email == values.email) {
// error.email = 'Користувач з таким email вже існує'
// }
// if (user.phone == values.phone) {
// error.phone = 'Користувач з таким телефоном вже існує'
// }
// })
// }

159
src/containers/User/hooks/use-create-edit-user.hook.ts

@ -8,7 +8,9 @@ import { @@ -8,7 +8,9 @@ import {
} from "@/services/domain";
import {
EUserRole,
extractMetaFromException,
IFactory,
isHttpErrorEqual,
IUser,
IUserPermissions,
notification,
@ -127,77 +129,118 @@ export const useCreateEditUser = ({ @@ -127,77 +129,118 @@ export const useCreateEditUser = ({
};
const createUser = async (value: IUserForm) => {
const dataToSave: ICreateUserPayload = _.omit(value, [
"confirmPassword",
"permissions",
]);
const userId = await usersService.createUser({
...(_.omitBy(dataToSave, (it) => !it) as ICreateUserPayload),
dateOfBirth: moment(value.dateOfBirth).format("YYYY-MM-DD"),
});
try {
const dataToSave: ICreateUserPayload = _.omit(value, [
"confirmPassword",
"permissions",
]);
const permissionsToSave = transformFormValuesToPermissions(
value.permissions
);
const userId = await usersService.createUser({
...(_.omitBy(dataToSave, (it) => !it) as ICreateUserPayload),
dateOfBirth: moment(value.dateOfBirth).format("YYYY-MM-DD"),
});
if (!_.isEmpty(permissionsToSave))
await permissionsApi.saveUserPermissions(
{ permissions: permissionsToSave },
userId
const permissionsToSave = transformFormValuesToPermissions(
value.permissions
);
};
const updateUser = async (value: IUserForm) => {
const dataToUpdate = _.omitBy(
value,
(it, key) =>
_.isNil(it) || defaultValues[key] === it || key === "permissions"
);
if (!_.isEmpty(permissionsToSave))
await permissionsApi.saveUserPermissions(
{ permissions: permissionsToSave },
userId
);
} catch (e) {
console.log("easdasdasasdas", e);
if (isHttpErrorEqual(e, "user_already_exists")) {
const meta = extractMetaFromException(e);
const duplicateFields = meta?.duplicateFields || [];
console.log(meta, duplicateFields);
if (duplicateFields.includes("phoneNumber")) {
setError("phoneNumber", {
message: "Такий номер телефону вже існує",
});
}
if (duplicateFields.includes("email")) {
setError("email", {
message: "Такий номер email вже існує",
});
}
if (duplicateFields.includes("login")) {
setError("login", {
message: "Такий логін вже існує",
});
}
}
if (
_.has(dataToUpdate, "personalPhoneNumber") &&
_.isEmpty(dataToUpdate.personalPhoneNumber)
)
dataToUpdate.personalPhoneNumber = "deleted";
throw e;
}
};
if (dataToUpdate.dateOfBirth)
dataToUpdate.dateOfBirth = moment(dataToUpdate.dateOfBirth).format(
"YYYY-MM-DD"
const updateUser = async (value: IUserForm) => {
try {
const dataToUpdate = _.omitBy(
value,
(it, key) =>
_.isNil(it) || defaultValues[key] === it || key === "permissions"
);
if (!_.isEmpty(dataToUpdate))
await accountApi.updateUser(dataToUpdate, value.id);
if (
_.has(dataToUpdate, "personalPhoneNumber") &&
_.isEmpty(dataToUpdate.personalPhoneNumber)
)
dataToUpdate.personalPhoneNumber = "deleted";
if (dataToUpdate.factoryId)
await usersApi.updateFactoryRelations([
{
userId: defaultValues.id,
factoryId: Number(dataToUpdate.factoryId),
},
]);
if (dataToUpdate.dateOfBirth)
dataToUpdate.dateOfBirth = moment(dataToUpdate.dateOfBirth).format(
"YYYY-MM-DD"
);
if (dataToUpdate.avatar)
await accountApi.changeAvatar(
{ userId: value.id },
{ avatar: dataToUpdate.avatar }
if (!_.isEmpty(dataToUpdate))
await accountApi.updateUser(dataToUpdate, value.id);
if (dataToUpdate.factoryId)
await usersApi.updateFactoryRelations([
{
userId: defaultValues.id,
factoryId: Number(dataToUpdate.factoryId),
},
]);
if (dataToUpdate.avatar)
await accountApi.changeAvatar(
{ userId: value.id },
{ avatar: dataToUpdate.avatar }
);
const permissionsToSave = transformFormValuesToPermissions(
value.permissions
);
const prevPermissions = transformFormValuesToPermissions(
defaultValues.permissions
);
const permissionsToSave = transformFormValuesToPermissions(
value.permissions
);
const prevPermissions = transformFormValuesToPermissions(
defaultValues.permissions
);
if (!_.isEqual(permissionsToSave, prevPermissions)) {
if (_.isEmpty(permissionsToSave))
await permissionsApi.deleteUserPermissions(value.id);
else
await permissionsApi.saveUserPermissions(
{ permissions: permissionsToSave },
value.id
);
}
} catch (e) {
if (isHttpErrorEqual(e, "user_already_exists")) {
const meta = extractMetaFromException(e);
if (meta.field === "phoneNumber") {
setError("phoneNumber", {
message: "Такий номер телефону вже існує",
});
}
}
if (!_.isEqual(permissionsToSave, prevPermissions)) {
if (_.isEmpty(permissionsToSave))
await permissionsApi.deleteUserPermissions(value.id);
else
await permissionsApi.saveUserPermissions(
{ permissions: permissionsToSave },
value.id
);
throw e;
}
};

3
src/services/domain/users.service.ts

@ -9,6 +9,7 @@ const createUser = async (createUserPayload: ICreateUserPayload) => { @@ -9,6 +9,7 @@ const createUser = async (createUserPayload: ICreateUserPayload) => {
return data;
} catch (error) {
console.log("CREATE USER ERROR", error);
throw error;
} finally {
}
};
@ -25,5 +26,5 @@ const fetchUserStats = async (userId: number) => { @@ -25,5 +26,5 @@ const fetchUserStats = async (userId: number) => {
export const usersService = {
createUser,
fetchUserStats
fetchUserStats,
};

64
src/shared/helpers/api.helpers.ts

@ -1,28 +1,48 @@ @@ -1,28 +1,48 @@
export const convertToFormData = (form: Record<string, any>) => {
const formData = new FormData()
const formData = new FormData();
Object.keys(form).map(key => {
if (Array.isArray(form[key])) {
form[key].map((it: any, i: number) => {
if (typeof it == 'object') {
formData.append(`${key}[${i}]`, JSON.stringify(it))
} else formData.append(`${key}[${i}]`, it)
})
} else formData.append(key, form[key])
})
Object.keys(form).map((key) => {
if (Array.isArray(form[key])) {
form[key].map((it: any, i: number) => {
if (typeof it == "object") {
formData.append(`${key}[${i}]`, JSON.stringify(it));
} else formData.append(`${key}[${i}]`, it);
});
} else formData.append(key, form[key]);
});
return formData
}
return formData;
};
const appendToFormDate = (formData: FormData, obj: any, startKey?: string) => {
if (startKey === 'image') formData.append(startKey, obj)
else if (Array.isArray(obj)) {
obj.map((it: any, i: number) =>
appendToFormDate(formData, it, `${startKey}[${i}]`),
)
} else if (typeof obj === 'object') {
Object.keys(obj).map(key => {
formData.append(`${startKey}.${key}`, obj[key])
})
} else formData.append(startKey, obj)
if (startKey === "image") formData.append(startKey, obj);
else if (Array.isArray(obj)) {
obj.map((it: any, i: number) =>
appendToFormDate(formData, it, `${startKey}[${i}]`)
);
} else if (typeof obj === "object") {
Object.keys(obj).map((key) => {
formData.append(`${startKey}.${key}`, obj[key]);
});
} else formData.append(startKey, obj);
};
export function extractKeyFromResponse(error) {
return error?.response?.data?.key || null;
}
export function isHttpErrorEqual(error: any, key: string) {
try {
return extractKeyFromResponse(error) === key;
} catch (e) {
return false;
}
}
export function extractMetaFromException(error) {
try {
return error?.response?.data?.metadata || {};
} catch (e) {
return {};
}
}

Loading…
Cancel
Save