|
|
@ -1,5 +1,6 @@ |
|
|
|
import React from 'react'; |
|
|
|
import { DatePickerIOS, requireNativeComponent, StyleSheet } from 'react-native'; |
|
|
|
import moment from 'moment' |
|
|
|
|
|
|
|
const NativeDatePicker = requireNativeComponent(`DatePickerManager`, DatePickerAndroid, { nativeOnly: { onChange: true } }); |
|
|
|
|
|
|
@ -10,30 +11,37 @@ class DatePickerAndroid extends React.Component { |
|
|
|
minuteInterval: 1, |
|
|
|
}; |
|
|
|
|
|
|
|
render = () => ( |
|
|
|
<NativeDatePicker |
|
|
|
{...this.props} |
|
|
|
date={this._date()} |
|
|
|
minimumDate={this._minimumDate()} |
|
|
|
maximumDate={this._maximumDate()} |
|
|
|
onChange={this._onChange} |
|
|
|
style={[styles.picker, this.props.style]} |
|
|
|
/> |
|
|
|
) |
|
|
|
|
|
|
|
_onChange = e => this.props.onDateChange(new Date(parseInt(e.nativeEvent.date + this._getOffsetMillis()))); |
|
|
|
_maximumDate = () => this._toUnixMillisWithTimeZoneOffset(this.props.maximumDate); |
|
|
|
_minimumDate = () => this._toUnixMillisWithTimeZoneOffset(this.props.minimumDate); |
|
|
|
_date = () => this._toUnixMillisWithTimeZoneOffset(this.props.date); |
|
|
|
_toUnixMillisWithTimeZoneOffset = date => date && this._toUnixMillis(date) - this._getOffsetMillis(); |
|
|
|
_toUnixMillis = date => date.getTime() |
|
|
|
|
|
|
|
_getOffsetMillis = () => this.props.timeZoneOffsetInMinutes === undefined ? 0 |
|
|
|
: -toMs(this.props.timeZoneOffsetInMinutes + new Date().getTimezoneOffset()) |
|
|
|
render = () => { |
|
|
|
return ( |
|
|
|
<NativeDatePicker |
|
|
|
{...this.props} |
|
|
|
date={this._date()} |
|
|
|
minimumDate={this._minimumDate()} |
|
|
|
maximumDate={this._maximumDate()} |
|
|
|
onChange={this._onChange} |
|
|
|
style={[styles.picker, this.props.style]} |
|
|
|
/> |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
_onChange = e => { |
|
|
|
const momentDateWithOffset = moment(e.nativeEvent.date).add(this._getOffsetMinutes(), 'minutes') |
|
|
|
const jsDate = momentDateWithOffset.toDate() |
|
|
|
this.props.onDateChange(jsDate) |
|
|
|
} |
|
|
|
|
|
|
|
const toMs = minutes => minutes * 60 * 1000 |
|
|
|
_maximumDate = () => this._toIsoWithTimeZoneOffset(this.props.maximumDate); |
|
|
|
|
|
|
|
_minimumDate = () => this._toIsoWithTimeZoneOffset(this.props.minimumDate); |
|
|
|
|
|
|
|
_date = () => this._toIsoWithTimeZoneOffset(this.props.date); |
|
|
|
|
|
|
|
_toIsoWithTimeZoneOffset = date => date && moment(date).add( -this._getOffsetMinutes(), 'minutes').toISOString() |
|
|
|
|
|
|
|
_getOffsetMinutes = () => this.props.timeZoneOffsetInMinutes === undefined ? 0 |
|
|
|
: -(this.props.timeZoneOffsetInMinutes + new Date().getTimezoneOffset()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
const styles = StyleSheet.create({ |
|
|
|
picker: { |
|
|
|