Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dd648da56f | |||
| d1e87835d1 | |||
| c715b16e44 | |||
| 31b428fa53 | |||
| a291c78379 | |||
| 772a277315 | |||
| a4545fedcf | |||
| 9a9ca10283 | |||
| e7b5987837 | |||
| fa59f35719 | |||
| 3d245127c7 | |||
| 7e3eae1758 | |||
| 60d1b3d157 | |||
| 3940e3b4dd | |||
| 75a3837417 | |||
| 95afd305a9 | |||
| 3621bfb351 | |||
| f567510b7b | |||
| feaa7dab56 | |||
| 3f723aa823 | |||
| 512250eff4 | |||
| 70d28f7a4b | |||
| d431c2b947 | |||
| c140cdd602 | |||
| ccce046a55 | |||
| 112d52fa90 | |||
| 0a8dcf87a4 | |||
| 6592d742af | |||
| 3c8f6888fc | |||
| 14001664b2 | |||
| c44faaba0f | |||
| 246a6b3bb7 |
@@ -0,0 +1,31 @@
|
|||||||
|
# Changelog
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [0.0.2] - 2019-04-16
|
||||||
|
## Second updated beta release version
|
||||||
|
### Changes
|
||||||
|
- First day of the week in calendar is now Monday instead of Sunday
|
||||||
|
- Minor styling consistency
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Typos
|
||||||
|
- Bleeding value is visible in shortcut from Homescreen
|
||||||
|
- Delete button for sex, pain and mood
|
||||||
|
- Dates on chart
|
||||||
|
|
||||||
|
## [0.0.1] - 2019-02-15
|
||||||
|
## First beta release version
|
||||||
|
### Added (list of core functionality)
|
||||||
|
- you can track your menstrual bleeding
|
||||||
|
- you can track symptoms related to natural family planning (nfp), i.e. basal temperature and mucus or cervix
|
||||||
|
- you can use nfp symptoms for fertility awareness (drip implements the sympto-thermal method)
|
||||||
|
- you can track other symptoms like desire, sex, pain, mood, or save a note
|
||||||
|
- you can see bleeding days and predicted bleeding days in a calendar
|
||||||
|
- drip gives you an overview of tracked symptoms on a beautiful chart
|
||||||
|
- you can see basic stats about your cycle lengths
|
||||||
|
- you can encrypt your data and protect it with a password
|
||||||
|
- you can import and export your data in a nice format (csv)
|
||||||
|
- you can set reminders (daily reminder for taking your temperature or once per cycle for your next period
|
||||||
@@ -52,39 +52,12 @@
|
|||||||
<meta-data android:name="com.dieam.reactnativepushnotification.notification_color"
|
<meta-data android:name="com.dieam.reactnativepushnotification.notification_color"
|
||||||
android:resource="@android:color/white"/>
|
android:resource="@android:color/white"/>
|
||||||
|
|
||||||
<!-- < Only if you're using GCM or localNotificationSchedule() > -->
|
|
||||||
<receiver
|
|
||||||
android:name="com.google.android.gms.gcm.GcmReceiver"
|
|
||||||
android:exported="true"
|
|
||||||
android:permission="com.google.android.c2dm.permission.SEND" >
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
|
||||||
<category android:name="${applicationId}" />
|
|
||||||
</intent-filter>
|
|
||||||
</receiver>
|
|
||||||
<!-- < Only if you're using GCM or localNotificationSchedule() > -->
|
|
||||||
|
|
||||||
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
|
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
|
||||||
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
|
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/>
|
|
||||||
<service
|
|
||||||
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
|
|
||||||
android:exported="false" >
|
|
||||||
<intent-filter>
|
|
||||||
<!-- < Only if you're using GCM or localNotificationSchedule() > -->
|
|
||||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
|
||||||
<!-- < Only if you're using GCM or localNotificationSchedule() > -->
|
|
||||||
|
|
||||||
<!-- <Else> -->
|
|
||||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
|
||||||
<!-- </Else> -->
|
|
||||||
</intent-filter>
|
|
||||||
</service>
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { CalendarList } from 'react-native-calendars'
|
|||||||
import { LocalDate } from 'js-joda'
|
import { LocalDate } from 'js-joda'
|
||||||
import { getBleedingDaysSortedByDate } from '../db'
|
import { getBleedingDaysSortedByDate } from '../db'
|
||||||
import cycleModule from '../lib/cycle'
|
import cycleModule from '../lib/cycle'
|
||||||
import {shadesOfRed} from '../styles/index'
|
import { shadesOfRed, calendarTheme } from '../styles/index'
|
||||||
import styles from '../styles/index'
|
import styles from '../styles/index'
|
||||||
import nothingChanged from '../db/db-unchanged'
|
import nothingChanged from '../db/db-unchanged'
|
||||||
|
|
||||||
@@ -52,6 +52,9 @@ export default class CalendarView extends Component {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
markingType={'custom'}
|
markingType={'custom'}
|
||||||
|
// If firstDay=1 week starts from Monday. Note that dayNames and dayNamesShort should still start from Sunday.
|
||||||
|
firstDay={1}
|
||||||
|
theme={calendarTheme}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-20
@@ -1,6 +1,5 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
import { View, FlatList, ActivityIndicator } from 'react-native'
|
import { View, FlatList, ActivityIndicator } from 'react-native'
|
||||||
import range from 'date-range'
|
|
||||||
import { LocalDate } from 'js-joda'
|
import { LocalDate } from 'js-joda'
|
||||||
import { makeYAxisLabels, makeHorizontalGrid } from './y-axis'
|
import { makeYAxisLabels, makeHorizontalGrid } from './y-axis'
|
||||||
import nfpLines from './nfp-lines'
|
import nfpLines from './nfp-lines'
|
||||||
@@ -124,14 +123,8 @@ export default class CycleChart extends Component {
|
|||||||
// we don't want the chart to end abruptly before the first data day
|
// we don't want the chart to end abruptly before the first data day
|
||||||
amountOfCycleDays += 5
|
amountOfCycleDays += 5
|
||||||
}
|
}
|
||||||
const jsDates = getTodayAndPreviousDays(amountOfCycleDays)
|
const localDates = getTodayAndPreviousDays(amountOfCycleDays)
|
||||||
return jsDates.map(jsDate => {
|
return localDates.map(localDate => localDate.toString())
|
||||||
return LocalDate.of(
|
|
||||||
jsDate.getFullYear(),
|
|
||||||
jsDate.getMonth() + 1,
|
|
||||||
jsDate.getDate()
|
|
||||||
).toString()
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -170,10 +163,7 @@ export default class CycleChart extends Component {
|
|||||||
size={styles.yAxis.width - 7}
|
size={styles.yAxis.width - 7}
|
||||||
color={cycleDayColor}
|
color={cycleDayColor}
|
||||||
/>
|
/>
|
||||||
<AppText style={[
|
<AppText style={[styles.yAxisLabels.dateLabel]}>
|
||||||
styles.column.label.date,
|
|
||||||
styles.yAxisLabels.dateLabel
|
|
||||||
]}>
|
|
||||||
{labels.date.toLowerCase()}
|
{labels.date.toLowerCase()}
|
||||||
</AppText>
|
</AppText>
|
||||||
</View>
|
</View>
|
||||||
@@ -216,12 +206,18 @@ function LoadingMoreView(props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getTodayAndPreviousDays(n) {
|
function getTodayAndPreviousDays(n) {
|
||||||
const today = new Date()
|
const today = LocalDate.now()
|
||||||
today.setHours(0)
|
const targetDate = today.minusDays(n)
|
||||||
today.setMinutes(0)
|
|
||||||
today.setSeconds(0)
|
|
||||||
today.setMilliseconds(0)
|
|
||||||
const earlierDate = new Date(today - (range.DAY * n))
|
|
||||||
|
|
||||||
return range(earlierDate, today).reverse()
|
function getDaysInRange(currDate, range) {
|
||||||
|
if (currDate.isBefore(targetDate)) {
|
||||||
|
return range
|
||||||
|
} else {
|
||||||
|
range.push(currDate)
|
||||||
|
const next = currDate.minusDays(1)
|
||||||
|
return getDaysInRange(next, range)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return getDaysInRange(today, [])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,11 +43,11 @@ export default class DayColumn extends Component {
|
|||||||
} else if (symptom === 'pain') {
|
} else if (symptom === 'pain') {
|
||||||
// is any pain documented?
|
// is any pain documented?
|
||||||
acc.pain = cycleDay.pain &&
|
acc.pain = cycleDay.pain &&
|
||||||
Object.values(cycleDay.pain).some(x => x === true)
|
Object.values({...cycleDay.pain}).some(x => x === true)
|
||||||
} else if (symptom === 'mood') {
|
} else if (symptom === 'mood') {
|
||||||
// is mood documented?
|
// is mood documented?
|
||||||
acc.mood = cycleDay.mood &&
|
acc.mood = cycleDay.mood &&
|
||||||
Object.values(cycleDay.mood).some(x => x === true)
|
Object.values({...cycleDay.mood}).some(x => x === true)
|
||||||
}
|
}
|
||||||
acc[`${symptom}Exclude`] = cycleDay[symptom] && cycleDay[symptom].exclude
|
acc[`${symptom}Exclude`] = cycleDay[symptom] && cycleDay[symptom].exclude
|
||||||
return acc
|
return acc
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ const styles = {
|
|||||||
fontSize: 9,
|
fontSize: 9,
|
||||||
fontWeight: '100',
|
fontWeight: '100',
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
|
paddingTop: 2.5
|
||||||
},
|
},
|
||||||
number: {
|
number: {
|
||||||
color: cycleDayColor,
|
color: cycleDayColor,
|
||||||
@@ -101,7 +102,10 @@ const styles = {
|
|||||||
},
|
},
|
||||||
dateLabel: {
|
dateLabel: {
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
justifyContent: 'center'
|
justifyContent: 'center',
|
||||||
|
color: 'grey',
|
||||||
|
fontSize: 9,
|
||||||
|
fontWeight: '100',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
horizontalGrid: {
|
horizontalGrid: {
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ export default class CycleDayOverView extends Component {
|
|||||||
},
|
},
|
||||||
sex: sex => {
|
sex: sex => {
|
||||||
let sexLabel = []
|
let sexLabel = []
|
||||||
if (sex && Object.values(sex).some(val => val)){
|
if (sex && Object.values({...sex}).some(val => val)){
|
||||||
Object.keys(sex).forEach(key => {
|
Object.keys(sex).forEach(key => {
|
||||||
if(sex[key] && key !== 'other' && key !== 'note') {
|
if(sex[key] && key !== 'other' && key !== 'note') {
|
||||||
sexLabel.push(
|
sexLabel.push(
|
||||||
@@ -128,7 +128,7 @@ export default class CycleDayOverView extends Component {
|
|||||||
},
|
},
|
||||||
pain: pain => {
|
pain: pain => {
|
||||||
let painLabel = []
|
let painLabel = []
|
||||||
if (pain && Object.values(pain).some(val => val)){
|
if (pain && Object.values({...pain}).some(val => val)){
|
||||||
Object.keys(pain).forEach(key => {
|
Object.keys(pain).forEach(key => {
|
||||||
if(pain[key] && key !== 'other' && key !== 'note') {
|
if(pain[key] && key !== 'other' && key !== 'note') {
|
||||||
painLabel.push(painLabels[key])
|
painLabel.push(painLabels[key])
|
||||||
@@ -147,7 +147,7 @@ export default class CycleDayOverView extends Component {
|
|||||||
},
|
},
|
||||||
mood: mood => {
|
mood: mood => {
|
||||||
let moodLabel = []
|
let moodLabel = []
|
||||||
if (mood && Object.values(mood).some(val => val)){
|
if (mood && Object.values({...mood}).some(val => val)){
|
||||||
Object.keys(mood).forEach(key => {
|
Object.keys(mood).forEach(key => {
|
||||||
if(mood[key] && key !== 'other' && key !== 'note') {
|
if(mood[key] && key !== 'other' && key !== 'note') {
|
||||||
moodLabel.push(moodLabels[key])
|
moodLabel.push(moodLabels[key])
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default class SelectTabGroup extends Component {
|
|||||||
key={i}
|
key={i}
|
||||||
activeOpacity={1}
|
activeOpacity={1}
|
||||||
>
|
>
|
||||||
<View style={styles.radioButtonTextGroup}>
|
<View>
|
||||||
<View style={[
|
<View style={[
|
||||||
styles.selectTab,
|
styles.selectTab,
|
||||||
firstOrLastStyle,
|
firstOrLastStyle,
|
||||||
|
|||||||
@@ -39,7 +39,10 @@ export default class ActionButtonFooter extends Component {
|
|||||||
}]
|
}]
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
disabledCondition: !currentSymptomValue,
|
disabledCondition: (!currentSymptomValue ||
|
||||||
|
(Object.keys(currentSymptomValue).length === 0 && currentSymptomValue.constructor === Object) ||
|
||||||
|
(Object.values(currentSymptomValue).every(x => !x) && currentSymptomValue.constructor === Object)
|
||||||
|
),
|
||||||
icon: 'delete-outline'
|
icon: 'delete-outline'
|
||||||
}, {
|
}, {
|
||||||
title: labels.save,
|
title: labels.save,
|
||||||
|
|||||||
+12
-8
@@ -1,19 +1,20 @@
|
|||||||
|
import { ChronoUnit, LocalDate } from 'js-joda'
|
||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
import { ScrollView, View, TouchableHighlight, Dimensions } from 'react-native'
|
import { Dimensions, ScrollView, TouchableHighlight, View } from 'react-native'
|
||||||
import { LocalDate, ChronoUnit } from 'js-joda'
|
|
||||||
import Icon from 'react-native-vector-icons/Entypo'
|
import Icon from 'react-native-vector-icons/Entypo'
|
||||||
import { secondaryColor, cycleDayColor, periodColor } from '../styles'
|
|
||||||
|
import DripHomeIcon from '../assets/drip-home-icons'
|
||||||
|
import { getCycleDay } from '../db'
|
||||||
import {
|
import {
|
||||||
home as labels,
|
|
||||||
bleedingPrediction as predictLabels,
|
bleedingPrediction as predictLabels,
|
||||||
|
home as labels,
|
||||||
shared,
|
shared,
|
||||||
} from '../i18n/en/labels'
|
} from '../i18n/en/labels'
|
||||||
import links from '../i18n/en/links'
|
import links from '../i18n/en/links'
|
||||||
import cycleModule from '../lib/cycle'
|
import cycleModule from '../lib/cycle'
|
||||||
import { getFertilityStatusForDay } from '../lib/sympto-adapter'
|
import { getFertilityStatusForDay } from '../lib/sympto-adapter'
|
||||||
import styles from '../styles'
|
import styles, { cycleDayColor, periodColor, secondaryColor } from '../styles'
|
||||||
import AppText from './app-text'
|
import AppText from './app-text'
|
||||||
import DripHomeIcon from '../assets/drip-home-icons'
|
|
||||||
import Button from './button'
|
import Button from './button'
|
||||||
|
|
||||||
const ShowMoreToggler = ({ isShowingMore, onToggle }) => {
|
const ShowMoreToggler = ({ isShowingMore, onToggle }) => {
|
||||||
@@ -83,7 +84,10 @@ export default class Home extends Component {
|
|||||||
|
|
||||||
passTodayTo(componentName) {
|
passTodayTo(componentName) {
|
||||||
const { navigate } = this.props
|
const { navigate } = this.props
|
||||||
navigate(componentName, { date: LocalDate.now().toString() })
|
navigate(componentName, {
|
||||||
|
date: this.todayDateString,
|
||||||
|
cycleDay: getCycleDay(this.todayDateString)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleShowingMore = () => {
|
toggleShowingMore = () => {
|
||||||
@@ -158,7 +162,7 @@ export default class Home extends Component {
|
|||||||
{ isShowingMore &&
|
{ isShowingMore &&
|
||||||
<View>
|
<View>
|
||||||
<AppText styles={styles.paragraph}>
|
<AppText styles={styles.paragraph}>
|
||||||
{ `${statusText} ${links.moreAboutNfp.url}` }
|
{ `${statusText} ${links.wiki.url}.` }
|
||||||
</AppText>
|
</AppText>
|
||||||
</View>
|
</View>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ export default class Settings extends Component {
|
|||||||
<AppText style={styles.framedSegmentTitle}>{`${labels.preOvu.title} `}</AppText>
|
<AppText style={styles.framedSegmentTitle}>{`${labels.preOvu.title} `}</AppText>
|
||||||
</View>
|
</View>
|
||||||
<AppText>{labels.preOvu.note}</AppText>
|
<AppText>{labels.preOvu.note}</AppText>
|
||||||
<AppText>{labels.preOvu.note}</AppText>
|
|
||||||
</FramedSegment>
|
</FramedSegment>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default class CreatePassword extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
startSettingPassword = () => {
|
startSettingPassword = () => {
|
||||||
showBackUpReminder(this.toggleSettingPassword)
|
showBackUpReminder(this.toggleSettingPassword, () => {})
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
|
||||||
import labels from '../../../i18n/en/settings'
|
import labels from '../../../i18n/en/settings'
|
||||||
import { changeEncryptionAndRestartApp } from '../../../db'
|
import { changeEncryptionAndRestartApp } from '../../../db'
|
||||||
import ConfirmWithPassword from '../shared/confirm-with-password'
|
import ConfirmWithPassword from '../shared/confirm-with-password'
|
||||||
@@ -14,7 +16,7 @@ export default class DeletePassword extends Component {
|
|||||||
|
|
||||||
startConfirmWithPassword = () => {
|
startConfirmWithPassword = () => {
|
||||||
this.setState({ enteringCurrentPassword: true })
|
this.setState({ enteringCurrentPassword: true })
|
||||||
this.props.onStartDeletingPassword()
|
this.props.onStartDelete()
|
||||||
}
|
}
|
||||||
|
|
||||||
startDeletePassword = async () => {
|
startDeletePassword = async () => {
|
||||||
@@ -23,6 +25,7 @@ export default class DeletePassword extends Component {
|
|||||||
|
|
||||||
cancelConfirmationWithPassword = () => {
|
cancelConfirmationWithPassword = () => {
|
||||||
this.setState({ enteringCurrentPassword: false })
|
this.setState({ enteringCurrentPassword: false })
|
||||||
|
this.props.onCancelDelete()
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -45,3 +48,8 @@ export default class DeletePassword extends Component {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeletePassword.propTypes = {
|
||||||
|
onStartDelete: PropTypes.func,
|
||||||
|
onCancelDelete: PropTypes.func
|
||||||
|
}
|
||||||
@@ -24,10 +24,18 @@ export default class PasswordSetting extends Component {
|
|||||||
this.setState({ isChangingPassword: true })
|
this.setState({ isChangingPassword: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onCancelChangingPassword = () => {
|
||||||
|
this.setState({ isChangingPassword: false })
|
||||||
|
}
|
||||||
|
|
||||||
onDeletingPassword = () => {
|
onDeletingPassword = () => {
|
||||||
this.setState({ isDeletingPassword: true })
|
this.setState({ isDeletingPassword: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onCancelDeletingPassword = () => {
|
||||||
|
this.setState({ isDeletingPassword: false })
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -53,13 +61,15 @@ export default class PasswordSetting extends Component {
|
|||||||
|
|
||||||
{ (isPasswordSet && !isDeletingPassword) && (
|
{ (isPasswordSet && !isDeletingPassword) && (
|
||||||
<ChangePassword
|
<ChangePassword
|
||||||
onStartChangingPassword = {this.onChangingPassword}
|
onStartChange = {this.onChangingPassword}
|
||||||
|
onCancelChange = {this.onCancelChangingPassword}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{ (isPasswordSet && !isChangingPassword) && (
|
{ (isPasswordSet && !isChangingPassword) && (
|
||||||
<DeletePassword
|
<DeletePassword
|
||||||
onStartDeletingPassword = {this.onDeletingPassword}
|
onStartDelete = {this.onDeletingPassword}
|
||||||
|
onCancelDelete = {this.onCancelDeletingPassword}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</FramedSegment>
|
</FramedSegment>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { Alert } from 'react-native'
|
|||||||
import { shared } from '../../../i18n/en/labels'
|
import { shared } from '../../../i18n/en/labels'
|
||||||
import labels from '../../../i18n/en/settings'
|
import labels from '../../../i18n/en/settings'
|
||||||
|
|
||||||
export default function showBackUpReminder(okHandler, isDelete) {
|
export default function showBackUpReminder(okHandler, cancelHandler, isDelete) {
|
||||||
let title, message
|
let title, message
|
||||||
if (isDelete) {
|
if (isDelete) {
|
||||||
title = labels.passwordSettings.deleteBackupReminderTitle
|
title = labels.passwordSettings.deleteBackupReminderTitle
|
||||||
@@ -17,10 +17,12 @@ export default function showBackUpReminder(okHandler, isDelete) {
|
|||||||
message,
|
message,
|
||||||
[{
|
[{
|
||||||
text: shared.cancel,
|
text: shared.cancel,
|
||||||
|
onPress: cancelHandler,
|
||||||
style: 'cancel'
|
style: 'cancel'
|
||||||
}, {
|
}, {
|
||||||
text: shared.ok,
|
text: shared.ok,
|
||||||
onPress: okHandler
|
onPress: okHandler
|
||||||
}]
|
}],
|
||||||
|
{ onDismiss: cancelHandler }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
|
||||||
import settings from '../../../i18n/en/settings'
|
import settings from '../../../i18n/en/settings'
|
||||||
import EnterNewPassword from './enter-new-password'
|
import EnterNewPassword from './enter-new-password'
|
||||||
import SettingsButton from '../shared/settings-button'
|
import SettingsButton from '../shared/settings-button'
|
||||||
@@ -17,10 +19,15 @@ export default class ChangePassword extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
startChangingPassword = () => {
|
startChangingPassword = () => {
|
||||||
showBackUpReminder(() => {
|
showBackUpReminder(
|
||||||
|
this.startEnteringCurrentPassword,
|
||||||
|
this.cancelConfirmationWithPassword
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
startEnteringCurrentPassword = () => {
|
||||||
this.setState({ enteringCurrentPassword: true })
|
this.setState({ enteringCurrentPassword: true })
|
||||||
})
|
this.props.onStartChange()
|
||||||
this.props.onStartChangingPassword()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
startEnteringNewPassword = () => {
|
startEnteringNewPassword = () => {
|
||||||
@@ -37,6 +44,7 @@ export default class ChangePassword extends Component {
|
|||||||
enteringNewPassword: false,
|
enteringNewPassword: false,
|
||||||
enteringCurrentPassword: false
|
enteringCurrentPassword: false
|
||||||
})
|
})
|
||||||
|
this.props.onCancelChange()
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -72,3 +80,8 @@ export default class ChangePassword extends Component {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChangePassword.propTypes = {
|
||||||
|
onStartChange: PropTypes.func,
|
||||||
|
onCancelChange: PropTypes.func
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
import { View, Alert } from 'react-native'
|
import { View, Alert } from 'react-native'
|
||||||
|
|
||||||
import nodejs from 'nodejs-mobile-react-native'
|
import nodejs from 'nodejs-mobile-react-native'
|
||||||
@@ -100,3 +101,8 @@ export default class ConfirmWithPassword extends Component {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConfirmWithPassword.propTypes = {
|
||||||
|
onSuccess: PropTypes.func,
|
||||||
|
onCancel: PropTypes.func
|
||||||
|
}
|
||||||
+1
-1
@@ -111,7 +111,7 @@ export const fertilityStatus = {
|
|||||||
fertileUntilEvening: 'Fertile phase ends in the evening',
|
fertileUntilEvening: 'Fertile phase ends in the evening',
|
||||||
unknown: 'We cannot show any cycle information because no period data has been added.',
|
unknown: 'We cannot show any cycle information because no period data has been added.',
|
||||||
preOvuText: "With NFP rules, you may assume 5 days of infertility at the beginning of your cycle, provided you don't observe any fertile mucus or cervix values.",
|
preOvuText: "With NFP rules, you may assume 5 days of infertility at the beginning of your cycle, provided you don't observe any fertile mucus or cervix values.",
|
||||||
periOvuText: "We have not been able to detect both a temperature shift and mucus or cervix shift.",
|
periOvuText: "We have not been able to detect both a temperature shift and mucus or cervix shift. Please find more information on NFP rules here:",
|
||||||
postOvuText: tempRule => {
|
postOvuText: tempRule => {
|
||||||
return (
|
return (
|
||||||
'We have detected a temperature shift (' + ['regular', '1st exception', '2nd exception'][tempRule] +
|
'We have detected a temperature shift (' + ['regular', '1st exception', '2nd exception'][tempRule] +
|
||||||
|
|||||||
+1
-5
@@ -9,13 +9,9 @@ export default {
|
|||||||
},
|
},
|
||||||
wiki: {
|
wiki: {
|
||||||
url: 'https://gitlab.com/bloodyhealth/drip/wikis/home',
|
url: 'https://gitlab.com/bloodyhealth/drip/wikis/home',
|
||||||
text: 'wiki'
|
text: 'our wiki'
|
||||||
},
|
},
|
||||||
website: {
|
website: {
|
||||||
url: 'https://bloodyhealth.gitlab.io/'
|
url: 'https://bloodyhealth.gitlab.io/'
|
||||||
},
|
},
|
||||||
moreAboutNfp: {
|
|
||||||
url: 'https://gitlab.com/bloodyhealth/drip/wikis/nfp/intro',
|
|
||||||
text: 'More'
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -15,8 +15,8 @@ export default {
|
|||||||
couldNotConvert: 'Could not convert data to CSV',
|
couldNotConvert: 'Could not convert data to CSV',
|
||||||
problemSharing: 'There was a problem sharing the data export file'
|
problemSharing: 'There was a problem sharing the data export file'
|
||||||
},
|
},
|
||||||
title: 'My Drip data export',
|
title: 'My drip data export',
|
||||||
subject: 'My Drip data export',
|
subject: 'My drip data export',
|
||||||
button: 'Export data',
|
button: 'Export data',
|
||||||
segmentExplainer: 'Export data in CSV format for backup or so you can use it elsewhere'
|
segmentExplainer: 'Export data in CSV format for backup or so you can use it elsewhere'
|
||||||
},
|
},
|
||||||
@@ -96,11 +96,11 @@ export default {
|
|||||||
},
|
},
|
||||||
aboutSection: {
|
aboutSection: {
|
||||||
title: 'About',
|
title: 'About',
|
||||||
text: `Please note that your data is stored locally on your phone and not on a server. This means your data cannot be read by anyone else unless they have access to your phone. We want to ensure that you stay in control of your own data. If you are planning to switch or reset your phone, please remember to export your data before doing so. You can reinstall the app afterwards and import your data.\n\nIf you encounter any technical issues, don't hesitate to contact via ${links.email.url}. You can also contribute to the code base on ${links.gitlab.url}`,
|
text: `Please note that your data is stored locally on your phone and not on a server. This means your data cannot be read by anyone else unless they have access to your phone. We want to ensure that you stay in control of your own data. If you are planning to switch or reset your phone, please remember to export your data before doing so. You can reinstall the app afterwards and import your data.\n\nIf you encounter any technical issues, don't hesitate to contact us via ${links.email.url}. You can also contribute to the code base on ${links.gitlab.url}`,
|
||||||
},
|
},
|
||||||
philosophy: {
|
philosophy: {
|
||||||
title: 'Remember to think for yourself',
|
title: 'Remember to think for yourself',
|
||||||
text: `Drip makes period predictions for you and helps you apply NFP fertility awareness rules. But please remember that this app is made by humans, and humans make mistakes. Always think for yourself: "Does this make sense?" Remember, you don't need an app to understand your cycle! However, drip wants to support you and make period tracking easier, more transparent and secure.`,
|
text: `drip makes period predictions for you and helps you apply NFP fertility awareness rules. But please remember that this app is made by humans, and humans make mistakes. Always think for yourself: "Does this make sense?" Remember, you don't need an app to understand your cycle! However, drip wants to support you and make period tracking easier, more transparent and secure.`,
|
||||||
},
|
},
|
||||||
license: {
|
license: {
|
||||||
title: 'drip is an open-source cycle tracking app',
|
title: 'drip is an open-source cycle tracking app',
|
||||||
@@ -118,7 +118,7 @@ You can contact us by bloodyhealth@mailbox.org.`
|
|||||||
},
|
},
|
||||||
preOvu: {
|
preOvu: {
|
||||||
title: 'Infertile days at cycle start',
|
title: 'Infertile days at cycle start',
|
||||||
note: `drip applies NFP's rules for calculating infertile days at the start of the cycle (see the ${links.wiki.url} for more info). However, drip does not currently apply the so called 20-day-rule, which determines infertile days at the cycle start from past cycle lengths in case no past symptothermal info is available.`
|
note: `drip applies NFP's rules for calculating infertile days at the start of the cycle (see ${links.wiki.url} for more info). However, drip does not currently apply the so called 20-day-rule, which determines infertile days at the cycle start from past cycle lengths in case no past symptothermal info is available.`
|
||||||
},
|
},
|
||||||
credits: {
|
credits: {
|
||||||
title: 'Credits',
|
title: 'Credits',
|
||||||
|
|||||||
+12
-24
@@ -2,12 +2,18 @@ import links from './links'
|
|||||||
|
|
||||||
export const generalInfo = {
|
export const generalInfo = {
|
||||||
chartNfp: `On the chart, you can track fertility signs. When both a valid temperature shift and a mucus or cervix shift have been detected, an orange line will be displayed on the chart. This indicates the end of the peri-ovulatory and the beginning of the post-ovulatory phase.`,
|
chartNfp: `On the chart, you can track fertility signs. When both a valid temperature shift and a mucus or cervix shift have been detected, an orange line will be displayed on the chart. This indicates the end of the peri-ovulatory and the beginning of the post-ovulatory phase.`,
|
||||||
curiousNfp: `If you are curious to learn more about the sympto-thermal method that is used for fertility tracking within the app, you can visit our ${links.wiki.url}.`,
|
curiousNfp: `If you are curious to learn more about the sympto-thermal method that is used for fertility tracking within the app, you can visit ${links.wiki.url}.`,
|
||||||
cycleRelation: `It may be influenced by or have an impact on your menstrual cycles and its hormonal changes.`,
|
cycleRelation: `It may be influenced by or have an impact on your menstrual cycles and its hormonal changes.`,
|
||||||
excludeExplainer: `You can exclude these values, so they won't be taken into account for any fertility calculation.`,
|
excludeExplainer: `You can exclude these values, so they won't be taken into account for any fertility calculation.`,
|
||||||
nfpTfyReminder: `Drip makes period predictions for you and helps you apply NFP fertility awareness rules. But please remember that this app is made by humans, and humans make mistakes. Always think for yourself: "Does this make sense?" Remember, you don't need an app to understand your cycle! However, drip wants to support you and make period tracking easier, more transparent and secure.
|
nfpTfyReminder: `When - on a daily/regular basis - you track:
|
||||||
|
1. your basal body temperature,
|
||||||
|
2. your cervical mucus OR your cervix,
|
||||||
|
3. and menstrual bleeding
|
||||||
|
the app helps you identify in which phase of the menstrual cycle you are.
|
||||||
|
|
||||||
Please find more info on the sympto-thermal method in our ${links.wiki.url}.`,
|
drip makes period predictions for you and helps you apply NFP fertility awareness rules. But please remember that this app is made by humans, and humans make mistakes. Always think for yourself: "Does this make sense?" Remember, you don't need an app to understand your cycle! However, drip wants to support you and make period tracking easier, more transparent and secure.
|
||||||
|
|
||||||
|
Please find more info on the sympto-thermal method in ${links.wiki.url}.`,
|
||||||
noNfpSymptom: `The app allows you to track this symptom for your information, it is not taken into account for any calculation. On the chart you can check how often you track this symptom.`
|
noNfpSymptom: `The app allows you to track this symptom for your information, it is not taken into account for any calculation. On the chart you can check how often you track this symptom.`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,12 +31,6 @@ The app allows you to track different intensities of bleeding. On the chart and
|
|||||||
|
|
||||||
Excluding bleeding values is for tracking bleeding when it's not marking the start of a new cycle or the continuation of menstrual bleeding the day(s) before, e.g. bleeding caused by ovulation or a miscarriage.
|
Excluding bleeding values is for tracking bleeding when it's not marking the start of a new cycle or the continuation of menstrual bleeding the day(s) before, e.g. bleeding caused by ovulation or a miscarriage.
|
||||||
|
|
||||||
When - on a daily/regular basis - you track:
|
|
||||||
1. your basal body temperature,
|
|
||||||
2. your cervical mucus OR your cervix,
|
|
||||||
3. and menstrual bleeding
|
|
||||||
the app helps you identify in which phase of your cycle you are.
|
|
||||||
|
|
||||||
${generalInfo.nfpTfyReminder}`,
|
${generalInfo.nfpTfyReminder}`,
|
||||||
},
|
},
|
||||||
cervix: {
|
cervix: {
|
||||||
@@ -39,11 +39,7 @@ ${generalInfo.nfpTfyReminder}`,
|
|||||||
|
|
||||||
Tracking how open or closed and how firm or soft the cervix feels can help determine in which phase of the menstrual cycle you are.
|
Tracking how open or closed and how firm or soft the cervix feels can help determine in which phase of the menstrual cycle you are.
|
||||||
|
|
||||||
By default, the secondary symptom the app uses for NFP evaluation is cervical mucus, but you can change it to cervix in "Settings" -> "NFP Settings". When - on a daily/regular basis - you track:
|
By default, the secondary symptom the app uses for NFP evaluation is cervical mucus, but you can change it to cervix in "Settings" -> "NFP Settings".
|
||||||
1. your basal body temperature,
|
|
||||||
2. your cervical mucus OR your cervix,
|
|
||||||
3. and menstrual bleeding
|
|
||||||
the app helps you identify in which phase of your cycle you are.
|
|
||||||
|
|
||||||
· How to identify a fertile cervix?
|
· How to identify a fertile cervix?
|
||||||
A fertile cervix is open and feels soft like your earlobes. In contrast, an infertile cervix feels closed and hard, like the tip of your nose. If the cervix feels anything other than closed and hard, drip takes it as a sign of fertility. On the chart, a fertile cervix is colored in dark yellow, and infertile cervix is colored in light yellow.
|
A fertile cervix is open and feels soft like your earlobes. In contrast, an infertile cervix feels closed and hard, like the tip of your nose. If the cervix feels anything other than closed and hard, drip takes it as a sign of fertility. On the chart, a fertile cervix is colored in dark yellow, and infertile cervix is colored in light yellow.
|
||||||
@@ -78,11 +74,7 @@ ${generalInfo.curiousNfp}`
|
|||||||
title: 'Tracking cervical mucus',
|
title: 'Tracking cervical mucus',
|
||||||
text: `Cervical mucus can help determine in which phase of the menstrual cycle you are.
|
text: `Cervical mucus can help determine in which phase of the menstrual cycle you are.
|
||||||
|
|
||||||
By default the secondary symptom the app uses for NFP evaluation is cervical mucus. When - on a daily/regular basis - you track:
|
By default the secondary symptom the app uses for NFP evaluation is cervical mucus.
|
||||||
1. your basal body temperature,
|
|
||||||
2. your cervical mucus OR your cervix,
|
|
||||||
3. and menstrual bleeding
|
|
||||||
the app helps you identify in which phase of your cycle you are.
|
|
||||||
|
|
||||||
· How to identify fertile cervical mucus?
|
· How to identify fertile cervical mucus?
|
||||||
Tracking the feeling and the texture of your cervical mucus on a daily basis helps you identify changes of the quality of the cervical mucus. The values you enter for both feeling and texture of your cervical mucus are combined by drip into one of five NFP-conforming values.
|
Tracking the feeling and the texture of your cervical mucus on a daily basis helps you identify changes of the quality of the cervical mucus. The values you enter for both feeling and texture of your cervical mucus are combined by drip into one of five NFP-conforming values.
|
||||||
@@ -133,11 +125,7 @@ ${generalInfo.curiousNfp}`
|
|||||||
title: 'Tracking body basal temperature',
|
title: 'Tracking body basal temperature',
|
||||||
text: `One of the body signs you need to track for knowing your fertility status is your body basal temperature. The body temperature changes over the course of a menstrual cycle, it rises after ovulation.
|
text: `One of the body signs you need to track for knowing your fertility status is your body basal temperature. The body temperature changes over the course of a menstrual cycle, it rises after ovulation.
|
||||||
|
|
||||||
By default the secondary symptom is cervical mucus, but you can change it to cervix in "Settings" -> "NFP Settings". When - on a daily/regular basis - you track:
|
By default the secondary symptom is cervical mucus, but you can change it to cervix in "Settings" -> "NFP Settings".
|
||||||
1. your basal body temperature,
|
|
||||||
2. your cervical mucus OR your cervix,
|
|
||||||
3. and menstrual bleeding
|
|
||||||
the app helps you identify in which phase of your cycle you are.
|
|
||||||
|
|
||||||
· What is body basal temperature?
|
· What is body basal temperature?
|
||||||
It's your temperature after lying still for at least 6 hours. For many, this is when they are waking up in the morning after sleeping at least 6 hours and before getting up.
|
It's your temperature after lying still for at least 6 hours. For many, this is when they are waking up in the morning after sleeping at least 6 hours and before getting up.
|
||||||
|
|||||||
+540
-420
File diff suppressed because it is too large
Load Diff
+29
-1
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#import <React/RCTBundleURLProvider.h>
|
#import <React/RCTBundleURLProvider.h>
|
||||||
#import <React/RCTRootView.h>
|
#import <React/RCTRootView.h>
|
||||||
|
#import <React/RCTPushNotificationManager.h>
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@
|
|||||||
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
|
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
|
||||||
|
|
||||||
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
|
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
|
||||||
moduleName:@"drip"
|
moduleName:@"home"
|
||||||
initialProperties:nil
|
initialProperties:nil
|
||||||
launchOptions:launchOptions];
|
launchOptions:launchOptions];
|
||||||
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
|
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
|
||||||
@@ -32,4 +33,31 @@
|
|||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Required to register for notifications
|
||||||
|
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
|
||||||
|
{
|
||||||
|
[RCTPushNotificationManager didRegisterUserNotificationSettings:notificationSettings];
|
||||||
|
}
|
||||||
|
// Required for the register event.
|
||||||
|
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
||||||
|
{
|
||||||
|
[RCTPushNotificationManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
|
||||||
|
}
|
||||||
|
// Required for the notification event. You must call the completion handler after handling the remote notification.
|
||||||
|
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
|
||||||
|
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
|
||||||
|
{
|
||||||
|
[RCTPushNotificationManager didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
|
||||||
|
}
|
||||||
|
// Required for the registrationError event.
|
||||||
|
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
|
||||||
|
{
|
||||||
|
[RCTPushNotificationManager didFailToRegisterForRemoteNotificationsWithError:error];
|
||||||
|
}
|
||||||
|
// Required for the localNotification event.
|
||||||
|
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
|
||||||
|
{
|
||||||
|
[RCTPushNotificationManager didReceiveLocalNotification:notification];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
Generated
+3
-9
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "drip",
|
"name": "drip",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -3220,11 +3220,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"date-range": {
|
|
||||||
"version": "0.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/date-range/-/date-range-0.0.2.tgz",
|
|
||||||
"integrity": "sha1-OVHZ5SWZgu3VMewx5APYImPvbjk="
|
|
||||||
},
|
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
@@ -7531,9 +7526,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"react-native-push-notification": {
|
"react-native-push-notification": {
|
||||||
"version": "3.1.1",
|
"version": "github:jfr3000/react-native-push-notification#f9e83510d687116ea79ee30fde6b93ba5a07b019",
|
||||||
"resolved": "https://registry.npmjs.org/react-native-push-notification/-/react-native-push-notification-3.1.1.tgz",
|
"from": "github:jfr3000/react-native-push-notification"
|
||||||
"integrity": "sha512-4+4yQXNPqh5IVvpSBmR4Cy/UeMjTcfE8KIJgEuT7pME97WK+aGPn6W3ybhOoXC1n+ZWKfrAlsHydLE4xfBZDJg=="
|
|
||||||
},
|
},
|
||||||
"react-native-restart": {
|
"react-native-restart": {
|
||||||
"version": "0.0.7",
|
"version": "0.0.7",
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "drip",
|
"name": "drip",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Julia Friesel <julia.friesel@gmail.com>",
|
"Julia Friesel <julia.friesel@gmail.com>",
|
||||||
"Marie Kochsiek",
|
"Marie Kochsiek",
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node node_modules/react-native/local-cli/cli.js start",
|
"start": "node node_modules/react-native/local-cli/cli.js start",
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
|
"ios": "react-native run-ios --simulator=\"iPhone 8 Plus\"",
|
||||||
"log": "react-native log-android",
|
"log": "react-native log-android",
|
||||||
"test": "mocha --recursive --require @babel/register test && npm run lint",
|
"test": "mocha --recursive --require @babel/register test && npm run lint",
|
||||||
"test-watch": "mocha --recursive --require @babel/register --watch test",
|
"test-watch": "mocha --recursive --require @babel/register --watch test",
|
||||||
@@ -20,7 +21,6 @@
|
|||||||
"ajv": "^5.5.2",
|
"ajv": "^5.5.2",
|
||||||
"assert": "^1.4.1",
|
"assert": "^1.4.1",
|
||||||
"csvtojson": "^2.0.8",
|
"csvtojson": "^2.0.8",
|
||||||
"date-range": "0.0.2",
|
|
||||||
"isobject": "^3.0.1",
|
"isobject": "^3.0.1",
|
||||||
"js-base64": "^2.4.8",
|
"js-base64": "^2.4.8",
|
||||||
"js-joda": "^1.8.2",
|
"js-joda": "^1.8.2",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"react-native-fs": "^2.13.3",
|
"react-native-fs": "^2.13.3",
|
||||||
"react-native-hyperlink": "0.0.14",
|
"react-native-hyperlink": "0.0.14",
|
||||||
"react-native-modal-datetime-picker-nevo": "^4.11.0",
|
"react-native-modal-datetime-picker-nevo": "^4.11.0",
|
||||||
"react-native-push-notification": "^3.1.1",
|
"react-native-push-notification": "github:jfr3000/react-native-push-notification",
|
||||||
"react-native-restart": "0.0.7",
|
"react-native-restart": "0.0.7",
|
||||||
"react-native-share": "^1.1.3",
|
"react-native-share": "^1.1.3",
|
||||||
"react-native-vector-icons": "^5.0.0",
|
"react-native-vector-icons": "^5.0.0",
|
||||||
|
|||||||
+15
-5
@@ -26,6 +26,16 @@ const defaultIndentation = 10
|
|||||||
const defaultTopMargin = 10
|
const defaultTopMargin = 10
|
||||||
const colorInActive = '#666666'
|
const colorInActive = '#666666'
|
||||||
|
|
||||||
|
export const calendarTheme = {
|
||||||
|
textDayFontFamily: textFont,
|
||||||
|
textMonthFontFamily: textFontBold,
|
||||||
|
textDayHeaderFontFamily: textFont,
|
||||||
|
textDayFontSize: regularSize,
|
||||||
|
textMonthFontSize: regularSize,
|
||||||
|
textDayHeaderFontSize: hintSize,
|
||||||
|
textSectionTitleColor: 'grey'
|
||||||
|
}
|
||||||
|
|
||||||
export default StyleSheet.create({
|
export default StyleSheet.create({
|
||||||
appText: {
|
appText: {
|
||||||
color: 'black',
|
color: 'black',
|
||||||
@@ -162,9 +172,9 @@ export default StyleSheet.create({
|
|||||||
fontFamily: headerFont
|
fontFamily: headerFont
|
||||||
},
|
},
|
||||||
symptomViewHeading: {
|
symptomViewHeading: {
|
||||||
fontSize: 20,
|
fontWeight: 'bold',
|
||||||
color: 'black',
|
fontFamily: textFontBold,
|
||||||
marginBottom: 5
|
marginTop: 10
|
||||||
},
|
},
|
||||||
symptomInfoIcon: {
|
symptomInfoIcon: {
|
||||||
marginRight: 20,
|
marginRight: 20,
|
||||||
@@ -333,10 +343,10 @@ export default StyleSheet.create({
|
|||||||
selectBoxSection: {
|
selectBoxSection: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
flexWrap: 'wrap',
|
flexWrap: 'wrap',
|
||||||
marginVertical: 10,
|
marginTop: 7,
|
||||||
},
|
},
|
||||||
selectTabGroup: {
|
selectTabGroup: {
|
||||||
marginVertical: 10,
|
marginTop: 7,
|
||||||
flexDirection: 'row'
|
flexDirection: 'row'
|
||||||
},
|
},
|
||||||
selectTab: {
|
selectTab: {
|
||||||
|
|||||||
Reference in New Issue
Block a user