UNPKG

react-native-lunar-calendars

Version:

React Native Calendar Components with Lunar Calendar Support - Fork of react-native-calendars with Vietnamese lunar calendar functionality

226 lines (225 loc) 10 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var react_1 = __importStar(require("react")); var react_native_1 = require("react-native"); var reservation_1 = __importDefault(require("./reservation")); var prop_types_1 = __importDefault(require("prop-types")); var xdate_1 = __importDefault(require("xdate")); var dateutils_1 = __importDefault(require("../../dateutils")); var style_1 = __importDefault(require("./style")); var ReactComp = /** @class */ (function (_super) { __extends(ReactComp, _super); function ReactComp(props) { var _this = _super.call(this, props) || this; _this.styles = (0, style_1.default)(props.theme); _this.state = { reservations: [] }; _this.heights = []; _this.selectedDay = _this.props.selectedDay; _this.scrollOver = true; return _this; } ReactComp.prototype.componentDidMount = function () { this.updateDataSource(this.getReservations(this.props).reservations); }; ReactComp.prototype.updateDataSource = function (reservations) { this.setState({ reservations: reservations }); }; ReactComp.prototype.updateReservations = function (props) { var reservations = this.getReservations(props); if (this.list && !dateutils_1.default.sameDate(props.selectedDay, this.selectedDay)) { var scrollPosition = 0; for (var i = 0; i < reservations.scrollPosition; i++) { scrollPosition += this.heights[i] || 0; } this.scrollOver = false; this.list.scrollToOffset({ offset: scrollPosition, animated: true }); } this.selectedDay = props.selectedDay; this.updateDataSource(reservations.reservations); }; ReactComp.prototype.componentWillReceiveProps = function (props) { var _this = this; if (!dateutils_1.default.sameDate(props.topDay, this.props.topDay)) { this.setState({ reservations: [] }, function () { _this.updateReservations(props); }); } else { this.updateReservations(props); } }; ReactComp.prototype.onScroll = function (event) { var yOffset = event.nativeEvent.contentOffset.y; this.props.onScroll(yOffset); var topRowOffset = 0; var topRow; for (topRow = 0; topRow < this.heights.length; topRow++) { if (topRowOffset + this.heights[topRow] / 2 >= yOffset) { break; } topRowOffset += this.heights[topRow]; } var row = this.state.reservations[topRow]; if (!row) return; var day = row.day; var sameDate = dateutils_1.default.sameDate(day, this.selectedDay); if (!sameDate && this.scrollOver) { this.selectedDay = day.clone(); this.props.onDayChange(day.clone()); } }; ReactComp.prototype.onRowLayoutChange = function (ind, event) { this.heights[ind] = event.nativeEvent.layout.height; }; ReactComp.prototype.renderRow = function (_a) { var item = _a.item, index = _a.index; return (<react_native_1.View onLayout={this.onRowLayoutChange.bind(this, index)}> <reservation_1.default item={item} renderItem={this.props.renderItem} renderDay={this.props.renderDay} renderEmptyDate={this.props.renderEmptyDate} theme={this.props.theme} rowHasChanged={this.props.rowHasChanged}/> </react_native_1.View>); }; ReactComp.prototype.getReservationsForDay = function (iterator, props) { var day = iterator.clone(); var res = props.reservations[day.toString('yyyy-MM-dd')]; if (res && res.length) { return res.map(function (reservation, i) { return { reservation: reservation, date: i ? false : day, day: day }; }); } else if (res) { return [{ date: iterator.clone(), day: day }]; } else { return false; } }; ReactComp.prototype.onListTouch = function () { this.scrollOver = true; }; ReactComp.prototype.getReservations = function (props) { if (!props.reservations || !props.selectedDay) { return { reservations: [], scrollPosition: 0 }; } var reservations = []; if (this.state.reservations && this.state.reservations.length) { var iterator_1 = this.state.reservations[0].day.clone(); while (iterator_1.getTime() < props.selectedDay.getTime()) { var res = this.getReservationsForDay(iterator_1, props); if (!res) { reservations = []; break; } else { reservations = reservations.concat(res); } iterator_1.addDays(1); } } var scrollPosition = reservations.length; var iterator = props.selectedDay.clone(); for (var i = 0; i < 31; i++) { var res = this.getReservationsForDay(iterator, props); if (res) { reservations = reservations.concat(res); } iterator.addDays(1); } return { reservations: reservations, scrollPosition: scrollPosition }; }; ReactComp.prototype.render = function () { var _this = this; if (!this.props.reservations || !this.props.reservations[this.props.selectedDay.toString('yyyy-MM-dd')]) { if (this.props.renderEmptyData) { return this.props.renderEmptyData(); } return (<react_native_1.ActivityIndicator style={{ marginTop: 80 }}/>); } return (<react_native_1.FlatList ref={function (c) { return _this.list = c; }} style={this.props.style} contentContainerStyle={this.styles.content} renderItem={this.renderRow.bind(this)} data={this.state.reservations} onScroll={this.onScroll.bind(this)} showsVerticalScrollIndicator={false} scrollEventThrottle={200} onMoveShouldSetResponderCapture={function () { _this.onListTouch(); return false; }} keyExtractor={function (item, index) { return String(index); }}/>); }; ReactComp.propTypes = { // specify your item comparison function for increased performance rowHasChanged: prop_types_1.default.func, // specify how each item should be rendered in agenda renderItem: prop_types_1.default.func, // specify how each date should be rendered. day can be undefined if the item is not first in that day. renderDay: prop_types_1.default.func, // specify how empty date content with no items should be rendered renderEmptyDate: prop_types_1.default.func, // callback that gets called when day changes while scrolling agenda list onDayChange: prop_types_1.default.func, // onScroll ListView event onScroll: prop_types_1.default.func, // the list of items that have to be displayed in agenda. If you want to render item as empty date // the value of date key kas to be an empty array []. If there exists no value for date key it is // considered that the date in question is not yet loaded reservations: prop_types_1.default.object, selectedDay: prop_types_1.default.instanceOf(xdate_1.default), topDay: prop_types_1.default.instanceOf(xdate_1.default), }; return ReactComp; }(react_1.Component)); exports.default = ReactComp;