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

akvo / nmis-mobile / 5723893709

01 Aug 2023 07:32AM UTC coverage: 80.065% (+7.3%) from 72.774%
5723893709

push

github

wayangalihpratama
[#32] Fix prettier

636 of 840 branches covered (75.71%)

Branch coverage included in aggregate %.

1 of 1 new or added line in 1 file covered. (100.0%)

1332 of 1618 relevant lines covered (82.32%)

16.87 hits per line

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

60.0
/app/src/form/components/QuestionField.js
1
import React, { useEffect, useState } from 'react';
2
import {
3
  TypeDate,
4
  TypeImage,
5
  TypeInput,
6
  TypeMultipleOption,
7
  TypeOption,
8
  TypeText,
9
  TypeNumber,
10
  TypeGeo,
11
  TypeCascade,
12
} from '../fields';
13
import { useField } from 'formik';
14
import { View, Text } from 'react-native';
15
import { styles } from '../styles';
16
import { FormState } from '../../store';
17
import { cascades } from '../../lib';
18

19
const QuestionField = ({ keyform, field: questionField, setFieldValue, values, validate }) => {
3✔
20
  const [field, meta, helpers] = useField({ name: questionField.id, validate });
280✔
21
  const [cascadeData, setCascadeData] = useState([]);
280✔
22

23
  useEffect(() => {
280✔
24
    if (meta.error && field.name) {
50✔
25
      FormState.update((s) => {
1✔
26
        const removedErrorValues = Object.keys(s.questionGroupListCurrentValues)
1✔
27
          .filter((key) => key.toString() !== field.name.toString())
9✔
28
          .reduce((acc, curr) => ({ ...acc, [curr]: s.questionGroupListCurrentValues[curr] }), {});
8✔
29
        s.questionGroupListCurrentValues = removedErrorValues;
1✔
30
      });
31
    } else {
32
      FormState.update((s) => {
49✔
33
        s.questionGroupListCurrentValues = { ...s.questionGroupListCurrentValues, ...values };
49✔
34
      });
35
    }
36
  }, [meta.error, field.name, values]);
37

38
  const handleOnChangeField = (id, value) => {
280✔
39
    helpers.setTouched({ [field.name]: true });
×
40
    FormState.update((s) => {
×
41
      s.currentValues = { ...s.currentValues, [id]: value };
×
42
    });
43

44
    if (questionField?.meta) {
×
45
      FormState.update((s) => {
×
46
        s.dataPointName = s.dataPointName.map((dp) =>
×
47
          dp.id.toString() === id.toString()
×
48
            ? {
49
                ...dp,
50
                value: value,
51
              }
52
            : dp,
53
        );
54
      });
55
    }
56
    setFieldValue(id, value);
×
57
  };
58

59
  const loadCascadeDataSource = async (source) => {
280✔
60
    const { rows } = await cascades.loadDataSource(source);
×
61
    setCascadeData(rows._array);
×
62
  };
63

64
  useEffect(() => {
280✔
65
    if (questionField?.type === 'cascade' && questionField?.source?.file) {
49!
66
      const cascadeSource = questionField.source;
×
67
      loadCascadeDataSource(cascadeSource);
×
68
    }
69
  }, []);
70

71
  const renderField = () => {
280✔
72
    switch (questionField?.type) {
280!
73
      case 'date':
74
        return (
34✔
75
          <TypeDate
76
            keyform={keyform}
77
            onChange={handleOnChangeField}
78
            values={values}
79
            {...questionField}
80
          />
81
        );
82
      case 'image':
83
        return (
×
84
          <TypeImage
85
            keyform={keyform}
86
            onChange={handleOnChangeField}
87
            values={values}
88
            {...questionField}
89
          />
90
        );
91
      case 'multiple_option':
92
        return (
×
93
          <TypeMultipleOption
94
            keyform={keyform}
95
            onChange={handleOnChangeField}
96
            values={values}
97
            {...questionField}
98
          />
99
        );
100
      case 'option':
101
        return (
136✔
102
          <TypeOption
103
            keyform={keyform}
104
            onChange={handleOnChangeField}
105
            values={values}
106
            {...questionField}
107
          />
108
        );
109
      case 'text':
110
        return (
34✔
111
          <TypeText
112
            keyform={keyform}
113
            onChange={handleOnChangeField}
114
            values={values}
115
            {...questionField}
116
          />
117
        );
118
      case 'number':
119
        return (
42✔
120
          <TypeNumber
121
            keyform={keyform}
122
            onChange={handleOnChangeField}
123
            values={values}
124
            {...questionField}
125
          />
126
        );
127
      case 'geo':
128
        return (
×
129
          <TypeGeo
130
            keyform={keyform}
131
            onChange={handleOnChangeField}
132
            values={values}
133
            {...questionField}
134
          />
135
        );
136
      case 'cascade':
137
        return (
×
138
          <TypeCascade
139
            keyform={keyform}
140
            onChange={handleOnChangeField}
141
            values={values}
142
            {...questionField}
143
            dataSource={cascadeData}
144
          />
145
        );
146

147
      default:
148
        return (
34✔
149
          <TypeInput
150
            keyform={keyform}
151
            onChange={handleOnChangeField}
152
            values={values}
153
            {...questionField}
154
          />
155
        );
156
    }
157
  };
158

159
  return (
280✔
160
    <View>
161
      {renderField()}
162
      {meta.touched && meta.error ? (
742✔
163
        <Text style={styles.validationErrorText}>{meta.error}</Text>
164
      ) : null}
165
    </View>
166
  );
167
};
168

169
export default QuestionField;
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