repair: brandDevice sparepart integration
This commit is contained in:
298
src/pages/master/brandDevice/hooks/useBrandDeviceLogic.jsx
Normal file
298
src/pages/master/brandDevice/hooks/useBrandDeviceLogic.jsx
Normal file
@@ -0,0 +1,298 @@
|
||||
import { useState } from 'react';
|
||||
import { NotifAlert, NotifOk } from '../../../../components/Global/ToastNotif';
|
||||
|
||||
export const useBrandDeviceLogic = (isEditMode = false, brandId = null) => {
|
||||
const [confirmLoading, setConfirmLoading] = useState(false);
|
||||
const [currentStep, setCurrentStep] = useState(0);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [errorCodes, setErrorCodes] = useState([]);
|
||||
const [pendingErrorCodes, setPendingErrorCodes] = useState([]);
|
||||
const [editingErrorCodeKey, setEditingErrorCodeKey] = useState(null);
|
||||
const [isErrorCodeFormReadOnly, setIsErrorCodeFormReadOnly] = useState(false);
|
||||
|
||||
const handleCancel = () => {
|
||||
};
|
||||
|
||||
const handleNextStep = async (validateForm, setFormData, currentFormData) => {
|
||||
try {
|
||||
const validatedFormData = await validateForm();
|
||||
|
||||
setFormData({
|
||||
brand_name: validatedFormData.brand_name,
|
||||
brand_type: validatedFormData.brand_type || '',
|
||||
brand_model: validatedFormData.brand_model || '',
|
||||
brand_manufacture: validatedFormData.brand_manufacture || '',
|
||||
is_active: validatedFormData.is_active,
|
||||
});
|
||||
|
||||
setCurrentStep(1);
|
||||
} catch (error) {
|
||||
NotifAlert({
|
||||
icon: 'warning',
|
||||
title: 'Perhatian',
|
||||
message: 'Harap isi semua kolom wajib untuk brand device!',
|
||||
});
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const handleFinish = async (
|
||||
formData,
|
||||
selectedSparepartIds,
|
||||
apiCall,
|
||||
successMessage,
|
||||
navigatePath
|
||||
) => {
|
||||
setConfirmLoading(true);
|
||||
try {
|
||||
const transformedErrorCodes = pendingErrorCodes.length > 0 ? pendingErrorCodes.map(ec => ({
|
||||
error_code: ec.error_code,
|
||||
error_code_name: ec.error_code_name,
|
||||
error_code_description: ec.error_code_description || '',
|
||||
error_code_color: ec.error_code_color || '#000000',
|
||||
path_icon: ec.path_icon || '',
|
||||
is_active: ec.status !== undefined ? ec.status : true,
|
||||
solution: (ec.solution || []).map(sol => ({
|
||||
solution_name: sol.solution_name,
|
||||
type_solution: sol.type_solution,
|
||||
text_solution: sol.text_solution || '',
|
||||
path_solution: sol.path_solution || '',
|
||||
is_active: sol.is_active
|
||||
}))
|
||||
})) : (isEditMode ? errorCodes.map(ec => ({
|
||||
error_code: ec.error_code,
|
||||
error_code_name: ec.error_code_name,
|
||||
error_code_description: ec.error_code_description || '',
|
||||
error_code_color: ec.error_code_color || '#000000',
|
||||
path_icon: ec.path_icon || '',
|
||||
is_active: ec.status !== undefined ? ec.status : true,
|
||||
solution: (ec.solution || []).map(sol => ({
|
||||
solution_name: sol.solution_name,
|
||||
type_solution: sol.type_solution,
|
||||
text_solution: sol.text_solution || '',
|
||||
path_solution: sol.path_solution || '',
|
||||
is_active: sol.is_active
|
||||
}))
|
||||
})) : []);
|
||||
|
||||
const brandData = {
|
||||
brand_name: formData.brand_name,
|
||||
brand_type: formData.brand_type || '',
|
||||
brand_model: formData.brand_model || '',
|
||||
brand_manufacture: formData.brand_manufacture || '',
|
||||
is_active: formData.is_active,
|
||||
spareparts: selectedSparepartIds,
|
||||
error_code: transformedErrorCodes,
|
||||
};
|
||||
|
||||
const response = await apiCall(brandId, brandData);
|
||||
|
||||
if (response && (response.statusCode === 200 || response.statusCode === 201)) {
|
||||
NotifOk({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
message: response.message || successMessage,
|
||||
});
|
||||
navigate(navigatePath);
|
||||
} else {
|
||||
NotifAlert({
|
||||
icon: 'error',
|
||||
title: 'Gagal',
|
||||
message: response?.message || 'Gagal menyimpan data.',
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
NotifAlert({
|
||||
icon: 'error',
|
||||
title: 'Gagal',
|
||||
message: error.message || 'Gagal menyimpan data. Silakan coba lagi.',
|
||||
});
|
||||
} finally {
|
||||
setConfirmLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleAddErrorCode = async (
|
||||
validateErrorCodeForm,
|
||||
getSolutionData,
|
||||
resetErrorCodeForm
|
||||
) => {
|
||||
try {
|
||||
const errorCodeValues = await validateErrorCodeForm();
|
||||
const solutionData = getSolutionData();
|
||||
|
||||
if (solutionData.length === 0) {
|
||||
NotifAlert({
|
||||
icon: 'warning',
|
||||
title: 'Perhatian',
|
||||
message: 'Setiap error code harus memiliki minimal 1 solution!',
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
const newErrorCode = {
|
||||
key: editingErrorCodeKey || `temp-${Date.now()}`,
|
||||
error_code: errorCodeValues.error_code,
|
||||
error_code_name: errorCodeValues.error_code_name,
|
||||
error_code_description: errorCodeValues.error_code_description,
|
||||
error_code_color: errorCodeValues.error_code_color || '#000000',
|
||||
path_icon: errorCodeValues.path_icon || '',
|
||||
is_active: errorCodeValues.status === undefined ? true : errorCodeValues.status,
|
||||
solution: solutionData,
|
||||
};
|
||||
|
||||
let updatedPendingErrorCodes;
|
||||
if (editingErrorCodeKey) {
|
||||
updatedPendingErrorCodes = pendingErrorCodes.map((item) => {
|
||||
if (item.key === editingErrorCodeKey) {
|
||||
return {
|
||||
...item,
|
||||
...newErrorCode,
|
||||
error_code_id: item.error_code_id || newErrorCode.error_code_id,
|
||||
};
|
||||
}
|
||||
return item;
|
||||
});
|
||||
NotifOk({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
message: 'Error code berhasil diupdate!',
|
||||
});
|
||||
} else {
|
||||
updatedPendingErrorCodes = [...pendingErrorCodes, newErrorCode];
|
||||
NotifOk({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
message: 'Error code berhasil ditambahkan!',
|
||||
});
|
||||
}
|
||||
|
||||
setPendingErrorCodes(updatedPendingErrorCodes);
|
||||
setErrorCodes(updatedPendingErrorCodes);
|
||||
|
||||
setTimeout(() => {
|
||||
resetErrorCodeForm();
|
||||
}, 100);
|
||||
return true;
|
||||
} catch (error) {
|
||||
NotifAlert({
|
||||
icon: 'warning',
|
||||
title: 'Perhatian',
|
||||
message: 'Harap isi semua kolom wajib (error code + minimal 1 solution)!',
|
||||
});
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const handleDeleteErrorCode = (key) => {
|
||||
if (errorCodes.length <= 1) {
|
||||
NotifAlert({
|
||||
icon: 'warning',
|
||||
title: 'Perhatian',
|
||||
message: 'Setiap brand harus memiliki minimal 1 error code!',
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
const updatedErrorCodes = errorCodes.filter((item) => item.key !== key);
|
||||
setErrorCodes(updatedErrorCodes);
|
||||
NotifOk({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
message: 'Error code berhasil dihapus!',
|
||||
});
|
||||
return true;
|
||||
};
|
||||
|
||||
const handleCreateNewErrorCode = (resetErrorCodeForm, resetSolutionFields) => {
|
||||
resetErrorCodeForm();
|
||||
resetSolutionFields();
|
||||
setIsErrorCodeFormReadOnly(false);
|
||||
setEditingErrorCodeKey(null);
|
||||
};
|
||||
|
||||
const handlePreviewErrorCode = (
|
||||
record,
|
||||
setErrorCodeIcon,
|
||||
setIsErrorCodeFormReadOnly,
|
||||
setEditingErrorCodeKey,
|
||||
setSolutionsForExistingRecord,
|
||||
resetSolutionFields,
|
||||
solutionForm
|
||||
) => {
|
||||
errorCodeForm.setFieldsValue({
|
||||
error_code: record.error_code,
|
||||
error_code_name: record.error_code_name,
|
||||
error_code_description: record.error_code_description,
|
||||
error_code_color: record.error_code_color,
|
||||
status: record.status,
|
||||
});
|
||||
setErrorCodeIcon(record.errorCodeIcon || null);
|
||||
setIsErrorCodeFormReadOnly(true);
|
||||
setEditingErrorCodeKey(record.key);
|
||||
|
||||
if (record.solution && record.solution.length > 0) {
|
||||
setSolutionsForExistingRecord(record.solution, solutionForm);
|
||||
} else {
|
||||
resetSolutionFields();
|
||||
}
|
||||
};
|
||||
|
||||
const handleEditErrorCode = (
|
||||
record,
|
||||
setErrorCodeIcon,
|
||||
setIsErrorCodeFormReadOnly,
|
||||
setEditingErrorCodeKey,
|
||||
setSolutionsForExistingRecord,
|
||||
resetSolutionFields,
|
||||
solutionForm
|
||||
) => {
|
||||
errorCodeForm.setFieldsValue({
|
||||
error_code: record.error_code,
|
||||
error_code_name: record.error_code_name,
|
||||
error_code_description: record.error_code_description,
|
||||
error_code_color: record.error_code_color,
|
||||
status: record.status,
|
||||
});
|
||||
setErrorCodeIcon(record.errorCodeIcon || null);
|
||||
setIsErrorCodeFormReadOnly(false);
|
||||
setEditingErrorCodeKey(record.key);
|
||||
|
||||
if (record.solution && record.solution.length > 0) {
|
||||
setSolutionsForExistingRecord(record.solution, solutionForm);
|
||||
}
|
||||
|
||||
const formElement = document.querySelector('.ant-form');
|
||||
if (formElement) {
|
||||
formElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
// State
|
||||
confirmLoading,
|
||||
setConfirmLoading,
|
||||
currentStep,
|
||||
setCurrentStep,
|
||||
loading,
|
||||
setLoading,
|
||||
errorCodes,
|
||||
setErrorCodes,
|
||||
pendingErrorCodes,
|
||||
setPendingErrorCodes,
|
||||
editingErrorCodeKey,
|
||||
setEditingErrorCodeKey,
|
||||
isErrorCodeFormReadOnly,
|
||||
setIsErrorCodeFormReadOnly,
|
||||
|
||||
// Handlers
|
||||
handleCancel,
|
||||
handleNextStep,
|
||||
handleFinish,
|
||||
handleAddErrorCode,
|
||||
handleDeleteErrorCode,
|
||||
handleCreateNewErrorCode,
|
||||
handlePreviewErrorCode,
|
||||
handleEditErrorCode,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user