85 lines
3.1 KiB
TypeScript
85 lines
3.1 KiB
TypeScript
|
|
|
|||
|
|
import React from 'react';
|
|||
|
|
import { Building } from '../../types';
|
|||
|
|
import { PassportView } from './PassportView';
|
|||
|
|
import { ResidentsView } from './ResidentsView';
|
|||
|
|
|
|||
|
|
export const Passport: React.FC<{
|
|||
|
|
building: Building,
|
|||
|
|
isEditing: boolean,
|
|||
|
|
setBuilding: React.Dispatch<React.SetStateAction<Building>>
|
|||
|
|
}> = ({ building, isEditing, setBuilding }) => {
|
|||
|
|
|
|||
|
|
const updatePassport = (section: keyof Building['passport'], field: string, value: any) => {
|
|||
|
|
setBuilding(prev => {
|
|||
|
|
try {
|
|||
|
|
const sectionData = prev.passport[section] as any;
|
|||
|
|
|
|||
|
|
// Если это массив (lifts, meters), заменяем весь массив
|
|||
|
|
if (Array.isArray(sectionData)) {
|
|||
|
|
return {
|
|||
|
|
...prev,
|
|||
|
|
passport: {
|
|||
|
|
...prev.passport,
|
|||
|
|
[section]: value
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Иначе обновляем поле в объекте
|
|||
|
|
// Проверяем, что sectionData существует, иначе создаем пустой объект
|
|||
|
|
const currentSectionData = sectionData || {};
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
...prev,
|
|||
|
|
passport: {
|
|||
|
|
...prev.passport,
|
|||
|
|
[section]: {
|
|||
|
|
...currentSectionData,
|
|||
|
|
[field]: value
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('Error in updatePassport:', error, { section, field, value });
|
|||
|
|
return prev; // Возвращаем предыдущее состояние при ошибке
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const updatePassportArray = (section: 'meters' | 'lifts', index: number, field: string, value: any) => {
|
|||
|
|
setBuilding(prev => {
|
|||
|
|
const newArray = [...prev.passport[section]];
|
|||
|
|
// @ts-ignore
|
|||
|
|
newArray[index] = { ...newArray[index], [field]: value };
|
|||
|
|
return {
|
|||
|
|
...prev,
|
|||
|
|
passport: {
|
|||
|
|
...prev.passport,
|
|||
|
|
[section]: newArray
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<div className="space-y-8 animate-fade-in">
|
|||
|
|
{/* Technical Passport Sheet */}
|
|||
|
|
<PassportView
|
|||
|
|
building={building}
|
|||
|
|
isEditing={isEditing}
|
|||
|
|
updatePassport={updatePassport}
|
|||
|
|
updatePassportArray={updatePassportArray}
|
|||
|
|
/>
|
|||
|
|
|
|||
|
|
{/* Resident Asset Sheet (Merged into Passport as per 8-tab logic) */}
|
|||
|
|
<div className="pt-6 border-t border-slate-200">
|
|||
|
|
<h3 className="font-black text-slate-800 text-[10px] uppercase tracking-[0.2em] mb-6 px-1">
|
|||
|
|
Совет дома и Контакты
|
|||
|
|
</h3>
|
|||
|
|
<ResidentsView building={building} setBuilding={setBuilding} isEditing={isEditing} />
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
);
|
|||
|
|
};
|