canina/frontend/application/lib/petCompatibility.ts
parsa aghaei 30fb8f3e83
Some checks failed
Deploy Canina / deploy (push) Successful in 2m5s
E2E Playwright Tests / Run Full E2E & Security Suites (push) Failing after 0s
fix(frontend): enhance species badges, smart symptom matching, and sync charity total
2026-09-05 16:37:35 +03:30

86 lines
3.6 KiB
TypeScript

export function isSuitableForDog(suitableFor?: string): boolean {
if (!suitableFor) return true;
const s = suitableFor.trim().toLowerCase();
return s === "سگ" || s.includes("سگ") || s.includes("هر دو") || s.includes("مشترک") || s.includes("both") || s.includes("dog");
}
export function isSuitableForCat(suitableFor?: string): boolean {
if (!suitableFor) return true;
const s = suitableFor.trim().toLowerCase();
return s === "گربه" || s.includes("گربه") || s.includes("هر دو") || s.includes("مشترک") || s.includes("both") || s.includes("cat");
}
export function isSuitableForBoth(suitableFor?: string): boolean {
if (!suitableFor) return true;
const s = suitableFor.trim().toLowerCase();
if (s.includes("هر دو") || s.includes("مشترک") || s.includes("both")) return true;
return isSuitableForDog(s) && isSuitableForCat(s);
}
export function isSpeciesCompatible(suitableFor: string | undefined, petType: string | undefined): boolean {
if (!petType) return true;
const isDog = petType.includes("سگ") || petType.toLowerCase().includes("dog");
const isCat = petType.includes("گربه") || petType.toLowerCase().includes("cat");
if (isSuitableForBoth(suitableFor)) return true;
if (isDog) return isSuitableForDog(suitableFor);
if (isCat) return isSuitableForCat(suitableFor);
return true;
}
/**
* Partial / fuzzy matching between pet medical conditions and product symptoms
*/
export function matchesMedicalSymptom(
petConditions: string[] | undefined,
productSymptoms: string[] | undefined,
productBenefits?: string
): string | null {
if (!petConditions || petConditions.length === 0) return null;
// Filter out negative conditions like "هیچ‌کدام"
const validConditions = petConditions.filter(
(c) => c && !c.includes("هیچ‌کدام") && !c.includes("سلامت کامل")
);
if (validConditions.length === 0) return null;
const symptoms = (productSymptoms || []).filter(Boolean);
const benefitsText = (productBenefits || "").toLowerCase();
for (const condition of validConditions) {
const condNorm = condition.trim().toLowerCase();
// Check direct symptom list
for (const symptom of symptoms) {
const sympNorm = symptom.trim().toLowerCase();
if (
condNorm.includes(sympNorm) ||
sympNorm.includes(condNorm) ||
// Check core keywords
(condNorm.includes("مفصل") && sympNorm.includes("مفصل")) ||
(condNorm.includes("گوارش") && (sympNorm.includes("گوارش") || sympNorm.includes("اسهال") || sympNorm.includes("غذا"))) ||
(condNorm.includes("مو") && (sympNorm.includes("مو") || sympNorm.includes("پوست") || sympNorm.includes("خارش"))) ||
(condNorm.includes("اشتها") && sympNorm.includes("اشتها")) ||
(condNorm.includes("باردار") && sympNorm.includes("باردار")) ||
(condNorm.includes("زایمان") && (sympNorm.includes("شیر") || sympNorm.includes("توله") || sympNorm.includes("زایمان")))
) {
return condition;
}
}
// Also check benefits text if available
if (benefitsText) {
if (
(condNorm.includes("مفصل") && benefitsText.includes("مفصل")) ||
(condNorm.includes("گوارش") && benefitsText.includes("گوارش")) ||
(condNorm.includes("مو") && (benefitsText.includes("ریزش") || benefitsText.includes("پوست"))) ||
(condNorm.includes("اشتها") && benefitsText.includes("اشتها"))
) {
return condition;
}
}
}
return null;
}