├── .babelrc ├── .buckconfig ├── .eslintrc.js ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── ROADMAP.md ├── ReactNativePaginationExample ├── .babelrc ├── .buckconfig ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .npmignore ├── .watchmanconfig ├── App.js ├── FakerMocks.js ├── Pages │ ├── HorizontalAdvancedFlatList.js │ ├── HorizontalPagedFlatListExample.js │ ├── VerticalAdvancedFlatList.js │ ├── VerticalBasicFlatList.js │ └── widgets │ │ ├── ContactItem.js │ │ ├── RobotItem.js │ │ └── TweetItem.js ├── __tests__ │ ├── HorizontalBasicFlatList.test.js │ ├── __snapshots__ │ │ └── index.ios.js.snap │ └── index.ios.js ├── app.json ├── index.android.js ├── index.ios.js ├── index.js ├── package.json └── yarn.lock ├── __tests__ └── index.test.js ├── package.json ├── react-native-pagination ├── components │ ├── Dot.js │ └── Icon.js └── index.js ├── yarn-error.log └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"] 3 | } 4 | -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // ESLint configuration 2 | // http://eslint.org/docs/user-guide/configuring 3 | module.exports = { 4 | parser: "babel-eslint", 5 | extends: ['eslint:recommended', "plugin:react/recommended"], 6 | // "airbnb", // builds upon airbnb's linting rules 7 | // "plugin:css-modules/recommended", // fixes css/scss 8 | // "prettier", // prettier is an opinionated formatter. Only runs of files that changes 9 | // "prettier/react", // follow react prittier rules flowtype 10 | // "plugin:react/recommended" 11 | // "plugin:react/all", 12 | // "plugin:react", 13 | // "plugin:eslint:all" 14 | // ], 15 | // plugins: ["css-modules", "prettier"], 16 | plugins: ["react"], 17 | // global variables 18 | globals: { 19 | __DEV__: true 20 | }, 21 | // envoriments eslint is expected to run. 22 | env: { 23 | browser: true, 24 | node: true 25 | }, 26 | settings: { 27 | // Allow absolute paths in imports, e.g. import Button from 'components/Button' 28 | // https://github.com/benmosher/eslint-plugin-import/tree/master/resolvers 29 | "import/resolver": { 30 | node: { 31 | moduleDirectory: ["node_modules", "src"] 32 | } 33 | } 34 | }, 35 | rules: { 36 | // Rules 37 | // ------------------------------- 38 | // 0: off 39 | // 1: show warning (same as ['warn']) 40 | // 2: show error. (same as ['error']) 41 | 42 | // JavaScript Specific Rules 43 | // ------------------------------- 44 | "comma-dangle": 2, 45 | indent: [ 46 | "warn", 47 | 2, 48 | { 49 | SwitchCase: 1, 50 | VariableDeclarator: { 51 | var: 2, 52 | let: 2, 53 | const: 3 54 | } 55 | } 56 | ], 57 | "no-trailing-spaces": [ 58 | 2, 59 | { 60 | skipBlankLines: true 61 | } 62 | ], 63 | "max-nested-callbacks": [2, 5], 64 | "no-eval": 2, 65 | "no-implied-eval": 2, 66 | "no-new-func": 2, 67 | "guard-for-in": 2, 68 | eqeqeq: 1, 69 | "no-else-return": 2, 70 | "no-redeclare": 2, 71 | "no-dupe-keys": 2, 72 | "no-shadow": 0, 73 | "no-delete-var": 2, 74 | "no-undef-init": 2, 75 | "no-shadow-restricted-names": 2, 76 | curly: ["error", "multi"], 77 | "handle-callback-err": 0, 78 | "no-lonely-if": 0, 79 | "keyword-spacing": 2, 80 | "constructor-super": 2, 81 | "no-this-before-super": 2, 82 | "no-dupe-class-members": 2, 83 | "no-const-assign": 2, 84 | "prefer-spread": 2, 85 | "no-useless-concat": 2, 86 | "no-var": 2, 87 | "object-shorthand": 2, 88 | "prefer-arrow-callback": 2, 89 | quotes: [ 90 | 2, 91 | "single", 92 | { 93 | avoidEscape: true 94 | } 95 | ], 96 | "new-cap": 1, 97 | "no-param-reassign": 1, 98 | "import/extensions": 1, 99 | "consistent-return": 1, 100 | "jsx-a11y/click-events-have-key-events": 1, 101 | "jsx-a11y/no-static-element-interactions": 1, 102 | // Forbid the use of extraneous packages 103 | // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-extraneous-dependencies.md 104 | "import/no-extraneous-dependencies": [ 105 | "error", 106 | { 107 | packageDir: "." 108 | } 109 | ], 110 | "no-multiple-empty-lines": ["error", { "max": 0, "maxEOF": 0 }], 111 | // Recommend not to leave any console.log in your code 112 | // Use console.error, console.warn and console.info instead 113 | // https://eslint.org/docs/rules/no-console 114 | "no-console": [ 115 | "error", 116 | { 117 | allow: ["warn", "error", "info"] 118 | } 119 | ], 120 | "no-else-return": ["error", { "allowElseIf": false }], 121 | "no-useless-return":2, 122 | "no-useless-return":2, 123 | // Prefer destructuring from arrays and objects 124 | // http://eslint.org/docs/rules/prefer-destructuring 125 | // "prefer-destructuring": [ 126 | // "error", 127 | // { 128 | // VariableDeclarator: { 129 | // array: false, 130 | // object: true 131 | // }, 132 | // AssignmentExpression: { 133 | // array: false, 134 | // object: false 135 | // } 136 | // }, 137 | // { 138 | // enforceForRenamedProperties: false 139 | // } 140 | // ], 141 | // Ensure tags are valid 142 | // https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md 143 | "jsx-a11y/anchor-is-valid": [ 144 | "error", 145 | { 146 | components: ["Link"], 147 | specialLink: ["to"], 148 | aspects: ["noHref", "invalidHref", "preferButton"] 149 | } 150 | ], 151 | // "jsx-quotes": [2, "double"], // This rule was introduced in ESLint 1.4.0. have to have an upto date eslint // https://eslint.org/docs/rules/jsx-quotes 152 | // REACT Specific Rules 153 | // ------------------------------- 154 | // TODO: due to the sheer number of issues this will just display warnings, and not errors for now. They should get stricter as we go. 155 | // https://github.com/yannickcr/eslint-plugin-react#list-of-supported-rules 156 | "react/prop-types": 1, // warn about missing proptypes 157 | "react/sort-comp": 1, // makes sure your life cycle methods are in order 158 | "import/no-named-as-default": 1, 159 | "react/no-did-mount-set-state": 1, 160 | "react/jsx-no-bind": 1, 161 | // Allow .js files to use JSX syntax 162 | // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-filename-extension.md 163 | "react/jsx-filename-extension": [ 164 | "error", 165 | { 166 | extensions: [".js", ".jsx"] 167 | } 168 | ], 169 | // Functional and class components are equivalent from React’s point of view 170 | // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-stateless-function.md 171 | "react/jsx-max-props-per-line": [2, { maximum: 8 }], 172 | "react/jsx-indent": 2, 173 | "react/jsx-handler-names": [ 174 | 2, 175 | { 176 | eventHandlerPrefix: "handle", 177 | eventHandlerPropPrefix: "on" 178 | } 179 | ], 180 | "react/jsx-no-target-blank": 2, // this is how you wann format each 181 | "react/jsx-indent-props": [2, 2], // [ , ] 182 | "react/forbid-component-props": 2, 183 | "react/boolean-prop-naming": 2, 184 | "react/boolean-prop-naming": [ 185 | "error", 186 | { 187 | rule: "^(is|has)[A-Z]([A-Za-z0-9]?)+", 188 | message: 189 | 'It is better if your boolean ({{ propName }}) starts with "is" or "has" (e.g. isEnabled)' 190 | } 191 | ], 192 | "react/no-render-return-value": 2, 193 | "react/no-unused-prop-types": 2, 194 | "react/no-unknown-property": 2, // catches class v className 195 | "react/no-string-refs": 2, 196 | "react/no-will-update-set-state": 2, 197 | "react/no-unused-state": 2, 198 | "react/self-closing-comp": [ 199 | "error", 200 | { 201 | component: true, 202 | html: true 203 | } 204 | ], 205 | "react/jsx-equals-spacing": [2, "never"], // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-equals-spacing.md#never 206 | "jsx-curly-spacing": [ 207 | 2, 208 | { 209 | when: "always", 210 | spacing: { objectLiterals: "never" }, 211 | allowMultiline: false 212 | } 213 | ], 214 | 215 | // react/jsx-wrap-multilines BIG ONE HERE https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-wrap-multilines.md 216 | "react/jsx-wrap-multilines": [ 217 | 2, 218 | { 219 | // "declaration": "parens", 220 | declaration: "parens-new-line", 221 | assignment: "parens", 222 | return: "parens", 223 | arrow: "parens", 224 | condition: "parens-new-line", 225 | logical: "parens", 226 | prop: "ignore" 227 | } 228 | ], 229 | "react/jsx-tag-spacing": [ 230 | 2, 231 | { 232 | //https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-tag-spacing.md 233 | closingSlash: "never", 234 | beforeSelfClosing: "always", 235 | afterOpening: "never", 236 | // "beforeClosing": "allow" 237 | beforeClosing: "never" 238 | } 239 | ], 240 | "react/jsx-sort-props": [ 241 | 2, 242 | { 243 | callbacksLast: true, 244 | shorthandFirst: true, 245 | shorthandLast: true, 246 | ignoreCase: true, 247 | noSortAlphabetically: true, 248 | reservedFirst: true // React reserved props (children, dangerouslySetInnerHTML - only for DOM components, key, and ref) 249 | // "reservedFirst": true|["string"], // cusotm 250 | } 251 | ], 252 | "react/jsx-curly-brace-presence": [ 253 | 2, 254 | { props: "never", children: "never" } 255 | ], 256 | // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-curly-brace-presence.md 257 | 258 | "no-unused-vars": 2, // https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-uses-vars.md 259 | // "react/jsx-pascal-case": [2, { allowAllCaps: false, ignore: `` }], 260 | "react/jsx-pascal-case": 2, 261 | "react/style-prop-object": 2, 262 | "react/sort-prop-types": [ 263 | 2, 264 | { 265 | callbacksLast: true, 266 | ignoreCase: true, 267 | requiredFirst: true, 268 | sortShapeProp: true 269 | } 270 | ], 271 | "react/jsx-no-undef": 2, // remove un used imports of JSX files 272 | "react/sort-comp": [ 273 | 2, 274 | { 275 | order: [ 276 | "static-methods", 277 | "lifecycle", 278 | "getters", 279 | "setters", 280 | "/^on.+$/", 281 | "/^update.+$/", 282 | "/^set.+$/", 283 | "/^check.+$/", 284 | "/^handleResize.+$/", 285 | "runGetData", 286 | "everything-else", 287 | "render" 288 | ], 289 | groups: { 290 | "static-methods": [ 291 | "propTypes", 292 | "storeShape", 293 | "loadData", 294 | "getPageSize", 295 | "dataUrl", 296 | "updateAnalyics", 297 | "insertPromoTile", 298 | "setSeoData" 299 | ], 300 | lifecycle: [ 301 | "displayName", 302 | "propTypes", 303 | "contextTypes", 304 | "childContextTypes", 305 | "mixins", 306 | "statics", 307 | "defaultProps", 308 | "constructor", 309 | "getDefaultProps", 310 | "getInitialState", 311 | "state", 312 | "getChildContext", 313 | "componentWillMount", 314 | "componentDidMount", 315 | "componentWillReceiveProps", 316 | "shouldComponentUpdate", 317 | "componentWillUpdate", 318 | "componentDidUpdate", 319 | "componentWillUnmount" 320 | ] 321 | } 322 | } 323 | ] 324 | 325 | // Flow Rules 326 | // ------------------------------- 327 | // "flowtype/boolean-style": [2, "boolean"], 328 | // "flowtype/define-flow-type": 1, 329 | // "flowtype/generic-spacing": [2, "never"], 330 | // "flowtype/no-primitive-constructor-types": 2, 331 | // "flowtype/no-weak-types": 2, 332 | // "flowtype/object-type-delimiter": [2, "comma"], 333 | // "flowtype/no-types-missing-file-annotation": 1, 334 | // "flowtype/require-valid-file-annotation": 1, 335 | // "flowtype/semi": [2, "always"], 336 | // "flowtype/space-after-type-colon": [2, "always"], 337 | // "flowtype/space-before-generic-bracket": [2, "never"], 338 | // "flowtype/space-before-type-colon": [2, "never"], 339 | // "flowtype/union-intersection-spacing": [2, "always"], 340 | // "flowtype/use-flow-type": 1, 341 | // "flowtype/valid-syntax": 1, 342 | // Custom Rules 343 | // ------------------------------- 344 | // ESLint plugin for prettier formatting 345 | // https://github.com/prettier/eslint-plugin-prettier 346 | // "prettier/prettier": "warn" 347 | } 348 | }; 349 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | logs 4 | 5 | node_modules/ 6 | 7 | ReactNativePaginationExample/react-native-pagination 8 | ReactNativePaginationExample/node_modules 9 | ReactNativePaginationExample/ios 10 | ReactNativePaginationExample/android 11 | coverage/ 12 | .coveralls.yml 13 | .travis.yml 14 | 15 | images 16 | 17 | 18 | #tests 19 | 20 | 21 | #build tools 22 | .travis.yml 23 | .jenkins.yml 24 | package-lock.json 25 | #linters 26 | .jscsrc 27 | .jshintrc 28 | 29 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | logs 4 | 5 | node_modules/ 6 | 7 | ReactNativePaginationExample/react-native-pagination 8 | ReactNativePaginationExample/node_modules 9 | ReactNativePaginationExample/ios 10 | ReactNativePaginationExample/android 11 | coverage/ 12 | .coveralls.yml 13 | .travis.yml 14 | 15 | images 16 | 17 | 18 | #tests 19 | 20 | 21 | #build tools 22 | .travis.yml 23 | .jenkins.yml 24 | package-lock.json 25 | #linters 26 | .jscsrc 27 | .jshintrc 28 | .eslintrc* 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Garrett Mac 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

7 | react-native-pagination 8 | 9 |

10 | 11 |

12 | The best Pagination component for React Native. 13 |

14 |

15 | 16 | npm version 17 | npm version 18 | npm version 19 | npm version 20 | PR Stats 21 | Issue Stats 22 | 23 | 24 | 25 | 26 | Join the chat 27 | 28 | 29 | 30 |

31 | 32 | # React Native Pagination 33 | 34 | 35 | 36 | ## Roadmap 37 | 38 | > see: [ROADMAP.md](ROADMAP.md) 39 | 40 | 41 | ### Horizontal 42 | 43 | > To try these out yourself its prudy easy, Just open `examples/ios/*.xcodeproj` in Xcode, then press `Cmd + R`; you may edit `examples/index.ios.js` for switch cases. 44 | 45 |

46 | 47 | react-native-pagination horizontal robot 48 | react-native-pagination horizontal 49 |

50 | 51 | ### Vertical 52 | 53 |

54 | react-native-pagination vertical 55 | react-native-pagination lighttheme 56 |

