...
 
Commits (22)
......@@ -5,22 +5,46 @@ A menstrual cycle tracking app that's open-source and leaves your data on your p
## Development setup
1. Install [Android Studio](https://developer.android.com/studio/) - you'll need it to install some dependencies.
1. Either start a virtual device in Android Studio (or make sure it's already running, you should see a phone on your screen) or [set your physical device like your phone up](https://developer.android.com/training/basics/firstapp/running-app) to run the app.
1. Make sure you are running Node 8 or 9 (newer versions won’t work). It's easiest to switch Node versions using `nvm`, here’s how to do it:
2. Clone this repository:
```
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
nvm install v9
```
1. Clone this repository:
```
git clone git@gitlab.com:bloodyhealth/drip.git
cd drip
```
4. Make sure you are running Node 8 or 9. It's easiest to switch Node versions using `nvm`. Here's [how to set it up](https://nodesource.com/blog/installing-node-js-tutorial-using-nvm-on-mac-os-x-and-ubuntu/)
5. Run `npm install`
5. You may need to open your app's /android folder in Android Studio, so that it detects, downloads and cofigures requirements that might be missing, like the NDK and CMake to build the native code part of the project. Also check out nodejs-mobile repository for the necessary prerequisites for your system.
5. Run `npm run android`
7. In another tab, run `npm run log` to see logging output
8. Run `adb shell input keyevent 82` and select enable hot reloading (see https://facebook.github.io/react-native/docs/debugging.html)
9. We recommend installing an [ESLint plugin in your editor](https://eslint.org/docs/user-guide/integrations#editors). There's an `.eslintrc` file in this project which will be used by the plugin to check your code for style errors and potential bugs.
1. Open Android Studio and click on "Open an existing Android Studio project". Navigate to the drip repository you cloned and double click the android folder. It detects, downloads and cofigures requirements that might be missing, like the NDK and CMake to build the native code part of the project. Also check out nodejs-mobile repository for the necessary prerequisites for your system.
1. Either start a virtual device in Android Studio (or make sure it's already running, you should see a phone on your screen) or [set your physical device like your phone up](https://developer.android.com/training/basics/firstapp/running-app) to run the app.
1. Open a terminal in Android Studio and run `npm install`
1. Run `npm run android`
1. In another tab, run `npm run log` to see logging output
1. Run `adb shell input keyevent 82` and select enable hot reloading (see https://facebook.github.io/react-native/docs/debugging.html)
1. We recommend installing an [ESLint plugin in your editor](https://eslint.org/docs/user-guide/integrations#editors). There's an `.eslintrc` file in this project which will be used by the plugin to check your code for style errors and potential bugs.
## Java problems on macOS
Make sure that you have Java 1.8 by running `java -version`.
If you don't have Java installed, or your Java version is different, the app may not work. You can try just using Android Studio's Java by prepending it to your `$PATH` in your shell profile:
```
export PATH="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin:${PATH}"
```
Now, `which java` should output `/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java`, and the correct Java version should be used.
## Tests
You can run the tests with `npm test`.
......
<?xml version="1.0" encoding="utf-8"?>
<vector
android:height="108dp"
android:width="108dp"
android:viewportHeight="108"
android:viewportWidth="108"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#008577"
android:pathData="M0,0h108v108h-108z"/>
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#141316</color>
</resources>
\ No newline at end of file
assets/drip_small.png

5.11 KB | W: | H:

assets/drip_small.png

14.9 KB | W: | H:

assets/drip_small.png
assets/drip_small.png
assets/drip_small.png
assets/drip_small.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -9,7 +9,7 @@ import symptomViews from './cycle-day/symptoms'
import Chart from './chart/chart'
import Settings from './settings'
import Stats from './stats'
import {headerTitles, menuTitles} from './labels'
import {headerTitles, menuTitles} from '../i18n/en/labels'
import setupNotifications from '../lib/notifications'
// design wants everyhting lowercased, but we don't
......
......@@ -11,7 +11,7 @@ import styles from './styles'
import { scaleObservable } from '../../local-storage'
import config from '../../config'
import AppText from '../app-text'
import { shared as labels } from '../labels'
import { shared as labels } from '../../i18n/en/labels'
import DripIcon from '../../assets/drip-icons'
import CycleDayIcon from '../../assets/home-circle'
import nothingChanged from '../../db/db-unchanged'
......
......@@ -10,7 +10,7 @@ import Header from '../header'
import { getCycleDay } from '../../db'
import cycleModule from '../../lib/cycle'
import styles from '../../styles'
import * as labels from './labels'
import * as labels from '../../i18n/en/cycle-day'
import AppText from '../app-text'
import DripIcon from '../../assets/drip-icons'
......
......@@ -5,7 +5,7 @@ import {
import Icon from 'react-native-vector-icons/MaterialCommunityIcons'
import { saveSymptom } from '../../../db'
import styles, {iconStyles} from '../../../styles'
import {sharedDialogs as labels} from '../labels'
import {sharedDialogs as labels} from '../../../i18n/en/cycle-day'
export default class ActionButtonFooter extends Component {
render() {
......
......@@ -6,7 +6,7 @@ import {
} from 'react-native'
import styles from '../../../styles'
import { saveSymptom } from '../../../db'
import { bleeding as labels } from '../labels'
import { bleeding as labels } from '../../../i18n/en/cycle-day'
import ActionButtonFooter from './action-button-footer'
import SelectTabGroup from '../select-tab-group'
import SymptomSection from './symptom-section'
......
......@@ -6,7 +6,7 @@ import {
} from 'react-native'
import styles from '../../../styles'
import { saveSymptom } from '../../../db'
import { cervix as labels } from '../labels'
import { cervix as labels } from '../../../i18n/en/cycle-day'
import ActionButtonFooter from './action-button-footer'
import SelectTabGroup from '../select-tab-group'
import SymptomSection from './symptom-section'
......
......@@ -5,7 +5,7 @@ import {
} from 'react-native'
import styles from '../../../styles'
import { saveSymptom } from '../../../db'
import { intensity, desire } from '../labels'
import { intensity, desire } from '../../../i18n/en/cycle-day'
import ActionButtonFooter from './action-button-footer'
import SelectTabGroup from '../select-tab-group'
import SymptomSection from './symptom-section'
......
......@@ -6,7 +6,7 @@ import {
} from 'react-native'
import styles from '../../../styles'
import { saveSymptom } from '../../../db'
import { mucus as labels } from '../labels'
import { mucus as labels } from '../../../i18n/en/cycle-day'
import computeSensiplanValue from '../../../lib/sensiplan-mucus'
import ActionButtonFooter from './action-button-footer'
import SelectTabGroup from '../select-tab-group'
......
......@@ -9,7 +9,7 @@ import styles from '../../../styles'
import { saveSymptom } from '../../../db'
import ActionButtonFooter from './action-button-footer'
import SymptomSection from './symptom-section'
import { noteExplainer } from '../labels'
import { noteExplainer } from '../../../i18n/en/cycle-day'
export default class Note extends Component {
constructor(props) {
......
......@@ -5,7 +5,7 @@ import {
View
} from 'react-native'
import { saveSymptom } from '../../../db'
import { pain as labels } from '../labels'
import { pain as labels } from '../../../i18n/en/cycle-day'
import ActionButtonFooter from './action-button-footer'
import SelectBoxGroup from '../select-box-group'
import SymptomSection from './symptom-section'
......
......@@ -6,7 +6,7 @@ import {
} from 'react-native'
import styles from '../../../styles'
import { saveSymptom } from '../../../db'
import { sex as sexLabels, contraceptives as cLabels } from '../labels'
import { sex as sexLabels, contraceptives as cLabels } from '../../../i18n/en/cycle-day'
import ActionButtonFooter from './action-button-footer'
import SelectBoxGroup from '../select-box-group'
import SymptomSection from './symptom-section'
......
......@@ -13,9 +13,9 @@ import padWithZeros from '../../helpers/pad-time-with-zeros'
import { getPreviousTemperature, saveSymptom } from '../../../db'
import styles from '../../../styles'
import { LocalTime, ChronoUnit } from 'js-joda'
import { temperature as labels } from '../labels'
import { temperature as labels } from '../../../i18n/en/cycle-day'
import { scaleObservable } from '../../../local-storage'
import { shared } from '../../labels'
import { shared } from '../../../i18n/en/labels'
import ActionButtonFooter from './action-button-footer'
import config from '../../../config'
import SymptomSection from './symptom-section'
......
......@@ -24,6 +24,7 @@ export default function SymptomViewHeader(props) {
</View >
<FeatherIcon
name='info'
style={styles.symptomInfoIcon}
{...iconStyles.symptomHeaderIcons}
/>
</View>
......
......@@ -4,7 +4,7 @@ import { LocalDate, ChronoUnit } from 'js-joda'
import Icon from 'react-native-vector-icons/Entypo'
import { Surface } from 'react-native/Libraries/ART/ReactNativeART'
import { secondaryColor, cycleDayColor, periodColor } from '../styles'
import { home as labels, bleedingPrediction as predictLabels, shared } from './labels'
import { home as labels, bleedingPrediction as predictLabels, shared } from '../i18n/en/labels'
import CycleDayIcon from '../assets/home-circle'
import Drop from '../assets/home-drop'
import cycleModule from '../lib/cycle'
......
......@@ -4,7 +4,7 @@ import nodejs from 'nodejs-mobile-react-native'
import { saveEncryptionFlag } from '../local-storage'
import AppText from './app-text'
import styles from '../styles'
import { passwordPrompt as labels, shared } from './labels'
import { passwordPrompt as labels, shared } from '../i18n/en/labels'
import { requestHash, deleteDbAndOpenNew, openDb } from '../db'
export default class PasswordPrompt extends Component {
......
import { Alert } from 'react-native'
import { shared as sharedLabels } from '../labels'
import { shared as sharedLabels } from '../../i18n/en/labels'
export default function alertError(msg) {
Alert.alert(sharedLabels.errorTitle, msg)
......
import Share from 'react-native-share'
import getDataAsCsvDataUri from '../../lib/import-export/export-to-csv'
import alertError from './alert-error'
import { settings as labels } from '../labels'
import { settings as labels } from '../../i18n/en/settings'
export default async function openShareDialogAndExport() {
let data
......
......@@ -2,7 +2,8 @@ import { Alert } from 'react-native'
import { DocumentPicker, DocumentPickerUtil } from 'react-native-document-picker'
import rnfs from 'react-native-fs'
import importCsv from '../../lib/import-export/import-from-csv'
import { settings as labels, shared as sharedLabels } from '../labels'
import { shared as sharedLabels } from '../../i18n/en/labels'
import { settings as labels } from '../../i18n/en/settings'
import alertError from './alert-error'
export default function openImportDialogAndImport() {
......
......@@ -5,7 +5,7 @@ import {
ScrollView,
} from 'react-native'
import styles from '../../styles/index'
import { settings as labels } from '../labels'
import { settings as labels } from '../../i18n/en/settings'
import AppText from '../app-text'
import TempReminderPicker from './temp-reminder-picker'
import PeriodReminderPicker from './period-reminder'
......
import { Alert } from 'react-native'
import { openDb } from '../../../db'
import { shared } from '../../labels'
import { shared } from '../../../i18n/en/labels'
export default async function checkPassword({hash, onCancel, onTryAgain }) {
const connected = await openDb(hash)
......
......@@ -6,7 +6,7 @@ import {
import nodejs from 'nodejs-mobile-react-native'
import AppText from '../../app-text'
import styles from '../../../styles'
import { settings as labels } from '../../labels'
import { settings as labels } from '../../../i18n/en/settings'
import { requestHash, changeEncryptionAndRestartApp } from '../../../db'
import PasswordField from './password-field'
import showBackUpReminder from './show-backup-reminder'
......
......@@ -6,7 +6,7 @@ import {
import nodejs from 'nodejs-mobile-react-native'
import AppText from '../../app-text'
import styles from '../../../styles'
import { settings as labels } from '../../labels'
import { settings as labels } from '../../../i18n/en/settings'
import { requestHash, changeEncryptionAndRestartApp } from '../../../db'
import PasswordField from './password-field'
import showBackUpReminder from './show-backup-reminder'
......
......@@ -8,7 +8,7 @@ import {
hasEncryptionObservable
} from '../../../local-storage'
import styles from '../../../styles/index'
import { settings as labels } from '../../labels'
import { settings as labels } from '../../../i18n/en/settings'
export default class PasswordSetting extends Component {
constructor(props) {
......
import { Alert } from 'react-native'
import { settings as labels, shared } from '../../labels'
import { shared } from '../../../i18n/en/labels'
import { settings as labels } from '../../../i18n/en/settings'
export default function showBackUpReminder(okHandler, isDelete) {
let title, message
......
......@@ -6,7 +6,8 @@ import {
import nodejs from 'nodejs-mobile-react-native'
import AppText from '../../app-text'
import styles from '../../../styles'
import { settings as labels, shared } from '../../labels'
import { shared } from '../../../i18n/en/labels'
import { settings as labels } from '../../../i18n/en/settings'
import { requestHash, changeEncryptionAndRestartApp } from '../../../db'
import PasswordField from './password-field'
import showBackUpReminder from './show-backup-reminder'
......
......@@ -9,7 +9,7 @@ import {
savePeriodReminder
} from '../../local-storage'
import styles from '../../styles/index'
import { settings as labels } from '../labels'
import { settings as labels } from '../../i18n/en/settings'
export default class PeriodReminderPicker extends Component {
constructor(props) {
......
......@@ -11,7 +11,7 @@ import {
saveTempReminder
} from '../../local-storage'
import styles from '../../styles/index'
import { settings as labels } from '../labels'
import { settings as labels } from '../../i18n/en/settings'
import padWithZeros from '../helpers/pad-time-with-zeros'
export default class TempReminderPicker extends Component {
......
......@@ -7,7 +7,7 @@ import {
saveTempScale,
} from '../../local-storage'
import { secondaryColor } from '../../styles/index'
import { settings as labels } from '../labels'
import { settings as labels } from '../../i18n/en/settings'
import config from '../../config'
import alertError from './alert-error'
......
......@@ -7,7 +7,7 @@ import {
import styles from '../styles/index'
import cycleModule from '../lib/cycle'
import {getCycleLengthStats as getCycleInfo} from '../lib/cycle-length'
import {stats as labels} from './labels'
import {stats as labels} from '../i18n/en/labels'
import AppText from './app-text'
import { getCycleStartsSortedByDate } from '../db'
......
......@@ -16,70 +16,6 @@ export const shared = {
less: 'less'
}
export const settings = {
export: {
errors: {
noData: 'There is no data to export',
couldNotConvert: 'Could not convert data to CSV',
problemSharing: 'There was a problem sharing the data export file'
},
title: 'My Drip data export',
subject: 'My Drip data export',
button: 'Export data',
segmentExplainer: 'Export data in CSV format for backup or so you can use it elsewhere'
},
import: {
button: 'Import data',
title: 'Keep existing data?',
message: `There are two options for the import:
1. Keep existing cycle days and replace only the ones in the import file.
2. Delete all existing cycle days and import cycle days from file.`,
replaceOption: 'Import and replace',
deleteOption: 'Import and delete existing',
errors: {
couldNotOpenFile: 'Could not open file',
postFix: 'No data was imported or changed'
},
success: {
message: 'Data successfully imported'
},
segmentExplainer: 'Import data in CSV format'
},
tempScale: {
segmentTitle: 'Temperature scale',
segmentExplainer: 'Change the minimum and maximum value for the temperature chart',
min: 'Min',
max: 'Max',
loadError: 'Could not load saved temperature scale settings',
saveError: 'Could not save temperature scale settings'
},
tempReminder: {
title: 'Temperature reminder',
noTimeSet: 'Set a time for a daily reminder to take your temperature',
timeSet: time => `Daily reminder set for ${time}`,
notification: 'Record your morning temperature'
},
periodReminder: {
title: 'Next period reminder',
reminderText: 'Get a notification 3 days before your next period is likely to start.',
notification: daysToEndOfPrediction => `Your next period is likely to start in 3 to ${daysToEndOfPrediction} days.`
},
passwordSettings: {
title: 'App password',
explainerDisabled: "Encrypt the app's database with a password. You need to enter the password every time the app is started.",
explainerEnabled: "Password protection and database encryption is currently enabled",
setPassword: 'Set password',
changePassword: 'Change password',
deletePassword: 'Delete password',
enterCurrent: "Please enter your current password",
enterNew: "Please enter a new password",
backupReminderTitle: 'Read this before making changes to your password',
backupReminder: 'Just to be safe, please backup your data using the export function before making changes to your password.\n\nLonger passwords are better! Consider using a passphrase.\n\nPlease also make sure you do not lose your password. There is no way to recover your data if you do.\n\nMaking any changes to your password setting will keep your data as it was before and restart the app.',
deleteBackupReminderTitle: 'Read this before deleting your password',
deleteBackupReminder: 'Deleting your password means your data will no longer be encrypted.\n\nJust to be safe, please backup your data using the export function before deleting your password.\n\nMaking any changes to your password setting will keep your data as it was before and restart the app.',
}
}
export const headerTitles = {
Home: 'Home',
Calendar: 'Calendar',
......
export const settings = {
export: {
errors: {
noData: 'There is no data to export',
couldNotConvert: 'Could not convert data to CSV',
problemSharing: 'There was a problem sharing the data export file'
},
title: 'My Drip data export',
subject: 'My Drip data export',
button: 'Export data',
segmentExplainer: 'Export data in CSV format for backup or so you can use it elsewhere'
},
import: {
button: 'Import data',
title: 'Keep existing data?',
message: `There are two options for the import:
1. Keep existing cycle days and replace only the ones in the import file.
2. Delete all existing cycle days and import cycle days from file.`,
replaceOption: 'Import and replace',
deleteOption: 'Import and delete existing',
errors: {
couldNotOpenFile: 'Could not open file',
postFix: 'No data was imported or changed'
},
success: {
message: 'Data successfully imported'
},
segmentExplainer: 'Import data in CSV format'
},
tempScale: {
segmentTitle: 'Temperature scale',
segmentExplainer: 'Change the minimum and maximum value for the temperature chart',
min: 'Min',
max: 'Max',
loadError: 'Could not load saved temperature scale settings',
saveError: 'Could not save temperature scale settings'
},
tempReminder: {
title: 'Temperature reminder',
noTimeSet: 'Set a time for a daily reminder to take your temperature',
timeSet: time => `Daily reminder set for ${time}`,
notification: 'Record your morning temperature'
},
periodReminder: {
title: 'Next period reminder',
reminderText: 'Get a notification 3 days before your next period is likely to start.',
notification: daysToEndOfPrediction => `Your next period is likely to start in 3 to ${daysToEndOfPrediction} days.`
},
passwordSettings: {
title: 'App password',
explainerDisabled: "Encrypt the app's database with a password. You need to enter the password every time the app is started.",
explainerEnabled: "Password protection and database encryption is currently enabled",
setPassword: 'Set password',
changePassword: 'Change password',
deletePassword: 'Delete password',
enterCurrent: "Please enter your current password",
enterNew: "Please enter a new password",
backupReminderTitle: 'Read this before making changes to your password',
backupReminder: 'Just to be safe, please backup your data using the export function before making changes to your password.\n\nLonger passwords are better! Consider using a passphrase.\n\nPlease also make sure you do not lose your password. There is no way to recover your data if you do.\n\nMaking any changes to your password setting will keep your data as it was before and restart the app.',
deleteBackupReminderTitle: 'Read this before deleting your password',
deleteBackupReminder: 'Deleting your password means your data will no longer be encrypted.\n\nJust to be safe, please backup your data using the export function before deleting your password.\n\nMaking any changes to your password setting will keep your data as it was before and restart the app.',
}
}
\ No newline at end of file
......@@ -2,7 +2,7 @@ import {tempReminderObservable, periodReminderObservable} from '../local-storage
import Notification from 'react-native-push-notification'
import { LocalDate } from 'js-joda'
import Moment from 'moment'
import { settings as labels } from '../components/labels'
import { settings as labels } from '../i18n/en/settings'
import { getBleedingDaysSortedByDate } from '../db'
import cycleModule from './cycle'
import nothingChanged from '../db/db-unchanged'
......
import getFertilityStatus from './sympto'
import cycleModule from './cycle'
import { fertilityStatus } from '../components/labels'
import { fertilityStatus } from '../i18n/en/labels'
export function getFertilityStatusForDay(dateString) {
const status = getCycleStatusForDay(dateString)
......
......@@ -6646,9 +6646,9 @@
"integrity": "sha512-/7TdL3pHM7H0Cut6U6SK1jd6fVYvLlQq0O4inJ7j4YD0w9BtAAFqLkLnBDOA0jL4oLw/89yR8HhLOzNFGvVsfw=="
},
"react-native-share": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-1.1.0.tgz",
"integrity": "sha512-uQXo+HzZGUo9VlfgfWwGa9vLrY9OBQOFAsxhH/e3GWAlCxrGGjXNu/La+aJzMJdhoHzzn1+NRWDp1LWvlxJHew=="
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-1.1.3.tgz",
"integrity": "sha512-vKAJqgkEt7HjsF0HUwgom+E0FbmFNVZNncHwby1+O8/mXlKugh+Ym6rvv+A2ASHmD5TXKohJMYT2+jYofzPORA=="
},
"react-native-vector-icons": {
"version": "5.0.0",
......
......@@ -34,7 +34,7 @@
"react-native-modal-datetime-picker-nevo": "^4.11.0",
"react-native-push-notification": "^3.1.1",
"react-native-restart": "0.0.7",
"react-native-share": "^1.1.0",
"react-native-share": "^1.1.3",
"react-native-vector-icons": "^5.0.0",
"realm": "^2.7.1"
},
......@@ -68,5 +68,9 @@
"url": "https://gitlab.com/bloodyhealth/drip/issues"
},
"homepage": "https://gitlab.com/bloodyhealth/drip#README",
"rnpm": { "assets": [ "assets/fonts" ] }
"rnpm": {
"assets": [
"assets/fonts"
]
}
}
......@@ -139,6 +139,10 @@ export default StyleSheet.create({
color: 'black',
marginBottom: 5
},
symptomInfoIcon: {
marginRight: 20,
marginLeft: 20
},
symptomBoxImage: {
width: 50,
height: 50
......@@ -199,9 +203,6 @@ export default StyleSheet.create({
flexDirection: 'row',
justifyContent: 'space-between',
},
headerSymptom: {
paddingRight: 20
},
navigationArrow: {
padding: 20
},
......