Compare commits

...

15 Commits

Author SHA1 Message Date
bl00dymarie 4fab8b26cb Setting for ITSAppUsesNonExemptEncryption 2022-08-11 08:29:26 +02:00
bl00dymarie deb9d3d8e8 Bump version number 1.2208.11 2022-08-11 08:20:25 +02:00
bl00dymarie fcc54566fc Merge branch 'fix/replace-app-restart' into 'release'
Replaces closing/restart functionality with a more friendly app state reset

See merge request bloodyhealth/drip!461
2022-08-11 06:16:17 +00:00
Sofiya Tepikin 0118fcd6ce Merge branch 'Chore/Remove-email-and-hence-typo' into 'release'
Chore: Remove email and hence typo from text

See merge request bloodyhealth/drip!459
2022-08-10 14:35:36 +00:00
Sofiya Tepikin 298eeafdba Fixes linter failing 2022-08-10 16:24:37 +02:00
Sofiya Tepikin 77ea075c23 Cleanup 2022-08-10 16:24:37 +02:00
Sofiya Tepikin 38f91c2e25 Reset app state without closing/restarting it 2022-08-10 16:24:37 +02:00
Sofiya Tepikin d9a1cd7895 Prettify files before other changes
Prettify
2022-08-10 16:24:37 +02:00
Sofiya Tepikin e954ddf991 Merge branch 'fix/realm-warning' into 'release'
Fix deprecated way of using writeCopyTo - realm method

See merge request bloodyhealth/drip!460
2022-08-10 14:22:56 +00:00
Sofiya Tepikin 74c570da38 Fix deprecated way of using writeCopyTo - realm method 2022-08-10 14:22:55 +00:00
bl00dymarie 8c99f2c6a3 Remove email and hence typo from text 2022-08-09 13:16:58 +02:00
bl00dymarie 34c1eae991 Merge branch 'fix/empty-password' into 'release'
Fix/empty password