57 | 58 | ## Getting Started 59 | 60 | - [React Native Pagination](#react-native-pagination) 61 | * [ROADMAP.md](#roadmap) 62 | * [Show Cases](#show-cases) 63 | + [Horizontal](#horizontal) 64 | + [Vertical](#vertical) 65 | * [Getting Started](#getting-started) 66 | * [Installation](#installation) 67 | + [Example](#example) 68 | + [Development](#development) 69 | * [Basic Usage](#basic-usage) 70 | * [Properties](#properties) 71 | + [Basic](#basic) 72 | - [Basic Props](#basic-props) 73 | - [Basic Styles](#basic-styles) 74 | + [Start/End Dots](#start-end-dots) 75 | - [Start/End Dot Basic Props](#start-end-dot-basic-props) 76 | - [Start/End Dot Text](#start-end-dot-text) 77 | + [Pagination Dots](#pagination-dots) 78 | - [Pagination Dots Basic Props](#pagination-dots-basic-props) 79 | - [Dot Text](#dot-text) 80 | - [Pagination Dots](#pagination-dots-1) 81 | + [Advanced Positioning](#advanced-positioning) 82 | + [Visibility](#visibility) 83 | + [Methods](#methods) 84 | + [Other](#other) 85 | * [Components](#components) 86 | * [Issues](#issues) 87 | 88 | 89 | ## Installation 90 | 91 | - Install `react-native` first 92 | ```bash 93 | $ npm i react-native -g 94 | $ yarn add react-native-pagination 95 | $ cd ReactNativePaginationExample 96 | $ yarn install #(or with npm "npm i react-native-pagination —save") 97 | $ react-native run-ios 98 | ``` 99 | - Initialization of a react-native project 100 | ```bash 101 | $ react-native init myReactNativePaginationExample 102 | $ cd myReactNativePaginationExample 103 | $ yarn install #(or with npm "npm i && npm i react-native-pagination —save") 104 | $ yarn add react-native-pagination 105 | $ react-native link 106 | $ react-native run-ios 107 | ``` 108 | 109 | 110 | ### Example 111 | or clone the repo and play with the example project 112 | 113 | ```bash 114 | $ git clone https://github.com/garrettmac/react-native-pagination 115 | $ cd react-native-pagination/ReactNativePaginationExample 116 | $ yarn install 117 | $ react-native link 118 | $ react-native run-ios 119 | ``` 120 | one liner 121 | ```bash 122 | git clone https://github.com/garrettmac/react-native-pagination && cd react-native-pagination/ReactNativePaginationExample && yarn install && react-native link && react-native run-ios 123 | ``` 124 | 125 | > Quick start with [ReactNativePaginationExample](https://github.com/garrettmac/react-native-pagination/tree/master/ReactNativePaginationExample/). 126 | 127 | ### Development 128 | in your project 129 | ```bash 130 | $ yarn add react-native-pagination 131 | $ react-native link #this makes sure react-native-vector-icons load correctly 132 | $ react-native run-ios 133 | ``` 134 | 135 | 136 | 137 | ## Basic Usage 138 | - In your `myApp/index.ios.js`, use: 139 | 140 | ```jsx 141 | import React, { Component } from 'react'; 142 | import {AppRegistry,StyleSheet,View,FlatList,} from 'react-native'; 143 | import ContactItem from './Pages/widgets/ContactItem'; // https://github.com/garrettmac/react-native-pagination/blob/master/ReactNativePaginationExample/Pages/widgets/ContactItem.js 144 | import faker from 'faker';//assuming you have this. 145 | import _ from 'lodash'; 146 | import Pagination,{Icon,Dot} from 'react-native-pagination';//{Icon,Dot} also available 147 | 148 | //lets use faker to create mock data 149 | let MockPersonList = new _.times(35,(i)=>{ 150 | return { 151 | id:i, 152 | index:i, 153 | name:faker.name.findName(), 154 | avatar:faker.internet.avatar(), 155 | group:_.sample(["Family","Friend","Acquaintance","Other"]), 156 | email:faker.internet.email(), 157 | } 158 | }) 159 | 160 | export default class ReactNativePaginationExample extends Component { 161 | constructor(props){ 162 | super(props); 163 | this.state = { 164 | items: MockPersonList, 165 | }; 166 | } 167 | //create each list item 168 | _renderItem = ({item}) => { 169 | return () 177 | }; 178 | //pressed an item 179 | onPressItem = (item) => console.log("onPressItem:item ",item); 180 | 181 | //map to some od. We use the "id" attribute of each item in our list created in our MockPersonList 182 | _keyExtractor = (item, index) => item.id.toString(); 183 | 184 | // REQUIRED for ReactNativePagination to work correctly 185 | onViewableItemsChanged = ({ viewableItems, changed }) =>this.setState({viewableItems}) 186 | 187 | render() { 188 | return ( 189 | 190 | this.refs=r}//create refrence point to enable scrolling 193 | keyExtractor={this._keyExtractor}//map your keys to whatever unique ids the have (mine is a "id" prop) 194 | renderItem={this._renderItem}//render each item 195 | onViewableItemsChanged={this.onViewableItemsChanged}//need this 196 | /> 197 | 198 | this.refs=r}" to your list) 201 | paginationVisibleItems={this.state.viewableItems}//needs to track what the user sees 202 | paginationItems={this.state.items}//pass the same list as data 203 | paginationItemPadSize={3} //num of items to pad above and below your visable items 204 | /> 205 | 206 | ) 207 | } 208 | }; 209 | 210 | const s = StyleSheet.create({ 211 | container: { 212 | flex: 1, 213 | // backgroundColor:"grey",//<-- use with "dotThemeLight" 214 | }, 215 | }); 216 | 217 | AppRegistry.registerComponent('ReactNativePaginationExample', () => App); 218 | ``` 219 | 220 | Currently only supported for FlatList's 221 | 222 | ## Properties 223 | All properties took text editors auto completion into consideration and follow the basic structure 224 | [`prefix`][`body`][`suffix` ] where 225 | [`component name` ][`component attribute`][`continued component attribute / component change`] to provide users with the full list of options when working with `prefix`'s without having to revisit the official docs. 226 | 227 | *Most Common Component Prefix Options*:`dot`, `startDot`,`endDot` 228 | *Most Common Component Body Options*:`Icon`, `Font`,`Style` ,`Color` 229 | *Most Common Component Suffix Options*:`Hide`, `Size`,`IconFamily` ,or `NotActive`,`Active` `Empty` 230 | Resulting props like 231 | `dotIconHide` ,`startDotIconHide`, or `startFontSize`,`endDotStyle` ect. 232 | 233 | ### Basic 234 | #### Basic Props 235 | 236 | | Prop | Default | Type | Description | 237 | |------------------|------------------|------------------|------------------| 238 | | paginationItems | `[]` | `array` |an array pagination Items| 239 | |paginationVisibleItems|`[]`|`array`|an array pagination visible items obtained by using React Native List Components `onViewableItemsChanged` callback function (see example) | 240 | |dotThemeLight |`false`|`bool`| if you pass in the `dotThemeLight` prop (setting it to `true`) the pagination dots swaps to a a light theme. By default they are dark. | 241 | |horizontal |`false`|`bool`| use to alternate between horizontal and vertical (just like you do with your list component) | 242 | |dotAnimation|`LayoutAnimation.Presets.easeInEaseOut`|`Animation`|dot Animation triggered when navigating| 243 | |paginationStyle|`{}`|`style`|pagination Styles| 244 | |pagingEnabled|`false`|`bool`| Enable Paging. This is a prop that is also used in React Native List Components (like `FlatList`) that gives you that paging effect that stops the scroll on every new page. | 245 | |hideEmptyDots|`false`|`bool`| Hide Empty Dots Icons| 246 | |paginationItemPadSize|`3`|`number`|pagination Item Pad Size| 247 | 248 | 249 | 250 | 251 | #### Basic Styles 252 | 253 | | Prop | Default | Type | Description | 254 | |------------------|------------------|------------------|------------------| 255 | |`paginationStyle` when horizontal|`{height, alignItems:"center" , justifyContent: 'space-between', position:"absolute", top:0, margin:0, bottom:0, right:0, bottom:0, padding:0, flex:1, }` | `style`| default when horizontal| 256 | |`paginationStyle` when not horizontal|`{width, alignItems:"center", justifyContent: 'space-between', position:"absolute", margin:0, bottom:10, left:0, right:0, padding:0, flex:1,}` | `style`| default when not horizontal| 257 | |textStyle|`{}`|`style object`| global style object. Tread lightly it may overlay if you plan to use my default Light/Dark Themes | 258 | |dotStyle|`{}`|`style object`| addition style to use for pagination dots | 259 | |startDotStyle|`{}`|`style object`| addition style to use for start dots | 260 | |endDotStyle`|`{}`|`style object`| addition style to use for end dots | 261 | > this uses react-native-vector-icons [checkout here] (https://github.com/oblador/react-native-vector-icons) 262 | 263 | ### Start/End Dots 264 | #### Start/End Dot Basic Props 265 | | Prop | Default | Type | Description | 266 | |------------------|------------------|------------------|------------------| 267 | |`startDotIconName` (when `horizontal`)|`”chevron-left”`|`icon name`| Icon shown for dot at start of list | 268 | |`startDotIconName` (when `vertical`)|`”chevron-up”`|`icon name`| Icon shown for dot at start of list | 269 | |`endDotIconName` (when `horizontal`)|`”chevron-right”`|`icon name`| Icon shown for dot at start of list | 270 | |`endDotIconName` (when `vertical` )|`”chevron-down”`|`icon name`| Icon shown for dot at start of list | 271 | |`startDotIconSize` |`15`|`number`| end icon dot size| 272 | |`endDotIconSize`|`15`|`number`| end icon dot size| 273 | |`startDotIconFamily` / `endDotIconFamily`|`MaterialCommunityIcons`|`string` of font family name | Font Family for Icon. options: `Entypo`, `EvilIcons`, `FontAwesome`, `Foundation`, `Ionicons`, `MaterialIcons`, `MaterialCommunityIcons`, `Octicons`, `Zocial`, `SimpleLineIcons` (available in react-native-vector-icons package)| 274 | 275 | #### Start/End Dot Text 276 | 277 | | Prop | Default | Type | Description | 278 | |------------------|------------------|------------------|------------------| 279 | |startDotFontSize|`11`|`number`|start Dot Font Size | 280 | |endDotFontSize|`11`|`number`|end Dot Font Size | 281 | 282 | ### Pagination Dots 283 | These are the list of dots that represent each item in your paginationItems 284 | #### Pagination Dots Basic Props 285 | | Prop | Default | Type | Description | 286 | |------------------|------------------|------------------|------------------| 287 | |`dotIconFamily`|`”MaterialCommunityIcons”`|`string` of font family name | Font Family for Icon. options: `Entypo`, `EvilIcons`, `FontAwesome`, `Foundation`, `Ionicons`, `MaterialIcons`, `MaterialCommunityIcons`, `Octicons`, `Zocial`, `SimpleLineIcons` (available in react-native-vector-icons package) | 288 | |dotIconNameEmpty|`”close”`|`icon name`| Icon Shown when pagination dot is Empty | 289 | |dotIconNameActive|`”checkbox-blank-circle”`|`icon name`| Icon Shown when pagination dot is Active| 290 | |dotIconNameNotActive|`”checkbox-blank-circle-outline”`|`icon name`| Icon Shown when pagination dot is Not Active| 291 | |dotIconSizeActive|`15`|`number`| size of pagination icon when active | 292 | |dotIconSizeNotActive|`10`|`number`| size of pagination iconwhen vertical | 293 | |dotIconColorNotActive|`”rgba(0,0,0,.5)”`|`color`|dot Icon Font Size when on page but Not Active| 294 | |dotIconColorActive|`”rgba(0,0,0,.3)”`|`color`|dot Icon Font Size when on page but Not Active| 295 | |dotIconColorEmpty|`”rgba(0,0,0,.2)”`|`color`|dot Icon Font Size when on page but Not Active| 296 | 297 | **when using dotThemeLight** 298 | 299 | | Prop | Default | Type | Description | 300 | |------------------|------------------|------------------|------------------| 301 | |dotIconColorNotActive| `”rgba(255,255,255,.4)”`|`color`|dot Icon Font Size when on page but Not Active| 302 | |dotIconColorActive| `”rgba(255,255,255,.5)”`|`color`|dot Icon Font Size when on page but Not Active| 303 | |dotIconColorEmpty| `”rgba(255,255,255,.2)”`|`color`|dot Icon Font Size when on page but Not Active| 304 | 305 | 306 | 307 | #### Dot Text 308 | by default it displays `index+1`, if you'd like display text add the `paginationDotText` property to each one of your items before passing it into the `Pagination` 309 | 310 | Component. Example: 311 | 312 | ```javascript 313 | paginationItems=paginationItems.map(o=>{ 314 | o.paginationDotText=o.name; 315 | return o 316 | }) 317 | ``` 318 | 319 | 320 | #### Pagination Dots 321 | | Prop | Default | Type | Description | 322 | |------------------|------------------|------------------|------------------| 323 | |dotFontSizeActive|11|`number`|dot Text Font Size when Active on page | 324 | |dotFontSizeEmpty|11|`number`|dot Text Font Size when empty on page | 325 | |dotFontSizeNotActive|9|`number`|dot Text Font Size when on page but Not Active | 326 | |dotTextColorNotActive|`”rgba(0,0,0,.5)”` |`color`|dot Text Color when Not Active| 327 | |dotTextColorActive|`”rgba(0,0,0,.3)”` |`color`| dot Text Color when Active| 328 | |dotTextColorEmpty|`”rgba(0,0,0,.2)”` |`color`|dot Text Color when Empty| 329 | 330 | **when using dotThemeLight** 331 | 332 | | Prop | Default | Type | Description | 333 | |------------------|------------------|------------------|------------------| 334 | |dotTextColorNotActive| `”rgba(255,255,255,.4)”` |`color`|dot Text Color when Not Active| 335 | |dotTextColorActive| `”rgba(255,255,255,.5)”` |`color`| dot Text Color when Active| 336 | |dotTextColorEmpty| `”rgba(255,255,255,.2)”`|`color`|dot Text Color when Empty| 337 | 338 | 339 | ### Advanced Positioning 340 | | Prop | Default | Type | Description | 341 | |------------------|------------------|------------------|------------------| 342 | |`dotSwapAxis` (all pagination dots)/ `startDotSwapAxis` / `endDotSwapAxis`|false|`bool`|keeps the lists in the correct position (horizontal or vertical) by swaps how dots display | 343 | |`dotPositionSwap` (all pagination dots)/`startDotPositionSwap` / `endDotPositionSwap`|false|`bool`| Swaps the dots `flexDirection` default style property. | 344 | 345 | Wanna move anything to the left, right, top, or bottom of something? Then use `dotSwapAxis` in combination until you find the right mix `startDotPositionSwap`. 346 | 347 | ### Visibility 348 | | Prop | Default | Type | Description | 349 | |------------------|------------------|------------------|------------------| 350 | |`dotIconHide` / `startDotIconHide` / `endDotIconHide` |false |`bool`| hide the dots icon | 351 | |`dotIconHide` / `startDotIconHide` / `endDotIconHide` |false|`bool`| hide the dots icon | 352 | |`dotTextHide` / `startDotTextHide` / `endDotTextHide` |false|`bool`| hide the dots text | 353 | |`dotEmptyHide` |false|`bool`| hide the dots text | 354 | 355 | ### Methods 356 | | Method Name | Description | 357 | |---------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 358 | | `dotOnPress` / `startDotOnPress` /`endDotOnPress` | by default it will scroll to the pagination dot pressed (`disableDotOnPressNavigation` to turn off), if you'd like a callback you can pass in the `dotOnPress` callback function | 359 | 360 | 361 | ### Other 362 | | Prop | Default | Type | Description | 363 | |------------------|------------------|------------------|------------------| 364 | |`debugMode` | false |`bool`| show console log results of list items | 365 | 366 | ## Components 367 | | Components | Required Params | Other Params | Description | 368 | |------------------|------------------|------------------|------------------| 369 | |`Pagination` | `paginationItems`,`paginationVisibleItems` |see above| main pagination Component | 370 | |`Dot` | `` |see above| Pagination Dot Component | 371 | |`Icon` | `name` | `iconFamily`,`size`,`color` | same as 'react-native-vector-icons' but with a `iconFamily` option| 372 | 373 | 374 | 375 | ## Issues 376 | 377 | Feel free to [contact me](mailto:garrett@vyga.io) or [create an issue](https://github.com/garrettmac/react-native-pagination/issues/new) 378 | -------------------------------------------------------------------------------- /ROADMAP.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garrettmac/react-native-pagination/100b1e7b761df54a82d8b1fcf4620701af7c85c2/ROADMAP.md -------------------------------------------------------------------------------- /ReactNativePaginationExample/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"] 3 | } 4 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | module.system=haste 28 | 29 | munge_underscores=true 30 | 31 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 32 | 33 | suppress_type=$FlowIssue 34 | suppress_type=$FlowFixMe 35 | suppress_type=$FixMe 36 | 37 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-7]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 38 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-7]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 41 | 42 | unsafe.enable_getters_and_setters=true 43 | 44 | [version] 45 | ^0.47.0 46 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://docs.fastlane.tools/best-practices/source-control/ 50 | 51 | */fastlane/report.xml 52 | */fastlane/Preview.html 53 | */fastlane/screenshots 54 | 55 | # Bundle artifact 56 | *.jsbundle 57 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/.npmignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 50 | 51 | fastlane/report.xml 52 | fastlane/Preview.html 53 | fastlane/screenshots 54 | yarn.lock 55 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /ReactNativePaginationExample/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | Dimensions, 4 | Platform, 5 | ScrollView, 6 | StyleSheet, 7 | Text, 8 | TouchableOpacity, 9 | View 10 | } from 'react-native'; 11 | const { width, height } = Dimensions.get('window'); 12 | import HorizontalAdvancedFlatList from './Pages/HorizontalAdvancedFlatList'; 13 | import HorizontalPagedFlatListExample from './Pages/HorizontalPagedFlatListExample'; 14 | /* 15 | * Import HorizontalBasicListView from './Pages/HorizontalBasicListView'; 16 | * Import HorizontalBasicSectionList from './Pages/HorizontalBasicSectionList'; 17 | */ 18 | import VerticalAdvancedFlatList from './Pages/VerticalAdvancedFlatList'; 19 | import VerticalBasicFlatList from './Pages/VerticalBasicFlatList'; 20 | /* 21 | * Import VerticalBasicListView from './Pages/VerticalBasicListView'; 22 | * Import VerticalBasicSectionList from './Pages/VerticalBasicSectionList'; 23 | */ 24 | export default class App extends Component { 25 | constructor(props) { 26 | super(props); 27 | this.state = { 28 | 29 | /* 30 | * Component: HorizontalAdvancedFlatList, 31 | * Component: HorizontalPagedFlatListExample, 32 | * Component: HorizontalBasicListView, 33 | */ 34 | Component: null, 35 | showHeader: true 36 | }; 37 | 38 | } 39 | 40 | renderExample([ 41 | Component, 42 | title, 43 | backgroundColor 44 | ]) { 45 | return ( 46 | this.setState({ Component })} 53 | > 54 | 57 | {title} 58 | 59 | 60 | ); 61 | } 62 | 63 | renderBackButton() { 64 | return ( 65 | this.setState({ showHeader: true, 68 | Component: null })} 69 | > 70 | 73 | ← Back 74 | 75 | 76 | ); 77 | } 78 | 79 | renderExamples(examples) { 80 | 81 | const { 82 | Component 83 | } = this.state; 84 | return ( 85 | 86 | {Component && 87 | 88 | } 89 | {Component && this.renderBackButton()} 90 | {!Component && 91 | 95 | 99 | 104 | React Native Pagination 105 | 106 | 111 | Example Application 112 | 113 | 120 | 121 | 126 | {examples.map((example) => this.renderExample(example))} 127 | 128 | 129 | } 130 | 131 | ); 132 | } 133 | 134 | render() { 135 | return this.renderExamples([ 136 | // [, ,] 137 | [ 138 | HorizontalAdvancedFlatList, 139 | 'Horizontal Advanced FlatList Example', 140 | 'rgba(0,166,155,.8)' 141 | ], 142 | [ 143 | HorizontalPagedFlatListExample, 144 | 'Horizontal Paged Example', 145 | 'rgba(0,136,155,.8)' 146 | ], 147 | 148 | /* 149 | * [HorizontalBasicListView , 'Horizontal Basic ListView Example',"rgba(0,106,155,.8)"], 150 | * [HorizontalBasicSectionList , 'Horizontal Basic SectionList Example',"rgba(0,76,155,.8)"], 151 | */ 152 | [ 153 | VerticalAdvancedFlatList, 154 | 'Vertical FlatList Example', 155 | 'rgba(166,0,155,.8)' 156 | ], 157 | [ 158 | VerticalBasicFlatList, 159 | 'Vertical FlatList Example \n (Dots Light Theme)', 160 | 'rgba(166,0,125,.8)' 161 | ] 162 | 163 | /* 164 | * [VerticalBasicListView , 'Vertical Basic ListView Example',"rgba(166,0,95,.8)"], 165 | * [VerticalBasicSectionList , 'Vertical Basic SectionList Example',"rgba(166,0,65,.8)"], 166 | */ 167 | ]); 168 | } 169 | } 170 | const styles = StyleSheet.create({ 171 | container: { 172 | ...StyleSheet.absoluteFillObject, 173 | justifyContent: 'flex-end', 174 | alignItems: 'center' 175 | }, 176 | scrollview: { 177 | alignItems: 'center', 178 | paddingVertical: 40 179 | }, 180 | button: { 181 | flex: 1, 182 | marginTop: 8, 183 | paddingHorizontal: 18, 184 | paddingVertical: 11, 185 | borderRadius: 5 186 | }, 187 | back: { 188 | position: 'absolute', 189 | top: 10, 190 | left: 0, 191 | padding: 12, 192 | width: 80, 193 | alignItems: 'center', 194 | justifyContent: 'center' 195 | } 196 | }); 197 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/FakerMocks.js: -------------------------------------------------------------------------------- 1 | import faker from 'faker'; 2 | import _ from 'lodash'; 3 | const MockPersonList = new _.times(35, (i) => ({ 4 | id: i, 5 | index: i, 6 | key: i, 7 | name: faker.name.findName(), 8 | avatar: faker.internet.avatar(), 9 | group: _.sample([ 10 | 'Family', 11 | 'Friend', 12 | 'Acquaintance', 13 | 'Other' 14 | ]), 15 | email: faker.internet.email() 16 | })), 17 | MockRobotsList = new _.times(15, (i) => ({ 18 | id: i, 19 | index: i, 20 | key: i, 21 | name: faker.name.findName(), 22 | avatar: faker.internet.avatar(), 23 | group: _.sample([ 24 | 'Work', 25 | 'Friend', 26 | 'Acquaintance', 27 | 'Other' 28 | ]), 29 | email: faker.internet.email() 30 | })), 31 | MockTweetList = new _.times(15, (i) => ({ 32 | id: i, 33 | index: i, 34 | key: i, 35 | title: faker.name.jobTitle(), 36 | city: faker.address.city(), 37 | type: faker.name.jobType(), 38 | color: faker.internet.color(), 39 | description: faker.lorem.sentence(), 40 | // Image:faker.image.business(), 41 | image: faker.internet.avatar() 42 | })); 43 | export { MockPersonList, MockRobotsList, MockTweetList }; 44 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/HorizontalAdvancedFlatList.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import { 4 | Dimensions, 5 | FlatList, 6 | Image, 7 | LayoutAnimation, 8 | StyleSheet, 9 | Text, 10 | TouchableOpacity, 11 | View 12 | } from 'react-native'; 13 | import Ionicons from 'react-native-vector-icons/Ionicons'; 14 | import _ from 'lodash'; 15 | import { MockRobotsList } from '../FakerMocks'; 16 | import Pagination from 'react-native-pagination'; 17 | const { width, height } = Dimensions.get('window'); 18 | const ITEM_HEIGHT = 100; 19 | export default class HorizontalAdvancedFlatList extends Component { 20 | constructor(props) { 21 | super(props); 22 | this.state = { 23 | isLoading: false, 24 | activeId: null, 25 | activeItem: null, 26 | items: MockRobotsList 27 | }; 28 | } 29 | 30 | getFlatListItems = () => { 31 | this.setState({ isLoading: true }); 32 | LayoutAnimation.configureNext(LayoutAnimation.Presets.spring); 33 | setTimeout(() => { 34 | this.setState({ 35 | isLoading: false, 36 | items: MockRobotsList 37 | }); 38 | }, 2000); 39 | }; 40 | 41 | setItemAsActive(activeItem) { 42 | this.setState({ scrollToItemRef: activeItem }); 43 | this.setState({ 44 | activeId: activeItem.index, 45 | activeItem: activeItem.item 46 | }); 47 | } 48 | renderItem = (o, i) => { 49 | return ( 50 | 59 | this.setItemAsActive(o)} 61 | style={[ 62 | s.renderItem, 63 | this.state.activeId === _.get(o, 'item.id', false) 64 | ? { backgroundColor: '#01a699' } 65 | : { backgroundColor: '#ff5b5f' } 66 | ]} 67 | > 68 | 75 | 83 | {o.item.name ? o.item.name : 'no name attrabute'} 84 | 85 | 86 | 87 | ); 88 | }; 89 | 90 | clearList() { 91 | this.setState({ items: [] }); 92 | } 93 | onEndReached(o) { 94 | console.log(' reached end: ', o); 95 | } 96 | 97 | onViewableItemsChanged = ({ viewableItems }) => 98 | this.setState({ viewableItems }); 99 | 100 | render() { 101 | const ListEmptyComponent = () => ( 102 | 111 | this.getFlatListItems()}> 112 | 120 | Nothing is Here! 121 | 122 | 129 | Try Again? 130 | 131 | 132 | 133 | ); 134 | return ( 135 | 136 | 137 | {!this.state.activeItem && ( 138 | 145 | 154 | Make a Selection! 155 | 156 | 157 | )} 158 | 159 | {this.state.activeItem && ( 160 | this.setItemAsActive(this.state.activeItem)} 162 | style={[s.renderItem, s.activeItem]} 163 | > 164 | 175 | 176 | {_.get(this.state.activeItem, 'name', 'No Default')} 177 | 178 | 179 | )} 180 | 181 | this.clearList()} 183 | style={s.trashButton} 184 | > 185 | 190 | 191 | 192 | 193 | 194 | (this.refs = r)} 200 | getItemLayout={(data, index) => ({ 201 | length: ITEM_HEIGHT, 202 | offset: ITEM_HEIGHT * index, 203 | index 204 | })} 205 | //onEndReached={this._onEndReached} 206 | onRefresh={o => alert('onRefresh:', o)} 207 | initialScrollIndex={0} 208 | refreshing={this.state.isLoading} 209 | onEndReached={o => this.onEndReached} 210 | keyExtractor={(o, i) => o.key.toString()} 211 | data={this.state.items} 212 | scrollRenderAheadDistance={width * 2} 213 | renderItem={this.renderItem} 214 | onViewableItemsChanged={this.onViewableItemsChanged} 215 | /> 216 | this.clearList()} 218 | style={{ 219 | position: 'absolute', 220 | backgroundColor: 'ff5b5f', 221 | right: 35, 222 | top: 0, 223 | margin: 10, 224 | zIndex: 3, 225 | height: 35, 226 | alignItems: 'center', 227 | justifyContent: 'center', 228 | backgroundColor: 'transparent' 229 | }} 230 | > 231 | 236 | 237 | this.clearList()} 239 | style={{ 240 | position: 'absolute', 241 | backgroundColor: 'ff5b5f', 242 | right: 0, 243 | top: 0, 244 | margin: 10, 245 | zIndex: 3, 246 | height: 35, 247 | alignItems: 'center', 248 | justifyContent: 'center', 249 | backgroundColor: 'transparent' 250 | }} 251 | > 252 | 257 | 258 | 259 | this.refs=r}" to your list) 265 | dotIconNameNotActive={'account-outline'} 266 | dotIconNameEmpty={'account-off'} 267 | dotIconNameActive={'account-settings'} 268 | dotTextHide 269 | dotIconSizeNotActive={20} 270 | dotIconSizeActive={27} 271 | dotIconSizeEmpty={27} 272 | //iconColorhasNotSeen={"red"} 273 | paginationVisibleItems={this.state.viewableItems} //needs to track what the user sees 274 | paginationItems={this.state.items} //pass the same list as data 275 | paginationItemPadSize={3} 276 | /> 277 | 278 | 279 | ); 280 | } 281 | } 282 | const s = StyleSheet.create({ 283 | container: { 284 | flex: 1, 285 | height, 286 | width, 287 | justifyContent: 'center', 288 | alignItems: 'center', 289 | backgroundColor: '#F5FCFF' 290 | }, 291 | innerContainer: { 292 | flex: 1, 293 | height, 294 | width, 295 | justifyContent: 'center', 296 | alignItems: 'center', 297 | backgroundColor: '#01a699' 298 | }, 299 | text: { 300 | fontWeight: '600', 301 | fontSize: 100, 302 | textAlignVertical: 'center', 303 | textAlign: 'center' 304 | }, 305 | renderItem: { 306 | // width: ITEM_HEIGHT, 307 | borderColor: 'rgba(0,0,0,.3)', 308 | shadowColor: 'rgba(0,0,0,.3)', 309 | // height: ITEM_HEIGHT, 310 | // margin: 10, 311 | justifyContent: 'center', 312 | alignItems: 'center', 313 | borderRadius: 50, 314 | borderWidth: 3, 315 | shadowOffset: { 316 | width: 3, 317 | height: 3 318 | }, 319 | shadowRadius: 6, 320 | shadowOpacity: 0.8 321 | }, 322 | activeItem: { 323 | borderColor: 'rgba(255,255,255,1)', 324 | backgroundColor: '#f5fcff', 325 | shadowColor: 'rgba(255,255,255,1)' 326 | }, 327 | name: { 328 | position: 'absolute', 329 | bottom: -34, 330 | left: 0, 331 | right: 0, 332 | backgroundColor: 'transparent', 333 | fontSize: 12, 334 | width: 100, 335 | textAlign: 'center', 336 | fontWeight: '600' 337 | }, 338 | trashButton: { 339 | position: 'absolute', 340 | backgroundColor: '#ff5b5f', 341 | right: 0, 342 | bottom: 0, 343 | margin: 10, 344 | zIndex: 3, 345 | height: 35, 346 | alignItems: 'center', 347 | justifyContent: 'center', 348 | backgroundColor: 'transparent' 349 | }, 350 | image: { 351 | width: 96, 352 | height: 96, 353 | borderRadius: 48 354 | } 355 | }); 356 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/HorizontalPagedFlatListExample.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Import React, { Component } from 'react'; 3 | * Import {AppRegistry} from 'react-native'; 4 | * Import App from './App.js'; 5 | * AppRegistry.registerComponent('ReactNativePaginationExample', () => App); 6 | */ 7 | import React, { Component } from 'react'; 8 | import { AppRegistry, FlatList, StyleSheet, Text, View } from 'react-native'; 9 | // Get here [TODO ADD URL] 10 | import TweetItem from './widgets/TweetItem'; 11 | import Pagination from 'react-native-pagination'; 12 | import _ from 'lodash';// If you dont have this then gtfo 13 | import { MockTweetList } from '../FakerMocks'; 14 | export default class HorizontalPagedFlatListExample extends Component { 15 | constructor(props) { 16 | super(props); 17 | this.state = { 18 | items: MockTweetList 19 | // Selected: (new Map(): Map), 20 | }; 21 | } 22 | // Render list seen here [TODO ADD URL] 23 | _renderItem = ({ item }) => (); 34 | // Map to some key. We use the "id" attribute of each item in our list created in our MockTweetList 35 | _keyExtractor = (item, index) => item.id.toString() 36 | // REQUIRED for ReactNativePagination to work correctly 37 | onViewableItemsChanged = ({ viewableItems, changed }) => this.setState({ viewableItems }) 38 | render() { 39 | return ( 40 | 41 | this.refs = r} 43 | data={this.state.items} 44 | horizontal 45 | keyExtractor={this._keyExtractor} 46 | onViewableItemsChanged={this.onViewableItemsChanged}// Map your keys to whatever unique ids the have (mine is a "id" prop) 47 | pagingEnabled 48 | renderItem={this._renderItem} 49 | /> 50 | console.log(' clicked: ', o)} 54 | hideEmptyDots 55 | pagingEnabled 56 | startDotIconFamily="Ionicons" 57 | startDotIconName="ios-arrow-back" 58 | endDotIconFamily="Ionicons" 59 | endDotIconName="ios-arrow-forward" 60 | dotIconName="ios-close" 61 | hideEmptyDots 62 | dotIconFamily="Ionicons" 63 | dotIconNameNotActive="logo-twitter" 64 | dotIconNameActive="logo-twitter" 65 | dotEmptyHide 66 | dotIconColorActive="white" 67 | dotIconColorNotActive="rgba(255,255,255,0.5)" 68 | // DotIconColorEmpty={"blue"} 69 | dotIconSizeActive={25} 70 | /* 71 | * DotIconSizeNotActive={10} 72 | * StartDotIconSize={30} 73 | * EndDotIconSize={30} 74 | */ 75 | listRef={this.refs}// To allow React Native Pagination to scroll to item when clicked (so add "ref={r=>this.refs=r}" to your list) 76 | paginationVisibleItems={this.state.viewableItems}// Needs to track what the user sees 77 | paginationItems={this.state.items}// Pass the same list as data 78 | paginationItemPadSize={3} 79 | /> 80 | ); 81 | } 82 | } 83 | const s = StyleSheet.create({ 84 | container: { 85 | flex: 1, 86 | backgroundColor: 'grey'// <-- use with "dotThemeLight" 87 | } 88 | }); 89 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/VerticalAdvancedFlatList.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import { 4 | Dimensions, 5 | FlatList, 6 | Image, 7 | StyleSheet, 8 | Text, 9 | TouchableHighlight, 10 | TouchableOpacity, 11 | View 12 | } from 'react-native'; 13 | const { width, height } = Dimensions.get('window'); 14 | import _ from 'lodash'; 15 | import PropTypes from 'prop-types'; 16 | import { MockPersonList } from '../FakerMocks'; 17 | import Pagination from 'react-native-pagination'; 18 | // Import {getMoviesFromApi} from './ListItems'; 19 | import ContactItem from './widgets/ContactItem'; 20 | export default class VerticalAdvancedFlatList extends Component { 21 | state = { 22 | items: MockPersonList, 23 | selected: new Map() 24 | }; 25 | _keyExtractor = (item, index) => item.id.toString(); 26 | _onPressItem = (id: string) => { 27 | // Updater functions are preferred for transactional updates 28 | this.setState(state => { 29 | // Copy the map rather than modifying state. 30 | const selected = new Map(state.selected); 31 | selected.set(id, !selected.get(id)); // Toggle 32 | return { selected }; 33 | }); 34 | }; 35 | _renderItem = ({ item }) => ( 36 | // console.log(" item: ",item); 37 | 48 | ); 49 | // need this 50 | onViewableItemsChanged = ({ viewableItems, changed }) => { 51 | this.setState({ viewableItems, changed }); 52 | }; 53 | 54 | render() { 55 | let heading = 'Contacts', 56 | subheading = 'Flat List Vertical Example'; 57 | let ListHeaderComponent = ( 58 | 59 | 62 | {heading ? heading : 'Heading'} 63 | 64 | 67 | {subheading} 68 | 69 | 79 | 80 | ); 81 | return ( 82 | 83 | (this.refs = r)} 86 | keyExtractor={this._keyExtractor} // map your keys to whatever unique ids the have (mine is a "key" proptery) 87 | renderItem={this._renderItem} 88 | onViewableItemsChanged={this.onViewableItemsChanged} 89 | /> 90 | this.refs=r}" to your list) 104 | paginationVisibleItems={this.state.viewableItems} // needs to track what the user sees 105 | paginationItems={this.state.items} // pass the same list as data 106 | paginationItemPadSize={3} // num of items to pad above and bellow your visable items 107 | /> 108 | 109 | ); 110 | } 111 | } 112 | const s = StyleSheet.create({ 113 | container: { 114 | flex: 1 115 | // BackgroundColor:"grey", 116 | }, 117 | pagination: { 118 | backgroundColor: 'rgba(0,0,0,0)', 119 | width, 120 | position: 'absolute', 121 | right: 0, 122 | left: 0, 123 | bottom: 7, 124 | padding: 0, 125 | flex: 1, 126 | justifyContent: 'center', 127 | alignItems: 'center', 128 | flexDirection: 'row' 129 | }, 130 | containerMarginTop: { 131 | marginTop: 30 132 | } 133 | }); 134 | VerticalAdvancedFlatList.defaultProps = { 135 | data: MockPersonList 136 | }; 137 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/VerticalBasicFlatList.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import { 4 | Dimensions, 5 | FlatList, 6 | Image, 7 | StyleSheet, 8 | Text, 9 | TouchableHighlight, 10 | TouchableOpacity, 11 | View 12 | } from 'react-native'; 13 | const { width, height } = Dimensions.get('window'); 14 | import _ from 'lodash'; 15 | import PropTypes from 'prop-types'; 16 | import { MockPersonList } from '../FakerMocks'; 17 | import Pagination from 'react-native-pagination'; 18 | import ContactItem from './widgets/ContactItem'; 19 | export default class VerticalBasicFlatList extends Component { 20 | state = { 21 | items: MockPersonList, 22 | selected: new Map() 23 | }; 24 | _keyExtractor = (item, index) => item.id.toString(); 25 | _onPressItem = (id: string) => { 26 | // Updater functions are preferred for transactional updates 27 | this.setState(state => { 28 | // Copy the map rather than modifying state. 29 | const selected = new Map(state.selected); 30 | selected.set(id, !selected.get(id)); // Toggle 31 | return { selected }; 32 | }); 33 | }; 34 | _renderItem = ({ item }) => ( 35 | // console.log(" item: ",item); 36 | 47 | ); 48 | _renderIteme = ({ item, separators }) => { 49 | console.log(' item: ', item); 50 | return ( 51 | this._onPress(item)} 53 | onShowUnderlay={separators.highlight} 54 | onHideUnderlay={separators.unhighlight} 55 | > 56 | 57 | {item.title}} 58 | 59 | 60 | ); 61 | }; 62 | // need this 63 | onViewableItemsChanged = ({ viewableItems, changed }) => { 64 | this.setState({ viewableItems, changed }); 65 | }; 66 | render() { 67 | let heading = 'Contacts', 68 | subheading = 'Flat List Vertical Example'; 69 | let ListHeaderComponent = ( 70 | 71 | 74 | {heading ? heading : 'Heading'} 75 | 76 | 79 | {subheading} 80 | 81 | 91 | 92 | ); 93 | return ( 94 | 95 | (this.refs = r)} 97 | data={this.state.items} 98 | keyExtractor={this._keyExtractor} // map your keys to whatever unique ids the have (mine is a "key" proptery) 99 | onViewableItemsChanged={this.onViewableItemsChanged} 100 | renderItem={this._renderItem} 101 | /> 102 | this.refs=r}" to your list) 113 | paginationVisibleItems={this.state.viewableItems} // needs to track what the user sees 114 | paginationItems={this.state.items} // pass the same list as data 115 | paginationItemPadSize={3} // num of items to pad above and bellow your visable items 116 | /> 117 | 118 | ); 119 | } 120 | } 121 | const s = StyleSheet.create({ 122 | container: { 123 | flex: 1, 124 | backgroundColor: '#1a2530' 125 | }, 126 | pagination: { 127 | backgroundColor: 'rgba(0,0,0,0)', 128 | width, 129 | position: 'absolute', 130 | right: 0, 131 | left: 0, 132 | bottom: 7, 133 | padding: 0, 134 | flex: 1, 135 | justifyContent: 'center', 136 | alignItems: 'center', 137 | flexDirection: 'row' 138 | }, 139 | containerMarginTop: { 140 | marginTop: 30 141 | } 142 | }); 143 | VerticalBasicFlatList.defaultProps = { 144 | data: MockPersonList 145 | }; 146 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/widgets/ContactItem.js: -------------------------------------------------------------------------------- 1 | PropTypes; 2 | import React, { Component } from 'react'; 3 | import { 4 | Dimensions, 5 | FlatList, 6 | Image, 7 | StyleSheet, 8 | Text, 9 | TouchableOpacity, 10 | View 11 | } from 'react-native'; 12 | const { width, height } = Dimensions.get('window'); 13 | import _ from 'lodash'; 14 | import PropTypes from 'prop-types'; 15 | export default class ListItem extends Component { 16 | // Generates a Hex Color for a string 17 | stringToHex(str) { 18 | if (!str) str = 'none'; 19 | let hash = 0; 20 | for (var i = 0; i < str.length; i++) 21 | hash = str.charCodeAt(i) + ((hash << 5) - hash); 22 | let color = '#'; 23 | for (var i = 0; i < 3; i++) { 24 | const value = (hash >> (i * 8)) & 0xff; 25 | color += `00${value.toString(16)}`.substr(-2); 26 | } 27 | return color; 28 | } 29 | 30 | render() { 31 | const { 32 | name, 33 | avatar, 34 | color, 35 | seen, 36 | selected, 37 | key, 38 | id, 39 | tag, 40 | onPressItem, 41 | description 42 | } = this.props; 43 | // Console.log(" this.props: ",this.props); 44 | let TagColor = '#33333'; 45 | if (color) TagColor = color; 46 | if (!color && tag) TagColor = this.stringToHex(this.props.tag); 47 | return ( 48 | onPressItem(item)} 57 | > 58 | 70 | 76 | 86 | 95 | {tag} 96 | 97 | 98 | {avatar && ( 99 | 110 | )} 111 | 112 | 118 | 125 | 131 | {name} 132 | 133 | 134 | {description && ( 135 | 143 | {' '} 144 | {description} 145 | 146 | )} 147 | 148 | 149 | 150 | ); 151 | } 152 | } 153 | ListItem.propTypes = { 154 | onPressItem: PropTypes.func, 155 | // Selected:PropTypes.bool, 156 | seen: PropTypes.bool, 157 | name: PropTypes.string, 158 | avatar: PropTypes.string, 159 | tag: PropTypes.string, 160 | createTagColor: PropTypes.bool 161 | }; 162 | ListItem.DefaultProps = { 163 | /* 164 | * Name:PropTypes.string, 165 | * avatar:PropTypes.string, 166 | * tag:"", 167 | */ 168 | selected: false, 169 | createTagColor: true 170 | }; 171 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/widgets/RobotItem.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | Dimensions, 4 | Image, 5 | LayoutAnimation, 6 | StyleSheet, 7 | Text, 8 | TouchableHighlight, 9 | TouchableOpacity, 10 | View 11 | } from 'react-native'; 12 | const darkColor = 'black', 13 | lightColor = 'white', 14 | // Import randomcolor from 'randomcolor'; 15 | { width, height } = Dimensions.get('window'); 16 | import _ from 'lodash'; 17 | import PropTypes from 'prop-types'; 18 | export default class RobotItem extends Component { 19 | render() { 20 | 21 | const { 22 | key, 23 | image, 24 | title, 25 | color, 26 | description, 27 | type, 28 | city 29 | } = this.props; 30 | console.log(' key: ', key); 31 | return ( 32 | 46 | 47 | 52 | 53 | {title} 54 | 55 | 56 | 61 | 66 | ff 67 | {city} 68 | 69 | 70 | 71 | 72 | 73 | 74 | {description} 75 | 76 | 77 | 78 | { 81 | LayoutAnimation.easeInEaseOut(); 82 | 83 | /* 84 | * This.setState({ 85 | * footerText: this.state.footerText + 1 86 | * }) 87 | */ 88 | }} 89 | > 90 | 97 | {city} 98 | - 99 | {description} 100 | 101 | 102 | 107 | {description} 108 | 109 | 110 | 111 | ); 112 | 113 | } 114 | } 115 | const s = StyleSheet.create({ 116 | bodyText: { 117 | fontSize: 32, 118 | color: 'white', 119 | backgroundColor: 'transparent', 120 | margin: 20 121 | }, 122 | linearGradient: { 123 | flex: 1, 124 | paddingLeft: 15, 125 | paddingRight: 15, 126 | borderRadius: 5 127 | }, 128 | reactionBox: { 129 | flex: 1, 130 | justifyContent: 'flex-end', 131 | margin: 40 132 | }, 133 | description: { 134 | textAlign: 'center', 135 | backgroundColor: 'transparent', 136 | fontSize: 10, 137 | padding: 15, 138 | color: 'white', 139 | textShadowRadius: 10, 140 | textShadowOffset: { 141 | width: 5, 142 | heigth: 5 143 | } 144 | }, 145 | footerText: { 146 | textAlign: 'center', 147 | backgroundColor: 'transparent', 148 | // FontSize: 10, 149 | color: 'white', 150 | padding: 0 151 | }, 152 | buttonText: { 153 | fontSize: 18, 154 | fontFamily: 'Gill Sans', 155 | textAlign: 'center', 156 | margin: 10, 157 | color: '#ffffff', 158 | backgroundColor: 'transparent' 159 | }, 160 | // ------- 161 | profilePicture: { 162 | width: 50, 163 | height: 50, 164 | borderRadius: 25, 165 | backgroundColor: 'white', 166 | margin: 20, 167 | marginRight: 10 168 | }, 169 | displayName: { 170 | backgroundColor: 'transparent', 171 | color: 'white', 172 | marginLeft: 0, 173 | marginTop: 22, 174 | fontSize: 20, 175 | marginBottom: 5 176 | }, 177 | badgeSection: { 178 | flex: 1, 179 | alignItems: 'flex-end', 180 | marginRight: 20, 181 | justifyContent: 'center' 182 | }, 183 | badgeSlug: { 184 | borderRadius: 15, 185 | paddingVertical: 5, 186 | paddingHorizontal: 12 187 | }, 188 | badgeText: { 189 | textAlign: 'center', 190 | fontSize: 10, 191 | fontWeight: 'bold' 192 | } 193 | }); 194 | RobotItem.propTypes = { 195 | index: PropTypes.number, 196 | name: PropTypes.string, 197 | avatar: PropTypes.string, 198 | group: PropTypes.string, 199 | email: PropTypes.string 200 | }; 201 | RobotItem.DefaultProps = { 202 | 203 | /* 204 | * Title:PropTypes.string, 205 | * image:PropTypes.string, 206 | * tag:"", 207 | */ 208 | selected: false, 209 | createTagColor: true 210 | }; 211 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/Pages/widgets/TweetItem.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { 3 | Dimensions, 4 | Image, 5 | LayoutAnimation, 6 | StyleSheet, 7 | Text, 8 | TouchableHighlight, 9 | TouchableOpacity, 10 | View 11 | } from 'react-native'; 12 | const darkColor = 'black', 13 | lightColor = 'white', 14 | // Import randomcolor from 'randomcolor'; 15 | { width, height } = Dimensions.get('window'); 16 | import _ from 'lodash'; 17 | import PropTypes from 'prop-types'; 18 | export default class Tweet extends Component { 19 | render() { 20 | 21 | const { 22 | id, 23 | index, 24 | key, 25 | title, 26 | city, 27 | type, 28 | color, 29 | description, 30 | image 31 | } = this.props; 32 | // Console.warn(" image: ",image); 33 | return ( 34 | 44 | 49 | 54 | 59 | {title} 60 | 61 | 66 | 71 | 76 | ( 77 | {index} 78 | ) in 79 | {' '} 80 | {city} 81 | 82 | 83 | 84 | 85 | 86 | 87 | {description} 88 | 89 | 90 | 91 | { 94 | LayoutAnimation.easeInEaseOut(); 95 | 96 | /* 97 | * This.setState({ 98 | * footerText: this.state.footerText + 1 99 | * }) 100 | */ 101 | }} 102 | > 103 | 111 | {description} 112 | 113 | 114 | 115 | 116 | ); 117 | } 118 | } 119 | const s = StyleSheet.create({ 120 | bodyText: { 121 | fontSize: 32, 122 | color: 'white', 123 | backgroundColor: 'transparent', 124 | margin: 20 125 | }, 126 | linearGradient: { 127 | flex: 1, 128 | paddingLeft: 15, 129 | paddingRight: 15, 130 | borderRadius: 5 131 | }, 132 | reactionBox: { 133 | flex: 1, 134 | justifyContent: 'flex-end', 135 | margin: 40 136 | }, 137 | description: { 138 | textAlign: 'center', 139 | backgroundColor: 'transparent', 140 | fontSize: 10, 141 | padding: 15, 142 | color: 'white', 143 | textShadowRadius: 5, 144 | textShadowOffset: { 145 | width: 2, 146 | heigth: 2 147 | } 148 | }, 149 | footerText: { 150 | textAlign: 'center', 151 | backgroundColor: 'transparent', 152 | // FontSize: 10, 153 | color: 'white', 154 | padding: 0 155 | }, 156 | buttonText: { 157 | fontSize: 18, 158 | fontFamily: 'Gill Sans', 159 | textAlign: 'center', 160 | margin: 10, 161 | color: '#ffffff', 162 | backgroundColor: 'transparent' 163 | }, 164 | // ------- 165 | profilePicture: { 166 | width: 50, 167 | height: 50, 168 | borderRadius: 25, 169 | backgroundColor: 'white', 170 | margin: 20, 171 | marginRight: 10 172 | }, 173 | displayName: { 174 | backgroundColor: 'transparent', 175 | color: 'white', 176 | marginLeft: 0, 177 | marginTop: 22, 178 | fontSize: 20, 179 | marginBottom: 5 180 | }, 181 | badgeSection: { 182 | // Flex: 1, 183 | top: 0, 184 | bottom: 0, 185 | right: 0, 186 | position: 'absolute', 187 | marginRight: 10, 188 | // MarginTop: 15, 189 | justifyContent: 'center' 190 | }, 191 | badgeSlug: { 192 | borderRadius: 15, 193 | paddingVertical: 5, 194 | paddingHorizontal: 12 195 | }, 196 | badgeText: { 197 | textAlign: 'center', 198 | fontSize: 10, 199 | fontWeight: 'bold' 200 | } 201 | }); 202 | Tweet.propTypes = { 203 | id: PropTypes.number, 204 | index: PropTypes.number, 205 | title: PropTypes.string, 206 | city: PropTypes.string, 207 | type: PropTypes.string, 208 | color: PropTypes.string, 209 | description: PropTypes.string, 210 | image: PropTypes.string 211 | }; 212 | Tweet.DefaultProps = { 213 | 214 | /* 215 | * Title:PropTypes.string, 216 | * image:PropTypes.string, 217 | * tag:"", 218 | */ 219 | selected: false, 220 | createTagColor: true 221 | }; 222 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/__tests__/HorizontalBasicFlatList.test.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import { FlatList, View } from 'react-native'; 3 | import React from 'react'; 4 | // Import Pagination from 'react-native-pagination'; 5 | import HorizontalBasicFlatList from '../Pages/HorizontalBasicFlatList'; 6 | // Note: test renderer must be required after react-native. 7 | import renderer from 'react-test-renderer'; 8 | /* 9 | * 10 | * Const startState = { 11 | * todos: [{ id: 1, done: false, name: 'Buy Milk' }] 12 | * }; 13 | * 14 | * const finState = toggleDone(startState, 1); 15 | * 16 | * expect(finState.todos).toEqual([ 17 | * { id: 1, done: true, name: 'Buy Milk' } 18 | * ]); 19 | */ 20 | describe('HorizontalBasicFlatList Components', () => { 21 | /* 22 | * It('Renders Pagination Class!', () => {const tree = renderer.create();}); 23 | * Test('Flat List Visable', () => { 24 | * Expect(sum(1, 2)).toBe(3); 25 | * }); 26 | * Exports[`Todo component renders the todo correctly renders correctly 1`] = ` 27 | *
29 | *

