• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

akvo / nmis-mobile / 5418980185

30 Jun 2023 03:25AM UTC coverage: 68.304% (-8.7%) from 76.971%
5418980185

Pull #28

github

web-flow
Merge 88ce2ceaf into 298e05ecb
Pull Request #28: Feature/26-storing-session-forms-sqlite

195 of 294 branches covered (66.33%)

Branch coverage included in aggregate %.

161 of 161 new or added lines in 7 files covered. (100.0%)

389 of 561 relevant lines covered (69.34%)

11.81 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

29.87
/app/src/pages/AddUser.js
1
import React from 'react';
2
import { View, ToastAndroid } from 'react-native';
3
import { ListItem, Button, Input } from '@rneui/themed';
4
import { Formik, ErrorMessage } from 'formik';
5
import * as Crypto from 'expo-crypto';
6
import * as Yup from 'yup';
7

8
import { BaseLayout, Image } from '../components';
9
import { conn, query } from '../database';
10
import { UserState } from '../store';
11

12
db = conn.init;
8✔
13

14
const DEFAULT_UID = 1;
8✔
15

16
const AddUser = ({ navigation }) => {
8✔
17
  const [loading, setLoading] = React.useState(false);
1✔
18
  const { id: userID, name, password } = UserState.useState((s) => s);
2✔
19

20
  const goToHome = () => {
1✔
21
    navigation.navigate('Home');
×
22
  };
23

24
  const handleUpdateDB = (id, data) => {
1✔
25
    const updateQuery = query.update('users', { id }, data);
×
26
    conn
×
27
      .tx(db, updateQuery, [id])
28
      .then(() => {
29
        UserState.update((s) => {
×
30
          s.id = id;
×
31
        });
32

33
        ToastAndroid.show('Success!', ToastAndroid.SHORT);
×
34
        setLoading(false);
×
35
      })
36
      .catch(() => {
37
        ToastAndroid.show('Unable to save the data to the database', ToastAndroid.LONG);
×
38
        setLoading(false);
×
39
      });
40
  };
41

42
  const handleInsertDB = (data) => {
1✔
43
    const insertQuery = query.insert('users', data);
×
44
    conn
×
45
      .tx(db, insertQuery)
46
      .then(({ insertId }) => {
47
        if (insertId) {
×
48
          UserState.update((s) => {
×
49
            s.id = insertId;
×
50
          });
51
        }
52
        ToastAndroid.show('Success!', ToastAndroid.SHORT);
×
53

54
        setLoading(false);
×
55
      })
56
      .catch(() => {
57
        ToastAndroid.show('Unable to save the data to the database', ToastAndroid.LONG);
×
58
        setLoading(false);
×
59
      });
60
  };
61

62
  const handleSaveData = async () => {
1✔
63
    const passwordEncrypted = await Crypto.digestStringAsync(
×
64
      Crypto.CryptoDigestAlgorithm.SHA1,
65
      password,
66
    );
67
    const data = {
×
68
      name,
69
      id: DEFAULT_UID,
70
      password: passwordEncrypted,
71
    };
72
    if (userID) {
×
73
      handleUpdateDB(userID, data);
×
74
    } else {
75
      handleInsertDB(data);
×
76
    }
77
  };
78

79
  const handleSubmit = () => {
1✔
80
    setLoading(true);
×
81
    try {
×
82
      handleSaveData();
×
83
    } catch (error) {
84
      consoe.log('err', error);
×
85
      setLoading(false);
×
86
      throw error;
×
87
    }
88
  };
89

90
  const handleNameChange = (formikChange, value) => {
1✔
91
    formikChange('name')(value);
×
92
    UserState.update((s) => {
×
93
      s.name = value;
×
94
    });
95
  };
96

97
  const handlePasswordChange = (formikChange, value) => {
1✔
98
    formikChange('password')(value);
×
99
    UserState.update((s) => {
×
100
      s.password = value;
×
101
    });
102
  };
103

104
  const initialValues = {
1✔
105
    name,
106
    password,
107
    confirmPassword: null,
108
  };
109

110
  const addSchema = Yup.object().shape({
1✔
111
    name: Yup.string().required('Username is required'),
112
    password: Yup.string().nullable(),
113
    confirmPassword: Yup.string().when('password', {
114
      is: (password) => password && password.length > 0,
×
115
      then: (schema) => schema.oneOf([Yup.ref('password')], 'Passwords must match'),
×
116
      otherwise: (schema) => schema.nullable(),
×
117
    }),
118
  });
119

120
  React.useEffect(() => {
1✔
121
    const selectQuery = query.read('users', { id: DEFAULT_UID });
1✔
122
    conn
1✔
123
      .tx(db, selectQuery, [DEFAULT_UID])
124
      .then(({ rows }) => {
125
        if (rows.length) {
1!
126
          const userDB = rows._array[0];
×
127
          UserState.update((s) => {
×
128
            s.id = DEFAULT_UID;
×
129
            s.name = userDB?.name;
×
130
          });
131
        }
132
      })
133
      .catch(() => {
134
        ToastAndroid.show('Unable to load profile', ToastAndroid.LONG);
×
135
      });
136
  }, []);
137

138
  return (
1✔
139
    <BaseLayout title="Create New Profile">
140
      <Formik initialValues={initialValues} validationSchema={addSchema} onSubmit={handleSubmit}>
141
        {(formik) => (
142
          <BaseLayout.Content>
1✔
143
            <ListItem>
144
              <ListItem.Content style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
145
                <Image />
146
              </ListItem.Content>
147
            </ListItem>
148

149
            <ListItem>
150
              <ListItem.Content>
151
                <ListItem.Title>Username</ListItem.Title>
152
                <Input
153
                  placeholder="Username"
154
                  onChangeText={(value) => handleNameChange(formik.handleChange, value)}
×
155
                  value={name}
156
                  errorMessage={<ErrorMessage name="name" />}
157
                />
158
              </ListItem.Content>
159
            </ListItem>
160
            <ListItem>
161
              <ListItem.Content>
162
                <ListItem.Title>Password</ListItem.Title>
163
                <Input
164
                  placeholder="Password"
165
                  secureTextEntry
166
                  onChangeText={(value) => handlePasswordChange(formik.handleChange, value)}
×
167
                  value={password}
168
                  errorMessage={<ErrorMessage name="password" />}
169
                />
170
              </ListItem.Content>
171
            </ListItem>
172
            <ListItem>
173
              <ListItem.Content>
174
                <ListItem.Title>Confirm Password</ListItem.Title>
175
                <Input
176
                  placeholder="Confirm Password"
177
                  secureTextEntry
178
                  onChangeText={formik.handleChange('confirmPassword')}
179
                  value={formik.confirmPassword}
180
                  errorMessage={<ErrorMessage name="confirmPassword" />}
181
                />
182
              </ListItem.Content>
183
            </ListItem>
184

185
            <View
186
              style={{ display: 'flex', flexDirection: 'column', gap: 8, paddingHorizontal: 16 }}
187
            >
188
              <Button onPress={formik.handleSubmit} loading={loading}>
189
                {loading ? 'Saving...' : 'Save'}
1!
190
              </Button>
191
              {userID && <Button title="Go to Dashboard" type="outline" onPress={goToHome} />}
1!
192
            </View>
193
          </BaseLayout.Content>
194
        )}
195
      </Formik>
196
    </BaseLayout>
197
  );
198
};
199

200
export default AddUser;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc