From 45cff710c82b1a92c8a1c87f0c39eb6b5e90dc10 Mon Sep 17 00:00:00 2001 From: mashazyu Date: Mon, 30 Mar 2020 17:13:47 +0200 Subject: [PATCH] Separates TemperatureSlider component, adds minor post-review changes --- components/common/app-icon.js | 9 +- components/common/segment.js | 19 +--- components/settings/nfp-settings/index.js | 96 ++++++------------- components/settings/nfp-settings/label.js | 52 ---------- .../settings/nfp-settings/slider-label.js | 54 +++++++++++ .../nfp-settings/temperature-slider.js | 80 ++++++++++++++++ 6 files changed, 171 insertions(+), 139 deletions(-) delete mode 100644 components/settings/nfp-settings/label.js create mode 100644 components/settings/nfp-settings/slider-label.js create mode 100644 components/settings/nfp-settings/temperature-slider.js diff --git a/components/common/app-icon.js b/components/common/app-icon.js index b719d74..f0e4e04 100644 --- a/components/common/app-icon.js +++ b/components/common/app-icon.js @@ -5,15 +5,16 @@ import Icon from 'react-native-vector-icons/Entypo' import { Sizes } from '../../styles/redesign' -const AppIcon = ({ color, name }) => { - const style = [styles.icon, { color }] +const AppIcon = ({ color, name, style, ...props }) => { + const iconStyle = [styles.icon, style, { color }] - return + return } AppIcon.propTypes = { color: PropTypes.string, - name: PropTypes.string.isRequired + name: PropTypes.string.isRequired, + style: PropTypes.object } AppIcon.defaultProps = { diff --git a/components/common/segment.js b/components/common/segment.js index f3d8e53..935394b 100644 --- a/components/common/segment.js +++ b/components/common/segment.js @@ -3,21 +3,15 @@ import PropTypes from 'prop-types' import { StyleSheet, View } from 'react-native' import AppText from './app-text' -import AppIcon from './app-icon' -import { Colors, Containers, Spacing, Typography } from '../../styles/redesign' +import { Colors, Spacing, Typography } from '../../styles/redesign' -const Segment = ({ children, icon, last, title }) => { +const Segment = ({ children, last, title }) => { const containerStyle = last ? styles.containerLast : styles.container return ( - {title && - - {icon && } - {title} - - } + {title && {title}} {children} ) @@ -25,7 +19,6 @@ const Segment = ({ children, icon, last, title }) => { Segment.propTypes = { children: PropTypes.node, - icon: PropTypes.string, last: PropTypes.bool, title: PropTypes.string } @@ -46,13 +39,9 @@ const styles = StyleSheet.create({ containerLast: { ...segmentContainer }, - line: { - alignItems: 'center', - flexDirection: 'row' - }, title: { ...Typography.subtitle } }) -export default Segment +export default Segment \ No newline at end of file diff --git a/components/settings/nfp-settings/index.js b/components/settings/nfp-settings/index.js index e8bcff3..8e19573 100644 --- a/components/settings/nfp-settings/index.js +++ b/components/settings/nfp-settings/index.js @@ -1,87 +1,58 @@ import React, { Component } from 'react' import { StyleSheet, View } from 'react-native' -import Slider from '@ptomasroos/react-native-multi-slider' -import alertError from '../shared/alert-error' +import AppIcon from '../../common/app-icon' import AppPage from '../../common/app-page' import AppSwitch from '../../common/app-switch' import AppText from '../../common/app-text' -import Label from './label' +import TemperatureSlider from './temperature-slider' import Segment from '../../common/segment' -import { useCervixObservable, - saveUseCervix, - scaleObservable, - saveTempScale -} from '../../../local-storage' -import { Colors, Sizes } from '../../../styles/redesign' +import { useCervixObservable, saveUseCervix } from '../../../local-storage' +import { Colors, Spacing, Typography } from '../../../styles/redesign' import labels from '../../../i18n/en/settings' -import config from '../../../config' export default class Settings extends Component { constructor(props) { super(props) this.state = { - useCervix: useCervixObservable.value, - temperatureScale: { ...scaleObservable.value } + shouldUseCervix: useCervixObservable.value } } onCervixToggle = (value) => { - this.setState({ useCervix: value }) + this.setState({ shouldUseCervix: value }) saveUseCervix(value) } - onSliderChange = (values) => { - this.setState({ min: values[0], max: values[1] }) - } - - onSliderChangeFinish = (values) => { - this.setState({ min: values[0], max: values[1] }) - - try { - saveTempScale({ min: values[0], max: values[1] }) - } catch(err) { - alertError(labels.tempScale.saveError) - } - } - render() { - const { useCervix } = this.state - const cervixText = useCervix ? + const { shouldUseCervix } = this.state + const cervixText = shouldUseCervix ? labels.useCervix.cervixModeOn : labels.useCervix.cervixModeOff - const { min, max } = this.state.temperatureScale + return ( {labels.tempScale.segmentExplainer} - - - + - + + + + {labels.preOvu.title} + {labels.preOvu.note} @@ -90,25 +61,14 @@ export default class Settings extends Component { } const styles = StyleSheet.create({ - container: { - alignItems: 'center', - paddingTop: Sizes.base + icon: { + marginRight: Spacing.base }, - marker: { - backgroundColor: Colors.tourquiseDark, - borderRadius: 50, - elevation: 4, - height: Sizes.subtitle, - width: Sizes.subtitle - }, - slider: { - borderRadius: 25, - height: Sizes.small - }, - sliderAccentBackground: { - backgroundColor: Colors.tourquiseDark - }, - sliderBackground: { - backgroundColor: Colors.tourquise + line: { + flexDirection: 'row', + alignItems: 'center' }, + title: { + ...Typography.subtitle + } }) diff --git a/components/settings/nfp-settings/label.js b/components/settings/nfp-settings/label.js deleted file mode 100644 index af63de3..0000000 --- a/components/settings/nfp-settings/label.js +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { StyleSheet } from 'react-native' - -import AppText from '../../common/app-text' - -import { Sizes } from '../../../styles/redesign' - -const sliderRadius = 5 -const width = 50 - -export default class Label extends React.Component { - static propTypes = { - oneMarkerValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - twoMarkerValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - oneMarkerLeftPosition: PropTypes.number, - twoMarkerLeftPosition: PropTypes.number, - } - - - render() { - const { - oneMarkerValue, - twoMarkerValue, - oneMarkerLeftPosition, - twoMarkerLeftPosition, - } = this.props - - const minCoordinate = oneMarkerLeftPosition - width / 2 + sliderRadius - const maxCoordinate = twoMarkerLeftPosition - width / 2 + sliderRadius - const isMinNumber = Number.isFinite(oneMarkerLeftPosition) && - Number.isFinite(oneMarkerValue) - const isMaxNumber = Number.isFinite(twoMarkerLeftPosition) && - Number.isFinite(twoMarkerValue) - const minStyle = [styles.label, { left: minCoordinate }] - const maxStyle = [styles.label, { left: maxCoordinate }] - - return ( - - {isMinNumber && {oneMarkerValue}} - {isMaxNumber && {twoMarkerValue}} - - ) - } -} - -const styles = StyleSheet.create({ - label: { - position: 'absolute', - marginTop: (-1) * Sizes.base - } -}) \ No newline at end of file diff --git a/components/settings/nfp-settings/slider-label.js b/components/settings/nfp-settings/slider-label.js new file mode 100644 index 0000000..d251003 --- /dev/null +++ b/components/settings/nfp-settings/slider-label.js @@ -0,0 +1,54 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { StyleSheet } from 'react-native' + +import AppText from '../../common/app-text' + +import { Fonts, Sizes } from '../../../styles/redesign' + +const sliderRadius = 5 +const width = 50 + +const getMarkerCoordinate = (position) => { + return position - width / 2 + sliderRadius +} + +const SliderLabel = ({ + oneMarkerValue, + twoMarkerValue, + oneMarkerLeftPosition, + twoMarkerLeftPosition +}) => { + const minCoordinate = getMarkerCoordinate(oneMarkerLeftPosition) + const maxCoordinate = getMarkerCoordinate(twoMarkerLeftPosition) + const isMinNumber = Number.isFinite(oneMarkerLeftPosition) && + Number.isFinite(oneMarkerValue) + const isMaxNumber = Number.isFinite(twoMarkerLeftPosition) && + Number.isFinite(twoMarkerValue) + const minStyle = [styles.label, { left: minCoordinate }] + const maxStyle = [styles.label, { left: maxCoordinate }] + + return ( + + {isMinNumber && {oneMarkerValue}} + {isMaxNumber && {twoMarkerValue}} + + ) +} + +SliderLabel.propTypes = { + oneMarkerValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + twoMarkerValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + oneMarkerLeftPosition: PropTypes.number, + twoMarkerLeftPosition: PropTypes.number +} + +const styles = StyleSheet.create({ + label: { + fontFamily: Fonts.bold, + position: 'absolute', + marginTop: (-1) * Sizes.base + } +}) + +export default SliderLabel \ No newline at end of file diff --git a/components/settings/nfp-settings/temperature-slider.js b/components/settings/nfp-settings/temperature-slider.js new file mode 100644 index 0000000..94db021 --- /dev/null +++ b/components/settings/nfp-settings/temperature-slider.js @@ -0,0 +1,80 @@ +import React, { Component } from 'react' +import { StyleSheet, View } from 'react-native' +import Slider from '@ptomasroos/react-native-multi-slider' + +import alertError from '../shared/alert-error' +import SliderLabel from './slider-label' + +import { scaleObservable, saveTempScale } from '../../../local-storage' +import { Colors, Sizes } from '../../../styles/redesign' +import labels from '../../../i18n/en/settings' +import config from '../../../config' + +export default class TemperatureSlider extends Component { + constructor(props) { + super(props) + + const { min, max } = scaleObservable.value + this.state = { minTemperature: min, maxTemperature: max } + } + + onTemperatureSliderChange = (values) => { + this.setState({ + minTemperature: values[0], + maxTemperature: values[1] + }) + + try { + saveTempScale({ min: values[0], max: values[1] }) + } catch(err) { + alertError(labels.tempScale.saveError) + } + } + + render() { + const { minTemperature, maxTemperature } = this.state + + return ( + + + + ) + } +} + +const styles = StyleSheet.create({ + container: { + alignItems: 'center', + paddingTop: Sizes.base + }, + marker: { + backgroundColor: Colors.tourquiseDark, + borderRadius: 50, + elevation: 4, + height: Sizes.subtitle, + width: Sizes.subtitle + }, + slider: { + borderRadius: 25, + height: Sizes.small + }, + sliderAccentBackground: { + backgroundColor: Colors.tourquiseDark + }, + sliderBackground: { + backgroundColor: Colors.tourquise + }, +})