diff --git a/components/cycle-day/symptom-edit-view.js b/components/cycle-day/symptom-edit-view.js index 64090a4..679d6a2 100644 --- a/components/cycle-day/symptom-edit-view.js +++ b/components/cycle-day/symptom-edit-view.js @@ -25,7 +25,6 @@ const SymptomEditView = ({ date, onClose, symptom, symptomData }) => { const [shouldShowInfo, setShouldShowInfo] = useState(false) const getParsedData = () => JSON.parse(JSON.stringify(data)) const onPressLearnMore = () => setShouldShowInfo(!shouldShowInfo) - const onEditNote = (note) => { const parsedData = getParsedData() @@ -135,7 +134,7 @@ const SymptomEditView = ({ date, onClose, symptom, symptomData }) => { {group.title} onSelectTab(group, value)} /> diff --git a/components/helpers/cycle-day.js b/components/helpers/cycle-day.js index ce5cd68..7317aac 100644 --- a/components/helpers/cycle-day.js +++ b/components/helpers/cycle-day.js @@ -23,9 +23,17 @@ const noteDescription = labels.noteExplainer const painLabels = labels.pain.categories const sexLabels = labels.sex.categories const temperatureLabels = labels.temperature +const productLabels = labels.products.categories const minutes = ChronoUnit.MINUTES +const getOptionsFromCategories = (categories) => { + return Object.keys(categories).map((key, _) => ({ + label: categories[key], + value: key, // or index, depending on what you want to use as the value + })) +} + const isNumber = (value) => typeof value === 'number' export const shouldShow = (value) => (value !== null ? true : false) @@ -56,6 +64,13 @@ export const blank = { bleeding: { exclude: false, value: null, + pad: null, + tampon: null, + underwear: null, + cup: null, + softTampon: null, + none: null, + other: null, }, cervix: { exclude: false, @@ -125,7 +140,6 @@ export const symtomPage = { bleeding: { excludeText: labels.bleeding.exclude.explainer, note: null, - selectBoxGroups: null, selectTabGroups: [ { key: 'value', @@ -133,6 +147,13 @@ export const symtomPage = { title: labels.bleeding.heaviness.explainer, }, ], + selectBoxGroups: [ + { + key: 'products', + options: productLabels, + title: 'Product', + }, + ], }, cervix: { excludeText: cervixLabels.excludeExplainer, @@ -242,12 +263,12 @@ export const symtomPage = { export const save = { bleeding: (data, date, shouldDeleteData) => { - const { exclude, value } = data - const isDataEntered = isNumber(value) - const valuesToSave = - shouldDeleteData || !isDataEntered ? null : { value, exclude } + //const { exclude, value, products } = data + //const isDataEntered = isNumber(value) + //const valuesToSave = + // shouldDeleteData || !isDataEntered ? null : { value, exclude, products } - saveSymptom('bleeding', date, valuesToSave) + saveBoxSymptom(data, date, shouldDeleteData, 'bleeding') }, cervix: (data, date, shouldDeleteData) => { const { opening, firmness, position, exclude } = data @@ -325,10 +346,36 @@ const saveBoxSymptom = (data, date, shouldDeleteData, symptom) => { } const label = { - bleeding: ({ value, exclude }) => { - if (isNumber(value)) { - const bleedingLabel = bleedingLabels[value] - return exclude ? `(${bleedingLabel})` : bleedingLabel + bleeding: (bleeding) => { + bleeding = mapRealmObjToJsObj(bleeding) + console.log(bleeding) + const bleedingLabel = [] + if (bleeding && Object.values({ ...bleeding }).some((val) => val)) { + Object.keys(bleeding).forEach((key) => { + if (key == 'value') { + console.log(bleedingLabel) + bleedingLabel.push(bleedingLabels[bleeding[key]]) + } + if ( + bleeding[key] && + key !== 'other' && + key !== 'note' && + key != 'value' && + key != 'exclude' + ) { + console.log(bleedingLabel) + bleedingLabel.push(bleedingLabels[key] || productLabels[key]) + } + if (key === 'other' && bleeding.other) { + let label = productLabels[key] + if (bleeding.note) { + label = `${label} (${bleeding.note})` + } + console.log(bleedingLabel) + bleedingLabel.push(label) + } + }) + return bleedingLabel.join(', ') } }, temperature: ({ value, time, exclude }) => { diff --git a/db/schemas/5.js b/db/schemas/5.js new file mode 100644 index 0000000..6d548b8 --- /dev/null +++ b/db/schemas/5.js @@ -0,0 +1,192 @@ +const TemperatureSchema = { + name: 'Temperature', + properties: { + value: 'double', + exclude: 'bool', + time: { + type: 'string', + optional: true, + }, + note: { + type: 'string', + optional: true, + }, + }, +} + +const BleedingSchema = { + name: 'Bleeding', + properties: { + value: 'int', + exclude: 'bool', + pad: { type: 'bool', optional: true }, + tampon: { type: 'bool', optional: true }, + underwear: { type: 'bool', optional: true }, + cup: { type: 'bool', optional: true }, + softTampon: { type: 'bool', optional: true }, + none: { type: 'bool', optional: true }, + other: { type: 'bool', optional: true }, + }, +} + +const MucusSchema = { + name: 'Mucus', + properties: { + feeling: { type: 'int', optional: true }, + texture: { type: 'int', optional: true }, + value: { type: 'int', optional: true }, + exclude: 'bool', + }, +} + +const CervixSchema = { + name: 'Cervix', + properties: { + opening: { type: 'int', optional: true }, + firmness: { type: 'int', optional: true }, + position: { type: 'int', optional: true }, + exclude: 'bool', + }, +} + +const NoteSchema = { + name: 'Note', + properties: { + value: 'string', + }, +} + +const DesireSchema = { + name: 'Desire', + properties: { + value: 'int', + }, +} + +const SexSchema = { + name: 'Sex', + properties: { + solo: { type: 'bool', optional: true }, + partner: { type: 'bool', optional: true }, + condom: { type: 'bool', optional: true }, + pill: { type: 'bool', optional: true }, + iud: { type: 'bool', optional: true }, + patch: { type: 'bool', optional: true }, + ring: { type: 'bool', optional: true }, + implant: { type: 'bool', optional: true }, + diaphragm: { type: 'bool', optional: true }, + none: { type: 'bool', optional: true }, + other: { type: 'bool', optional: true }, + note: { type: 'string', optional: true }, + }, +} + +const PainSchema = { + name: 'Pain', + properties: { + cramps: { type: 'bool', optional: true }, + ovulationPain: { type: 'bool', optional: true }, + headache: { type: 'bool', optional: true }, + backache: { type: 'bool', optional: true }, + nausea: { type: 'bool', optional: true }, + tenderBreasts: { type: 'bool', optional: true }, + migraine: { type: 'bool', optional: true }, + other: { type: 'bool', optional: true }, + note: { type: 'string', optional: true }, + }, +} + +const MoodSchema = { + name: 'Mood', + properties: { + happy: { type: 'bool', optional: true }, + sad: { type: 'bool', optional: true }, + stressed: { type: 'bool', optional: true }, + balanced: { type: 'bool', optional: true }, + fine: { type: 'bool', optional: true }, + anxious: { type: 'bool', optional: true }, + energetic: { type: 'bool', optional: true }, + fatigue: { type: 'bool', optional: true }, + angry: { type: 'bool', optional: true }, + other: { type: 'bool', optional: true }, + note: { type: 'string', optional: true }, + }, +} + +const CycleDaySchema = { + name: 'CycleDay', + primaryKey: 'date', + properties: { + date: 'string', + temperature: { + type: 'Temperature', + optional: true, + }, + isCycleStart: 'bool', + bleeding: { + type: 'Bleeding', + optional: true, + }, + mucus: { + type: 'Mucus', + optional: true, + }, + cervix: { + type: 'Cervix', + optional: true, + }, + note: { + type: 'Note', + optional: true, + }, + desire: { + type: 'Desire', + optional: true, + }, + sex: { + type: 'Sex', + optional: true, + }, + pain: { + type: 'Pain', + optional: true, + }, + mood: { + type: 'Mood', + optional: true, + }, + }, +} + +export default { + schema: [ + CycleDaySchema, + TemperatureSchema, + BleedingSchema, + MucusSchema, + CervixSchema, + NoteSchema, + DesireSchema, + SexSchema, + PainSchema, + MoodSchema, + ], + schemaVersion: 5, + migration: (oldRealm, newRealm) => { + if (oldRealm.schemaVersion < 5) { + const oldObjects = oldRealm.objects('Bleeding') + const newObjects = newRealm.objects('Bleeding') + + // loop through all objects and assign a default value for new properties + for (let i = 0; i < oldObjects.length; i++) { + newObjects[i].pad = false + newObjects[i].tampon = false + newObjects[i].underwear = false + newObjects[i].cup = false + newObjects[i].softTampon = false + newObjects[i].none = false + newObjects[i].other = false + } + } + }, +} diff --git a/db/schemas/index.js b/db/schemas/index.js index 4530908..871f8e1 100644 --- a/db/schemas/index.js +++ b/db/schemas/index.js @@ -3,5 +3,6 @@ import schema1 from './1.js' import schema2 from './2.js' import schema3 from './3.js' import schema4 from './4.js' +import schema5 from './5.js' -export default [schema0, schema1, schema2, schema3, schema4] \ No newline at end of file +export default [schema0, schema1, schema2, schema3, schema4, schema5] diff --git a/i18n/en/cycle-day.js b/i18n/en/cycle-day.js index 5d8da32..490149c 100644 --- a/i18n/en/cycle-day.js +++ b/i18n/en/cycle-day.js @@ -4,70 +4,87 @@ export const intensity = ['low', 'medium', 'high'] export const bleeding = { labels: ['spotting', 'light', 'medium', 'heavy'], heaviness: { - header: "Heaviness", - explainer: "How heavy is the bleeding?", + header: 'Heaviness', + explainer: 'How heavy is the bleeding?', }, exclude: { - header: "Exclude", - explainer: "You can exclude this value if it's not menstrual bleeding" - } + header: 'Exclude', + explainer: "You can exclude this value if it's not menstrual bleeding", + }, +} + +export const products = { + categories: { + pad: 'pad', + tampon: 'tampon', + underwear: 'underwear', + cup: 'cup', + softTampon: 'soft tampon', + none: 'none', + other: 'other', + }, + header: 'period products', + explainer: 'Did you use period products?', } export const cervix = { subcategories: { opening: 'opening', firmness: 'firmness', - position: 'position' + position: 'position', }, opening: { categories: ['closed', 'medium', 'open'], - explainer: 'Is your cervix open or closed?' + explainer: 'Is your cervix open or closed?', }, firmness: { categories: ['hard', 'soft'], - explainer: "When it's hard, it might feel like the tip of your nose" + explainer: "When it's hard, it might feel like the tip of your nose", }, position: { categories: ['low', 'medium', 'high'], - explainer: 'How high up in the vagina is the cervix?' + explainer: 'How high up in the vagina is the cervix?', }, - excludeExplainer: "You can exclude this value if you don't want to use it for fertility detection.", - actionHint: 'Choose values for at least "Opening" and "Firmness" to save.' + excludeExplainer: + "You can exclude this value if you don't want to use it for fertility detection.", + actionHint: 'Choose values for at least "Opening" and "Firmness" to save.', } export const mucus = { subcategories: { feeling: 'feeling', - texture: 'texture' + texture: 'texture', }, feeling: { categories: ['dry', 'nothing', 'wet', 'slippery'], - explainer: 'What does your vaginal entrance feel like?' + explainer: 'What does your vaginal entrance feel like?', }, texture: { categories: ['nothing', 'creamy', 'egg white'], - explainer: "Looking at and touching your cervical mucus, which describes it best?" + explainer: + 'Looking at and touching your cervical mucus, which describes it best?', }, - excludeExplainer: "You can exclude this value if you don't want to use it for fertility detection", - actionHint: 'Choose values for both "Feeling" and "Texture" to save.' + excludeExplainer: + "You can exclude this value if you don't want to use it for fertility detection", + actionHint: 'Choose values for both "Feeling" and "Texture" to save.', } export const desire = { header: 'Intensity', - explainer: 'How would you rate your sexual desire?' + explainer: 'How would you rate your sexual desire?', } export const sex = { - categories:{ + categories: { solo: 'solo', partner: 'partner', }, - header: "Activity", + header: 'Activity', explainer: 'Were you sexually active today?', } export const contraceptives = { - categories:{ + categories: { condom: 'condom', pill: 'pill', iud: 'iud', @@ -78,8 +95,8 @@ export const contraceptives = { none: 'none', other: 'other', }, - header: "Contraceptives", - explainer: 'Did you use contraceptives?' + header: 'Contraceptives', + explainer: 'Did you use contraceptives?', } export const pain = { @@ -91,9 +108,9 @@ export const pain = { nausea: 'nausea', tenderBreasts: 'tender breasts', migraine: 'migraine', - other: 'other' + other: 'other', }, - explainer: 'How did your body feel today?' + explainer: 'How did your body feel today?', } export const mood = { @@ -107,37 +124,42 @@ export const mood = { energetic: 'energetic', fatigue: 'fatigue', angry: 'angry', - other: 'other' + other: 'other', }, - explainer: 'How did you feel today?' + explainer: 'How did you feel today?', } export const temperature = { // disabled temporarily, TODO https://gitlab.com/bloodyhealth/drip/-/issues/545 */} // outOfRangeWarning: 'This temperature value is out of the current range for the temperature chart. You can change the range in the settings.', - outOfRangeWarning: 'This temperature value is too high or low to be shown on the temperature chart.', - outOfAbsoluteRangeWarning: 'This temperature value is too high or low to be shown on the temperature chart.', + outOfRangeWarning: + 'This temperature value is too high or low to be shown on the temperature chart.', + outOfAbsoluteRangeWarning: + 'This temperature value is too high or low to be shown on the temperature chart.', saveAnyway: 'Save anyway', temperature: { - header: "Temperature", - explainer: 'Take your temperature right after waking up, before getting out of bed' + header: 'Temperature', + explainer: + 'Take your temperature right after waking up, before getting out of bed', }, - time: "Time", + time: 'Time', note: { - header: "Note", - explainer: 'Is there anything that could have influenced this value, such as bad sleep or alcohol consumption?' + header: 'Note', + explainer: + 'Is there anything that could have influenced this value, such as bad sleep or alcohol consumption?', }, exclude: { - header: "Exclude", - explainer: "You can exclude this value if you don't want to use it for fertility detection" - } + header: 'Exclude', + explainer: + "You can exclude this value if you don't want to use it for fertility detection", + }, } -export const noteExplainer = "Anything you want to add for the day?" +export const noteExplainer = 'Anything you want to add for the day?' export const general = { - cycleDayNumber: "Cycle day ", - today: "Today" + cycleDayNumber: 'Cycle day ', + today: 'Today', } export const sharedDialogs = { @@ -147,5 +169,5 @@ export const sharedDialogs = { reallyDeleteData: 'Yes, I am sure', save: 'Save', delete: 'Delete', - disabledInfo: 'There is some data missing' + disabledInfo: 'There is some data missing', }