UNPKG

react-native-healthkit-bridge

Version:

A comprehensive React Native bridge for Apple HealthKit with TypeScript support, advanced authorization, and flexible data queries

341 lines (340 loc) 13.7 kB
import { CategoryTypeIdentifier } from '../types/healthkit.types'; import { HealthKitBridge } from '../core/HealthKitBridge'; /** * Example usage for women's health data * * This example shows how to access and manage data related to: * - Menstrual cycle * - Pregnancy * - Lactation * - Contraception * - Fertility */ export class WomensHealthTracker { constructor() { this.bridge = new HealthKitBridge(); } /** * Request authorization for women's health data */ async requestWomensHealthAuthorization() { try { const isAuthorized = await this.bridge.requestReadAuthorization([ // Menstrual cycle data CategoryTypeIdentifier.MenstrualFlow, CategoryTypeIdentifier.IntermenstrualBleeding, CategoryTypeIdentifier.CervicalMucusQuality, CategoryTypeIdentifier.OvulationTestResult, // Pregnancy and lactation data CategoryTypeIdentifier.Pregnancy, CategoryTypeIdentifier.Lactation, // Contraception data CategoryTypeIdentifier.Contraceptive, // Related data (symptoms, etc.) CategoryTypeIdentifier.SexualActivity, CategoryTypeIdentifier.PelvicPain, CategoryTypeIdentifier.VaginalDryness, CategoryTypeIdentifier.HotFlashes, CategoryTypeIdentifier.NightSweats ]); if (isAuthorized) { console.log('✅ Authorization for women\'s health data granted'); return true; } else { console.log('❌ Authorization for women\'s health data denied'); return false; } } catch (error) { console.error('Error requesting authorization:', error); return false; } } /** * Get menstrual cycle data */ async getMenstrualCycleData(days = 90) { try { const [menstrualFlow, intermenstrualBleeding, cervicalMucus] = await Promise.all([ this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.MenstrualFlow, days), this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.IntermenstrualBleeding, days), this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.CervicalMucusQuality, days) ]); return { menstrualFlow, intermenstrualBleeding, cervicalMucus, cycleLength: this.calculateCycleLength(menstrualFlow), fertileWindow: this.calculateFertileWindow(menstrualFlow, cervicalMucus) }; } catch (error) { console.error('Error getting menstrual cycle data:', error); return null; } } /** * Get fertility data */ async getFertilityData(days = 30) { try { const [ovulationTests, cervicalMucus] = await Promise.all([ this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.OvulationTestResult, days), this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.CervicalMucusQuality, days) ]); return { ovulationTests, cervicalMucus, ovulationPrediction: this.predictOvulation(ovulationTests, cervicalMucus) }; } catch (error) { console.error('Error getting fertility data:', error); return null; } } /** * Get pregnancy data */ async getPregnancyData(days = 365) { var _a; try { const pregnancyData = await this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.Pregnancy, days); return { pregnancyData, isPregnant: pregnancyData.length > 0 && ((_a = pregnancyData[pregnancyData.length - 1]) === null || _a === void 0 ? void 0 : _a.value) === 1, pregnancyDuration: this.calculatePregnancyDuration(pregnancyData) }; } catch (error) { console.error('Error getting pregnancy data:', error); return null; } } /** * Get lactation data */ async getLactationData(days = 365) { var _a; try { const lactationData = await this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.Lactation, days); return { lactationData, isLactating: lactationData.length > 0 && ((_a = lactationData[lactationData.length - 1]) === null || _a === void 0 ? void 0 : _a.value) === 1, lactationDuration: this.calculateLactationDuration(lactationData) }; } catch (error) { console.error('Error getting lactation data:', error); return null; } } /** * Get contraception data */ async getContraceptionData(days = 365) { var _a; try { const contraceptionData = await this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.Contraceptive, days); return { contraceptionData, isUsingContraception: contraceptionData.length > 0 && ((_a = contraceptionData[contraceptionData.length - 1]) === null || _a === void 0 ? void 0 : _a.value) === 1, contraceptionMethod: this.getContraceptionMethod(contraceptionData) }; } catch (error) { console.error('Error getting contraception data:', error); return null; } } /** * Get women's health related symptoms */ async getWomensHealthSymptoms(days = 30) { try { const [pelvicPain, vaginalDryness, hotFlashes, nightSweats] = await Promise.all([ this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.PelvicPain, days), this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.VaginalDryness, days), this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.HotFlashes, days), this.bridge.getCategorySamplesForDays(CategoryTypeIdentifier.NightSweats, days) ]); return { pelvicPain, vaginalDryness, hotFlashes, nightSweats, symptomSummary: this.analyzeSymptoms({ pelvicPain, vaginalDryness, hotFlashes, nightSweats }) }; } catch (error) { console.error('Error getting symptoms:', error); return null; } } /** * Complete women's health dashboard */ async getWomensHealthDashboard() { try { const [cycleData, fertilityData, pregnancyData, lactationData, contraceptionData, symptoms] = await Promise.all([ this.getMenstrualCycleData(90), this.getFertilityData(30), this.getPregnancyData(365), this.getLactationData(365), this.getContraceptionData(365), this.getWomensHealthSymptoms(30) ]); return { cycle: cycleData, fertility: fertilityData, pregnancy: pregnancyData, lactation: lactationData, contraception: contraceptionData, symptoms, summary: this.generateHealthSummary({ cycleData, fertilityData, pregnancyData, lactationData, contraceptionData, symptoms }) }; } catch (error) { console.error('Error generating dashboard:', error); return null; } } // Helper methods for data analysis calculateCycleLength(menstrualFlow) { if (menstrualFlow.length < 2) return null; // Logic to calculate cycle length // Specific implementation depends on returned values return 28; // Example } calculateFertileWindow(menstrualFlow, cervicalMucus) { // Logic to calculate fertile window return { startDate: new Date().toISOString(), endDate: new Date().toISOString(), probability: 0.8 }; } predictOvulation(ovulationTests, cervicalMucus) { // Logic to predict ovulation return { predictedDate: new Date().toISOString(), confidence: 0.9 }; } calculatePregnancyDuration(pregnancyData) { if (pregnancyData.length === 0) return null; // Logic to calculate pregnancy duration return 280; // Example in days } calculateLactationDuration(lactationData) { if (lactationData.length === 0) return null; // Logic to calculate lactation duration return 180; // Example in days } getContraceptionMethod(contraceptionData) { if (contraceptionData.length === 0) return 'None'; // Logic to determine contraception method return 'Pill'; // Example } analyzeSymptoms(symptoms) { return { totalSymptoms: Object.values(symptoms).reduce((acc, val) => acc.concat(val), []).length, mostCommon: 'PelvicPain', severity: 'Moderate' }; } generateHealthSummary(data) { var _a, _b, _c, _d, _e, _f, _g, _h; return { cycleRegular: ((_a = data.cycleData) === null || _a === void 0 ? void 0 : _a.cycleLength) === 28, fertile: ((_c = (_b = data.fertilityData) === null || _b === void 0 ? void 0 : _b.ovulationPrediction) === null || _c === void 0 ? void 0 : _c.confidence) > 0.7, pregnant: (_d = data.pregnancyData) === null || _d === void 0 ? void 0 : _d.isPregnant, lactating: (_e = data.lactationData) === null || _e === void 0 ? void 0 : _e.isLactating, usingContraception: (_f = data.contraceptionData) === null || _f === void 0 ? void 0 : _f.isUsingContraception, hasSymptoms: ((_h = (_g = data.symptoms) === null || _g === void 0 ? void 0 : _g.symptomSummary) === null || _h === void 0 ? void 0 : _h.totalSymptoms) > 0 }; } } /** * Practical usage example */ export async function womensHealthExample() { var _a, _b, _c, _d, _e; const tracker = new WomensHealthTracker(); // 1. Request authorization const isAuthorized = await tracker.requestWomensHealthAuthorization(); if (!isAuthorized) { console.log('❌ Could not obtain authorization'); return; } // 2. Get complete dashboard const dashboard = await tracker.getWomensHealthDashboard(); if (!dashboard) { console.log('❌ Error getting data'); return; } // 3. Show results console.log('📊 Women\'s Health Dashboard:'); console.log('🩸 Cycle:', dashboard.cycle ? 'Data available' : 'No data'); console.log('🥚 Fertility:', dashboard.fertility ? 'Data available' : 'No data'); console.log('🤱 Pregnancy:', ((_a = dashboard.pregnancy) === null || _a === void 0 ? void 0 : _a.isPregnant) ? 'Yes' : 'No'); console.log('🍼 Lactation:', ((_b = dashboard.lactation) === null || _b === void 0 ? void 0 : _b.isLactating) ? 'Yes' : 'No'); console.log('💊 Contraception:', ((_c = dashboard.contraception) === null || _c === void 0 ? void 0 : _c.isUsingContraception) ? 'Yes' : 'No'); console.log('😷 Symptoms:', ((_e = (_d = dashboard.symptoms) === null || _d === void 0 ? void 0 : _d.symptomSummary) === null || _e === void 0 ? void 0 : _e.totalSymptoms) || 0); // 4. Health summary console.log('\n📋 Health Summary:'); console.log('Regular Cycle:', dashboard.summary.cycleRegular ? '✅' : '❌'); console.log('Fertile Period:', dashboard.summary.fertile ? '✅' : '❌'); console.log('Pregnancy:', dashboard.summary.pregnant ? '✅' : '❌'); console.log('Lactation:', dashboard.summary.lactating ? '✅' : '❌'); console.log('Contraception:', dashboard.summary.usingContraception ? '✅' : '❌'); console.log('Symptoms:', dashboard.summary.hasSymptoms ? '⚠️' : '✅'); } /** * Available data types for women's health: * * 🩸 MENSTRUAL CYCLE: * - CategoryTypeIdentifier.MenstrualFlow (Menstrual flow) * - CategoryTypeIdentifier.IntermenstrualBleeding (Intermenstrual bleeding) * - CategoryTypeIdentifier.CervicalMucusQuality (Cervical mucus quality) * * 🥚 FERTILITY: * - CategoryTypeIdentifier.OvulationTestResult (Ovulation test result) * - CategoryTypeIdentifier.SexualActivity (Sexual activity) * * 🤱 PREGNANCY AND LACTATION: * - CategoryTypeIdentifier.Pregnancy (Pregnancy) * - CategoryTypeIdentifier.Lactation (Lactation) * * 💊 CONTRACEPTION: * - CategoryTypeIdentifier.Contraceptive (Contraceptive) * * 😷 RELATED SYMPTOMS: * - CategoryTypeIdentifier.PelvicPain (Pelvic pain) * - CategoryTypeIdentifier.VaginalDryness (Vaginal dryness) * - CategoryTypeIdentifier.HotFlashes (Hot flashes) * - CategoryTypeIdentifier.NightSweats (Night sweats) * * 📊 ADDITIONAL DATA: * - CategoryTypeIdentifier.Headache (Headache) * - CategoryTypeIdentifier.Fatigue (Fatigue) * - CategoryTypeIdentifier.MoodChanges (Mood changes) * - CategoryTypeIdentifier.AppetiteChanges (Appetite changes) */