See merge request bloodyhealth/drip!456
2022-08-08 11:33:56 +00:00
bl00dymarie e37d44c506 Bump version number 1.2208.8 2022-08-08 13:31:17 +02:00
Sofiya Tepikin 33dba03c47 Disable button when no input 2022-08-08 12:38:20 +02:00
Sofiya Tepikin a7bdd4b6a6 Prettify enter-new-password 2022-08-08 12:37:20 +02:00
15 changed files with 130 additions and 148 deletions
+6 -6
View File
@@ -12,7 +12,7 @@ import AppStatusBar from './common/app-status-bar'
import License from './License'
import PasswordPrompt from './password-prompt'
import store from "../store"
import store from '../store'
export default class AppWrapper extends Component {
constructor() {
@@ -51,7 +51,7 @@ export default class AppWrapper extends Component {
enableShowLicenseAgreement = () => {
this.setState({
shouldShowLicenseAgreement: true,
isCheckingLicenseAgreement: false
isCheckingLicenseAgreement: false,
})
}
@@ -62,7 +62,7 @@ export default class AppWrapper extends Component {
enableShowApp = () => {
this.setState({
shouldShowApp: true,
shouldShowPasswordPrompt: false
shouldShowPasswordPrompt: false,
})
}
@@ -79,11 +79,11 @@ export default class AppWrapper extends Component {
if (isCheckingLicenseAgreement) {
initialView = <AppLoadingView />
} else if (shouldShowLicenseAgreement) {
initialView = <License setLicense={this.disableShowLicenseAgreement}/>
initialView = <License setLicense={this.disableShowLicenseAgreement} />
} else if (shouldShowPasswordPrompt) {
initialView = <PasswordPrompt enableShowApp={this.enableShowApp} />
} else if (shouldShowApp) {
initialView = <App />
initialView = <App restartApp={() => this.checkDbPasswordSet()} />
}
return (
@@ -100,5 +100,5 @@ export default class AppWrapper extends Component {
const styles = StyleSheet.create({
container: {
flex: 1,
}
},
})
+12 -15
View File
@@ -17,12 +17,12 @@ import setupNotifications from '../lib/notifications'
import { getCycleDay, closeDb } from '../db'
class App extends Component {
static propTypes = {
date: PropTypes.string,
navigation: PropTypes.object.isRequired,
navigate: PropTypes.func,
goBack: PropTypes.func,
restartApp: PropTypes.func,
}
constructor(props) {
@@ -54,7 +54,7 @@ class App extends Component {
}
render() {
const { date, navigation, goBack } = this.props
const { date, navigation, goBack, restartApp } = this.props
const { currentPage } = navigation
if (!currentPage) {
@@ -80,8 +80,8 @@ class App extends Component {
return (
<View style={styles.container}>
<Header { ...headerProps } />
<Page { ...pageProps } />
<Header {...headerProps} />
<Page {...pageProps} restartApp={restartApp} />
<Menu />
</View>
)
@@ -90,25 +90,22 @@ class App extends Component {
const styles = StyleSheet.create({
container: {
flex: 1
}
flex: 1,
},
})
const mapStateToProps = (state) => {
return({
return {
date: getDate(state),
navigation: getNavigation(state)
})
navigation: getNavigation(state),
}
}
const mapDispatchToProps = (dispatch) => {
return({
return {
navigate: (page) => dispatch(navigate(page)),
goBack: () => dispatch(goBack()),
})
}
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(App)
export default connect(mapStateToProps, mapDispatchToProps)(App)
+12 -4
View File
@@ -1,4 +1,5 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import Button from '../../common/button'
@@ -8,6 +9,10 @@ import showBackUpReminder from './show-backup-reminder'
import settings from '../../../i18n/en/settings'
export default class CreatePassword extends Component {
static propTypes = {
changeEncryptionAndRestart: PropTypes.func,
}
constructor() {
super()
@@ -23,7 +28,7 @@ export default class CreatePassword extends Component {
showBackUpReminder(this.toggleSettingPassword, () => {})
}
render () {
render() {
const { isSettingPassword } = this.state
const labels = settings.passwordSettings
@@ -34,8 +39,11 @@ export default class CreatePassword extends Component {
</Button>
)
} else {
return <EnterNewPassword />
return (
<EnterNewPassword
changeEncryptionAndRestart={this.props.changeEncryptionAndRestart}
/>
)
}
}
}
}
+4 -8
View File
@@ -4,13 +4,13 @@ import PropTypes from 'prop-types'
import Button from '../../common/button'
import ConfirmWithPassword from '../common/confirm-with-password'
import { changeEncryptionAndRestartApp } from '../../../db'
import labels from '../../../i18n/en/settings'
export default class DeletePassword extends Component {
static propTypes = {
onStartDelete: PropTypes.func,
onCancelDelete: PropTypes.func
onCancelDelete: PropTypes.func,
changeEncryptionAndRestart: PropTypes.func,
}
constructor() {
@@ -24,10 +24,6 @@ export default class DeletePassword extends Component {
this.props.onStartDelete()
}
startDeletePassword = async () => {
await changeEncryptionAndRestartApp()
}
cancelConfirmationWithPassword = () => {
this.setState({ enteringCurrentPassword: false })
this.props.onCancelDelete()
@@ -39,7 +35,7 @@ export default class DeletePassword extends Component {
if (enteringCurrentPassword) {
return (
<ConfirmWithPassword
onSuccess={this.startDeletePassword}
onSuccess={this.props.changeEncryptionAndRestart}
onCancel={this.cancelConfirmationWithPassword}
/>
)
@@ -51,4 +47,4 @@ export default class DeletePassword extends Component {
</Button>
)
}
}
}
@@ -1,20 +1,23 @@
import React, { Component } from 'react'
import { StyleSheet } from 'react-native'
import nodejs from 'nodejs-mobile-react-native'
import PropTypes from 'prop-types'
import AppText from '../../common/app-text'
import AppTextInput from '../../common/app-text-input'
import Button from '../../common/button'
import { requestHash, changeEncryptionAndRestartApp } from '../../../db'
import { requestHash } from '../../../db'
import { Colors, Spacing } from '../../../styles'
import settings from '../../../i18n/en/settings'
const LISTENER_TYPE = 'create-or-change-pw'
export default class EnterNewPassword extends Component {
constructor() {
static propTypes = {
changeEncryptionAndRestart: PropTypes.func,
}
constructor(props) {
super()
this.state = {
password: '',
@@ -23,13 +26,16 @@ export default class EnterNewPassword extends Component {
}
nodejs.channel.addListener(
LISTENER_TYPE,
changeEncryptionAndRestartApp,
props.changeEncryptionAndRestart,
this
)
}
componentWillUnmount() {
nodejs.channel.removeListener(LISTENER_TYPE, changeEncryptionAndRestartApp)
nodejs.channel.removeListener(
LISTENER_TYPE,
this.props.changeEncryptionAndRestart
)
}
savePassword = () => {
@@ -52,15 +58,12 @@ export default class EnterNewPassword extends Component {
this.setState({ passwordConfirmation })
}
render () {
const {
password,
passwordConfirmation,
shouldShowErrorMessage
} = this.state
render() {
const { password, passwordConfirmation, shouldShowErrorMessage } =
this.state
const labels = settings.passwordSettings
const isButtonActive =
(password.length > 0) && (passwordConfirmation.length > 0)
password.length > 0 && passwordConfirmation.length > 0
return (
<React.Fragment>
@@ -80,10 +83,14 @@ export default class EnterNewPassword extends Component {
value={passwordConfirmation}
secureTextEntry={true}
/>
{shouldShowErrorMessage &&
{shouldShowErrorMessage && (
<AppText style={styles.error}>{labels.passwordsDontMatch}</AppText>
}
<Button isCTA={isButtonActive} onPress={this.savePassword}>
)}
<Button
isCTA={isButtonActive}
disabled={!isButtonActive}
onPress={this.savePassword}
>
{labels.savePassword}
</Button>
</React.Fragment>
@@ -94,6 +101,6 @@ export default class EnterNewPassword extends Component {
const styles = StyleSheet.create({
error: {
color: Colors.orange,
marginTop: Spacing.base
}
})
marginTop: Spacing.base,
},
})
+44 -22
View File
@@ -1,4 +1,10 @@
import React, { Component } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
import { navigate } from '../../../slices/navigation'
import { changeDbEncryption } from '../../../db'
import AppPage from '../../common/app-page'
import AppText from '../../common/app-text'
@@ -11,14 +17,18 @@ import DeletePassword from './delete'
import { hasEncryptionObservable } from '../../../local-storage'
import labels from '../../../i18n/en/settings'
export default class PasswordSetting extends Component {
class PasswordSetting extends Component {
static propTypes = {
navigate: PropTypes.func,
restartApp: PropTypes.func,
}
constructor(props) {
super(props)
this.state = {
isPasswordSet: hasEncryptionObservable.value,
isChangingPassword: false,
isDeletingPassword: false
isDeletingPassword: false,
}
}
@@ -38,19 +48,17 @@ export default class PasswordSetting extends Component {
this.setState({ isDeletingPassword: false })
}
changeEncryptionAndRestart = async (hash) => {
await changeDbEncryption(hash)
await this.props.restartApp()
this.props.navigate('Home')
}
render() {
const { isPasswordSet, isChangingPassword, isDeletingPassword } = this.state
const {
isPasswordSet,
isChangingPassword,
isDeletingPassword,
} = this.state
const {
title,
explainerEnabled,
explainerDisabled
} = labels.passwordSettings
const { title, explainerEnabled, explainerDisabled } =
labels.passwordSettings
return (
<AppPage>
@@ -59,19 +67,25 @@ export default class PasswordSetting extends Component {
{isPasswordSet ? explainerEnabled : explainerDisabled}
</AppText>
{!isPasswordSet && <CreatePassword/>}
{(isPasswordSet && !isDeletingPassword) && (
<ChangePassword
onStartChange = {this.onChangingPassword}
onCancelChange = {this.onCancelChangingPassword}
{!isPasswordSet && (
<CreatePassword
changeEncryptionAndRestart={this.changeEncryptionAndRestart}
/>
)}
{(isPasswordSet && !isChangingPassword) && (
{isPasswordSet && !isDeletingPassword && (
<ChangePassword
onStartChange={this.onChangingPassword}
onCancelChange={this.onCancelChangingPassword}
changeEncryptionAndRestart={this.changeEncryptionAndRestart}
/>
)}
{isPasswordSet && !isChangingPassword && (
<DeletePassword
onStartDelete = {this.onDeletingPassword}
onCancelDelete = {this.onCancelDeletingPassword}
onStartDelete={this.onDeletingPassword}
onCancelDelete={this.onCancelDeletingPassword}
changeEncryptionAndRestart={this.changeEncryptionAndRestart}
/>
)}
</Segment>
@@ -79,3 +93,11 @@ export default class PasswordSetting extends Component {
)
}
}
const mapDispatchToProps = (dispatch) => {
return {
navigate: (page) => dispatch(navigate(page)),
}
}
export default connect(null, mapDispatchToProps)(PasswordSetting)
+13 -11
View File
@@ -12,7 +12,8 @@ import settings from '../../../i18n/en/settings'
export default class ChangePassword extends Component {
static propTypes = {
onStartChange: PropTypes.func,
onCancelChange: PropTypes.func
onCancelChange: PropTypes.func,
changeEncryptionAndRestart: PropTypes.func,
}
constructor() {
@@ -21,7 +22,7 @@ export default class ChangePassword extends Component {
this.state = {
currentPassword: null,
enteringCurrentPassword: false,
enteringNewPassword: false
enteringNewPassword: false,
}
}
@@ -41,7 +42,7 @@ export default class ChangePassword extends Component {
this.setState({
currentPassword: null,
enteringNewPassword: true,
enteringCurrentPassword: false
enteringCurrentPassword: false,
})
}
@@ -49,17 +50,14 @@ export default class ChangePassword extends Component {
this.setState({
currentPassword: null,
enteringNewPassword: false,
enteringCurrentPassword: false
enteringCurrentPassword: false,
})
this.props.onCancelChange()
}
render() {
const {
enteringCurrentPassword,
enteringNewPassword,
currentPassword
} = this.state
const { enteringCurrentPassword, enteringNewPassword, currentPassword } =
this.state
const labels = settings.passwordSettings
const isPasswordSet = currentPassword !== null
@@ -73,7 +71,11 @@ export default class ChangePassword extends Component {
}
if (enteringNewPassword) {
return <EnterNewPassword />
return (
<EnterNewPassword
changeEncryptionAndRestart={this.props.changeEncryptionAndRestart}
/>
)
}
return (
@@ -86,4 +88,4 @@ export default class ChangePassword extends Component {
</Button>
)
}
}
}
+2 -9
View File
@@ -2,7 +2,6 @@ import Realm from 'realm'
import { LocalDate, ChronoUnit } from 'js-joda'
import nodejs from 'nodejs-mobile-react-native'
import fs from 'react-native-fs'
import { restartApp } from './restart-app'
import schemas from './schemas'
import cycleModule from '../lib/cycle'
@@ -195,7 +194,7 @@ export function requestHash(type, pw) {
)
}
export async function changeEncryptionAndRestartApp(hash) {
export async function changeDbEncryption(hash) {
let key
if (hash) key = hashToInt8Array(hash)
const defaultPath = db.path
@@ -205,16 +204,10 @@ export async function changeEncryptionAndRestartApp(hash) {
const copyPath = dir.join('/')
const exists = await fs.exists(copyPath)
if (exists) await fs.unlink(copyPath)
// for some reason, realm complains if we give it a key with value undefined
if (key) {
db.writeCopyTo(copyPath, key)
} else {
db.writeCopyTo(copyPath)
}
db.writeCopyTo({ path: copyPath, encryptionKey: key })
db.close()
await fs.unlink(defaultPath)
await fs.moveFile(copyPath, defaultPath)
restartApp()
}
export function isDbEmpty() {
-5
View File
@@ -1,5 +0,0 @@
// Current version of react-native-restart doesn't work with our ios setup
// therefore we have a fork and use different libraries on the platforms
import restart from 'react-native-restart'
export const restartApp = restart.Restart
-11
View File
@@ -1,11 +0,0 @@
// Current version of react-native-restart doesn't work with our ios setup
// therefore we have a fork and use different libraries on the platforms
import RNExitApp from 'react-native-exit-app-v2'
import { Alert } from 'react-native'
export const restartApp = () => {
Alert.alert('Closing app', 'App is shutting down. Please restart.')
setTimeout(() => {
RNExitApp.exitApp()
}, 3000)
}
+1 -1
View File
@@ -17,7 +17,7 @@
"settings": {
"license": {
"title": "drip. an open-source cycle tracking app",
"text": "Copyright (C) {{currentYear}} Heart of Code e.V.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details: https://www.gnu.org/licenses/gpl-3.0.html\n\nYou can contact us at drip@mailbox.org."
"text": "Copyright (C) {{currentYear}} Heart of Code e.V.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details: https://www.gnu.org/licenses/gpl-3.0.html."
},
"privacyPolicy": {
"title": "Privacy Policy",
+2 -19
View File
@@ -57,19 +57,6 @@
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
2B572382D4504B8FB4B9D251 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
00E356EE1AD99517003FC87E /* dripTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = dripTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -525,7 +512,6 @@
"${BUILT_PRODUCTS_DIR}/RCTTypeSafety/RCTTypeSafety.framework",
"${BUILT_PRODUCTS_DIR}/RNCPushNotificationIOS/RNCPushNotificationIOS.framework",
"${BUILT_PRODUCTS_DIR}/RNDateTimePicker/RNDateTimePicker.framework",
"${BUILT_PRODUCTS_DIR}/RNExitApp/RNExitApp.framework",
"${BUILT_PRODUCTS_DIR}/RNFS/RNFS.framework",
"${BUILT_PRODUCTS_DIR}/RNShare/RNShare.framework",
"${BUILT_PRODUCTS_DIR}/RNVectorIcons/RNVectorIcons.framework",
@@ -552,7 +538,6 @@
"${BUILT_PRODUCTS_DIR}/glog/glog.framework",
"${PODS_ROOT}/../../node_modules/nodejs-mobile-react-native/ios/NodeMobile.framework",
"${BUILT_PRODUCTS_DIR}/react-native-document-picker/react_native_document_picker.framework",
"${BUILT_PRODUCTS_DIR}/react-native-restart/react_native_restart.framework",
"${BUILT_PRODUCTS_DIR}/react-native-simple-toast/react_native_simple_toast.framework",
);
name = "[CP] Embed Pods Frameworks";
@@ -564,7 +549,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTTypeSafety.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RNCPushNotificationIOS.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RNDateTimePicker.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RNExitApp.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RNFS.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RNShare.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RNVectorIcons.framework",
@@ -591,7 +575,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/glog.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NodeMobile.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/react_native_document_picker.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/react_native_restart.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/react_native_simple_toast.framework",
);
runOnlyForDeploymentPostprocessing = 0;
@@ -857,7 +840,7 @@
"\"${PODS_ROOT}/../../node_modules/realm/vendor/realm-ios\"",
"$(inherited)",
);
MARKETING_VERSION = 1.2208.2;
MARKETING_VERSION = 1.2208.11;
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
@@ -936,7 +919,7 @@
"\"${PODS_ROOT}/../../node_modules/realm/vendor/realm-ios\"",
"$(inherited)",
);
MARKETING_VERSION = 1.2208.2;
MARKETING_VERSION = 1.2208.11;
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
+4 -2
View File
@@ -22,6 +22,8 @@
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
@@ -81,9 +83,9 @@
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
</dict>
</plist>
+4 -14
View File
@@ -1,6 +1,6 @@
{
"name": "drip.",
"version": "1.2208.2",
"version": "1.2208.11",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -2485,9 +2485,9 @@
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
"caniuse-lite": {
"version": "1.0.30001258",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz",
"integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA=="
"version": "1.0.30001375",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz",
"integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw=="
},
"capture-exit": {
"version": "2.0.0",
@@ -8561,11 +8561,6 @@
"resolved": "https://registry.npmjs.org/react-native-document-picker/-/react-native-document-picker-4.3.0.tgz",
"integrity": "sha512-ygcY0ijlVuhxzdWnhqd917yMUFT9FF0b4CM81LWoY4/bpQYz5PGUdRAdh25kS0VA+cEUYNL2iI7OpHXq00epPA=="
},
"react-native-exit-app-v2": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/react-native-exit-app-v2/-/react-native-exit-app-v2-1.2.2.tgz",
"integrity": "sha512-RWCfmus7h99M1aONqBnWG3g3TFRzKsmok6cLAuqN5NVQAxpcgzbJZgAryA/ADpmBrBP5EIJnCBFo64ApQGOZPw=="
},
"react-native-fs": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.19.0.tgz",
@@ -8600,11 +8595,6 @@
"@react-native-community/push-notification-ios": "^1.0.1"
}
},
"react-native-restart": {
"version": "0.0.18",
"resolved": "https://registry.npmjs.org/react-native-restart/-/react-native-restart-0.0.18.tgz",
"integrity": "sha512-AoEINeKuvj0yJY9I4GEbY27ifiVTo/2KhW2MnGeFgtjInfAvA9hgbGXjQO8xT2wQA9ZIzTgUQyyWC6yFiQeREA=="
},
"react-native-share": {
"version": "3.8.5",
"resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-3.8.5.tgz",
+1 -3
View File
@@ -1,6 +1,6 @@
{
"name": "drip.",
"version": "1.2208.2",
"version": "1.2208.11",
"contributors": [
"Julia Friesel <julia.friesel@gmail.com>",
"Marie Kochsiek",
@@ -47,12 +47,10 @@
"react-native": "0.61.0",
"react-native-calendars": "^1.19.3",
"react-native-document-picker": "^4.2.0",
"react-native-exit-app-v2": "^1.2.2",
"react-native-fs": "^2.19.0",
"react-native-hyperlink": "0.0.19",
"react-native-modal-datetime-picker": "8.0.0",
"react-native-push-notification": "3.2.1",
"react-native-restart": "0.0.18",
"react-native-share": "^3.0.0",
"react-native-simple-toast": "^1.1.3",
"react-native-size-matters": "^0.4.0",