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
JavaScript
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)
*/