32 | * Buy Milk 33 | *

34 | * 38 | * Delete 39 | * 40 | *
41 | * `; 42 | */ 43 | const component = renderer.create( 44 | 45 | {/* */} 53 | this.refs=r}" to your list) 58 | * visible={this.state.viewableItems}//needs to track what the user sees 59 | * Data={this.state.items}//pass the same list as data 60 | */ 61 | padSize={3} 62 | /> 63 | 64 | ), 65 | tree = component.toJSON(); 66 | // Console.log(" tree: ",tree); 67 | it('Flat List Visable', () => { 68 | expect(tree).toMatchSnapshot(); 69 | }); 70 | /* 71 | * 72 | * // manually trigger the callback 73 | * tree.props.onMouseEnter(); 74 | * // re-rendering 75 | * tree = component.toJSON(); 76 | * expect(tree).toMatchSnapshot(); 77 | * 78 | * // manually trigger the callback 79 | * tree.props.onMouseLeave(); 80 | * // re-rendering 81 | * tree = component.toJSON(); 82 | * expect(tree).toMatchSnapshot(); 83 | */ 84 | }); 85 | /* 86 | * Var Icon=require('react-native-pagination/components/Icon') 87 | * Var sum=require('react-native-pagination/components/sum').default 88 | * Import sum from 'react-native-pagination/components/sum'; 89 | * Test('adds 1 + 2 to equal 3', () => { 90 | * Expect(sum(1, 2)).toBe(3); 91 | * }); 92 | */ 93 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/__tests__/__snapshots__/index.ios.js.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`React Native Pagination Tests HorizontalBasicFlatList Components Flat List Visable 1`] = ` 4 | 5 | 12 | 18 | I'm the Pagination component 19 | 20 | 21 | 22 | `; 23 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/__tests__/index.ios.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Pagination from 'react-native-pagination'; 4 | import Icon from 'react-native-pagination/components/Icon'; 5 | import Dot from 'react-native-pagination/components/Dot'; 6 | // Note: test renderer must be required after react-native. 7 | import renderer from 'react-test-renderer'; 8 | describe('React Native Pagination Tests', () => { 9 | 10 | describe('Render Components', () => { 11 | it('Renders Pagination Class!', () => { 12 | 13 | const tree = renderer.create(); 14 | }); 15 | it('Renders Icon Class!', () => { 16 | const tree = renderer.create(); 17 | 18 | }); 19 | it('Renders Dot Class!', () => { 20 | 21 | const tree = renderer.create(); 22 | 23 | }); 24 | }); 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ReactNativePaginationExample", 3 | "displayName": "ReactNativePaginationExample" 4 | } -------------------------------------------------------------------------------- /ReactNativePaginationExample/index.android.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample React Native App 3 | * https://github.com/facebook/react-native 4 | * @flow 5 | */ 6 | import React, { Component } from 'react'; 7 | import { AppRegistry } from 'react-native'; 8 | import App from './App.js'; 9 | // Not Tested 10 | AppRegistry.registerComponent('ReactNativePaginationExample', () => App); 11 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/index.ios.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { AppRegistry } from 'react-native'; 3 | import App from './App.js'; 4 | AppRegistry.registerComponent('ReactNativePaginationExample', () => App); 5 | 6 | /* 7 | *this.refs=r}" to your list) 10 | * paginationVisibleItems={this.state.viewableItems}//needs to track what the user sees 11 | * paginationItems={this.state.items}//pass the same list as data 12 | * paginationItemPadSize={3} //num of items to pad above and below your visable items 13 | * // more params you can play with 14 | * // hideEmptyDots 15 | * // pagingEnabled 16 | * // dotSwapAxis 17 | * // dotPositionSwap 18 | * // disableDotOnPressNavigation 19 | * // dotOnPress={(item)=>alert(JSON.stringify(item))} 20 | * // startDotOnPress={(item)=>alert("pressed startDotOnPress")} 21 | * // endDotOnPress={(item)=>alert("pressed endDotOnPress")} 22 | * // startDotIconFamily="Ionicons" 23 | * // startDotIconName="ios-arrow-back" 24 | * // endDotIconFamily="Ionicons" 25 | * // endDotIconName="ios-arrow-forward" 26 | * // dotIconNameActive={"contacts"} 27 | * // dotTextColor={"red"} 28 | * // dotTextColorActive={"green"} 29 | * // dotTextColorNotActive={"red"} 30 | * // dotTextColorEmpty={"blue"} 31 | * // dotIconColorActive={"green"} 32 | * // dotIconColorNotActive={"red"} 33 | * // dotIconColorEmpty={"blue"} 34 | * /> 35 | */ 36 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { AppRegistry } from 'react-native'; 3 | import App from './App.js'; 4 | AppRegistry.registerComponent('ReactNativePaginationExample', () => App); 5 | 6 | /* 7 | *this.refs=r}" to your list) 10 | * paginationVisibleItems={this.state.viewableItems}//needs to track what the user sees 11 | * paginationItems={this.state.items}//pass the same list as data 12 | * paginationItemPadSize={3} //num of items to pad above and below your visable items 13 | * // more params you can play with 14 | * // hideEmptyDots 15 | * // pagingEnabled 16 | * // dotSwapAxis 17 | * // dotPositionSwap 18 | * // disableDotOnPressNavigation 19 | * // dotOnPress={(item)=>alert(JSON.stringify(item))} 20 | * // startDotOnPress={(item)=>alert("pressed startDotOnPress")} 21 | * // endDotOnPress={(item)=>alert("pressed endDotOnPress")} 22 | * // startDotIconFamily="Ionicons" 23 | * // startDotIconName="ios-arrow-back" 24 | * // endDotIconFamily="Ionicons" 25 | * // endDotIconName="ios-arrow-forward" 26 | * // dotIconNameActive={"contacts"} 27 | * // dotTextColor={"red"} 28 | * // dotTextColorActive={"green"} 29 | * // dotTextColorNotActive={"red"} 30 | * // dotTextColorEmpty={"blue"} 31 | * // dotIconColorActive={"green"} 32 | * // dotIconColorNotActive={"red"} 33 | * // dotIconColorEmpty={"blue"} 34 | * /> 35 | */ 36 | -------------------------------------------------------------------------------- /ReactNativePaginationExample/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-pagination-example", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "prestart": "react-native link", 7 | "start": "node node_modules/react-native/local-cli/cli.js start", 8 | "test": "jest", 9 | "test:watch": "jest --watch", 10 | "test:coverage": "jest --coverage" 11 | }, 12 | "dependencies": { 13 | "faker": "^4.1.0", 14 | "prop-types": "^15.6.2", 15 | "react": "^16.4.1", 16 | "react-native": "^0.55.4", 17 | "react-native-pagination": "^1.5.5", 18 | "react-native-vector-icons": "^4.6.0" 19 | }, 20 | "devDependencies": { 21 | "babel-jest": "^23.0.1", 22 | "babel-preset-react": "^6.24.1", 23 | "babel-preset-react-native": "^4.0.0", 24 | "jest": "^23.1.0" 25 | }, 26 | "jest": { 27 | "preset": "react-native" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /__tests__/index.test.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Pagination from '../src/index.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-pagination", 3 | "version": "1.5.5", 4 | "description": "The best Pagination component for React Native.", 5 | "main": "react-native-pagination/index.js", 6 | "dependencies": { 7 | "react-native-vector-icons": "^4.3.0" 8 | }, 9 | "devDependencies": { 10 | "babel-eslint": "^8.2.5", 11 | "eslint": "^5.0.0", 12 | "eslint-plugin-react": "^7.9.1" 13 | }, 14 | "scripts": { 15 | "eslint": "eslint --config .eslintrc.js react-native-pagination/* --fix && eslint --config .eslintrc.js ReactNativePaginationExample --fix" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/garrettmac/react-native-pagination.git" 20 | }, 21 | "keywords": [ 22 | "react", 23 | "react-native", 24 | "pagination", 25 | "scroll", 26 | "tabs", 27 | "list", 28 | "flatlist", 29 | "native", 30 | "listview", 31 | "flatlist", 32 | "sectionlist", 33 | "react-component", 34 | "react-native-component", 35 | "list", 36 | "ui", 37 | "profile-page" 38 | ], 39 | "author": "Garrett Mac (http://vyga.io)", 40 | "license": "MIT", 41 | "bugs": { 42 | "url": "https://github.com/garrettmac/react-native-pagination/issues" 43 | }, 44 | "homepage": "https://github.com/garrettmac/react-native-pagination#readme" 45 | } -------------------------------------------------------------------------------- /react-native-pagination/components/Dot.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import { 4 | Text, 5 | TouchableOpacity, 6 | View 7 | } from 'react-native'; 8 | import _ from 'lodash'; 9 | import PropTypes from 'prop-types'; 10 | import Icon from './Icon'; 11 | export default class Dot extends Component { 12 | render() { 13 | let { 14 | disableDotOnPressNavigation, 15 | disableStartDotOnPressNavigation, 16 | disableEndDotOnPressNavigation, 17 | dotOnPress, 18 | startDotOnPress, 19 | endDotOnPress, 20 | item, 21 | dotThemeLight, 22 | onPress, 23 | textStyle, 24 | // Dots 25 | StartDot, EndDot, 26 | // Dots styles 27 | dotStyle, startDotStyle, endDotStyle, 28 | dotIconStyle, startDotIconStyle, endDotIconStyle, // Add to docs 29 | // Start/finish dot Icon 30 | startDotIconName, endDotIconName, 31 | startDotIconSize, endDotIconSize, 32 | startDotIconColor, endDotIconColor, 33 | // Dot text 34 | startDotFontSize, endDotFontSize, 35 | startDotTextColor, endDotTextColor, 36 | startDotText, endDotText, 37 | // Dot position 38 | dotSwapAxis, startDotSwapAxis, endDotSwapAxis, 39 | horizontal, 40 | dotIconFamily, startDotIconFamily, endDotIconFamily, 41 | dotPositionSwap, startDotPositionSwap, endDotPositionSwap, 42 | // Dot section visablity 43 | dotIconHide, startDotIconHide, endDotIconHide, 44 | dotTextHide, startDotTextHide, endDotTextHide, 45 | dotEmptyHide, 46 | // Pagination dots only 47 | dotIconNameNotActive, dotIconNameActive, dotIconNameEmpty, 48 | dotIconSizeNotActive, dotIconSizeActive, dotIconSizeEmpty, 49 | dotIconColorNotActive, dotIconColorActive, dotIconColorEmpty, 50 | dotFontSizeNotActive, dotFontSizeActive, dotFontSizeEmpty, 51 | dotTextColorNotActive, dotTextColorActive, dotTextColorEmpty, 52 | showStartingJumpDot, showEndingJumpDot, 53 | jumpItems, 54 | endingJumpSize, 55 | startingJumpSize 56 | } = this.props, 57 | dotFontSize, dotIconColor, dotIconName, dotIconSize; 58 | if (dotThemeLight) { 59 | dotIconColorActive = 'rgba(255,255,255,.5)'; 60 | dotIconColorNotActive = 'rgba(255,255,255,.4)'; 61 | dotIconColorEmpty = 'rgba(255,255,255,.2)'; 62 | dotTextColorActive = 'rgba(255,255,255,.5)'; 63 | dotTextColorNotActive = 'rgba(255,255,255,.4)'; 64 | dotTextColorEmpty = 'rgba(255,255,255,.2)'; 65 | } 66 | let onPressDot = (item) => { 67 | if (!disableDotOnPressNavigation) try { 68 | this.props.listRef.scrollToItem(item); 69 | } catch (e) { 70 | console.log(' e: ', e); 71 | } 72 | if (dotOnPress)dotOnPress(item); 73 | }; 74 | if (!dotIconSizeNotActive)dotIconSizeNotActive = 10; 75 | if (!dotIconSizeActive)dotIconSizeActive = 15; 76 | if (!dotIconSizeEmpty)dotIconSizeEmpty = 20; 77 | /* 78 | * Console.warn(_.get(item,"index",false)); 79 | * Setup dots icon 80 | */ 81 | if (_.get(item, 'isViewable', false) === true)dotIconName = dotIconNameActive; 82 | else dotIconName = dotIconNameNotActive; 83 | if (_.get(item, 'index', true) === true) { 84 | dotIconHide = dotEmptyHide; 85 | dotIconName = dotIconNameEmpty; 86 | } 87 | /* 88 | * If(dotTextHide)dotTextHide=true 89 | * console.warn(" item.index: ",_.has(item,"index"),_.has(item,"index")); 90 | */ 91 | if (_.get(item, 'isViewable', false) === true)dotIconSize = dotIconSizeActive; 92 | else dotIconSize = dotIconSizeNotActive; 93 | if (_.get(item, 'index', true) === true)dotIconSize = dotIconSizeEmpty; 94 | if (_.get(item, 'isViewable', false) === true)dotIconColor = dotIconColorActive; 95 | else dotIconColor = dotIconColorNotActive; 96 | if (_.get(item, 'index', true) === true)dotIconColor = dotIconColorEmpty; 97 | // Setup dots font 98 | if (_.get(item, 'isViewable', false) === true)dotFontSize = dotFontSizeActive; 99 | else dotFontSize = dotFontSizeNotActive; 100 | if (_.get(item, 'index', true) === true)dotFontSize = dotFontSizeEmpty; 101 | if (_.get(item, 'isViewable', false) === true)dotTextColor = dotTextColorActive; 102 | else dotTextColor = dotTextColorNotActive; 103 | if (_.get(item, 'index', true) === true)dotTextColor = dotTextColorEmpty; 104 | dotSwapAxis = !dotSwapAxis; 105 | if (horizontal == true) dotPositionSwap = !dotPositionSwap; 106 | if (StartDot) { 107 | dotIconHide = false;// Reset 108 | /* 109 | *Style 110 | *console.log(" horizontal: ",horizontal); 111 | */ 112 | if (startDotStyle)dotStyle = startDotStyle; 113 | if (startDotIconStyle)dotIconStyle = startDotIconStyle; 114 | if (horizontal === true)dotIconName = 'chevron-left'; 115 | if (horizontal === false)dotIconName = 'chevron-up'; 116 | if (startDotIconName)dotIconName = startDotIconName; 117 | if (startDotIconSize)dotIconSize = startDotIconSize; 118 | if (startDotIconFamily)dotIconFamily = startDotIconFamily; 119 | if (startDotIconColor)dotIconColor = startDotIconColor; 120 | if (startDotFontSize)dotFontSize = startDotFontSize; 121 | if (startDotTextHide)dotTextHide = true; 122 | if (startDotTextColor)dotTextColor = startDotTextColor; 123 | // Positioning 124 | if (startDotIconHide)dotIconHide = true; 125 | if (startDotSwapAxis)dotSwapAxis = !dotSwapAxis; 126 | if (startDotPositionSwap)dotPositionSwap = !dotPositionSwap; 127 | onPressDot = (item) => { 128 | if (!disableStartDotOnPressNavigation) try { 129 | this.props.listRef.scrollToOffset({ x: 0, 130 | y: 0, 131 | amimated: true }); 132 | } catch (e) { 133 | console.log(' e: ', e); 134 | } 135 | if (startDotOnPress)startDotOnPress(item); 136 | }; 137 | } 138 | if (EndDot) { 139 | if (endDotStyle)dotStyle = endDotStyle; 140 | if (!endDotText)dotTextHide = true; 141 | dotIconHide = false;// Reset 142 | if (endDotIconStyle)dotIconStyle = endDotIconStyle; 143 | if (horizontal === true)dotIconName = 'chevron-right'; 144 | if (horizontal === false)dotIconName = 'chevron-down'; 145 | if (endDotIconName)dotIconName = endDotIconName; 146 | if (endDotIconFamily)dotIconFamily = endDotIconFamily; 147 | if (endDotIconSize)dotIconSize = endDotIconSize; 148 | if (endDotIconColor)dotIconColor = endDotIconColor; 149 | if (endDotTextHide)dotTextHide = true; 150 | if (endDotFontSize)dotFontSize = endDotFontSize; 151 | if (endDotTextColor)dotTextColor = endDotTextColor; 152 | // Positioning 153 | if (endDotIconHide)dotIconHide = true; 154 | if (endDotSwapAxis)dotSwapAxis = !dotSwapAxis; 155 | if (endDotPositionSwap)dotPositionSwap = !dotPositionSwap; 156 | // Console.warn(" dotIconFamily: ",dotIconFamily); 157 | onPressDot = (item) => { 158 | this.props.listRef.scrollToEnd(); 159 | // If(!disableEndDotOnPressNavigation){try {this.props.listRef.scrollToItem(jumpItems[1])} catch (e) {console.log(" e: ",e);}} 160 | if (endDotOnPress)endDotOnPress(item); 161 | }; 162 | } 163 | const text = (o) => { 164 | if (!o) return ''; 165 | if (_.has(o, 'item.paginationDotText')) return o.item.paginationDotText; 166 | // Console.warn(_.isUndefined(o,'index'),_.get(o,'index')); 167 | /* 168 | * If(StartDot)return startDotText 169 | * else if(EndDot)return endDotText 170 | * else if(jumpItems)return 5 171 | * else if(showEndingJumpDot)return 5 172 | */ 173 | if (_.isNumber(_.get(o, 'index', false))) return ` ${o.index + 1} `; 174 | return ''; 175 | }, 176 | icon = (o) => { 177 | if (_.isUndefined(o, 'index') && !EndDot && !startingJumpSize && !endingJumpSize && !StartDot) return; 178 | return ; 179 | }; 180 | return ( 181 | onPressDot(item)} 183 | style={[ 184 | { flex: 1, 185 | flexDirection: horizontal == dotSwapAxis ? 'column' : 'row', 186 | justifyContent: 'center', 187 | alignItems: 'center' }, 188 | dotStyle 189 | ]} 190 | > 191 | 196 | {!dotIconHide && dotPositionSwap && 197 | ( 198 | {icon(item)} 199 | ) 200 | } 201 | {!dotTextHide && 202 | ( 210 | {text(item)} 211 | ) 212 | } 213 | 214 | 215 | {!dotIconHide && !dotPositionSwap && 216 | 217 | {icon(item)} 218 | 219 | } 220 | 221 | 222 | ); 223 | } 224 | onPress(item, disableDotOnPressNavigation) { 225 | console.log(' item: ', item); 226 | console.log(' this.props: ', this.props.listRef); 227 | // ScrollTo(ref="FlatListRef",x=0,y=0){ 228 | } 229 | } 230 | // Item:{index:null,}, 231 | Dot.defaultProps = { 232 | dotIconNameEmpty: 'close', 233 | dotIconNameActive: 'checkbox-blank-circle', 234 | dotIconNameNotActive: 'checkbox-blank-circle-outline', 235 | dotEmptyHide: false, 236 | /* 237 | * 238 | * DotIconSizeNotActive:10, 239 | * dotIconSizeActive:15, 240 | * dotIconSizeEmpty:20, 241 | */ 242 | dotFontSizeNotActive: 9, 243 | dotFontSizeActive: 11, 244 | dotFontSizeEmpty: 9, 245 | startDotFontSize: 11, 246 | endDotFontSize: 11, 247 | dotIconColorNotActive: 'rgba(0,0,0,.5)', 248 | dotIconColorActive: 'rgba(0,0,0,.3)', 249 | dotIconColorEmpty: 'rgba(0,0,0,.2)', 250 | dotTextColorNotActive: 'rgba(0,0,0,.5)', 251 | dotTextColorActive: 'rgba(0,0,0,.3)', 252 | dotTextColorEmpty: 'rgba(0,0,0,.2)', 253 | dotThemeLight: false, 254 | /* 255 | * For start and finish dots 256 | * StartDotStyle:{}, 257 | * EndDotStyle:{}, 258 | */ 259 | dotStyle: { flex: 1, 260 | backgroundColor: 'rgba(0,0,0,0)', 261 | justifyContent: 'center', 262 | alignItems: 'center' }, 263 | /* 264 | * StartDotIconName:"chevron-up", 265 | * EndDotIconName:"chevron-down", 266 | */ 267 | dotSwapAxis: false, 268 | dotIconHide: false, 269 | dotIconStyle: {}, 270 | // DotPositionSwap:true, 271 | dotPositionSwap: false 272 | /* 273 | * StartDotStyle:{alignItems:"center"}, 274 | * endDotStyle:{alignItems:"center"}, 275 | */ 276 | }; 277 | /* 278 | * 279 | * Dot.propTypes={ 280 | * Item:{ 281 | * Index:null 282 | * } 283 | * } 284 | */ 285 | -------------------------------------------------------------------------------- /react-native-pagination/components/Icon.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React, { Component } from 'react'; 3 | import Entypo from 'react-native-vector-icons/Entypo'; 4 | import EvilIcons from 'react-native-vector-icons/EvilIcons'; 5 | import FontAwesome from 'react-native-vector-icons/FontAwesome'; 6 | import Foundation from 'react-native-vector-icons/Foundation'; 7 | import Ionicons from 'react-native-vector-icons/Ionicons'; 8 | import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; 9 | import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; 10 | import Octicons from 'react-native-vector-icons/Octicons'; 11 | import Zocial from 'react-native-vector-icons/Zocial'; 12 | import SimpleLineIcons from 'react-native-vector-icons/SimpleLineIcons'; 13 | import PropTypes from 'prop-types'; 14 | export default class Icon extends Component { 15 | render() { 16 | const { iconFamily, name, size, color } = this.props; 17 | let Icon = null; 18 | if (iconFamily === 'Entypo')Icon = Entypo; 19 | else if (iconFamily === 'EvilIcons')Icon = EvilIcons; 20 | else if (iconFamily === 'FontAwesome')Icon = FontAwesome; 21 | else if (iconFamily === 'Foundation')Icon = Foundation; 22 | else if (iconFamily === 'Ionicons')Icon = Ionicons; 23 | else if (iconFamily === 'SimpleLineIcons')Icon = SimpleLineIcons; 24 | else if (iconFamily === 'MaterialIcons')Icon = MaterialIcons; 25 | else if (iconFamily === 'MaterialCommunityIcons')Icon = MaterialCommunityIcons; 26 | else if (iconFamily === 'Octicons')Icon = Octicons; 27 | else if (iconFamily === 'Zocial')Icon = Zocial; 28 | else Icon = MaterialCommunityIcons; 29 | return ; 30 | } 31 | } 32 | Icon.defaultProps = { 33 | iconFamily: 'MaterialCommunityIcons' 34 | }; 35 | Icon.propTypes = { 36 | name: PropTypes.string, 37 | size: PropTypes.number, 38 | color: PropTypes.string 39 | }; 40 | -------------------------------------------------------------------------------- /react-native-pagination/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author garrettmac (http://vyga.io) 3 | * @version 1.0.4 4 | * @module ReactNativePagination (https://github.com/garrettmac/react-native-pagination) 5 | */ 6 | import React, { Component } from 'react'; 7 | import { 8 | Dimensions, 9 | LayoutAnimation, 10 | StyleSheet, 11 | Text, 12 | TouchableOpacity, View 13 | } from 'react-native'; 14 | import _ from 'lodash'; 15 | _.mixin({ compactObject: (o) => _.each(o, (v, k) => { 16 | if (!v) delete o[k]; 17 | }) }); 18 | import Icon from './components/Icon'; 19 | import Dot from './components/Dot'; 20 | const { width, height } = Dimensions.get('window'); 21 | import PropTypes from 'prop-types'; 22 | /* 23 | * Helper functions 24 | * Export default class Pagination extends Component { 25 | */ 26 | class Pagination extends Component { 27 | render() { 28 | let { 29 | iconFamily, 30 | textStyle, 31 | containerStyle, 32 | nextButtonStyle, 33 | backButtonStyle, 34 | backwardStyle, 35 | dotStyle, 36 | backText, 37 | backStyle, 38 | nextText, 39 | nextStyle, 40 | paginationItemPadSize, 41 | paginationVisibleItems, 42 | paginationItems, 43 | horizontal, 44 | startDotStyle, 45 | DotComponent, 46 | endDotStyle, 47 | debugMode, 48 | dotAnimation, 49 | dotAnimationType, 50 | paginationStyle, 51 | pagingEnabled, 52 | // ShowStartingJumpDot,showEndingJumpDot,endingJumpSize,startingJumpSize, 53 | hideEmptyDots 54 | } = this.props; 55 | paginationItems = paginationItems.map((item, i) => { 56 | item.paginationIndexId = i; 57 | item.index = i; 58 | item.paginationHasSeenItem = false; 59 | item.paginationHasPressedItem = false; 60 | item.paginationSelectedItem = false; 61 | return item; 62 | }); 63 | // PaginationVisibleItemsIndexList this list of index that you want to remove or you'll see two active icon buttons 64 | const paginationVisibleItemsIndexList = paginationVisibleItems.map((i) => i.index); 65 | if (pagingEnabled) 66 | // Fix issue where it says two visable list items are active when only one should be 67 | if (paginationVisibleItemsIndexList.length > 1) { 68 | paginationVisibleItems = paginationVisibleItems.map((o) => { 69 | if (o.index === _.min(paginationVisibleItemsIndexList)) return { index: _.get(o, 'index'), 70 | key: _.get(o, 'key'), 71 | item: _.get(o, 'item', {}), 72 | isViewable: false }; 73 | return o; 74 | }); 75 | } 76 | // Gets max and min pads. should look something like [0, -1, -2, 2, 3, 4] if [0,1] are viewable and paginationItemPadSize is 3 77 | const getVisibleArrayIndexes = (paginationVisibleItems, paginationVisibleItemsIndexList, paginationItemPadSize) => { 78 | const preIniquePaddedIndexList = [ 79 | ..._.times(paginationItemPadSize, (i) => _.min(paginationVisibleItemsIndexList) - (i + 1)), 80 | ..._.times(paginationItemPadSize, (i) => _.max(paginationVisibleItemsIndexList) + (i + 1)) 81 | ], 82 | uniquePaddedIndexList = preIniquePaddedIndexList.map((num, i) => { 83 | if (num < 0) return _.max(paginationVisibleItemsIndexList) + (num *= -1); 84 | return num; 85 | }); 86 | return _.uniq(uniquePaddedIndexList); 87 | }, 88 | paginationVisableItemsIndexArray = getVisibleArrayIndexes(paginationVisibleItems, paginationVisibleItemsIndexList, paginationItemPadSize), 89 | paginationVisiblePadItems = paginationVisableItemsIndexArray.map((o, i) => ({ index: _.get(paginationItems, `[${o}].paginationIndexId`), 90 | key: _.get(paginationItems, `[${o}].paginationIndexId`), 91 | item: _.get(paginationItems, `[${o}]`, {}), 92 | isViewable: false })), 93 | flatListPaginationItems = _.sortBy([ 94 | ...paginationVisibleItems, 95 | ...paginationVisiblePadItems 96 | ], 'index'); 97 | if (debugMode) { 98 | const paginationItemsIndexList = paginationItems.map((i) => i.index), 99 | allDotsIndexList = flatListPaginationItems.map((i) => i.index), 100 | NOT_ACTIVE_DOTS_INDEXES = _.sortBy(paginationVisiblePadItems.map((i) => i.index)), 101 | ALL_DOTS_INDEXES = flatListPaginationItems.map((i) => i.isViewable), 102 | ___ = '%c __________________________________________\n', 103 | ADBY = `%c all paginationVisibleItems dots: ${allDotsIndexList} \n`, 104 | ADI = `%c active paginationVisibleItems dots: ${paginationVisibleItemsIndexList} \n`, 105 | ANDI = `%c not active dots: (padding): ${NOT_ACTIVE_DOTS_INDEXES} \n`, 106 | ADI_ISVIEWABLE = `%c each "paginationVisibleItems dots" "isViewable" attribute:\n ${ALL_DOTS_INDEXES} \n`, 107 | AID = `%c all "paginationItems"'s': ${paginationItemsIndexList} \n`; 108 | console.log(`${'\n\n%cGarrett Mac\'s React Native Pagination' + '%c \ndebugMode: ON\n'}${___}${ADBY}${ADI}${ANDI}${___}${ADI_ISVIEWABLE}${___}${AID}`, 'color: #01a699', 'color: #f99137', 'color: #f99137', 'color: #a94920', 'color: #00a7f8', 'color: #3b539a', 'color: #32db64', 'color: #00c59e', 'color: #3b539a', 'color: #488aff'); 109 | } 110 | let verticalStyle = { height, 111 | alignItems: 'center', 112 | justifyContent: 'space-between', 113 | position: 'absolute', 114 | top: 0, 115 | margin: 0, 116 | bottom: 0, 117 | right: 0, 118 | bottom: 0, 119 | padding: 0, 120 | flex: 1 }, 121 | horizontalStyle = { width, 122 | alignItems: 'center', 123 | justifyContent: 'space-between', 124 | position: 'absolute', 125 | margin: 0, 126 | bottom: 10, 127 | left: 0, 128 | right: 0, 129 | padding: 0, 130 | flex: 1 }; 131 | if (horizontal === true)PaginationContainerStyle = horizontalStyle; 132 | else if (paginationStyle)PaginationContainerStyle = paginationStyle; 133 | else PaginationContainerStyle = verticalStyle; 134 | return ( 135 | 140 | 153 | 159 | {/* {showStartingJumpDot && 160 | 161 | } */} 162 | {flatListPaginationItems.map((item, i) => { 163 | if(dotAnimation){ 164 | LayoutAnimation.configureNext(dotAnimationType); 165 | } 166 | return ( 167 | {!DotComponent && 168 | 169 | } 170 | {DotComponent && 171 | 172 | } 173 | ) 174 | })} 175 | {/* {showEndingJumpDot && 176 | 177 | } */} 178 | 184 | 185 | 186 | ); 187 | } 188 | } 189 | const s = StyleSheet.create({ 190 | container: { 191 | } 192 | }); 193 | Pagination.defaultProps = { 194 | // ContainerStyle:{flex: 1,backgroundColor:"red",width,height:null}, 195 | containerStyle: null, 196 | // TextStyle:{color:"rgba(0,0,0,0.5)",textAlign: "center",}, 197 | paginationVisibleItems: [], 198 | paginationItems: [], 199 | horizontal: false, 200 | pageRangeDisplayed: 10, 201 | hideEmptyDots: false, 202 | activeItemIndex: null, 203 | hideEmptyDotComponents: false, 204 | paginationItemPadSize: 3, 205 | dotAnimation:true, 206 | dotAnimationType: LayoutAnimation.Presets.easeInEaseOut 207 | }; 208 | // NOT WORKING (I dont know why) 209 | Pagination.propTypes = { 210 | paginationItems: PropTypes.array, 211 | visableItemList: PropTypes.array 212 | }; 213 | export default Pagination; 214 | export { Icon, Dot }; 215 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.0.0-beta.44": 6 | version "7.0.0-beta.44" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" 8 | dependencies: 9 | "@babel/highlight" "7.0.0-beta.44" 10 | 11 | "@babel/generator@7.0.0-beta.44": 12 | version "7.0.0-beta.44" 13 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" 14 | dependencies: 15 | "@babel/types" "7.0.0-beta.44" 16 | jsesc "^2.5.1" 17 | lodash "^4.2.0" 18 | source-map "^0.5.0" 19 | trim-right "^1.0.1" 20 | 21 | "@babel/helper-function-name@7.0.0-beta.44": 22 | version "7.0.0-beta.44" 23 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" 24 | dependencies: 25 | "@babel/helper-get-function-arity" "7.0.0-beta.44" 26 | "@babel/template" "7.0.0-beta.44" 27 | "@babel/types" "7.0.0-beta.44" 28 | 29 | "@babel/helper-get-function-arity@7.0.0-beta.44": 30 | version "7.0.0-beta.44" 31 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" 32 | dependencies: 33 | "@babel/types" "7.0.0-beta.44" 34 | 35 | "@babel/helper-split-export-declaration@7.0.0-beta.44": 36 | version "7.0.0-beta.44" 37 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" 38 | dependencies: 39 | "@babel/types" "7.0.0-beta.44" 40 | 41 | "@babel/highlight@7.0.0-beta.44": 42 | version "7.0.0-beta.44" 43 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" 44 | dependencies: 45 | chalk "^2.0.0" 46 | esutils "^2.0.2" 47 | js-tokens "^3.0.0" 48 | 49 | "@babel/template@7.0.0-beta.44": 50 | version "7.0.0-beta.44" 51 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" 52 | dependencies: 53 | "@babel/code-frame" "7.0.0-beta.44" 54 | "@babel/types" "7.0.0-beta.44" 55 | babylon "7.0.0-beta.44" 56 | lodash "^4.2.0" 57 | 58 | "@babel/traverse@7.0.0-beta.44": 59 | version "7.0.0-beta.44" 60 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" 61 | dependencies: 62 | "@babel/code-frame" "7.0.0-beta.44" 63 | "@babel/generator" "7.0.0-beta.44" 64 | "@babel/helper-function-name" "7.0.0-beta.44" 65 | "@babel/helper-split-export-declaration" "7.0.0-beta.44" 66 | "@babel/types" "7.0.0-beta.44" 67 | babylon "7.0.0-beta.44" 68 | debug "^3.1.0" 69 | globals "^11.1.0" 70 | invariant "^2.2.0" 71 | lodash "^4.2.0" 72 | 73 | "@babel/types@7.0.0-beta.44": 74 | version "7.0.0-beta.44" 75 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" 76 | dependencies: 77 | esutils "^2.0.2" 78 | lodash "^4.2.0" 79 | to-fast-properties "^2.0.0" 80 | 81 | acorn-jsx@^4.1.1: 82 | version "4.1.1" 83 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" 84 | dependencies: 85 | acorn "^5.0.3" 86 | 87 | acorn@^5.0.3, acorn@^5.6.0: 88 | version "5.7.4" 89 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" 90 | 91 | ajv-keywords@^3.0.0: 92 | version "3.2.0" 93 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" 94 | 95 | ajv@^6.0.1, ajv@^6.5.0: 96 | version "6.5.1" 97 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d" 98 | dependencies: 99 | fast-deep-equal "^2.0.1" 100 | fast-json-stable-stringify "^2.0.0" 101 | json-schema-traverse "^0.4.1" 102 | uri-js "^4.2.1" 103 | 104 | ansi-escapes@^3.0.0: 105 | version "3.1.0" 106 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 107 | 108 | ansi-regex@^2.0.0: 109 | version "2.1.1" 110 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 111 | 112 | ansi-regex@^3.0.0: 113 | version "3.0.0" 114 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 115 | 116 | ansi-styles@^2.2.1: 117 | version "2.2.1" 118 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 119 | 120 | ansi-styles@^3.1.0: 121 | version "3.2.0" 122 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 123 | dependencies: 124 | color-convert "^1.9.0" 125 | 126 | ansi-styles@^3.2.1: 127 | version "3.2.1" 128 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 129 | dependencies: 130 | color-convert "^1.9.0" 131 | 132 | argparse@^1.0.7: 133 | version "1.0.10" 134 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 135 | dependencies: 136 | sprintf-js "~1.0.2" 137 | 138 | array-includes@^3.0.3: 139 | version "3.0.3" 140 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 141 | dependencies: 142 | define-properties "^1.1.2" 143 | es-abstract "^1.7.0" 144 | 145 | array-union@^1.0.1: 146 | version "1.0.2" 147 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 148 | dependencies: 149 | array-uniq "^1.0.1" 150 | 151 | array-uniq@^1.0.1: 152 | version "1.0.3" 153 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 154 | 155 | arrify@^1.0.0: 156 | version "1.0.1" 157 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 158 | 159 | asap@~2.0.3: 160 | version "2.0.6" 161 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 162 | 163 | babel-code-frame@^6.26.0: 164 | version "6.26.0" 165 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 166 | dependencies: 167 | chalk "^1.1.3" 168 | esutils "^2.0.2" 169 | js-tokens "^3.0.2" 170 | 171 | babel-eslint@^8.2.5: 172 | version "8.2.5" 173 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.5.tgz#dc2331c259d36782aa189da510c43dedd5adc7a3" 174 | dependencies: 175 | "@babel/code-frame" "7.0.0-beta.44" 176 | "@babel/traverse" "7.0.0-beta.44" 177 | "@babel/types" "7.0.0-beta.44" 178 | babylon "7.0.0-beta.44" 179 | eslint-scope "~3.7.1" 180 | eslint-visitor-keys "^1.0.0" 181 | 182 | babylon@7.0.0-beta.44: 183 | version "7.0.0-beta.44" 184 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" 185 | 186 | balanced-match@^1.0.0: 187 | version "1.0.0" 188 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 189 | 190 | brace-expansion@^1.1.7: 191 | version "1.1.8" 192 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 193 | dependencies: 194 | balanced-match "^1.0.0" 195 | concat-map "0.0.1" 196 | 197 | builtin-modules@^1.0.0: 198 | version "1.1.1" 199 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 200 | 201 | caller-path@^0.1.0: 202 | version "0.1.0" 203 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 204 | dependencies: 205 | callsites "^0.2.0" 206 | 207 | callsites@^0.2.0: 208 | version "0.2.0" 209 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 210 | 211 | camelcase@^4.1.0: 212 | version "4.1.0" 213 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 214 | 215 | chalk@^1.1.3: 216 | version "1.1.3" 217 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 218 | dependencies: 219 | ansi-styles "^2.2.1" 220 | escape-string-regexp "^1.0.2" 221 | has-ansi "^2.0.0" 222 | strip-ansi "^3.0.0" 223 | supports-color "^2.0.0" 224 | 225 | chalk@^2.0.0: 226 | version "2.0.1" 227 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d" 228 | dependencies: 229 | ansi-styles "^3.1.0" 230 | escape-string-regexp "^1.0.5" 231 | supports-color "^4.0.0" 232 | 233 | chalk@^2.1.0: 234 | version "2.4.1" 235 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 236 | dependencies: 237 | ansi-styles "^3.2.1" 238 | escape-string-regexp "^1.0.5" 239 | supports-color "^5.3.0" 240 | 241 | chardet@^0.4.0: 242 | version "0.4.2" 243 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 244 | 245 | circular-json@^0.3.1: 246 | version "0.3.3" 247 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 248 | 249 | cli-cursor@^2.1.0: 250 | version "2.1.0" 251 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 252 | dependencies: 253 | restore-cursor "^2.0.0" 254 | 255 | cli-width@^2.0.0: 256 | version "2.1.0" 257 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 258 | 259 | cliui@^3.2.0: 260 | version "3.2.0" 261 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 262 | dependencies: 263 | string-width "^1.0.1" 264 | strip-ansi "^3.0.1" 265 | wrap-ansi "^2.0.0" 266 | 267 | code-point-at@^1.0.0: 268 | version "1.1.0" 269 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 270 | 271 | color-convert@^1.9.0: 272 | version "1.9.0" 273 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 274 | dependencies: 275 | color-name "^1.1.1" 276 | 277 | color-name@^1.1.1: 278 | version "1.1.3" 279 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 280 | 281 | concat-map@0.0.1: 282 | version "0.0.1" 283 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 284 | 285 | core-js@^1.0.0: 286 | version "1.2.7" 287 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 288 | 289 | cross-spawn@^5.0.1: 290 | version "5.1.0" 291 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 292 | dependencies: 293 | lru-cache "^4.0.1" 294 | shebang-command "^1.2.0" 295 | which "^1.2.9" 296 | 297 | cross-spawn@^6.0.5: 298 | version "6.0.5" 299 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 300 | dependencies: 301 | nice-try "^1.0.4" 302 | path-key "^2.0.1" 303 | semver "^5.5.0" 304 | shebang-command "^1.2.0" 305 | which "^1.2.9" 306 | 307 | debug@^3.1.0: 308 | version "3.1.0" 309 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 310 | dependencies: 311 | ms "2.0.0" 312 | 313 | decamelize@^1.1.1: 314 | version "1.2.0" 315 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 316 | 317 | deep-is@~0.1.3: 318 | version "0.1.3" 319 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 320 | 321 | define-properties@^1.1.2: 322 | version "1.1.2" 323 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 324 | dependencies: 325 | foreach "^2.0.5" 326 | object-keys "^1.0.8" 327 | 328 | del@^2.0.2: 329 | version "2.2.2" 330 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 331 | dependencies: 332 | globby "^5.0.0" 333 | is-path-cwd "^1.0.0" 334 | is-path-in-cwd "^1.0.0" 335 | object-assign "^4.0.1" 336 | pify "^2.0.0" 337 | pinkie-promise "^2.0.0" 338 | rimraf "^2.2.8" 339 | 340 | doctrine@^2.1.0: 341 | version "2.1.0" 342 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 343 | dependencies: 344 | esutils "^2.0.2" 345 | 346 | encoding@^0.1.11: 347 | version "0.1.12" 348 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 349 | dependencies: 350 | iconv-lite "~0.4.13" 351 | 352 | error-ex@^1.2.0: 353 | version "1.3.1" 354 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 355 | dependencies: 356 | is-arrayish "^0.2.1" 357 | 358 | es-abstract@^1.10.0, es-abstract@^1.7.0: 359 | version "1.12.0" 360 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" 361 | dependencies: 362 | es-to-primitive "^1.1.1" 363 | function-bind "^1.1.1" 364 | has "^1.0.1" 365 | is-callable "^1.1.3" 366 | is-regex "^1.0.4" 367 | 368 | es-to-primitive@^1.1.1: 369 | version "1.1.1" 370 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 371 | dependencies: 372 | is-callable "^1.1.1" 373 | is-date-object "^1.0.1" 374 | is-symbol "^1.0.1" 375 | 376 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 377 | version "1.0.5" 378 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 379 | 380 | eslint-plugin-react@^7.9.1: 381 | version "7.9.1" 382 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.9.1.tgz#101aadd15e7c7b431ed025303ac7b421a8e3dc15" 383 | dependencies: 384 | doctrine "^2.1.0" 385 | has "^1.0.2" 386 | jsx-ast-utils "^2.0.1" 387 | prop-types "^15.6.1" 388 | 389 | eslint-scope@^4.0.0: 390 | version "4.0.0" 391 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 392 | dependencies: 393 | esrecurse "^4.1.0" 394 | estraverse "^4.1.1" 395 | 396 | eslint-scope@~3.7.1: 397 | version "3.7.1" 398 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 399 | dependencies: 400 | esrecurse "^4.1.0" 401 | estraverse "^4.1.1" 402 | 403 | eslint-visitor-keys@^1.0.0: 404 | version "1.0.0" 405 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 406 | 407 | eslint@^5.0.0: 408 | version "5.0.0" 409 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.0.0.tgz#3576704f7377aca072da69c00862277c5fe57153" 410 | dependencies: 411 | ajv "^6.5.0" 412 | babel-code-frame "^6.26.0" 413 | chalk "^2.1.0" 414 | cross-spawn "^6.0.5" 415 | debug "^3.1.0" 416 | doctrine "^2.1.0" 417 | eslint-scope "^4.0.0" 418 | eslint-visitor-keys "^1.0.0" 419 | espree "^4.0.0" 420 | esquery "^1.0.1" 421 | esutils "^2.0.2" 422 | file-entry-cache "^2.0.0" 423 | functional-red-black-tree "^1.0.1" 424 | glob "^7.1.2" 425 | globals "^11.5.0" 426 | ignore "^3.3.3" 427 | imurmurhash "^0.1.4" 428 | inquirer "^5.2.0" 429 | is-resolvable "^1.1.0" 430 | js-yaml "^3.11.0" 431 | json-stable-stringify-without-jsonify "^1.0.1" 432 | levn "^0.3.0" 433 | lodash "^4.17.5" 434 | minimatch "^3.0.4" 435 | mkdirp "^0.5.1" 436 | natural-compare "^1.4.0" 437 | optionator "^0.8.2" 438 | path-is-inside "^1.0.2" 439 | pluralize "^7.0.0" 440 | progress "^2.0.0" 441 | regexpp "^1.1.0" 442 | require-uncached "^1.0.3" 443 | semver "^5.5.0" 444 | string.prototype.matchall "^2.0.0" 445 | strip-ansi "^4.0.0" 446 | strip-json-comments "^2.0.1" 447 | table "^4.0.3" 448 | text-table "^0.2.0" 449 | 450 | espree@^4.0.0: 451 | version "4.0.0" 452 | resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" 453 | dependencies: 454 | acorn "^5.6.0" 455 | acorn-jsx "^4.1.1" 456 | 457 | esprima@^4.0.0: 458 | version "4.0.1" 459 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 460 | 461 | esquery@^1.0.1: 462 | version "1.0.1" 463 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 464 | dependencies: 465 | estraverse "^4.0.0" 466 | 467 | esrecurse@^4.1.0: 468 | version "4.2.0" 469 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 470 | dependencies: 471 | estraverse "^4.1.0" 472 | object-assign "^4.0.1" 473 | 474 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 475 | version "4.2.0" 476 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 477 | 478 | esutils@^2.0.2: 479 | version "2.0.2" 480 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 481 | 482 | execa@^0.7.0: 483 | version "0.7.0" 484 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 485 | dependencies: 486 | cross-spawn "^5.0.1" 487 | get-stream "^3.0.0" 488 | is-stream "^1.1.0" 489 | npm-run-path "^2.0.0" 490 | p-finally "^1.0.0" 491 | signal-exit "^3.0.0" 492 | strip-eof "^1.0.0" 493 | 494 | external-editor@^2.1.0: 495 | version "2.2.0" 496 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 497 | dependencies: 498 | chardet "^0.4.0" 499 | iconv-lite "^0.4.17" 500 | tmp "^0.0.33" 501 | 502 | fast-deep-equal@^2.0.1: 503 | version "2.0.1" 504 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 505 | 506 | fast-json-stable-stringify@^2.0.0: 507 | version "2.0.0" 508 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 509 | 510 | fast-levenshtein@~2.0.4: 511 | version "2.0.6" 512 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 513 | 514 | fbjs@^0.8.9: 515 | version "0.8.14" 516 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.14.tgz#d1dbe2be254c35a91e09f31f9cd50a40b2a0ed1c" 517 | dependencies: 518 | core-js "^1.0.0" 519 | isomorphic-fetch "^2.1.1" 520 | loose-envify "^1.0.0" 521 | object-assign "^4.1.0" 522 | promise "^7.1.1" 523 | setimmediate "^1.0.5" 524 | ua-parser-js "^0.7.9" 525 | 526 | figures@^2.0.0: 527 | version "2.0.0" 528 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 529 | dependencies: 530 | escape-string-regexp "^1.0.5" 531 | 532 | file-entry-cache@^2.0.0: 533 | version "2.0.0" 534 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 535 | dependencies: 536 | flat-cache "^1.2.1" 537 | object-assign "^4.0.1" 538 | 539 | find-up@^2.0.0: 540 | version "2.1.0" 541 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 542 | dependencies: 543 | locate-path "^2.0.0" 544 | 545 | flat-cache@^1.2.1: 546 | version "1.2.2" 547 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 548 | dependencies: 549 | circular-json "^0.3.1" 550 | del "^2.0.2" 551 | graceful-fs "^4.1.2" 552 | write "^0.2.1" 553 | 554 | foreach@^2.0.5: 555 | version "2.0.5" 556 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 557 | 558 | fs.realpath@^1.0.0: 559 | version "1.0.0" 560 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 561 | 562 | function-bind@^1.0.2: 563 | version "1.1.0" 564 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 565 | 566 | function-bind@^1.1.1: 567 | version "1.1.1" 568 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 569 | 570 | functional-red-black-tree@^1.0.1: 571 | version "1.0.1" 572 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 573 | 574 | get-caller-file@^1.0.1: 575 | version "1.0.2" 576 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 577 | 578 | get-stream@^3.0.0: 579 | version "3.0.0" 580 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 581 | 582 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 583 | version "7.1.2" 584 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 585 | dependencies: 586 | fs.realpath "^1.0.0" 587 | inflight "^1.0.4" 588 | inherits "2" 589 | minimatch "^3.0.4" 590 | once "^1.3.0" 591 | path-is-absolute "^1.0.0" 592 | 593 | globals@^11.1.0, globals@^11.5.0: 594 | version "11.7.0" 595 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 596 | 597 | globby@^5.0.0: 598 | version "5.0.0" 599 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 600 | dependencies: 601 | array-union "^1.0.1" 602 | arrify "^1.0.0" 603 | glob "^7.0.3" 604 | object-assign "^4.0.1" 605 | pify "^2.0.0" 606 | pinkie-promise "^2.0.0" 607 | 608 | graceful-fs@^4.1.2: 609 | version "4.1.11" 610 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 611 | 612 | has-ansi@^2.0.0: 613 | version "2.0.0" 614 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 615 | dependencies: 616 | ansi-regex "^2.0.0" 617 | 618 | has-flag@^2.0.0: 619 | version "2.0.0" 620 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 621 | 622 | has-flag@^3.0.0: 623 | version "3.0.0" 624 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 625 | 626 | has-symbols@^1.0.0: 627 | version "1.0.0" 628 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 629 | 630 | has@^1.0.1: 631 | version "1.0.1" 632 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 633 | dependencies: 634 | function-bind "^1.0.2" 635 | 636 | has@^1.0.2: 637 | version "1.0.3" 638 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 639 | dependencies: 640 | function-bind "^1.1.1" 641 | 642 | hosted-git-info@^2.1.4: 643 | version "2.8.9" 644 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 645 | 646 | iconv-lite@^0.4.17, iconv-lite@~0.4.13: 647 | version "0.4.18" 648 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" 649 | 650 | ignore@^3.3.3: 651 | version "3.3.3" 652 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" 653 | 654 | imurmurhash@^0.1.4: 655 | version "0.1.4" 656 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 657 | 658 | inflight@^1.0.4: 659 | version "1.0.6" 660 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 661 | dependencies: 662 | once "^1.3.0" 663 | wrappy "1" 664 | 665 | inherits@2: 666 | version "2.0.3" 667 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 668 | 669 | inquirer@^5.2.0: 670 | version "5.2.0" 671 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" 672 | dependencies: 673 | ansi-escapes "^3.0.0" 674 | chalk "^2.0.0" 675 | cli-cursor "^2.1.0" 676 | cli-width "^2.0.0" 677 | external-editor "^2.1.0" 678 | figures "^2.0.0" 679 | lodash "^4.3.0" 680 | mute-stream "0.0.7" 681 | run-async "^2.2.0" 682 | rxjs "^5.5.2" 683 | string-width "^2.1.0" 684 | strip-ansi "^4.0.0" 685 | through "^2.3.6" 686 | 687 | invariant@^2.2.0: 688 | version "2.2.4" 689 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 690 | dependencies: 691 | loose-envify "^1.0.0" 692 | 693 | invert-kv@^1.0.0: 694 | version "1.0.0" 695 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 696 | 697 | is-arrayish@^0.2.1: 698 | version "0.2.1" 699 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 700 | 701 | is-builtin-module@^1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 704 | dependencies: 705 | builtin-modules "^1.0.0" 706 | 707 | is-callable@^1.1.1, is-callable@^1.1.3: 708 | version "1.1.3" 709 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 710 | 711 | is-date-object@^1.0.1: 712 | version "1.0.1" 713 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 714 | 715 | is-fullwidth-code-point@^1.0.0: 716 | version "1.0.0" 717 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 718 | dependencies: 719 | number-is-nan "^1.0.0" 720 | 721 | is-fullwidth-code-point@^2.0.0: 722 | version "2.0.0" 723 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 724 | 725 | is-path-cwd@^1.0.0: 726 | version "1.0.0" 727 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 728 | 729 | is-path-in-cwd@^1.0.0: 730 | version "1.0.0" 731 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 732 | dependencies: 733 | is-path-inside "^1.0.0" 734 | 735 | is-path-inside@^1.0.0: 736 | version "1.0.0" 737 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 738 | dependencies: 739 | path-is-inside "^1.0.1" 740 | 741 | is-promise@^2.1.0: 742 | version "2.1.0" 743 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 744 | 745 | is-regex@^1.0.4: 746 | version "1.0.4" 747 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 748 | dependencies: 749 | has "^1.0.1" 750 | 751 | is-resolvable@^1.1.0: 752 | version "1.1.0" 753 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 754 | 755 | is-stream@^1.0.1, is-stream@^1.1.0: 756 | version "1.1.0" 757 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 758 | 759 | is-symbol@^1.0.1: 760 | version "1.0.1" 761 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 762 | 763 | isexe@^2.0.0: 764 | version "2.0.0" 765 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 766 | 767 | isomorphic-fetch@^2.1.1: 768 | version "2.2.1" 769 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 770 | dependencies: 771 | node-fetch "^1.0.1" 772 | whatwg-fetch ">=0.10.0" 773 | 774 | js-tokens@^3.0.0, js-tokens@^3.0.2: 775 | version "3.0.2" 776 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 777 | 778 | js-yaml@^3.11.0: 779 | version "3.13.1" 780 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 781 | dependencies: 782 | argparse "^1.0.7" 783 | esprima "^4.0.0" 784 | 785 | jsesc@^2.5.1: 786 | version "2.5.1" 787 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 788 | 789 | json-schema-traverse@^0.4.1: 790 | version "0.4.1" 791 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 792 | 793 | json-stable-stringify-without-jsonify@^1.0.1: 794 | version "1.0.1" 795 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 796 | 797 | jsx-ast-utils@^2.0.1: 798 | version "2.0.1" 799 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" 800 | dependencies: 801 | array-includes "^3.0.3" 802 | 803 | lcid@^1.0.0: 804 | version "1.0.0" 805 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 806 | dependencies: 807 | invert-kv "^1.0.0" 808 | 809 | levn@^0.3.0, levn@~0.3.0: 810 | version "0.3.0" 811 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 812 | dependencies: 813 | prelude-ls "~1.1.2" 814 | type-check "~0.3.2" 815 | 816 | load-json-file@^2.0.0: 817 | version "2.0.0" 818 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 819 | dependencies: 820 | graceful-fs "^4.1.2" 821 | parse-json "^2.2.0" 822 | pify "^2.0.0" 823 | strip-bom "^3.0.0" 824 | 825 | locate-path@^2.0.0: 826 | version "2.0.0" 827 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 828 | dependencies: 829 | p-locate "^2.0.0" 830 | path-exists "^3.0.0" 831 | 832 | lodash@^4.0.0, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: 833 | version "4.17.21" 834 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 835 | 836 | loose-envify@^1.0.0, loose-envify@^1.3.1: 837 | version "1.3.1" 838 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 839 | dependencies: 840 | js-tokens "^3.0.0" 841 | 842 | lru-cache@^4.0.1: 843 | version "4.1.1" 844 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 845 | dependencies: 846 | pseudomap "^1.0.2" 847 | yallist "^2.1.2" 848 | 849 | mem@^1.1.0: 850 | version "1.1.0" 851 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 852 | dependencies: 853 | mimic-fn "^1.0.0" 854 | 855 | mimic-fn@^1.0.0: 856 | version "1.1.0" 857 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 858 | 859 | minimatch@^3.0.4: 860 | version "3.0.4" 861 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 862 | dependencies: 863 | brace-expansion "^1.1.7" 864 | 865 | minimist@0.0.8: 866 | version "0.0.8" 867 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 868 | 869 | mkdirp@^0.5.1: 870 | version "0.5.1" 871 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 872 | dependencies: 873 | minimist "0.0.8" 874 | 875 | ms@2.0.0: 876 | version "2.0.0" 877 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 878 | 879 | mute-stream@0.0.7: 880 | version "0.0.7" 881 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 882 | 883 | natural-compare@^1.4.0: 884 | version "1.4.0" 885 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 886 | 887 | nice-try@^1.0.4: 888 | version "1.0.4" 889 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" 890 | 891 | node-fetch@^1.0.1: 892 | version "1.7.1" 893 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" 894 | dependencies: 895 | encoding "^0.1.11" 896 | is-stream "^1.0.1" 897 | 898 | normalize-package-data@^2.3.2: 899 | version "2.4.0" 900 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 901 | dependencies: 902 | hosted-git-info "^2.1.4" 903 | is-builtin-module "^1.0.0" 904 | semver "2 || 3 || 4 || 5" 905 | validate-npm-package-license "^3.0.1" 906 | 907 | npm-run-path@^2.0.0: 908 | version "2.0.2" 909 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 910 | dependencies: 911 | path-key "^2.0.0" 912 | 913 | number-is-nan@^1.0.0: 914 | version "1.0.1" 915 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 916 | 917 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 918 | version "4.1.1" 919 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 920 | 921 | object-keys@^1.0.8: 922 | version "1.0.11" 923 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 924 | 925 | once@^1.3.0: 926 | version "1.4.0" 927 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 928 | dependencies: 929 | wrappy "1" 930 | 931 | onetime@^2.0.0: 932 | version "2.0.1" 933 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 934 | dependencies: 935 | mimic-fn "^1.0.0" 936 | 937 | optionator@^0.8.2: 938 | version "0.8.2" 939 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 940 | dependencies: 941 | deep-is "~0.1.3" 942 | fast-levenshtein "~2.0.4" 943 | levn "~0.3.0" 944 | prelude-ls "~1.1.2" 945 | type-check "~0.3.2" 946 | wordwrap "~1.0.0" 947 | 948 | os-locale@^2.0.0: 949 | version "2.1.0" 950 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 951 | dependencies: 952 | execa "^0.7.0" 953 | lcid "^1.0.0" 954 | mem "^1.1.0" 955 | 956 | os-tmpdir@~1.0.2: 957 | version "1.0.2" 958 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 959 | 960 | p-finally@^1.0.0: 961 | version "1.0.0" 962 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 963 | 964 | p-limit@^1.1.0: 965 | version "1.1.0" 966 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 967 | 968 | p-locate@^2.0.0: 969 | version "2.0.0" 970 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 971 | dependencies: 972 | p-limit "^1.1.0" 973 | 974 | parse-json@^2.2.0: 975 | version "2.2.0" 976 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 977 | dependencies: 978 | error-ex "^1.2.0" 979 | 980 | path-exists@^3.0.0: 981 | version "3.0.0" 982 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 983 | 984 | path-is-absolute@^1.0.0: 985 | version "1.0.1" 986 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 987 | 988 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 989 | version "1.0.2" 990 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 991 | 992 | path-key@^2.0.0, path-key@^2.0.1: 993 | version "2.0.1" 994 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 995 | 996 | path-type@^2.0.0: 997 | version "2.0.0" 998 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 999 | dependencies: 1000 | pify "^2.0.0" 1001 | 1002 | pify@^2.0.0: 1003 | version "2.3.0" 1004 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1005 | 1006 | pinkie-promise@^2.0.0: 1007 | version "2.0.1" 1008 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1009 | dependencies: 1010 | pinkie "^2.0.0" 1011 | 1012 | pinkie@^2.0.0: 1013 | version "2.0.4" 1014 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1015 | 1016 | pluralize@^7.0.0: 1017 | version "7.0.0" 1018 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1019 | 1020 | prelude-ls@~1.1.2: 1021 | version "1.1.2" 1022 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1023 | 1024 | progress@^2.0.0: 1025 | version "2.0.0" 1026 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1027 | 1028 | promise@^7.1.1: 1029 | version "7.3.1" 1030 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1031 | dependencies: 1032 | asap "~2.0.3" 1033 | 1034 | prop-types@^15.5.10: 1035 | version "15.5.10" 1036 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" 1037 | dependencies: 1038 | fbjs "^0.8.9" 1039 | loose-envify "^1.3.1" 1040 | 1041 | prop-types@^15.6.1: 1042 | version "15.6.2" 1043 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" 1044 | dependencies: 1045 | loose-envify "^1.3.1" 1046 | object-assign "^4.1.1" 1047 | 1048 | pseudomap@^1.0.2: 1049 | version "1.0.2" 1050 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1051 | 1052 | punycode@^2.1.0: 1053 | version "2.1.1" 1054 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1055 | 1056 | react-native-vector-icons@^4.3.0: 1057 | version "4.3.0" 1058 | resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-4.3.0.tgz#49eab845fbcde6354cb3dbcb62c1abd1f6abc866" 1059 | dependencies: 1060 | lodash "^4.0.0" 1061 | prop-types "^15.5.10" 1062 | yargs "^8.0.2" 1063 | 1064 | read-pkg-up@^2.0.0: 1065 | version "2.0.0" 1066 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1067 | dependencies: 1068 | find-up "^2.0.0" 1069 | read-pkg "^2.0.0" 1070 | 1071 | read-pkg@^2.0.0: 1072 | version "2.0.0" 1073 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1074 | dependencies: 1075 | load-json-file "^2.0.0" 1076 | normalize-package-data "^2.3.2" 1077 | path-type "^2.0.0" 1078 | 1079 | regexp.prototype.flags@^1.2.0: 1080 | version "1.2.0" 1081 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" 1082 | dependencies: 1083 | define-properties "^1.1.2" 1084 | 1085 | regexpp@^1.1.0: 1086 | version "1.1.0" 1087 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 1088 | 1089 | require-directory@^2.1.1: 1090 | version "2.1.1" 1091 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1092 | 1093 | require-main-filename@^1.0.1: 1094 | version "1.0.1" 1095 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1096 | 1097 | require-uncached@^1.0.3: 1098 | version "1.0.3" 1099 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1100 | dependencies: 1101 | caller-path "^0.1.0" 1102 | resolve-from "^1.0.0" 1103 | 1104 | resolve-from@^1.0.0: 1105 | version "1.0.1" 1106 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1107 | 1108 | restore-cursor@^2.0.0: 1109 | version "2.0.0" 1110 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1111 | dependencies: 1112 | onetime "^2.0.0" 1113 | signal-exit "^3.0.2" 1114 | 1115 | rimraf@^2.2.8: 1116 | version "2.6.1" 1117 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1118 | dependencies: 1119 | glob "^7.0.5" 1120 | 1121 | run-async@^2.2.0: 1122 | version "2.3.0" 1123 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1124 | dependencies: 1125 | is-promise "^2.1.0" 1126 | 1127 | rxjs@^5.5.2: 1128 | version "5.5.11" 1129 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" 1130 | dependencies: 1131 | symbol-observable "1.0.1" 1132 | 1133 | "semver@2 || 3 || 4 || 5": 1134 | version "5.4.1" 1135 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 1136 | 1137 | semver@^5.5.0: 1138 | version "5.5.0" 1139 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1140 | 1141 | set-blocking@^2.0.0: 1142 | version "2.0.0" 1143 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1144 | 1145 | setimmediate@^1.0.5: 1146 | version "1.0.5" 1147 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1148 | 1149 | shebang-command@^1.2.0: 1150 | version "1.2.0" 1151 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1152 | dependencies: 1153 | shebang-regex "^1.0.0" 1154 | 1155 | shebang-regex@^1.0.0: 1156 | version "1.0.0" 1157 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1158 | 1159 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1160 | version "3.0.2" 1161 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1162 | 1163 | slice-ansi@1.0.0: 1164 | version "1.0.0" 1165 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 1166 | dependencies: 1167 | is-fullwidth-code-point "^2.0.0" 1168 | 1169 | source-map@^0.5.0: 1170 | version "0.5.7" 1171 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1172 | 1173 | spdx-correct@~1.0.0: 1174 | version "1.0.2" 1175 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1176 | dependencies: 1177 | spdx-license-ids "^1.0.2" 1178 | 1179 | spdx-expression-parse@~1.0.0: 1180 | version "1.0.4" 1181 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1182 | 1183 | spdx-license-ids@^1.0.2: 1184 | version "1.2.2" 1185 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1186 | 1187 | sprintf-js@~1.0.2: 1188 | version "1.0.3" 1189 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1190 | 1191 | string-width@^1.0.1: 1192 | version "1.0.2" 1193 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1194 | dependencies: 1195 | code-point-at "^1.0.0" 1196 | is-fullwidth-code-point "^1.0.0" 1197 | strip-ansi "^3.0.0" 1198 | 1199 | string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: 1200 | version "2.1.1" 1201 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1202 | dependencies: 1203 | is-fullwidth-code-point "^2.0.0" 1204 | strip-ansi "^4.0.0" 1205 | 1206 | string.prototype.matchall@^2.0.0: 1207 | version "2.0.0" 1208 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz#2af8fe3d2d6dc53ca2a59bd376b089c3c152b3c8" 1209 | dependencies: 1210 | define-properties "^1.1.2" 1211 | es-abstract "^1.10.0" 1212 | function-bind "^1.1.1" 1213 | has-symbols "^1.0.0" 1214 | regexp.prototype.flags "^1.2.0" 1215 | 1216 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1217 | version "3.0.1" 1218 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1219 | dependencies: 1220 | ansi-regex "^2.0.0" 1221 | 1222 | strip-ansi@^4.0.0: 1223 | version "4.0.0" 1224 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1225 | dependencies: 1226 | ansi-regex "^3.0.0" 1227 | 1228 | strip-bom@^3.0.0: 1229 | version "3.0.0" 1230 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1231 | 1232 | strip-eof@^1.0.0: 1233 | version "1.0.0" 1234 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1235 | 1236 | strip-json-comments@^2.0.1: 1237 | version "2.0.1" 1238 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1239 | 1240 | supports-color@^2.0.0: 1241 | version "2.0.0" 1242 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1243 | 1244 | supports-color@^4.0.0: 1245 | version "4.2.1" 1246 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" 1247 | dependencies: 1248 | has-flag "^2.0.0" 1249 | 1250 | supports-color@^5.3.0: 1251 | version "5.4.0" 1252 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1253 | dependencies: 1254 | has-flag "^3.0.0" 1255 | 1256 | symbol-observable@1.0.1: 1257 | version "1.0.1" 1258 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" 1259 | 1260 | table@^4.0.3: 1261 | version "4.0.3" 1262 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" 1263 | dependencies: 1264 | ajv "^6.0.1" 1265 | ajv-keywords "^3.0.0" 1266 | chalk "^2.1.0" 1267 | lodash "^4.17.4" 1268 | slice-ansi "1.0.0" 1269 | string-width "^2.1.1" 1270 | 1271 | text-table@^0.2.0: 1272 | version "0.2.0" 1273 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1274 | 1275 | through@^2.3.6: 1276 | version "2.3.8" 1277 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1278 | 1279 | tmp@^0.0.33: 1280 | version "0.0.33" 1281 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1282 | dependencies: 1283 | os-tmpdir "~1.0.2" 1284 | 1285 | to-fast-properties@^2.0.0: 1286 | version "2.0.0" 1287 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1288 | 1289 | trim-right@^1.0.1: 1290 | version "1.0.1" 1291 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1292 | 1293 | type-check@~0.3.2: 1294 | version "0.3.2" 1295 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1296 | dependencies: 1297 | prelude-ls "~1.1.2" 1298 | 1299 | ua-parser-js@^0.7.9: 1300 | version "0.7.28" 1301 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" 1302 | 1303 | uri-js@^4.2.1: 1304 | version "4.2.2" 1305 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1306 | dependencies: 1307 | punycode "^2.1.0" 1308 | 1309 | validate-npm-package-license@^3.0.1: 1310 | version "3.0.1" 1311 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1312 | dependencies: 1313 | spdx-correct "~1.0.0" 1314 | spdx-expression-parse "~1.0.0" 1315 | 1316 | whatwg-fetch@>=0.10.0: 1317 | version "2.0.3" 1318 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 1319 | 1320 | which-module@^2.0.0: 1321 | version "2.0.0" 1322 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1323 | 1324 | which@^1.2.9: 1325 | version "1.2.14" 1326 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" 1327 | dependencies: 1328 | isexe "^2.0.0" 1329 | 1330 | wordwrap@~1.0.0: 1331 | version "1.0.0" 1332 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1333 | 1334 | wrap-ansi@^2.0.0: 1335 | version "2.1.0" 1336 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1337 | dependencies: 1338 | string-width "^1.0.1" 1339 | strip-ansi "^3.0.1" 1340 | 1341 | wrappy@1: 1342 | version "1.0.2" 1343 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1344 | 1345 | write@^0.2.1: 1346 | version "0.2.1" 1347 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1348 | dependencies: 1349 | mkdirp "^0.5.1" 1350 | 1351 | y18n@^3.2.1: 1352 | version "3.2.2" 1353 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" 1354 | 1355 | yallist@^2.1.2: 1356 | version "2.1.2" 1357 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1358 | 1359 | yargs-parser@^7.0.0: 1360 | version "7.0.0" 1361 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" 1362 | dependencies: 1363 | camelcase "^4.1.0" 1364 | 1365 | yargs@^8.0.2: 1366 | version "8.0.2" 1367 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" 1368 | dependencies: 1369 | camelcase "^4.1.0" 1370 | cliui "^3.2.0" 1371 | decamelize "^1.1.1" 1372 | get-caller-file "^1.0.1" 1373 | os-locale "^2.0.0" 1374 | read-pkg-up "^2.0.0" 1375 | require-directory "^2.1.1" 1376 | require-main-filename "^1.0.1" 1377 | set-blocking "^2.0.0" 1378 | string-width "^2.0.0" 1379 | which-module "^2.0.0" 1380 | y18n "^3.2.1" 1381 | yargs-parser "^7.0.0" 1382 | --------------------------------------------------------------------------------