269 lines
11 KiB
TypeScript
269 lines
11 KiB
TypeScript
import React from 'react';
|
||
import './BehavioralProfile.css';
|
||
|
||
interface BehavioralProfileProps {
|
||
diagnosis_type?: string[];
|
||
has_transport?: string;
|
||
age_years?: number;
|
||
reason?: string;
|
||
}
|
||
|
||
interface ProfileCardData {
|
||
id: string;
|
||
title: string;
|
||
color: string;
|
||
recommendations: string[];
|
||
zoneModifiers: { zone: string; multiplier: number }[];
|
||
}
|
||
|
||
const BehavioralProfile: React.FC<BehavioralProfileProps> = ({
|
||
diagnosis_type = [],
|
||
has_transport,
|
||
age_years,
|
||
reason
|
||
}) => {
|
||
const getActiveProfiles = (): ProfileCardData[] => {
|
||
const profiles: ProfileCardData[] = [];
|
||
|
||
// РАС (Расстройство аутистического спектра)
|
||
if (diagnosis_type.includes('РАС') || diagnosis_type.includes('аутизм')) {
|
||
profiles.push({
|
||
id: 'ras',
|
||
title: 'РАС (Расстройство аутистического спектра)',
|
||
color: 'red',
|
||
recommendations: [
|
||
'Не кричать имя — может спрятаться от громких звуков',
|
||
'Приоритет: водоёмы, тихие места, укрытия',
|
||
'Перекрыть доступ к воде (пруды, реки, колодцы)',
|
||
'Проверить железнодорожные пути и технические помещения',
|
||
'Искать в радиусе до 5 км, часто движется по прямой'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Водоём', multiplier: 3.0 },
|
||
{ zone: 'Укрытие', multiplier: 2.0 },
|
||
{ zone: 'Населённый пункт', multiplier: 0.4 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Эпилепсия
|
||
if (diagnosis_type.includes('эпилепсия')) {
|
||
profiles.push({
|
||
id: 'epilepsy',
|
||
title: 'Эпилепсия',
|
||
color: 'orange',
|
||
recommendations: [
|
||
'Искать близко к точке потери — радиус до 1 км',
|
||
'Проверить канавы, овраги, низины (риск падения)',
|
||
'Приоритет: водоёмы и опасные участки',
|
||
'Срочная медицинская помощь при обнаружении',
|
||
'Проверить укрытия (мог укрыться после приступа)'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Водоём', multiplier: 3.5 },
|
||
{ zone: 'Укрытие', multiplier: 2.5 },
|
||
{ zone: 'Радиус поиска', multiplier: 0.6 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// СДВГ (Синдром дефицита внимания и гиперактивности)
|
||
if (diagnosis_type.includes('СДВГ') || diagnosis_type.includes('гиперактивность')) {
|
||
profiles.push({
|
||
id: 'adhd',
|
||
title: 'СДВГ (Гиперактивность)',
|
||
color: 'yellow',
|
||
recommendations: [
|
||
'Расширенный радиус поиска — может уйти далеко',
|
||
'Приоритет: дороги, тропы, интересные объекты',
|
||
'Проверить игровые площадки, стройки, заброшенные здания',
|
||
'Может отвлечься и изменить направление',
|
||
'Искать вдоль дорог и троп'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Дороги', multiplier: 1.6 },
|
||
{ zone: 'Радиус поиска', multiplier: 1.4 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Деменция
|
||
if (diagnosis_type.includes('деменция') || diagnosis_type.includes('Альцгеймер')) {
|
||
profiles.push({
|
||
id: 'dementia',
|
||
title: 'Деменция / Альцгеймер',
|
||
color: 'purple',
|
||
recommendations: [
|
||
'Искать в радиусе до 2 км от дома',
|
||
'Проверить знакомые места (бывший дом, работа)',
|
||
'Приоритет: дороги, тропы (идёт по привычному маршруту)',
|
||
'Может не откликаться на имя',
|
||
'Проверить водоёмы и опасные участки'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Дороги', multiplier: 1.8 },
|
||
{ zone: 'Исторические места', multiplier: 2.0 },
|
||
{ zone: 'Водоём', multiplier: 1.5 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Велосипед
|
||
if (has_transport === 'велосипед') {
|
||
profiles.push({
|
||
id: 'bicycle',
|
||
title: 'Транспорт: Велосипед',
|
||
color: 'blue',
|
||
recommendations: [
|
||
'Радиус поиска ×5 — может уехать на 10-25 км',
|
||
'Приоритет: дороги, велодорожки, тропы',
|
||
'Запросить записи с камер на дорогах',
|
||
'Проверить популярные велосипедные маршруты',
|
||
'Лес и бездорожье менее вероятны'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Радиус поиска', multiplier: 5.0 },
|
||
{ zone: 'Дороги', multiplier: 1.8 },
|
||
{ zone: 'Лес', multiplier: 0.8 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Автомобиль
|
||
if (has_transport === 'автомобиль' || has_transport === 'машина') {
|
||
profiles.push({
|
||
id: 'car',
|
||
title: 'Транспорт: Автомобиль',
|
||
color: 'blue',
|
||
recommendations: [
|
||
'Радиус поиска ×10 — может уехать на 50+ км',
|
||
'Запросить записи с камер ГИБДД и дорожных камер',
|
||
'Проверить заправки, парковки, придорожные кафе',
|
||
'Ориентация на дороги и трассы',
|
||
'Розыск по номеру автомобиля'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Радиус поиска', multiplier: 10.0 },
|
||
{ zone: 'Дороги', multiplier: 2.5 },
|
||
{ zone: 'Лес', multiplier: 0.3 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Подросток, ушедший из дома
|
||
if (age_years && age_years >= 13 && age_years <= 17 &&
|
||
(reason?.includes('ушёл из дома') || reason?.includes('конфликт'))) {
|
||
profiles.push({
|
||
id: 'runaway',
|
||
title: 'Подросток: Уход из дома',
|
||
color: 'gray',
|
||
recommendations: [
|
||
'Розыск через соцсети и друзей',
|
||
'Проверить дома друзей, торговые центры, вокзалы',
|
||
'Лес и удалённые места менее вероятны',
|
||
'Может иметь телефон — запросить геолокацию',
|
||
'Проверить популярные места встреч подростков'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Населённый пункт', multiplier: 2.0 },
|
||
{ zone: 'Лес', multiplier: 0.3 },
|
||
{ zone: 'Дороги', multiplier: 1.5 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Грибник
|
||
if (reason?.includes('грибы') || reason?.includes('грибник')) {
|
||
profiles.push({
|
||
id: 'mushroom',
|
||
title: 'Активность: Сбор грибов',
|
||
color: 'green',
|
||
recommendations: [
|
||
'Приоритет: лесные массивы, особенно смешанные леса',
|
||
'Радиус до 3 км от точки входа в лес',
|
||
'Проверить популярные грибные места',
|
||
'Может углубиться в лес, потеряв ориентацию',
|
||
'Искать вдоль просек и лесных дорог'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Лес', multiplier: 3.0 },
|
||
{ zone: 'Дороги', multiplier: 0.6 },
|
||
{ zone: 'Радиус поиска', multiplier: 1.2 }
|
||
]
|
||
});
|
||
}
|
||
|
||
// Охотник
|
||
if (reason?.includes('охота') || reason?.includes('охотник')) {
|
||
profiles.push({
|
||
id: 'hunter',
|
||
title: 'Активность: Охота',
|
||
color: 'green',
|
||
recommendations: [
|
||
'Радиус до 5-10 км — охотники перемещаются активно',
|
||
'Приоритет: лесные массивы, поля, болота',
|
||
'Проверить охотничьи вышки, избушки, кормушки',
|
||
'Может иметь оружие — соблюдать осторожность',
|
||
'Искать вдоль звериных троп и просек'
|
||
],
|
||
zoneModifiers: [
|
||
{ zone: 'Лес', multiplier: 2.5 },
|
||
{ zone: 'Радиус поиска', multiplier: 2.0 },
|
||
{ zone: 'Укрытие', multiplier: 1.5 }
|
||
]
|
||
});
|
||
}
|
||
|
||
return profiles;
|
||
};
|
||
|
||
const activeProfiles = getActiveProfiles();
|
||
|
||
if (activeProfiles.length === 0) {
|
||
return null;
|
||
}
|
||
|
||
return (
|
||
<div className="behavioral-profiles">
|
||
<h3 className="profiles-title">Поведенческие профили</h3>
|
||
<div className="profiles-grid">
|
||
{activeProfiles.map((profile) => (
|
||
<div
|
||
key={profile.id}
|
||
className={`profile-card profile-card-${profile.color}`}
|
||
>
|
||
<div className="profile-header">
|
||
<h4 className="profile-title">{profile.title}</h4>
|
||
</div>
|
||
|
||
<div className="profile-recommendations">
|
||
<h5>Рекомендации:</h5>
|
||
<ul className="recommendations-list">
|
||
{profile.recommendations.map((rec, idx) => (
|
||
<li key={idx} className={idx >= 2 ? 'mobile-hidden' : ''}>
|
||
{rec}
|
||
</li>
|
||
))}
|
||
</ul>
|
||
</div>
|
||
|
||
<div className="profile-modifiers">
|
||
<h5>Модификаторы зон:</h5>
|
||
<div className="modifiers-list">
|
||
{profile.zoneModifiers.map((mod, idx) => (
|
||
<div key={idx} className="modifier-item">
|
||
<span className="modifier-zone">{mod.zone}:</span>
|
||
<span className="modifier-value">×{mod.multiplier.toFixed(1)}</span>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default BehavioralProfile;
|