298 lines
10 KiB
JavaScript
298 lines
10 KiB
JavaScript
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,
|
|
};
|
|
}; |