From 090f4116d523199651a71ac4ad5f6dabfa718cfa Mon Sep 17 00:00:00 2001 From: Julia Friesel Date: Tue, 5 Jun 2018 16:37:06 +0200 Subject: [PATCH] Add edit bleeding and persist it. --- app.js | 6 +++++- bleeding.js | 52 +++++++++++++++++++++++++++++++++++++++++++++++ datepicker.js | 10 ++++----- day-view.js | 32 +++++++++++++++++++++++++++++ db.js | 43 ++++++++++++++++++++++++++++++++++++--- format.js | 5 +++++ package-lock.json | 6 +++--- 7 files changed, 141 insertions(+), 13 deletions(-) create mode 100644 bleeding.js create mode 100644 day-view.js create mode 100644 format.js diff --git a/app.js b/app.js index fc21bf2..cccd782 100644 --- a/app.js +++ b/app.js @@ -2,9 +2,13 @@ import { createStackNavigator } from 'react-navigation' import Home from './home' import TemperatureList from './list' import Datepicker from './datepicker' +import DayView from './day-view' +import Bleeding from './bleeding' export default createStackNavigator({ home: { screen: Home }, temperatureList: { screen: TemperatureList }, - datepicker: { screen: Datepicker } + datepicker: { screen: Datepicker }, + dayView: { screen: DayView }, + bleeding: { screen: Bleeding } }) \ No newline at end of file diff --git a/bleeding.js b/bleeding.js new file mode 100644 index 0000000..6175be5 --- /dev/null +++ b/bleeding.js @@ -0,0 +1,52 @@ +import React, { Component } from 'react' +import { + View, + Button, + Text, + Picker +} from 'react-native' +import styles from './styles' +import { saveBleeding } from './db' +import { formatDateForViewHeader } from './format' + +export default class Bleeding extends Component { + constructor(props) { + super(props) + this.state = { + cycleDay: props.navigation.state.params.cycleDay, + currentValue: null + } + } + + // TODO display cycle day + render() { + const navigate = this.props.navigation.navigate + const day = this.state.cycleDay + return ( + + {formatDateForViewHeader(day.date)} + { + this.setState({ currentValue: itemValue }) + }}> + + + + + + + + ) + } +} \ No newline at end of file diff --git a/datepicker.js b/datepicker.js index 2aee26d..df300ba 100644 --- a/datepicker.js +++ b/datepicker.js @@ -2,8 +2,8 @@ import React, { Component } from 'react' import { View, Button, DatePickerAndroid } from 'react-native' -import moment from 'moment' import * as styles from './styles' +import { getOrCreateCycleDay } from './db' export default class DatePickView extends Component { constructor(props) { @@ -15,12 +15,10 @@ export default class DatePickView extends Component { date: new Date() }) if (result.action !== DatePickerAndroid.dismissedAction) { + const date = new Date(result.year, result.month, result.day) + const cycleDay = getOrCreateCycleDay(date) const navigate = this.props.navigation.navigate - // continue here and actually make that view - navigate( - 'dayView', - { date: moment(new Date(result.year, result.month, result.day)) } - ) + navigate('dayView', { cycleDay }) } } diff --git a/day-view.js b/day-view.js new file mode 100644 index 0000000..3b74f20 --- /dev/null +++ b/day-view.js @@ -0,0 +1,32 @@ +import React, { Component } from 'react' +import { + View, + Button, + Text +} from 'react-native' +import styles from './styles' +import { formatDateForViewHeader } from './format' + +export default class DayView extends Component { + constructor(props) { + super(props) + this.state = { + cycleDay: props.navigation.state.params.cycleDay + } + } + + render() { + const navigate = this.props.navigation.navigate + const day = this.state.cycleDay + return ( + + {formatDateForViewHeader(day.date)} + {day.bleeding && day.bleeding.value} + + + ) + } +} \ No newline at end of file diff --git a/db.js b/db.js index a91c098..27cbc0c 100644 --- a/db.js +++ b/db.js @@ -1,8 +1,10 @@ import realm from 'realm' +import moment from 'moment' import { v4 as uuid } from 'uuid' let db let cycleDaysSortedbyTempValueView = [] +let cycleDaysSortedbyDate = [] const TemperatureSchema = { name: 'Temperature', @@ -12,6 +14,14 @@ const TemperatureSchema = { } } +const BleedingSchema = { + name: 'Bleeding', + properties: { + value: 'int', + exclude: 'bool' + } +} + const CycleDaySchema = { name: 'CycleDay', primaryKey: 'key', @@ -21,6 +31,10 @@ const CycleDaySchema = { temperature: { type: 'Temperature', optional: true + }, + bleeding: { + type: 'Bleeding', + optional: true } } } @@ -29,7 +43,8 @@ async function openDatabase() { db = await realm.open({ schema: [ CycleDaySchema, - TemperatureSchema + TemperatureSchema, + BleedingSchema ], // we only want this in dev mode deleteRealmIfMigrationNeeded: true @@ -37,9 +52,10 @@ async function openDatabase() { // just for testing purposes, the highest temperature will be topmost // because I was too layz to make a scroll view cycleDaysSortedbyTempValueView = db.objects('CycleDay').sorted('temperature.value', true) + cycleDaysSortedbyDate = db.objects('CycleDay').sorted('date', true) } -async function saveTemperature(date, temperature) { +function saveTemperature(date, temperature) { db.write(() => { const doc = { key: uuid(), @@ -50,8 +66,29 @@ async function saveTemperature(date, temperature) { }) } +function saveBleeding(cycleDay, bleeding) { + db.write(() => { + cycleDay.bleeding = bleeding + }) +} + +function getOrCreateCycleDay(date) { + let result = Array.from(cycleDaysSortedbyDate.filtered('date = $0', date))[0] + if (!result) { + db.write(() => { + result = db.create('CycleDay', { + key: uuid(), + date + }) + }) + } + return result +} + export { cycleDaysSortedbyTempValueView, openDatabase, - saveTemperature + saveTemperature, + saveBleeding, + getOrCreateCycleDay } \ No newline at end of file diff --git a/format.js b/format.js new file mode 100644 index 0000000..16e2f71 --- /dev/null +++ b/format.js @@ -0,0 +1,5 @@ +import moment from "moment" + +export function formatDateForViewHeader(date) { + return moment(date).format() +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a98f29c..6de7be2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1989,9 +1989,9 @@ } }, "big-integer": { - "version": "1.6.28", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.28.tgz", - "integrity": "sha512-OJT3rzgtsYca/5WmmEuFJDPMwROVh5SSjoEX9wIrpfbbWJ4KqRzShs8Cj6jWHaatBYAeWngBA+kmmrcHSklT1g==" + "version": "1.6.30", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.30.tgz", + "integrity": "sha512-LGDF7k/8yjS+GTbfFRGiSdcPnIwcjM6kQ0lmbja3tKJzVMmqHmUFnTuUOm/Lt2KVQ3mAZVupf9KNcsew0QV8Kw==" }, "bl": { "version": "1.2.2",