diff --git a/package-lock.json b/package-lock.json index bd504906f..53bfba7f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2426,7 +2426,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -2979,7 +2979,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -2991,7 +2991,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -7710,6 +7710,15 @@ "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0" } + }, + "react-native-keyboard-aware-scroll-view": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.5.0.tgz", + "integrity": "sha512-nGXsACZBCiWuwRrZy+UjiSJqb4tZ/6ePHUSY8M+09g4VfNm/ogvvWpwBa6B999NZ6DwhZTKBjVWeZxX9XG8bbQ==", + "requires": { + "prop-types": "^15.6.0", + "react-native-iphone-x-helper": "^1.0.1" + } } } }, @@ -8867,17 +8876,17 @@ } }, "react-native-iphone-x-helper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.0.3.tgz", - "integrity": "sha512-QHzpx4fv9u30VVU1DMgotiZsUB+m4BRjypca2rOczyj3cZBny5I+QDplrpFIBhzsa1iADNkziWa7kInzmKs00Q==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.0.tgz", + "integrity": "sha512-xIeTo4s77wwKgBZLVRIZC9tM9/PkXS46Ul76NXmvmixEb3ZwqGdQesR3zRiLMOoIdfOURB6N9bba9po7+x9Bag==" }, "react-native-keyboard-aware-scroll-view": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.5.0.tgz", - "integrity": "sha512-nGXsACZBCiWuwRrZy+UjiSJqb4tZ/6ePHUSY8M+09g4VfNm/ogvvWpwBa6B999NZ6DwhZTKBjVWeZxX9XG8bbQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.7.2.tgz", + "integrity": "sha512-FCVKAmM5jHwbWZFW/zUOhid18OoSGcbyx2jGk+q6eVjjtj+RPomeqX0aAHf2ALXYJ1BuC5+OtXhFA/hp8ombcQ==", "requires": { - "prop-types": "^15.6.0", - "react-native-iphone-x-helper": "^1.0.1" + "prop-types": "^15.6.2", + "react-native-iphone-x-helper": "^1.0.3" } }, "react-native-lightbox": { @@ -8914,6 +8923,14 @@ "react-native-animatable": "^1.2.4" } }, + "react-native-modal-dropdown": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-native-modal-dropdown/-/react-native-modal-dropdown-0.6.2.tgz", + "integrity": "sha512-1jzByA+ME+q0mZJ2rZrLsf6jVwJhNxNHdg7I50xYZ9oYJsmmKwF9r/ks95tZxxks4Zvd7/FnaveNtyd+uevXAw==", + "requires": { + "prop-types": "^15.6.0" + } + }, "react-native-modal-popover": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/react-native-modal-popover/-/react-native-modal-popover-0.0.10.tgz", @@ -8956,14 +8973,6 @@ "prop-types": "^15.5.10" } }, - "react-native-theming": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/react-native-theming/-/react-native-theming-1.0.16.tgz", - "integrity": "sha512-f8P7F3yKW9i+PmsmZo98V933Ggsu6YpsBw8pvNEAOENnNqbFmeDL6K+89F0WmkpF6bSs/qqSbyGUWKvCgNhBkw==", - "requires": { - "prop-types": "^15.6.0" - } - }, "react-native-vector-icons": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-4.6.0.tgz", @@ -9915,7 +9924,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", diff --git a/package.json b/package.json index 319c20899..d4ac2ccb1 100644 --- a/package.json +++ b/package.json @@ -25,13 +25,14 @@ "react-native-extended-stylesheet": "^0.10.0", "react-native-fast-image": "^4.0.14", "react-native-html-renderer": "^1.0.0", + "react-native-keyboard-aware-scroll-view": "^0.7.2", "react-native-markdown-editor": "^1.0.1", "react-native-modal": "^6.5.0", + "react-native-modal-dropdown": "^0.6.2", "react-native-modal-popover": "0.0.10", "react-native-navigation": "^2.0.2519", "react-native-restart": "0.0.6", "react-native-slider": "^0.11.0", - "react-native-theming": "^1.0.16", "react-native-vector-icons": "^4.6.0", "react-redux": "^5.0.7", "realm": "^2.15.3", diff --git a/src/_EXAMPLES FOR DEVELOPERS/styles/example.styles.js b/src/_EXAMPLES FOR DEVELOPER/actions/.gitkeep similarity index 100% rename from src/_EXAMPLES FOR DEVELOPERS/styles/example.styles.js rename to src/_EXAMPLES FOR DEVELOPER/actions/.gitkeep diff --git a/src/_EXAMPLES FOR DEVELOPER/components/statefull/container/exampleContainer.js b/src/_EXAMPLES FOR DEVELOPER/components/statefull/container/exampleContainer.js new file mode 100644 index 000000000..de63d9b50 --- /dev/null +++ b/src/_EXAMPLES FOR DEVELOPER/components/statefull/container/exampleContainer.js @@ -0,0 +1,43 @@ +import React, { Component } from "react"; +import { connect } from "react-redux"; + +// Services and Actions + +// Middleware + +// Constants + +// Utilities + +// Component +import { ExampleView } from "../"; + +/* +* Props Name Description Value +*@props --> props name here description here Value Type Here +* +*/ + +class ExampleContainer extends Component { + constructor(props) { + super(props); + this.state = {}; + } + + // Component Life Cycle Functions + + // Component Functions + + render() { + // eslint-disable-next-line + const {} = this.props; + + return ; + } +} + +const mapStateToProps = state => ({ + user: state.user.user, +}); + +export default connect(mapStateToProps)(ExampleContainer); diff --git a/src/_EXAMPLES FOR DEVELOPER/components/statefull/index.js b/src/_EXAMPLES FOR DEVELOPER/components/statefull/index.js new file mode 100644 index 000000000..d1e9460be --- /dev/null +++ b/src/_EXAMPLES FOR DEVELOPER/components/statefull/index.js @@ -0,0 +1,5 @@ +import ExampleView from "./view/exampleView"; +import ExampleContainer from "./container/exampleContainer"; + +export { ExampleView, ExampleContainer }; +export default ExampleContainer; diff --git a/src/_EXAMPLES FOR DEVELOPER/components/statefull/view/exampleStyles.js b/src/_EXAMPLES FOR DEVELOPER/components/statefull/view/exampleStyles.js new file mode 100644 index 000000000..15460415e --- /dev/null +++ b/src/_EXAMPLES FOR DEVELOPER/components/statefull/view/exampleStyles.js @@ -0,0 +1,7 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + styleName: { + // TODO: If we need default style. We can put there. + }, +}); diff --git a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/screen/exampleScreen.js b/src/_EXAMPLES FOR DEVELOPER/components/statefull/view/exampleView.js similarity index 72% rename from src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/screen/exampleScreen.js rename to src/_EXAMPLES FOR DEVELOPER/components/statefull/view/exampleView.js index fc96cd237..ac33f46a1 100644 --- a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/screen/exampleScreen.js +++ b/src/_EXAMPLES FOR DEVELOPER/components/statefull/view/exampleView.js @@ -11,11 +11,10 @@ import styles from "./_styles"; class ExampleView extends Component { /* Props - * ------------------------------------------------ TODO: Fill fallowlines - * @prop { type } name - Description. - * @prop { type } name - Description. - * + * ------------------------------------------------ + * @prop { type } name - Description.... */ + constructor(props) { super(props); this.state = {}; diff --git a/src/_EXAMPLES FOR DEVELOPER/components/stateless/exampleStyles.js b/src/_EXAMPLES FOR DEVELOPER/components/stateless/exampleStyles.js new file mode 100644 index 000000000..15460415e --- /dev/null +++ b/src/_EXAMPLES FOR DEVELOPER/components/stateless/exampleStyles.js @@ -0,0 +1,7 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + styleName: { + // TODO: If we need default style. We can put there. + }, +}); diff --git a/src/_EXAMPLES FOR DEVELOPER/components/stateless/exampleView.js b/src/_EXAMPLES FOR DEVELOPER/components/stateless/exampleView.js new file mode 100644 index 000000000..0d72efe50 --- /dev/null +++ b/src/_EXAMPLES FOR DEVELOPER/components/stateless/exampleView.js @@ -0,0 +1,12 @@ +import React from "react"; +import { View } from "react-native"; +import styles from "./exampleStyles"; + +/* Props +* ------------------------------------------------ +* @prop { type } name - Description.... +*/ + +const ExampleView = ({ x, y, z }) => ; + +export default ExampleView; diff --git a/src/_EXAMPLES FOR DEVELOPER/constant/.gitkeep b/src/_EXAMPLES FOR DEVELOPER/constant/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/_EXAMPLES FOR DEVELOPER/reducer/.gitkeep b/src/_EXAMPLES FOR DEVELOPER/reducer/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/_EXAMPLES FOR DEVELOPER/screen/.gitkeep b/src/_EXAMPLES FOR DEVELOPER/screen/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/index.js b/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/index.js deleted file mode 100644 index 35b7a581e..000000000 --- a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import ExampleView from "./exampleView"; -import ExampleContainer from "./exampleContainer"; - -export { ExampleView, ExampleContainer }; -export default ExampleContainer; diff --git a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/screen/exampleStyles.js b/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/screen/exampleStyles.js deleted file mode 100644 index 814b1b4f6..000000000 --- a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/example/screen/exampleStyles.js +++ /dev/null @@ -1,3 +0,0 @@ -import EStyleSheet from "react-native-extended-stylesheet"; - -export default EStyleSheet.create({}); diff --git a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/index.js b/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/index.js deleted file mode 100644 index 4483c09d6..000000000 --- a/src/_EXAMPLES FOR DEVELOPERS/componentsScreens/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Exmaple from "./example/example.container"; - -export { Exmaple }; diff --git a/src/assets/steem_connect.png b/src/assets/steem_connect.png new file mode 100644 index 000000000..b7b8bd7f1 Binary files /dev/null and b/src/assets/steem_connect.png differ diff --git a/src/components/basicUIElements/view/lineBreakStyles.js b/src/components/basicUIElements/view/lineBreakStyles.js index 864ab5e5b..a3d199d16 100644 --- a/src/components/basicUIElements/view/lineBreakStyles.js +++ b/src/components/basicUIElements/view/lineBreakStyles.js @@ -5,5 +5,6 @@ export default EStyleSheet.create({ width: "$deviceWidth", backgroundColor: "#f6f6f6", height: 10, + justifyContent: "center", }, }); diff --git a/src/components/basicUIElements/view/lineBreakView.js b/src/components/basicUIElements/view/lineBreakView.js index 65779d15d..966e4fef8 100644 --- a/src/components/basicUIElements/view/lineBreakView.js +++ b/src/components/basicUIElements/view/lineBreakView.js @@ -2,6 +2,10 @@ import React from "react"; import { View } from "react-native"; import styles from "./lineBreakStyles"; -const LineBreak = ({ color }) => ; +const LineBreak = ({ color, children, height }) => ( + + {children} + +); export default LineBreak; diff --git a/src/components/buttons/index.js b/src/components/buttons/index.js index 6e06c5bf2..27397c583 100644 --- a/src/components/buttons/index.js +++ b/src/components/buttons/index.js @@ -1,5 +1,5 @@ -import GreetingHeaderButton from "./views/greetingHeaderButtonView"; import CircularButton from "./views/circularButtonView"; import IconButton from "./views/iconButtomView"; +import TextButton from "./views/textButtonView"; -export { GreetingHeaderButton, CircularButton, IconButton }; +export { CircularButton, IconButton, TextButton }; diff --git a/src/components/buttons/views/greetingHeaderButtonView.js b/src/components/buttons/views/greetingHeaderButtonView.js deleted file mode 100644 index 7f32598dc..000000000 --- a/src/components/buttons/views/greetingHeaderButtonView.js +++ /dev/null @@ -1,17 +0,0 @@ -import React, { Fragment } from "react"; -import { TouchableWithoutFeedback, Text } from "react-native"; - -import styles from "./greetingHeaderButtonStyles"; - -const GreetingHeaderButtonView = ({ text, onPress, style }) => ( - - onPress && onPress()} - > - {text} - - -); - -export default GreetingHeaderButtonView; diff --git a/src/components/buttons/views/greetingHeaderButtonStyles.js b/src/components/buttons/views/textButtonStyles.js similarity index 86% rename from src/components/buttons/views/greetingHeaderButtonStyles.js rename to src/components/buttons/views/textButtonStyles.js index 8fb2f46b4..21e3a19b7 100644 --- a/src/components/buttons/views/greetingHeaderButtonStyles.js +++ b/src/components/buttons/views/textButtonStyles.js @@ -2,6 +2,8 @@ import EStyleSheet from "react-native-extended-stylesheet"; export default EStyleSheet.create({ button: { + flex: 1, + flexDirection: "row", width: 54, backgroundColor: "transparent", height: 19, diff --git a/src/components/buttons/views/textButtonView.js b/src/components/buttons/views/textButtonView.js new file mode 100644 index 000000000..aceda7faf --- /dev/null +++ b/src/components/buttons/views/textButtonView.js @@ -0,0 +1,19 @@ +import React, { Fragment } from "react"; +import { TouchableWithoutFeedback, Text, View } from "react-native"; + +import styles from "./textButtonStyles"; + +const TextButtonView = ({ text, onPress, style }) => ( + + onPress && onPress()} + > + + {text} + + + +); + +export default TextButtonView; diff --git a/src/components/containerHeader/index.js b/src/components/containerHeader/index.js new file mode 100644 index 000000000..6c6a4ba60 --- /dev/null +++ b/src/components/containerHeader/index.js @@ -0,0 +1,4 @@ +import ContainerHeader from "./view/containerHeaderView"; + +export { ContainerHeader }; +export default ContainerHeader; diff --git a/src/components/containerHeader/view/containerHeaderStyles.js b/src/components/containerHeader/view/containerHeaderStyles.js new file mode 100644 index 000000000..b9eed7795 --- /dev/null +++ b/src/components/containerHeader/view/containerHeaderStyles.js @@ -0,0 +1,20 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + wrapper: { + width: "$deviceWidth", + height: 50, + backgroundColor: "$white", + borderTopColor: "#cfcfcf", + justifyContent: "center", + borderTopColor: "#e7e7e7", + borderTopWidth: 1, + }, + title: { + alignSelf: "flex-start", + fontSize: 14, + color: "$primaryGray", + fontWeight: "bold", + marginLeft: 26, + }, +}); diff --git a/src/components/containerHeader/view/containerHeaderView.js b/src/components/containerHeader/view/containerHeaderView.js new file mode 100644 index 000000000..a5d91df65 --- /dev/null +++ b/src/components/containerHeader/view/containerHeaderView.js @@ -0,0 +1,37 @@ +import React, { Component } from "react"; +import { View, Text } from "react-native"; + +// Constants + +// Components + +// Styles +import styles from "./containerHeaderStyles"; + +class ContainerHeaderView extends Component { + /* Props + * ------------------------------------------------ + * @prop { type } title - Renderable title for header. + * + */ + constructor(props) { + super(props); + this.state = {}; + } + + // Component Life Cycles + + // Component Functions + + render() { + const { title } = this.props; + + return ( + + {title} + + ); + } +} + +export default ContainerHeaderView; diff --git a/src/components/dropdownButton/index.js b/src/components/dropdownButton/index.js new file mode 100644 index 000000000..9a4b49faa --- /dev/null +++ b/src/components/dropdownButton/index.js @@ -0,0 +1,4 @@ +import DropdownButton from "./view/dropdownButtonView"; + +export { DropdownButton }; +export default DropdownButton; diff --git a/src/components/dropdownButton/view/dropdownButtonStyles.js b/src/components/dropdownButton/view/dropdownButtonStyles.js new file mode 100644 index 000000000..ba821047c --- /dev/null +++ b/src/components/dropdownButton/view/dropdownButtonStyles.js @@ -0,0 +1,85 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + container: { + flexDirection: "row", + justifyContent: "center", + alignItems: "center", + alignSelf: "flex-start", + height: 35, + }, + dropdownText: { + fontSize: 9, + color: "$primaryGray", + marginLeft: 25, + }, + dropdownIcon: { + fontSize: 18, + color: "#c1c5c7", + marginLeft: 7, + marginTop: 1, + }, + dropdown: { + marginTop: 5, + marginLeft: -2, + paddingTop: 10, + paddingBottom: 10, + minWidth: "$deviceWidth / 2", + borderColor: "#e7e7e7", + borderRadius: 5, + shadowOpacity: 0.8, + shadowColor: "#e7e7e7", + }, + iconWrapper: { + justifyContent: "center", + alignItems: "center", + }, + dropdownText: { + fontSize: 9, + color: "$primaryGray", + padding: 5, + borderColor: "#e7e7e7", + }, + dropdownTextHighlight: { + backgroundColor: "#387be5", + width: "$deviceWidth / 3", + }, + button: { + marginLeft: 25, + }, + buttonText: { + fontSize: 9, + alignSelf: "center", + color: "$primaryGray", + fontWeight: "normal", + }, + rowWrapper: { + height: 35, + justifyContent: "center", + borderTopRightRadius: 20, + borderBottomRightRadius: 20, + width: "$deviceWidth / 2.5", + padding: 5, + }, + dropdownRow: { + marginLeft: 30, + justifyContent: "center", + }, + highlightedRow: { + borderRadius: 20, + height: 35, + backgroundColor: "$primaryBlue", + alignSelf: "flex-start", + paddingLeft: 11, + paddingRight: 11, + marginLeft: 20, + }, + highlightedRowText: { + color: "$white", + fontWeight: "bold", + }, + rowText: { + fontSize: 9, + color: "$primaryGray", + }, +}); diff --git a/src/components/dropdownButton/view/dropdownButtonView.js b/src/components/dropdownButton/view/dropdownButtonView.js new file mode 100644 index 000000000..580414947 --- /dev/null +++ b/src/components/dropdownButton/view/dropdownButtonView.js @@ -0,0 +1,70 @@ +import React from "react"; +import { View, Text, TouchableHighlight } from "react-native"; +import { Dimensions } from "react-native"; + +// Constants +const DEVICE_HEIGHT = Dimensions.get("window").height; + +// External components +import ModalDropdown from "react-native-modal-dropdown"; +import Ionicons from "react-native-vector-icons/Ionicons"; + +// Styles +import styles from "./dropdownButtonStyles"; + +/* Props TODO: Fill all description + * ------------------------------------------------ + * @prop { string } defaultText - Description.... + * @prop { string } iconName - Description.... + * @prop { array } options - Description.... + * @prop { function } onSelect - Description.... + * + */ + +const renderDropdownRow = (rowData, rowID, highlighted) => { + return ( + + + + {rowData} + + + + ); +}; + +const DropdownButtonView = ({ + defaultText, + iconName, + options, + onSelect, + defaultIndex, +}) => ( + + onSelect && onSelect(e)} + defaultIndex={defaultIndex} + defaultValue={defaultText} + renderSeparator={() => null} + renderRow={(rowData, rowID, highlighted) => + renderDropdownRow(rowData, rowID, highlighted) + } + /> + + + + +); + +export default DropdownButtonView; diff --git a/src/components/filterBar/index.js b/src/components/filterBar/index.js new file mode 100644 index 000000000..7e821ff1e --- /dev/null +++ b/src/components/filterBar/index.js @@ -0,0 +1,4 @@ +import FilterBar from "./view/filterBarView"; + +export { FilterBar }; +export default FilterBar; diff --git a/src/components/filterBar/view/filterBarStyles.js b/src/components/filterBar/view/filterBarStyles.js new file mode 100644 index 000000000..327703c72 --- /dev/null +++ b/src/components/filterBar/view/filterBarStyles.js @@ -0,0 +1,20 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + container: { + justifyContent: "center", + }, + filterBarWrapper: { + flexDirection: "row", + justifyContent: "space-between", + }, + rightIconWrapper: { + marginRight: 32, + }, + rightIcon: { + color: "#c1c5c7", + fontSize: 32, + textAlign: "center", + width: 32, + }, +}); diff --git a/src/components/filterBar/view/filterBarView.js b/src/components/filterBar/view/filterBarView.js new file mode 100644 index 000000000..30c8e94ce --- /dev/null +++ b/src/components/filterBar/view/filterBarView.js @@ -0,0 +1,47 @@ +import React from "react"; +import { View, TouchableOpacity, Text } from "react-native"; +import Ionicons from "react-native-vector-icons/Ionicons"; + +// External Components +import { DropdownButton } from "../../../components/dropdownButton"; + +// Components +import { LineBreak } from "../../basicUIElements"; + +// Styles +import styles from "./filterBarStyles"; + +/* Props +* ------------------------------------------------ +* @prop { type } name - Description.... +*/ + +const FilterBarView = ({ + rightIconName, + options, + defaultText, + dropdownIconName, + onDropdownSelect, + onRightIconPress, +}) => ( + + + + + + + + + + +); + +export default FilterBarView; diff --git a/src/components/formInput/view/formInputStyles.js b/src/components/formInput/view/formInputStyles.js index d90b10a73..eac09a18a 100644 --- a/src/components/formInput/view/formInputStyles.js +++ b/src/components/formInput/view/formInputStyles.js @@ -5,7 +5,7 @@ export default EStyleSheet.create({ borderTopLeftRadius: 8, borderTopRightRadius: 8, marginHorizontal: 30, - marginVertical: 20, + marginVertical: 10, flexDirection: "row", backgroundColor: "#f5f5f5", height: 60, diff --git a/src/components/formInput/view/formInputView.js b/src/components/formInput/view/formInputView.js index 440e31883..2c0e31a87 100644 --- a/src/components/formInput/view/formInputView.js +++ b/src/components/formInput/view/formInputView.js @@ -29,27 +29,34 @@ class FormInputView extends Component { this.state = { value: "", inputBorderColor: "#c1c5c7", + isValid: true, }; } // Component Life Cycles + componentWillReceiveProps(nextProps) { + const { isValid } = this.props; + + if (nextProps.isValid !== isValid) { + this.setState({ isValid: nextProps.isValid }); + } + } // Component Functions _handleOnChange = value => { const { onChange } = this.props; - value && this.setState({ value }); - onChange && value && onChange(value); + this.setState({ value }); + onChange && onChange(value); }; render() { - const { inputBorderColor, value } = this.state; + const { inputBorderColor, isValid, value } = this.state; const { placeholder, type, isFirstImage, isEditable, - isValid, leftIconName, rightIconName, secureTextEntry, @@ -81,7 +88,7 @@ class FormInputView extends Component { this.setState({ - inputBorderColor: "#357ce6", + inputBorderColor: "$primaryBlue", }) } onSubmitEditing={() => diff --git a/src/components/index.js b/src/components/index.js index 727517833..7233d6c57 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -1,6 +1,6 @@ import Logo from "./logo/logo"; import Comment from "./comment/comment"; -import PostCard from "./post-card/postCard"; +import PostCard from "./postCard"; import Reply from "./reply/reply"; import Search from "./search/search"; import { FormInput } from "./formInput"; diff --git a/src/components/informationArea/view/informationAreaStyles.js b/src/components/informationArea/view/informationAreaStyles.js index d6565c9f3..9fdb127e1 100644 --- a/src/components/informationArea/view/informationAreaStyles.js +++ b/src/components/informationArea/view/informationAreaStyles.js @@ -5,7 +5,7 @@ export default EStyleSheet.create({ flexDirection: "row", paddingLeft: 50, paddingRight: 32, - marginTop: 10, + marginTop: 20, }, infoIcon: { flex: 0.125, @@ -15,6 +15,6 @@ export default EStyleSheet.create({ infoText: { flex: 0.875, fontSize: 12, - color: "#788187", + color: "$primaryGray", }, }); diff --git a/src/components/leaderBoard/index.js b/src/components/leaderBoard/index.js new file mode 100644 index 000000000..5ba6a0a20 --- /dev/null +++ b/src/components/leaderBoard/index.js @@ -0,0 +1,4 @@ +import LeaderBoard from "./view/leaderBoardView"; + +export { LeaderBoard }; +export default LeaderBoard; diff --git a/src/components/leaderBoard/view/leaderBoardStyles.js b/src/components/leaderBoard/view/leaderBoardStyles.js new file mode 100644 index 000000000..15460415e --- /dev/null +++ b/src/components/leaderBoard/view/leaderBoardStyles.js @@ -0,0 +1,7 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + styleName: { + // TODO: If we need default style. We can put there. + }, +}); diff --git a/src/components/leaderBoard/view/leaderBoardView.js b/src/components/leaderBoard/view/leaderBoardView.js new file mode 100644 index 000000000..b8f0e3b7c --- /dev/null +++ b/src/components/leaderBoard/view/leaderBoardView.js @@ -0,0 +1,37 @@ +import React, { Component } from "react"; +import { View } from "react-native"; + +// Constants + +// Components + +// Styles +// eslint-disable-next-line +import styles from "./leaderBoardStyles"; + +/* +* Props Name Description Value +*@props --> props name here description here Value Type Here +* +*/ + +class LeaderBoardView extends Component { + constructor(props) { + super(props); + this.state = {}; + } + + // Component Life Cycles + + // Component Functions + + render() { + // eslint-disable-next-line + const {} = this.props; + + // eslint-disable-next-line + return ; + } +} + +export default LeaderBoardView; diff --git a/src/components/loginHeader/view/loginHeaderStyles.js b/src/components/loginHeader/view/loginHeaderStyles.js index 71ed9ce90..9bfd82707 100644 --- a/src/components/loginHeader/view/loginHeaderStyles.js +++ b/src/components/loginHeader/view/loginHeaderStyles.js @@ -14,7 +14,7 @@ export default EStyleSheet.create({ }, description: { textAlignVertical: "center", - color: "#788187", + color: "$primaryGray", fontSize: 14, fontWeight: "400", }, @@ -22,7 +22,7 @@ export default EStyleSheet.create({ textAlignVertical: "center", fontSize: 20, fontWeight: "bold", - color: "#788187", + color: "$primaryGray", marginBottom: 16, }, mascot: { diff --git a/src/components/loginHeader/view/loginHeaderView.js b/src/components/loginHeader/view/loginHeaderView.js index a546e6f4c..ce4db381b 100644 --- a/src/components/loginHeader/view/loginHeaderView.js +++ b/src/components/loginHeader/view/loginHeaderView.js @@ -3,7 +3,7 @@ import { View, Text, Image } from "react-native"; // Constants // Components -import { GreetingHeaderButton } from "../../buttons"; +import { TextButton } from "../../buttons"; import { LineBreak } from "../../basicUIElements"; // Styles // eslint-disable-next-line @@ -26,7 +26,7 @@ class LoginHeaderView extends Component { // Component Functions render() { - const { description, title } = this.props; + const { description, title, onPress, isKeyboardOpen } = this.props; return ( @@ -36,21 +36,23 @@ class LoginHeaderView extends Component { source={require("../../../assets/esteem.png")} /> - + - - - {title} - {description} + {!isKeyboardOpen && ( + + + {title} + {description} + + + + - - - - + )} ); diff --git a/src/components/mainButton/index.js b/src/components/mainButton/index.js new file mode 100644 index 000000000..d7a48f861 --- /dev/null +++ b/src/components/mainButton/index.js @@ -0,0 +1,3 @@ +import MainButton from "./view/mainButtonView"; + +export { MainButton }; diff --git a/src/components/mainButton/view/mainButtonStyles.js b/src/components/mainButton/view/mainButtonStyles.js new file mode 100644 index 000000000..48f44a474 --- /dev/null +++ b/src/components/mainButton/view/mainButtonStyles.js @@ -0,0 +1,51 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + wrapper: {}, + touchable: { + maxWidth: 200, + minWidth: 56, + height: 56, + borderRadius: 30, + backgroundColor: "$primaryBlue", + flexDirection: "row", + margin: 5, + shadowOffset: { + height: 5, + }, + shadowColor: "#5f5f5fbf", + shadowOpacity: 0.3, + }, + icon: { + alignSelf: "center", + fontSize: 25, + marginLeft: 20, + }, + text: { + color: "white", + fontWeight: "400", + alignSelf: "center", + fontSize: 14, + paddingLeft: 10, + paddingRight: 20, + }, + secondText: { + fontWeight: "bold", + }, + activityIndicator: { + minWidth: 56, + height: 56, + }, + body: { + flexDirection: "row", + }, + image: { + marginLeft: 20, + alignSelf: "center", + width: 20, + height: 20, + }, + disableTouchable: { + backgroundColor: "#c1c5c7", + }, +}); diff --git a/src/components/mainButton/view/mainButtonView.js b/src/components/mainButton/view/mainButtonView.js new file mode 100644 index 000000000..48a0b3d6b --- /dev/null +++ b/src/components/mainButton/view/mainButtonView.js @@ -0,0 +1,108 @@ +import React, { Component, Fragment } from "react"; +import { + ActivityIndicator, + Image, + Text, + TouchableOpacity, + View, +} from "react-native"; +import Ionicons from "react-native-vector-icons/Ionicons"; + +// Constants + +// Components + +// Styles +import styles from "./mainButtonStyles"; + +class MainButton extends Component { + /* Props + * ------------------------------------------------ + * @prop { string } isLoading - TODO: + * @prop { string } text - TODO: + * @prop { boolean } secondText - TODO: + * @prop { boolean } iconColor - TODO: + * @prop { boolean } iconName - TODO: + * @prop { boolean } isDisable - TODO: + * + * + */ + constructor(props) { + super(props); + + this.state = { + isDisable: !props.isLoading && props.isDisable, + }; + } + + // Component Life Cycles + componentWillReceiveProps(nextProps) { + const { isLoading, isDisable } = this.props; + if ( + nextProps.isLoading !== isLoading || + nextProps.isDisable !== isDisable + ) { + this.setState({ + isDisable: !nextProps.isLoading && nextProps.isDisable, + }); + } + } + + // Component Functions + _handleOnPress = () => { + const { onPress } = this.props; + + onPress && onPress(); + }; + + _getBody = () => { + const { + isLoading, + text, + secondText, + iconColor, + iconName, + source, + } = this.props; + + if (isLoading) { + return ( + + ); + } else if (text) { + return ( + + {source ? ( + + ) : ( + + )} + + {text} + {secondText && {secondText}} + + + ); + } + return ; + }; + + render() { + const { wrapperStyle } = this.props; + const { isDisable } = this.state; + + return ( + + this._handleOnPress()} + style={[styles.touchable, isDisable && styles.disableTouchable]} + > + {this._getBody()} + + + ); + } +} + +export default MainButton; diff --git a/src/components/notification/index.js b/src/components/notification/index.js new file mode 100644 index 000000000..dda0d4f48 --- /dev/null +++ b/src/components/notification/index.js @@ -0,0 +1,4 @@ +import Notification from "./view/notificationView"; + +export { Notification }; +export default Notification; diff --git a/src/components/notification/view/notificationStyles.js b/src/components/notification/view/notificationStyles.js new file mode 100644 index 000000000..5fe75c81c --- /dev/null +++ b/src/components/notification/view/notificationStyles.js @@ -0,0 +1,62 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + container: { + backgroundColor: "#fff", + }, + notificationWrapper: { + flex: 1, + flexDirection: "row", + width: "$deviceWidth", + justifyContent: "space-between", + alignItems: "center", + height: 64, + }, + avatar: { + width: 32, + height: 32, + borderRadius: 32 / 2, + marginLeft: 24, + }, + image: { + width: 32, + height: 32, + borderRadius: 32 / 4, + marginRight: 24, + }, + body: { + flexDirection: "column", + flexGrow: 1, + fontSize: 12, + marginRight: 28, + marginLeft: 16, + alignSelf: "center", + width: "$deviceWidth / 1.76", + }, + titleWrapper: { + flexDirection: "row", + }, + name: { + fontWeight: "bold", + }, + title: { + color: "$primaryGray", + }, + description: { + color: "#3c4449", + fontSize: 12, + fontWeight: "500", + }, + scrollView: { + height: "$deviceHeight / 1.35", + }, + isNewNotification: { + backgroundColor: "#eaf2fc", + borderTopWidth: 0.3, + borderBottomWidth: 0.3, + borderColor: "#e7e7e7", + }, + hasNoAvatar: { + backgroundColor: "#d8d8d8", + }, +}); diff --git a/src/components/notification/view/notificationView.js b/src/components/notification/view/notificationView.js new file mode 100644 index 000000000..1c53c6061 --- /dev/null +++ b/src/components/notification/view/notificationView.js @@ -0,0 +1,147 @@ +import React, { Component } from "react"; +import { View, ScrollView, Text, FlatList, Image } from "react-native"; +import { ContainerHeader } from "../../containerHeader"; +// Constants + +// Components +import { FilterBar } from "../../../components/filterBar"; +// Styles +import styles from "./notificationStyles"; + +class NotificationView extends Component { + /* Props + * ------------------------------------------------ + * @prop { type } name - Description.... + */ + constructor(props) { + super(props); + this.state = { + // NOTE: DOMI DATA! them gonna remove! + notification: [ + { + name: "esteemapp", + title: "25% likes your post:", + avatar: "https://steemitimages.com/u/feruz/avatar/small", + description: "My own Top 5 eSteem Surfer Featuressasasaasasas", + image: "https://steemitimages.com/u/feruz/avatar/small", + date: "yesterday", + isNew: true, + }, + { + name: "esteemapp", + title: "25% likes your post:", + avatar: "https://steemitimages.com/u/feruz/avatar/small", + description: "My own Top 5 eSteem Surfer Features", + image: "https://steemitimages.com/u/feruz/avatar/small", + date: "yesterday", + isNew: true, + }, + { + name: "esteemapp", + title: "25% likes your post:", + description: "My own Top 5 eSteem Surfer Features", + image: "https://steemitimages.com/u/feruz/avatar/small", + date: "yesterday", + }, + { + name: "esteemapp", + title: "25% likes your post:", + avatar: "https://steemitimages.com/u/feruz/avatar/small", + description: "My own Top 5 eSteem Surfer Featuresasassasasaasas", + date: "yesterday", + }, + { + name: "esteemapp", + title: "25% likes your post:", + avatar: "https://steemitimages.com/u/feruz/avatar/small", + description: "My own Top 5 eSteem Surfer Features", + image: "https://steemitimages.com/u/feruz/avatar/small", + date: "yesterday", + }, + ], + }; + } + + // Component Life Cycles + + // Component Functions + + _handleOnDropdownSelect = index => { + console.log("selected index is:" + index); + }; + + _getRenderItem = item => { + return ( + + + + + {item.name} + {item.title} + + + {item.description} + + + {item.image && ( + + )} + + ); + }; + + render() { + const { notification } = this.state; + + return ( + + + + + this._getRenderItem(item)} + keyExtractor={item => item.email} + /> + {/* Will remove follow lines */} + + this._getRenderItem(item)} + keyExtractor={item => item.email} + /> + + + ); + } +} + +export default NotificationView; diff --git a/src/components/post-card/postCard.js b/src/components/post-card/postCard.js deleted file mode 100644 index b726899a3..000000000 --- a/src/components/post-card/postCard.js +++ /dev/null @@ -1,653 +0,0 @@ -/* eslint-disable no-unused-vars */ -import React from "react"; -import { - StyleSheet, - Image, - TouchableOpacity, - Dimensions, - FlatList, - ActivityIndicator, -} from "react-native"; -import { - Card, - CardItem, - Left, - Right, - Thumbnail, - View, - Icon, - Body, - Text, -} from "native-base"; -import { Navigation } from "react-native-navigation"; - -import Modal from "react-native-modal"; -import { Popover, PopoverController } from "react-native-modal-popover"; -import Slider from "react-native-slider"; - -// STEEM -import { upvote, upvoteAmount } from "../../providers/steem/dsteem"; -import { decryptKey } from "../../utils/crypto"; -import { getUserData } from "../../realm/realm"; -/* eslint-enable no-unused-vars */ - -class PostCard extends React.PureComponent { - constructor(props) { - super(props); - this.upvoteContent = this.upvoteContent.bind(this); - this.calculateEstimatedAmount = this.calculateEstimatedAmount.bind( - this - ); - - this.state = { - value: 0.0, - isVoting: false, - isVoted: this.props.content.isVoted, - amount: "0.00", - isModalVisible: false, - }; - } - - componentDidMount() { - if (this.props.isLoggedIn == true) { - this.calculateEstimatedAmount(); - } - } - - calculateEstimatedAmount = async () => { - // Calculate total vesting shares - let total_vests = - parseFloat(this.props.user.vesting_shares) + - parseFloat(this.props.user.received_vesting_shares) - - parseFloat(this.props.user.delegated_vesting_shares); - - let final_vest = total_vests * 1e6; - - let power = - (this.props.user.voting_power * (this.state.value * 10000)) / - 10000 / - 50; - - let rshares = (power * final_vest) / 10000; - - let estimated = await upvoteAmount(rshares); - - this.setState({ - amount: estimated.toFixed(3), - }); - }; - - upvoteContent = async () => { - let postingKey; - let userData; - - if (this.props.isLoggedIn) { - await this.setState({ - isVoting: true, - }); - - await getUserData().then(result => { - userData = Array.from(result); - postingKey = decryptKey(userData[0].postingKey, "pinCode"); - }); - upvote( - { - voter: this.props.user.name, - author: this.props.content.author, - permlink: this.props.content.permlink, - weight: (this.state.value * 100).toFixed(0) * 100, - }, - postingKey - ) - .then(res => { - console.log(res); - this.setState({ - isVoted: true, - isVoting: false, - }); - }) - .catch(err => { - console.log(err); - this.setState({ - isVoted: false, - isVoting: false, - }); - }); - } - }; - - toggleModal = () => { - this.setState({ - isModalVisible: !this.state.isModalVisible, - }); - }; - - render() { - return ( - - - - - Navigation.push("tab1Stack", { - component: { - name: "navigation.eSteem.Author", - passProps: { - author: this.props.content.author, - isLoggedIn: this.props.isLoggedIn, - user: this.props.user, - }, - options: { - topBar: {}, - }, - }, - }) - } - > - - - - - - {this.props.content.author} - - - - - {this.props.content.author_reputation} - - - - - {this.props.content.category} - - - - {" "} - {this.props.content.created}{" "} - - - - - - - - - - Navigation.push("tab1Stack", { - component: { - name: "navigation.eSteem.Post", - passProps: { - content: this.props.content, - isLoggedIn: this.props.isLoggedIn, - user: this.props.user, - }, - options: { - topBar: {}, - }, - }, - }) - } - > - - - - {this.props.content.title} - - - {this.props.content.summary} - - - - - - - - {({ - openPopover, - closePopover, - popoverVisible, - setPopoverAnchor, - popoverAnchorRect, - }) => ( - - - {this.state.isVoting ? ( - - ) : ( - - {this.state.isVoted ? ( - - ) : ( - - )} - - )} - - - ${this.state.amount} - - { - closePopover(); - this.upvoteContent(); - }} - style={{ - flex: 0.1, - alignSelf: "center", - }} - > - - - { - this.setState( - { value }, - () => { - this.calculateEstimatedAmount(); - } - ); - }} - /> - - {( - this.state.value * 100 - ).toFixed(0)} - % - - - - - )} - - - - ${this.props.content.pending_payout_value} - - - - - - Tap to close! - - - item.voter.toString() - } - renderItem={({ item }) => ( - - - - {" "} - {item.voter} ( - {item.reputation}) - - - {item.value}$ - - - {item.percent}% - - - )} - /> - - - - - - - - - {this.props.content.children} - - - - - {this.props.content.top_likers ? ( - - - - - - @{this.props.content.top_likers[0]}, @ - {this.props.content.top_likers[1]}, @ - {this.props.content.top_likers[2]} - & - {this.props.content.vote_count - - this.props.content.top_likers.length}{" "} - others like this - - - ) : ( - - - {this.props.content.vote_count} likes - - - )} - - ); - } -} -const styles = StyleSheet.create({ - post: { - shadowColor: "white", - padding: 0, - marginRight: 0, - marginLeft: 0, - marginTop: 10, - marginBottom: 0, - borderWidth: 1, - borderColor: "#e5e5e5", - borderRadius: 5, - }, - avatar: { - width: 30, - height: 30, - borderRadius: 15, - borderColor: "lightgray", - borderWidth: 1, - }, - author: { - backgroundColor: "white", - alignSelf: "flex-start", - paddingVertical: 5, - }, - timeAgo: { - alignSelf: "center", - fontSize: 9, - fontWeight: "100", - marginHorizontal: 3, - }, - authorName: { - color: "#222", - fontWeight: "600", - fontSize: 10, - }, - upvoteButton: { - margin: 0, - flexDirection: "row", - paddingVertical: 0, - }, - upvoteIcon: { - alignSelf: "flex-start", - fontSize: 20, - color: "#007ee5", - margin: 0, - width: 18, - }, - payout: { - alignSelf: "center", - fontSize: 10, - color: "#626262", - marginLeft: 3, - }, - payoutIcon: { - fontSize: 15, - marginHorizontal: 3, - color: "#a0a0a0", - alignSelf: "center", - }, - payoutButton: { - flexDirection: "row", - alignSelf: "flex-start", - paddingVertical: 2, - }, - commentButton: { - padding: 0, - margin: 0, - flexDirection: "row", - }, - comment: { - alignSelf: "center", - fontSize: 10, - color: "#626262", - marginLeft: 3, - }, - commentIcon: { - alignSelf: "flex-start", - fontSize: 20, - color: "#007ee5", - margin: 0, - width: 20, - }, - title: { - fontSize: 12, - fontWeight: "500", - marginVertical: 5, - }, - summary: { - fontSize: 10, - fontWeight: "200", - overflow: "hidden", - }, - header: { - shadowColor: "white", - height: 50, - borderRadius: 5, - }, - body: { - justifyContent: "flex-start", - flexDirection: "row", - }, - image: { - margin: 0, - width: "100%", - height: 160, - }, - badge: { - alignSelf: "center", - borderColor: "lightgray", - borderWidth: 1, - borderRadius: 10, - width: 15, - height: 15, - padding: 2, - backgroundColor: "lightgray", - marginHorizontal: 5, - }, - category: { - alignSelf: "center", - borderRadius: 10, - height: 15, - backgroundColor: "#007EE5", - paddingHorizontal: 5, - paddingVertical: 1.5, - }, - categoryText: { - fontSize: 9, - color: "white", - fontWeight: "600", - }, - text: { - fontSize: 7, - alignSelf: "center", - textAlignVertical: "center", - color: "white", - fontWeight: "bold", - }, - topLikers: { - shadowColor: "white", - backgroundColor: "#f8f8f8", - borderWidth: 0, - padding: 0, - borderRadius: 5, - }, - likers_1: { - width: 14, - height: 14, - borderRadius: 7, - borderWidth: 0.5, - borderColor: "lightgray", - marginVertical: -5, - }, - likers_2: { - width: 14, - height: 14, - borderRadius: 7, - borderWidth: 0.5, - borderColor: "lightgray", - marginVertical: -5, - marginLeft: -3, - }, - likers_3: { - width: 14, - height: 14, - borderRadius: 7, - borderWidth: 0.5, - borderColor: "lightgray", - marginVertical: -5, - marginLeft: -3, - }, - footer: { - shadowColor: "white", - paddingLeft: 5, - borderRadius: 5, - fontSize: 7, - fontWeight: "100", - color: "#777777", - }, - popover: { - width: Dimensions.get("window").width - 20, - borderRadius: 5, - padding: 10, - }, - track: { - height: 2, - borderRadius: 1, - }, - thumb: { - width: 30, - height: 30, - borderRadius: 30 / 2, - backgroundColor: "white", - shadowColor: "black", - shadowOffset: { width: 0, height: 2 }, - shadowRadius: 2, - shadowOpacity: 0.35, - }, -}); - -export default PostCard; diff --git a/src/components/postCard/container/postCardContainer.js b/src/components/postCard/container/postCardContainer.js new file mode 100644 index 000000000..7d4c16483 --- /dev/null +++ b/src/components/postCard/container/postCardContainer.js @@ -0,0 +1,35 @@ +import React, { Component } from "react"; + +// Services and Actions + +// Middleware + +// Constants + +// Utilities + +// Component +import { PostCardView } from "../"; + +/* +* Props Name Description Value +*@props --> props name here description here Value Type Here +* +*/ + +class PostCardContainer extends Component { + constructor(props) { + super(props); + this.state = {}; + } + + // Component Life Cycle Functions + + // Component Functions + + render() { + return ; + } +} + +export default PostCardContainer; diff --git a/src/components/postCard/index.js b/src/components/postCard/index.js new file mode 100644 index 000000000..53c3a7c5b --- /dev/null +++ b/src/components/postCard/index.js @@ -0,0 +1,5 @@ +import PostCardView from "./view/postCardView"; +import PostCard from "./container/postCardContainer"; + +export { PostCardView, PostCard }; +export default PostCard; diff --git a/src/components/postCard/view/postCardStyles.js b/src/components/postCard/view/postCardStyles.js new file mode 100644 index 000000000..0f8b4b7d7 --- /dev/null +++ b/src/components/postCard/view/postCardStyles.js @@ -0,0 +1,200 @@ +import EStyleSheet from "react-native-extended-stylesheet"; + +export default EStyleSheet.create({ + post: { + shadowColor: "white", + padding: 0, + marginRight: 0, + marginLeft: 0, + marginTop: 10, + marginBottom: 0, + borderWidth: 1, + borderColor: "#e5e5e5", + borderRadius: 5, + }, + avatar: { + width: 30, + height: 30, + borderRadius: 15, + borderColor: "lightgray", + borderWidth: 1, + }, + author: { + backgroundColor: "white", + alignSelf: "flex-start", + paddingVertical: 5, + }, + timeAgo: { + alignSelf: "center", + fontSize: 9, + fontWeight: "100", + marginHorizontal: 3, + }, + authorName: { + color: "#222", + fontWeight: "600", + fontSize: 10, + }, + upvoteButton: { + margin: 0, + flexDirection: "row", + paddingVertical: 0, + }, + upvoteIcon: { + alignSelf: "flex-start", + fontSize: 20, + color: "#007ee5", + margin: 0, + width: 18, + }, + payout: { + alignSelf: "center", + fontSize: 10, + color: "#626262", + marginLeft: 3, + }, + payoutIcon: { + fontSize: 15, + marginHorizontal: 3, + color: "#a0a0a0", + alignSelf: "center", + }, + payoutButton: { + flexDirection: "row", + alignSelf: "flex-start", + paddingVertical: 2, + }, + commentButton: { + padding: 0, + margin: 0, + flexDirection: "row", + }, + comment: { + alignSelf: "center", + fontSize: 10, + color: "#626262", + marginLeft: 3, + }, + commentIcon: { + alignSelf: "flex-start", + fontSize: 20, + color: "#007ee5", + margin: 0, + width: 20, + }, + title: { + fontSize: 12, + fontWeight: "500", + marginVertical: 5, + }, + summary: { + fontSize: 10, + fontWeight: "200", + overflow: "hidden", + }, + header: { + shadowColor: "white", + height: 50, + borderRadius: 5, + }, + body: { + justifyContent: "flex-start", + flexDirection: "row", + }, + image: { + margin: 0, + width: "100%", + height: 160, + }, + badge: { + alignSelf: "center", + borderColor: "lightgray", + borderWidth: 1, + borderRadius: 10, + width: 15, + height: 15, + padding: 2, + backgroundColor: "lightgray", + marginHorizontal: 5, + }, + category: { + alignSelf: "center", + borderRadius: 10, + height: 15, + backgroundColor: "#007EE5", + paddingHorizontal: 5, + paddingVertical: 1.5, + }, + categoryText: { + fontSize: 9, + color: "white", + fontWeight: "600", + }, + text: { + fontSize: 7, + alignSelf: "center", + textAlignVertical: "center", + color: "white", + fontWeight: "bold", + }, + topLikers: { + shadowColor: "white", + backgroundColor: "#f8f8f8", + borderWidth: 0, + padding: 0, + borderRadius: 5, + }, + likers_1: { + width: 14, + height: 14, + borderRadius: 7, + borderWidth: 0.5, + borderColor: "lightgray", + marginVertical: -5, + }, + likers_2: { + width: 14, + height: 14, + borderRadius: 7, + borderWidth: 0.5, + borderColor: "lightgray", + marginVertical: -5, + marginLeft: -3, + }, + likers_3: { + width: 14, + height: 14, + borderRadius: 7, + borderWidth: 0.5, + borderColor: "lightgray", + marginVertical: -5, + marginLeft: -3, + }, + footer: { + shadowColor: "white", + paddingLeft: 5, + borderRadius: 5, + fontSize: 7, + fontWeight: "100", + color: "#777777", + }, + popover: { + width: "$deviceWidth - 20", + borderRadius: 5, + padding: 10, + }, + track: { + height: 2, + borderRadius: 1, + }, + thumb: { + width: 30, + height: 30, + borderRadius: 30 / 2, + backgroundColor: "white", + shadowColor: "black", + shadowOffset: { width: 0, height: 2 }, + shadowRadius: 2, + shadowOpacity: 0.35, + }, +}); diff --git a/src/components/postCard/view/postCardView.js b/src/components/postCard/view/postCardView.js new file mode 100644 index 000000000..14b10079d --- /dev/null +++ b/src/components/postCard/view/postCardView.js @@ -0,0 +1,423 @@ +import React, { Component } from "react"; +import { + Image, + TouchableOpacity, + FlatList, + ActivityIndicator, +} from "react-native"; +import { + Card, + CardItem, + Left, + Right, + Thumbnail, + View, + Icon, + Body, + Text, +} from "native-base"; +import { Navigation } from "react-native-navigation"; +import Modal from "react-native-modal"; +import { Popover, PopoverController } from "react-native-modal-popover"; +import Slider from "react-native-slider"; + +// STEEM +import { upvote, upvoteAmount } from "../../../providers/steem/dsteem"; +import { decryptKey } from "../../../utils/crypto"; +import { getUserData } from "../../../realm/realm"; + +// Styles +import styles from "./postCardStyles"; + +class PostCard extends Component { + /* Props + * ------------------------------------------------ + * @prop { string } description - Description texts. + * @prop { string } iconName - For icon render name. + * + */ + constructor(props) { + super(props); + this.upvoteContent = this.upvoteContent.bind(this); + this.calculateEstimatedAmount = this.calculateEstimatedAmount.bind(this); + + this.state = { + value: 0.0, + isVoting: false, + isVoted: props.content && props.content.isVoted, + amount: "0.00", + isModalVisible: false, + }; + } + + // Component Lifecycle Functions + componentDidMount() { + const { isLoggedIn } = this.props; + + isLoggedIn && this.calculateEstimatedAmount(); + } + + // Component Functions + calculateEstimatedAmount = async () => { + const { user } = this.props; + const { value } = this.state; + // Calculate total vesting shares + const total_vests = + parseFloat(user.vesting_shares) + + parseFloat(user.received_vesting_shares) - + parseFloat(user.delegated_vesting_shares); + + const final_vest = total_vests * 1e6; + + const power = (user.voting_power * (value * 10000)) / 10000 / 50; + + const rshares = (power * final_vest) / 10000; + + const estimated = await upvoteAmount(rshares); + + this.setState({ + amount: estimated.toFixed(3), + }); + }; + + upvoteContent = async () => { + const { isLoggedIn, user, content } = this.prop; + const { value } = this.state; + + let postingKey; + let userData; + + if (isLoggedIn) { + await this.setState({ + isVoting: true, + }); + + await getUserData().then(result => { + userData = Array.from(result); + postingKey = decryptKey(userData[0].postingKey, "pinCode"); + }); + upvote( + { + voter: user && user.name, + author: content && content.author, + permlink: content && content.permlink, + weight: (value * 100).toFixed(0) * 100, + }, + postingKey + ) + .then(res => { + console.log(res); + this.setState({ + isVoted: true, + isVoting: false, + }); + }) + .catch(err => { + console.log(err); + this.setState({ + isVoted: false, + isVoting: false, + }); + }); + } + }; + + toggleModal = () => { + const { isModalVisible } = this.state; + + this.setState({ + isModalVisible: !isModalVisible, + }); + }; + + render() { + const { content, isLoggedIn, user } = this.props; + const { isVoted, isVoting, isModalVisible, value } = this.state; + + // TODO: Should seperate bunch of component REFACTOR ME! + return ( + + + + + Navigation.push("tab1Stack", { + component: { + name: "navigation.eSteem.Author", + passProps: { + author: content && content.author, + isLoggedIn: isLoggedIn, + user: user, + }, + options: { + topBar: {}, + }, + }, + }) + } + > + + + + + {content.author} + + + {content.author_reputation} + + + {content.category} + + + {" "} + {content.created}{" "} + + + + + + + + + + Navigation.push("tab1Stack", { + component: { + name: "navigation.eSteem.Post", + passProps: { + content: content, + isLoggedIn: isLoggedIn, + user: user, + }, + options: { + topBar: {}, + }, + }, + }) + } + > + + + {content.title} + {content.summary} + + + + + + + {({ + openPopover, + closePopover, + popoverVisible, + setPopoverAnchor, + popoverAnchorRect, + }) => ( + + + {isVoting ? ( + + ) : ( + + {isVoted ? ( + + ) : ( + + )} + + )} + + + ${this.state.amount} + + { + closePopover(); + this.upvoteContent(); + }} + style={{ + flex: 0.1, + alignSelf: "center", + }} + > + + + { + this.setState({ value }, () => { + this.calculateEstimatedAmount(); + }); + }} + /> + + {(value * 100).toFixed(0)}% + + + + + )} + + + ${content.pending_payout_value} + + + + + Tap to close! + + item.voter.toString()} + renderItem={({ item }) => ( + + + + {" "} + {item.voter} ({item.reputation}) + + {item.value}$ + {item.percent}% + + )} + /> + + + + + + + + {content.children} + + + + {content.top_likers ? ( + + + + + + @{content.top_likers[0]}, @{content.top_likers[1]}, @ + {content.top_likers[2]} + & + {content.vote_count - content.top_likers.length} others like this + + + ) : ( + + {content.vote_count} likes + + )} + + ); + } +} + +export default PostCard; diff --git a/src/components/search/search.js b/src/components/search/search.js index d1f262e44..7687a99c2 100644 --- a/src/components/search/search.js +++ b/src/components/search/search.js @@ -1,12 +1,12 @@ import React, { Component } from "react"; import { - Text, - View, - Dimensions, - TextInput, - FlatList, - Image, - ActivityIndicator, + Text, + View, + Dimensions, + TextInput, + FlatList, + Image, + ActivityIndicator, } from "react-native"; import Ionicons from "react-native-vector-icons/Ionicons"; import { Navigation } from "react-native-navigation"; @@ -14,202 +14,200 @@ import { lookupAccounts } from "../../providers/steem/dsteem"; import { SEARCH_API_TOKEN } from "../../../config"; export default class Search extends Component { - constructor() { - super(); - this.handleSearch = this.handleSearch.bind(this); - this.state = { - text: "", - scroll_id: "", - posts: [], - users: [], - loading: false, - }; - } - - closeSearch = () => { - Navigation.dismissOverlay(this.props.componentId); + constructor() { + super(); + this.handleSearch = this.handleSearch.bind(this); + this.state = { + text: "", + scroll_id: "", + posts: [], + users: [], + loading: false, }; + } - handleSearch = async text => { - if (text.length < 3) return; - let users; - let posts; - let scroll_id; + closeSearch = () => { + Navigation.dismissOverlay(this.props.componentId); + }; - await this.setState({ - loading: true, - text: text, - }); + handleSearch = async text => { + if (text.length < 3) return; + let users; + let posts; + let scroll_id; - users = await lookupAccounts(text); + await this.setState({ + loading: true, + text: text, + }); - await this.setState({ users: users }); + users = await lookupAccounts(text); - let data = { q: text }; - await fetch("https://api.search.esteem.app/search", { - method: "POST", - headers: { - // TODO: Create a config file for authorization + await this.setState({ users: users }); - Authorization: SEARCH_API_TOKEN, - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }) - .then(result => result.json()) - .then(result => { - posts = result.results; - scroll_id = result.scroll_id; - }) - .catch(error => { - console.log(error); - }); + let data = { q: text }; + await fetch("https://api.search.esteem.app/search", { + method: "POST", + headers: { + // TODO: Create a config file for authorization - await this.setState({ loading: false }); + Authorization: SEARCH_API_TOKEN, + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }) + .then(result => result.json()) + .then(result => { + posts = result.results; + scroll_id = result.scroll_id; + }) + .catch(error => { + console.log(error); + }); - await this.setState({ - posts: posts, - scroll_id: scroll_id, - }); - }; + await this.setState({ loading: false }); - render() { - return ( - + + + + this.handleSearch(text)} + value={this.state.text} + /> + + + + + + ( + + + + @{item} + + + )} + keyExtractor={(post, index) => index.toString()} + removeClippedSubviews={true} + onEndThreshold={0} + /> + + ( + // TODO: Create a component to list search results + + > - - - this.handleSearch(text)} - value={this.state.text} - /> - - - - - - ( - - - - @{item} - - - )} - keyExtractor={(post, index) => index.toString()} - removeClippedSubviews={true} - onEndThreshold={0} - /> - - ( - // TODO: Create a component to list search results - - - - - {item.author} ({item.author_rep}) - - - - )} - keyExtractor={(post, index) => index.toString()} - removeClippedSubviews={true} - onEndThreshold={0} - initialNumToRender={20} - /> + style={{ + width: 40, + height: 40, + borderRadius: 20, + borderWidth: 1, + borderColor: "gray", + }} + /> + + {item.author} ({item.author_rep}) + - - ); - } + + )} + keyExtractor={(post, index) => index.toString()} + removeClippedSubviews={true} + onEndThreshold={0} + initialNumToRender={20} + /> + + + ); + } } diff --git a/src/components/tabBar/view/tabBarView.js b/src/components/tabBar/view/tabBarView.js index f1f59d789..07059557a 100644 --- a/src/components/tabBar/view/tabBarView.js +++ b/src/components/tabBar/view/tabBarView.js @@ -1,151 +1,143 @@ import React, { Component } from "react"; import { - Text, - View, - Animated, - TouchableNativeFeedback, - TouchableOpacity, - Platform, - Dimensions, + Text, + View, + Animated, + TouchableNativeFeedback, + TouchableOpacity, + Platform, + Dimensions, } from "react-native"; // Styles import styles from "./tabBarStyles"; export default class TabBar extends Component { - /* Props + /* Props * ------------------------------------------------ TODO: Fill fallowlines * @prop { type } name - Description. * @prop { type } name - Description. * */ - constructor(props) { - super(props); + constructor(props) { + super(props); - this.state = {}; - } + this.state = {}; + } - _renderTab = (name, page, isTabActive, onPressHandler) => { - const { activeColor, inactiveColor } = this.props; - const textColor = isTabActive ? activeColor : inactiveColor; - const fontWeight = isTabActive ? "bold" : "normal"; - const Button = Platform.OS == "ios" ? ButtonIos : ButtonAndroid; - // TODO: make generic component!! + _renderTab = (name, page, isTabActive, onPressHandler) => { + const { activeColor, inactiveColor } = this.props; + const textColor = isTabActive ? activeColor : inactiveColor; + const fontWeight = isTabActive ? "bold" : "normal"; + const Button = Platform.OS == "ios" ? ButtonIos : ButtonAndroid; + // TODO: make generic component!! - return ( - - ); + return ( + + ); + }; + + _renderUnderline = () => { + const { + activeColor, + tabs, + tabUnderlineDefaultWidth, + tabUnderlineScaleX, + scrollValue, + underlineStyle, + } = this.props; + + const containerWidth = Dimensions.get("window").width; + const numberOfTabs = tabs.length; + const underlineWidth = + tabUnderlineDefaultWidth || containerWidth / (numberOfTabs * 2); + const scale = tabUnderlineScaleX || 2; + const deLen = (containerWidth / numberOfTabs - underlineWidth) / 2; + const tabUnderlineStyle = { + position: "absolute", + width: underlineWidth, + height: 2, + borderRadius: 2, + backgroundColor: activeColor, + bottom: 0, + left: deLen, }; - _renderUnderline = () => { - const { - activeColor, - tabs, - tabUnderlineDefaultWidth, - tabUnderlineScaleX, - scrollValue, - underlineStyle, - } = this.props; + const translateX = scrollValue.interpolate({ + inputRange: [0, 1], + outputRange: [0, containerWidth / numberOfTabs], + }); - const containerWidth = Dimensions.get("window").width; - const numberOfTabs = tabs.length; - const underlineWidth = - tabUnderlineDefaultWidth || containerWidth / (numberOfTabs * 2); - const scale = tabUnderlineScaleX || 2; - const deLen = (containerWidth / numberOfTabs - underlineWidth) / 2; - const tabUnderlineStyle = { - position: "absolute", - width: underlineWidth, - height: 2, - borderRadius: 2, - backgroundColor: activeColor, - bottom: 0, - left: deLen, - }; + const scaleValue = defaultScale => { + const number = 4; + const arr = new Array(number * 2); - const translateX = scrollValue.interpolate({ - inputRange: [0, 1], - outputRange: [0, containerWidth / numberOfTabs], - }); - - const scaleValue = defaultScale => { - const number = 4; - const arr = new Array(number * 2); - - return arr.fill(0).reduce( - function(pre, cur, idx) { - idx == 0 - ? pre.inputRange.push(cur) - : pre.inputRange.push(pre.inputRange[idx - 1] + 0.5); - idx % 2 - ? pre.outputRange.push(defaultScale) - : pre.outputRange.push(1); - return pre; - }, - { inputRange: [], outputRange: [] } - ); - }; - - const scaleX = scrollValue.interpolate(scaleValue(scale)); - - return ( - - ); + return arr.fill(0).reduce( + function(pre, cur, idx) { + idx == 0 + ? pre.inputRange.push(cur) + : pre.inputRange.push(pre.inputRange[idx - 1] + 0.5); + idx % 2 + ? pre.outputRange.push(defaultScale) + : pre.outputRange.push(1); + return pre; + }, + { inputRange: [], outputRange: [] } + ); }; - render() { - const { activeTab, backgroundColor, goToPage, style } = this.props; + const scaleX = scrollValue.interpolate(scaleValue(scale)); - return ( - - {this.props.tabs.map((name, page) => { - const isTabActive = activeTab === page; - return this._renderTab(name, page, isTabActive, goToPage); - })} - {this._renderUnderline()} - - ); - } + return ( + + ); + }; + + render() { + const { activeTab, backgroundColor, goToPage, style } = this.props; + + return ( + + {this.props.tabs.map((name, page) => { + const isTabActive = activeTab === page; + return this._renderTab(name, page, isTabActive, goToPage); + })} + {this._renderUnderline()} + + ); + } } const ButtonAndroid = props => ( - - {props.children} - + + {props.children} + ); const ButtonIos = props => ( - {props.children} + {props.children} ); diff --git a/src/navigation.js b/src/navigation.js index 224bbf8c2..5da9761f9 100755 --- a/src/navigation.js +++ b/src/navigation.js @@ -40,8 +40,8 @@ export const goToAuthScreens = () => right: 0, }, icon: require("./assets/feed.png"), - iconColor: "gray", - selectedIconColor: "#222", + iconColor: "#c1c5c7", + selectedIconColor: "#357ce6", }, }, }, @@ -67,8 +67,13 @@ export const goToAuthScreens = () => right: 0, }, icon: require("./assets/notification.png"), - iconColor: "gray", - selectedIconColor: "#222", + iconColor: "#c1c5c7", + selectedIconColor: "#357ce6", + }, + topBar: { + visible: false, + noBorder: true, + elevation: 0, }, }, }, @@ -94,8 +99,8 @@ export const goToAuthScreens = () => right: 0, }, icon: require("./assets/add.png"), - iconColor: "gray", - selectedIconColor: "#222", + iconColor: "#c1c5c7", + selectedIconColor: "#357ce6", }, }, }, @@ -121,8 +126,8 @@ export const goToAuthScreens = () => right: 0, }, icon: require("./assets/wallet.png"), - iconColor: "gray", - selectedIconColor: "#222", + iconColor: "#c1c5c7", + selectedIconColor: "#357ce6", }, }, }, @@ -148,8 +153,8 @@ export const goToAuthScreens = () => right: 0, }, icon: require("./assets/wallet.png"), - iconColor: "gray", - selectedIconColor: "#222", + iconColor: "#c1c5c7", + selectedIconColor: "#357ce6", }, }, }, @@ -161,7 +166,7 @@ export const goToAuthScreens = () => textColor: "#AED581", iconColor: "#AED581", selectedTextColor: "gray", - selectedIconColor: "gray", + selectediconColor: "#c1c5c7", fontFamily: "HelveticaNeue-Italic", fontSize: 13, }, @@ -188,8 +193,8 @@ export const goToAuthScreens = () => animate: false, // Controls whether BottomTabs visibility changes should be animated }, bottomTab: { - iconColor: "gray", - selectedIconColor: "#222", + iconColor: "#c1c5c7", + selectedIconColor: "#357ce6", textColor: "#1B4C77", selectedTextColor: "#0f0", fontFamily: "HelveticaNeue-Italic", diff --git a/src/providers/steem/dsteem.js b/src/providers/steem/dsteem.js index e0c699dda..875c246c1 100644 --- a/src/providers/steem/dsteem.js +++ b/src/providers/steem/dsteem.js @@ -12,13 +12,13 @@ let medianPrice = null; let client = new Client("https://api.steemit.com"); getClient = async () => { - let server = await AsyncStorage.getItem("server"); + let server = await AsyncStorage.getItem("server"); - if (server === null || server === undefined || server === "") { - client = new Client("https://api.steemit.com"); - } else { - client = new Client(`${server}`); - } + if (server === null || server === undefined || server === "") { + client = new Client("https://api.steemit.com"); + } else { + client = new Client(`${server}`); + } }; getClient(); @@ -27,14 +27,14 @@ getClient(); * @param user username */ export const getAccount = user => { - return new Promise((resolve, reject) => { - try { - let account = client.database.getAccounts([user]); - resolve(account); - } catch (error) { - reject(error); - } - }); + return new Promise((resolve, reject) => { + try { + let account = client.database.getAccounts([user]); + resolve(account); + } catch (error) { + reject(error); + } + }); }; /** @@ -42,43 +42,43 @@ export const getAccount = user => { * @param user username */ export const getUser = async user => { - try { - let account = await client.database.getAccounts([user]); - // get global properties to calculate Steem Power - let global_properties = await client.database.getDynamicGlobalProperties(); + try { + let account = await client.database.getAccounts([user]); + // get global properties to calculate Steem Power + let global_properties = await client.database.getDynamicGlobalProperties(); - // calculate Steem Power (own, received, delegated) - account[0].steem_power = vestToSteem( - account[0].vesting_shares, - global_properties.total_vesting_shares, - global_properties.total_vesting_fund_steem - ).toFixed(0); - account[0].received_steem_power = vestToSteem( - account[0].received_vesting_shares, - global_properties.total_vesting_shares, - global_properties.total_vesting_fund_steem - ).toFixed(0); - account[0].delegated_steem_power = vestToSteem( - account[0].delegated_vesting_shares, - global_properties.total_vesting_shares, - global_properties.total_vesting_fund_steem - ).toFixed(0); + // calculate Steem Power (own, received, delegated) + account[0].steem_power = vestToSteem( + account[0].vesting_shares, + global_properties.total_vesting_shares, + global_properties.total_vesting_fund_steem + ).toFixed(0); + account[0].received_steem_power = vestToSteem( + account[0].received_vesting_shares, + global_properties.total_vesting_shares, + global_properties.total_vesting_fund_steem + ).toFixed(0); + account[0].delegated_steem_power = vestToSteem( + account[0].delegated_vesting_shares, + global_properties.total_vesting_shares, + global_properties.total_vesting_fund_steem + ).toFixed(0); - return account[0]; - } catch (error) { - return error; - } + return account[0]; + } catch (error) { + return error; + } }; export const vestToSteem = ( - vestingShares, - totalVestingShares, - totalVestingFundSteem + vestingShares, + totalVestingShares, + totalVestingFundSteem ) => { - return ( - parseFloat(totalVestingFundSteem) * - (parseFloat(vestingShares) / parseFloat(totalVestingShares)) - ); + return ( + parseFloat(totalVestingFundSteem) * + (parseFloat(vestingShares) / parseFloat(totalVestingShares)) + ); }; /** @@ -86,16 +86,16 @@ export const vestToSteem = ( * @param user username */ export const getFollows = user => { - return new Promise((resolve, reject) => { - client - .call("follow_api", "get_follow_count", [user]) - .then(result => { - resolve(result); - }) - .catch(err => { - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client + .call("follow_api", "get_follow_count", [user]) + .then(result => { + resolve(result); + }) + .catch(err => { + reject(err); + }); + }); }; /** @@ -104,16 +104,16 @@ export const getFollows = user => { * TODO: Pagination */ export const getFollowers = user => { - return new Promise((resolve, reject) => { - client - .call("follow_api", "get_followers", [user, "", "blog", 50]) - .then(result => { - resolve(result); - }) - .catch(err => { - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client + .call("follow_api", "get_followers", [user, "", "blog", 50]) + .then(result => { + resolve(result); + }) + .catch(err => { + reject(err); + }); + }); }; /** @@ -122,33 +122,33 @@ export const getFollowers = user => { * TODO: Pagination */ export const getFollowing = user => { - return new Promise((resolve, reject) => { - client - .call("follow_api", "get_following", [user, "", "blog", 50]) - .then(result => { - resolve(result); - }) - .catch(err => { - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client + .call("follow_api", "get_following", [user, "", "blog", 50]) + .then(result => { + resolve(result); + }) + .catch(err => { + reject(err); + }); + }); }; export const isFolllowing = (author, user) => { - return new Promise((resolve, reject) => { - client - .call("follow_api", "get_followers", [author, user, "blog", 10]) - .then(result => { - if (result[0].follower === user) { - resolve(true); - } else { - resolve(false); - } - }) - .catch(err => { - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client + .call("follow_api", "get_followers", [author, user, "blog", 10]) + .then(result => { + if (result[0].follower === user) { + resolve(true); + } else { + resolve(false); + } + }) + .catch(err => { + reject(err); + }); + }); }; /** @@ -157,26 +157,26 @@ export const isFolllowing = (author, user) => { * @param query tag, limit, start_author?, start_permalink? */ export const getPosts = async (by, query, user) => { - try { - let posts = await client.database.getDiscussions(by, query); - console.log("comments"); - console.log(posts); - posts = await parsePosts(posts, user); - return posts; - } catch (error) { - return error; - } + try { + let posts = await client.database.getDiscussions(by, query); + console.log("comments"); + console.log(posts); + posts = await parsePosts(posts, user); + return posts; + } catch (error) { + return error; + } }; export const getUserComments = async query => { - try { - let comments = await client.database.getDiscussions("comments", query); - comments = parseComments(comments); - console.log(comments); - return comments; - } catch (error) { - return error; - } + try { + let comments = await client.database.getDiscussions("comments", query); + comments = parseComments(comments); + console.log(comments); + return comments; + } catch (error) { + return error; + } }; /** @@ -185,14 +185,14 @@ export const getUserComments = async query => { * @param permlink post permlink */ export const getPost = (user, permlink) => { - return new Promise((resolve, reject) => { - try { - let post = client.database.call("get_content", [user, permlink]); - resolve(post); - } catch (error) { - reject(error); - } - }); + return new Promise((resolve, reject) => { + try { + let post = client.database.call("get_content", [user, permlink]); + resolve(post); + } catch (error) { + reject(error); + } + }); }; /** @@ -201,20 +201,20 @@ export const getPost = (user, permlink) => { * @param permlink post permlink */ export const getComments = (user, permlink) => { - let comments; - return new Promise((resolve, reject) => { - client.database - .call("get_content_replies", [user, permlink]) - .then(result => { - comments = parseComments(result); - }) - .then(() => { - resolve(comments); - }) - .catch(error => { - reject(error); - }); - }); + let comments; + return new Promise((resolve, reject) => { + client.database + .call("get_content_replies", [user, permlink]) + .then(result => { + comments = parseComments(result); + }) + .then(() => { + resolve(comments); + }) + .catch(error => { + reject(error); + }); + }); }; /** @@ -223,17 +223,17 @@ export const getComments = (user, permlink) => { * @param permlink post permlink */ export const getPostWithComments = async (user, permlink) => { - let post; - let comments; + let post; + let comments; - await getPost(user, permlink).then(result => { - post = result; - }); - await getComments(user, permlink).then(result => { - comments = result; - }); + await getPost(user, permlink).then(result => { + post = result; + }); + await getComments(user, permlink).then(result => { + comments = result; + }); - return [post, comments]; + return [post, comments]; }; /** @@ -242,43 +242,43 @@ export const getPostWithComments = async (user, permlink) => { * @param postingKey private posting key */ export const upvote = (vote, postingKey) => { - let key = PrivateKey.fromString(postingKey); - return new Promise((resolve, reject) => { - client.broadcast - .vote(vote, key) - .then(result => { - console.log(result); - resolve(result); - }) - .catch(err => { - console.log(err); - reject(err); - }); - }); + let key = PrivateKey.fromString(postingKey); + return new Promise((resolve, reject) => { + client.broadcast + .vote(vote, key) + .then(result => { + console.log(result); + resolve(result); + }) + .catch(err => { + console.log(err); + reject(err); + }); + }); }; /** * @method upvoteAmount estimate upvote amount */ export const upvoteAmount = async input => { - if (rewardFund == null || medianPrice == null) { - rewardFund = await client.database.call("get_reward_fund", ["post"]); + if (!rewardFund || !medianPrice) { + rewardFund = await client.database.call("get_reward_fund", ["post"]); - await client.database - .getCurrentMedianHistoryPrice() - .then(res => { - medianPrice = res; - }) - .catch(err => { - console.log(err); - }); - } + await client.database + .getCurrentMedianHistoryPrice() + .then(res => { + medianPrice = res; + }) + .catch(err => { + console.log(err); + }); + } - let estimated = - (input / parseFloat(rewardFund.recent_claims)) * - parseFloat(rewardFund.reward_balance) * - parseFloat(medianPrice.base); - return estimated; + let estimated = + (input / parseFloat(rewardFund.recent_claims)) * + parseFloat(rewardFund.reward_balance) * + parseFloat(medianPrice.base); + return estimated; }; /** @@ -287,258 +287,255 @@ export const upvoteAmount = async input => { * @param PrivateKey Private posting key */ export const postComment = (comment, postingKey) => { - let key = PrivateKey.fromString(postingKey); - return new Promise((resolve, reject) => { - try { - client.broadcast.comment(comment, key).then(result => { - resolve(result); - }); - } catch (error) { - console.log(error); - reject(error); - } - }); + let key = PrivateKey.fromString(postingKey); + return new Promise((resolve, reject) => { + try { + client.broadcast.comment(comment, key).then(result => { + resolve(result); + }); + } catch (error) { + console.log(error); + reject(error); + } + }); }; export const transferToken = (data, activeKey) => { - let key = PrivateKey.fromString(activeKey); - return new Promise((resolve, reject) => { - client.broadcast - .transfer(data, key) - .then(result => { - console.log(result); - resolve(result); - }) - .catch(err => { - console.log(err); - reject(err); - }); - }); + let key = PrivateKey.fromString(activeKey); + return new Promise((resolve, reject) => { + client.broadcast + .transfer(data, key) + .then(result => { + console.log(result); + resolve(result); + }) + .catch(err => { + console.log(err); + reject(err); + }); + }); }; export const followUser = (data, postingKey) => { - let key; - try { - key = PrivateKey.fromString(postingKey); - } catch (error) { - console.log(error); - } - let json = { - id: "follow", - json: JSON.stringify([ - "follow", - { - follower: `${data.follower}`, - following: `${data.following}`, - what: ["blog"], - }, - ]), - required_auths: [], - required_posting_auths: [`${data.follower}`], - }; + let key; + try { + key = PrivateKey.fromString(postingKey); + } catch (error) { + console.log(error); + } + let json = { + id: "follow", + json: JSON.stringify([ + "follow", + { + follower: `${data.follower}`, + following: `${data.following}`, + what: ["blog"], + }, + ]), + required_auths: [], + required_posting_auths: [`${data.follower}`], + }; - return new Promise((resolve, reject) => { - client.broadcast - .json(json, key) - .then(result => { - console.log(result); - resolve(result); - }) - .catch(err => { - console.log(err); - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client.broadcast + .json(json, key) + .then(result => { + console.log(result); + resolve(result); + }) + .catch(err => { + console.log(err); + reject(err); + }); + }); }; export const unfollowUser = (data, postingKey) => { - let key; - try { - key = PrivateKey.fromString(postingKey); - } catch (error) { - console.log(error); - } - let json = { - id: "follow", - json: JSON.stringify([ - "follow", - { - follower: `${data.follower}`, - following: `${data.following}`, - what: [""], - }, - ]), - required_auths: [], - required_posting_auths: [`${data.follower}`], - }; + let key; + try { + key = PrivateKey.fromString(postingKey); + } catch (error) { + console.log(error); + } + let json = { + id: "follow", + json: JSON.stringify([ + "follow", + { + follower: `${data.follower}`, + following: `${data.following}`, + what: [""], + }, + ]), + required_auths: [], + required_posting_auths: [`${data.follower}`], + }; - return new Promise((resolve, reject) => { - client.broadcast - .json(json, key) - .then(result => { - console.log(result); - resolve(result); - }) - .catch(err => { - console.log(err); - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client.broadcast + .json(json, key) + .then(result => { + console.log(result); + resolve(result); + }) + .catch(err => { + console.log(err); + reject(err); + }); + }); }; export const delegate = (data, activeKey) => { - let key; - try { - key = PrivateKey.fromString(activeKey); - } catch (error) { - console.log(error); - } + let key; + try { + key = PrivateKey.fromString(activeKey); + } catch (error) { + console.log(error); + } - return new Promise((resolve, reject) => { - client.broadcast - .delegateVestingShares(data, key) - .then(result => { - resolve(result); - }) - .catch(err => { - console.log(err); - reject(err); - }); - }); + return new Promise((resolve, reject) => { + client.broadcast + .delegateVestingShares(data, key) + .then(result => { + resolve(result); + }) + .catch(err => { + console.log(err); + reject(err); + }); + }); }; export const globalProps = async () => { - try { - let global_properties = await client.database.getDynamicGlobalProperties(); - return global_properties; - } catch (error) { - console.log(error); - return error; - } + try { + let global_properties = await client.database.getDynamicGlobalProperties(); + return global_properties; + } catch (error) { + console.log(error); + return error; + } }; export const transferToVesting = (data, activeKey) => { - let key; - try { - key = PrivateKey.fromString(activeKey); - console.log(key); - } catch (error) { + let key; + try { + key = PrivateKey.fromString(activeKey); + console.log(key); + } catch (error) { + console.log(error); + } + + const op = [ + "transfer_to_vesting", + { + from: data.from, + to: data.to, + amount: data.amount, + }, + ]; + + return new Promise((resolve, reject) => { + client.broadcast + .sendOperations([op], key) + .then(result => { + resolve(result); + }) + .catch(error => { console.log(error); - } - - const op = [ - "transfer_to_vesting", - { - from: data.from, - to: data.to, - amount: data.amount, - }, - ]; - - return new Promise((resolve, reject) => { - client.broadcast - .sendOperations([op], key) - .then(result => { - resolve(result); - }) - .catch(error => { - console.log(error); - reject(error); - }); - }); + reject(error); + }); + }); }; export const withdrawVesting = (data, activeKey) => { - let key; - try { - key = PrivateKey.fromString(activeKey); - console.log(key); - } catch (error) { + let key; + try { + key = PrivateKey.fromString(activeKey); + console.log(key); + } catch (error) { + console.log(error); + } + + const op = [ + "withdraw_vesting", + { + account: data.account, + vesting_shares: data.vesting_shares, + }, + ]; + + return new Promise((resolve, reject) => { + client.broadcast + .sendOperations([op], key) + .then(result => { + resolve(result); + }) + .catch(error => { console.log(error); - } - - const op = [ - "withdraw_vesting", - { - account: data.account, - vesting_shares: data.vesting_shares, - }, - ]; - - return new Promise((resolve, reject) => { - client.broadcast - .sendOperations([op], key) - .then(result => { - resolve(result); - }) - .catch(error => { - console.log(error); - reject(error); - }); - }); + reject(error); + }); + }); }; export const postContent = (data, postingKey) => { - let key; + let key; - try { - key = PrivateKey.fromString(postingKey); - } catch (error) { + try { + key = PrivateKey.fromString(postingKey); + } catch (error) { + console.log(error); + } + + let post = { + author: data.author, + body: data.body, + parent_author: "", + parent_permlink: data.tags[0], + permlink: data.permlink, + title: data.title, + json_metadata: JSON.stringify({ + app: "esteem/2.0.0-mobile", + community: "esteem.app", + tags: data.tags, + }), + }; + + let op = { + author: data.author, + permlink: data.permlink, + max_accepted_payout: "1000000.000 SBD", + percent_steem_dollars: 10000, + allow_votes: true, + allow_curation_rewards: true, + extensions: [ + [ + 0, + { + beneficiaries: [{ account: "esteemapp", weight: 1000 }], + }, + ], + ], + }; + + return new Promise((resolve, reject) => { + client.broadcast + .commentWithOptions(post, op, key) + .then(result => { + resolve(result); + }) + .catch(error => { console.log(error); - } - - let post = { - author: data.author, - body: data.body, - parent_author: "", - parent_permlink: data.tags[0], - permlink: data.permlink, - title: data.title, - json_metadata: JSON.stringify({ - app: "esteem/2.0.0-mobile", - community: "esteem.app", - tags: data.tags, - }), - }; - - let op = { - author: data.author, - permlink: data.permlink, - max_accepted_payout: "1000000.000 SBD", - percent_steem_dollars: 10000, - allow_votes: true, - allow_curation_rewards: true, - extensions: [ - [ - 0, - { - beneficiaries: [{ account: "esteemapp", weight: 1000 }], - }, - ], - ], - }; - - return new Promise((resolve, reject) => { - client.broadcast - .commentWithOptions(post, op, key) - .then(result => { - resolve(result); - }) - .catch(error => { - console.log(error); - reject(error); - }); - }); + reject(error); + }); + }); }; export const lookupAccounts = async username => { - try { - let users = await client.database.call("lookup_accounts", [ - username, - 20, - ]); - return users; - } catch (error) { - throw error; - } + try { + let users = await client.database.call("lookup_accounts", [username, 20]); + return users; + } catch (error) { + throw error; + } }; diff --git a/src/screens/authorProfile/screen/authorScreen.js b/src/screens/authorProfile/screen/authorScreen.js index a7a416bba..07801ddb0 100644 --- a/src/screens/authorProfile/screen/authorScreen.js +++ b/src/screens/authorProfile/screen/authorScreen.js @@ -3,14 +3,14 @@ import { FlatList, ActivityIndicator, BackHandler } from "react-native"; // External Components import { - Container, - Card, - CardItem, - Body, - Button, - Icon, - Text, - View, + Container, + Card, + CardItem, + Body, + Button, + Icon, + Text, + View, } from "native-base"; import ScrollableTabView from "@esteemapp/react-native-scrollable-tab-view"; import { Navigation } from "react-native-navigation"; @@ -18,526 +18,501 @@ import FastImage from "react-native-fast-image"; // Internal Components import { TabBar } from "../../../components/tabBar"; -import PostCard from "../../../components/post-card/postCard"; +import { PostCard } from "../../../components/postCard"; + import Comment from "../../../components/comment/comment"; -// TODO: Make utils for all using moment. -import moment from "moment"; - -//import Icon from "react-native-vector-icons/FontAwesome"; +import { getTimeFromNow } from "../../../utils/time"; // Styles import styles from "./authorStyles"; -//import themes from "../../styles/themes"; import { - followUser, - unfollowUser, - getFollows, - getPosts, - getUserComments, - getUser, - isFolllowing, + followUser, + unfollowUser, + getFollows, + getPosts, + getUserComments, + getUser, + isFolllowing, } from "../../../providers/steem/dsteem"; import { getAuthStatus, getUserData } from "../../../realm/realm"; import { decryptKey } from "../../../utils/crypto"; class AuthorScreen extends Component { - static get options() { - return { - _statusBar: { - visible: true, - drawBehind: false, - }, - topBar: { - animate: true, - hideOnScroll: false, - drawBehind: false, - leftButtons: { - id: "back", - icon: require("../../../assets/back.png"), - }, - }, - layout: { - backgroundColor: "#f5fcff", - }, - bottomTabs: { - visible: false, - drawBehind: true, - }, - }; - } - constructor(props) { - super(props); - Navigation.events().bindComponent(this); - this.getBlog = this.getBlog.bind(this); - this.getMore = this.getMore.bind(this); - this.getComments = this.getComments.bind(this); - this.follow = this.follow.bind(this); - this.unfollow = this.unfollow.bind(this); - this.state = { - user: { - name: "null", - }, - posts: [], - commments: [], - replies: [], - about: {}, - follows: {}, - loading: false, - isLoggedIn: false, - author: "author", - start_author: "", - start_permlink: "", - isFolllowing: false, - follow_loader: true, - }; - } + static get options() { + return { + _statusBar: { + visible: true, + drawBehind: false, + }, + topBar: { + animate: true, + hideOnScroll: false, + drawBehind: false, + leftButtons: { + id: "back", + icon: require("../../../assets/back.png"), + }, + }, + layout: { + backgroundColor: "#f5fcff", + }, + bottomTabs: { + visible: false, + drawBehind: true, + }, + }; + } + constructor(props) { + super(props); + Navigation.events().bindComponent(this); + this.getBlog = this.getBlog.bind(this); + this.getMore = this.getMore.bind(this); + this.getComments = this.getComments.bind(this); + this.follow = this.follow.bind(this); + this.unfollow = this.unfollow.bind(this); + this.state = { + user: { + name: "null", + }, + posts: [], + commments: [], + replies: [], + about: {}, + follows: {}, + loading: false, + isLoggedIn: false, + author: "author", + start_author: "", + start_permlink: "", + isFolllowing: false, + follow_loader: true, + }; + } - async componentDidMount() { - BackHandler.addEventListener("hardwareBackPress", () => { - Navigation.pop(this.props.componentId); - return true; - }); - /*for (var i = 0; i < themes.length; i++) { + async componentDidMount() { + BackHandler.addEventListener("hardwareBackPress", () => { + Navigation.pop(this.props.componentId); + return true; + }); + /*for (var i = 0; i < themes.length; i++) { themes[i].name == 'Light'?themes[0].apply():''; }*/ - let info; - let json_metadata; - let isLoggedIn; - let follows; - let author; - let user; + let info; + let json_metadata; + let isLoggedIn; + let follows; + let author; + let user; - await getAuthStatus().then(res => { - isLoggedIn = res; + await getAuthStatus().then(res => { + isLoggedIn = res; + }); + + if (isLoggedIn) { + getUserData() + .then(res => { + user = Array.from(res); + user = user[0]; + }) + .then(() => { + this.setState({ + user: user, + }); + }) + .then(() => { + getUser(user.username).then(result => { + this.setState({ + user: result, + }); + }); + + isFolllowing(this.props.author, user.username).then(result => { + this.setState({ + isFolllowing: result, + follow_loader: false, + }); + }); }); - - if (isLoggedIn == true) { - getUserData() - .then(res => { - user = Array.from(res); - user = user[0]; - }) - .then(() => { - this.setState({ - user: user, - }); - }) - .then(() => { - getUser(user.username).then(result => { - this.setState({ - user: result, - }); - }); - - isFolllowing(this.props.author, user.username).then( - result => { - this.setState({ - isFolllowing: result, - follow_loader: false, - }); - } - ); - }); - } - - await getFollows(this.props.author).then(res => { - follows = res; - }); - - author = await getUser(this.props.author); - - this.getBlog(this.state.user.name, author.name); - this.getComments(author.name); - - json_metadata = JSON.parse(author.json_metadata); - info = json_metadata.profile; - this.setState( - { - about: info, - author: author, - isLoggedIn: isLoggedIn, - follows: follows, - }, - () => { - console.log(this.state.about); - } - ); } - getBlog = (user, author) => { - this.setState({ loading: true }); - getPosts("blog", { tag: author, limit: 10 }, user) - .then(result => { - this.setState({ - loading: false, - isReady: true, - posts: result, - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - refreshing: false, - }); - }) - .catch(err => { - console.log(err); - }); - }; + await getFollows(this.props.author).then(res => { + follows = res; + }); - getMore = () => { - if (this.state.loading == true) { - return false; - } else { - getPosts( - "blog", - { - tag: this.state.user.name, - limit: 10, - start_author: this.state.start_author, - start_permlink: this.state.start_permlink, - }, - this.state.user.name - ).then(result => { - console.log(result); - let posts = result; - posts.shift(); - this.setState({ - posts: [...this.state.posts, ...posts], - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - loading: false, - }); - }); - } - }; + author = await getUser(this.props.author); - getComments = async user => { - await getUserComments({ start_author: user, limit: 10 }) - .then(result => { - this.setState({ - isReady: true, - commments: result, - refreshing: false, - loading: false, - }); - }) - .catch(err => { - console.log(err); - }); - }; + this.getBlog(this.state.user.name, author.name); + this.getComments(author.name); - follow = async () => { - let userData; - let privateKey; + json_metadata = JSON.parse(author.json_metadata); + info = json_metadata.profile; + this.setState( + { + about: info, + author: author, + isLoggedIn: isLoggedIn, + follows: follows, + }, + () => { + console.log(this.state.about); + } + ); + } - await this.setState({ - follow_loader: true, + getBlog = (user, author) => { + this.setState({ loading: true }); + getPosts("blog", { tag: author, limit: 10 }, user) + .then(result => { + this.setState({ + loading: false, + isReady: true, + posts: result, + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + refreshing: false, }); + }) + .catch(err => { + console.log(err); + }); + }; - await getUserData().then(result => { - userData = Array.from(result); + getMore = () => { + if (this.state.loading) { + return false; + } else { + getPosts( + "blog", + { + tag: this.state.user.name, + limit: 10, + start_author: this.state.start_author, + start_permlink: this.state.start_permlink, + }, + this.state.user.name + ).then(result => { + console.log(result); + let posts = result; + posts.shift(); + this.setState({ + posts: [...this.state.posts, ...posts], + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + loading: false, }); - - console.log(userData); - privateKey = decryptKey(userData[0].postingKey, "pinCode"); - - followUser( - { - follower: userData[0].username, - following: this.state.author.name, - }, - privateKey - ) - .then(result => { - console.log(result); - this.setState({ - follow_loader: false, - isFolllowing: true, - }); - }) - .catch(err => { - console.log(err); - this.setState({ - follow_loader: false, - isFolllowing: false, - }); - }); - }; - - unfollow = async () => { - let userData; - let privateKey; - - await this.setState({ - follow_loader: true, - }); - - await getUserData().then(result => { - userData = Array.from(result); - }); - - console.log(userData); - privateKey = decryptKey(userData[0].postingKey, "pinCode"); - - unfollowUser( - { - follower: userData[0].username, - following: this.state.author.name, - }, - privateKey - ) - .then(result => { - this.setState({ - follow_loader: false, - isFolllowing: false, - }); - }) - .catch(err => { - this.setState({ - follow_loader: false, - }); - }); - }; - - renderFooter = () => { - if (!this.state.loading == false) return null; - - return ( - - - - ); - }; - - navigationButtonPressed({ buttonId }) { - // will be called when "buttonOne" is clicked - if (buttonId === "back") { - Navigation.pop(this.props.componentId); - } + }); } + }; - componentWillUnmount() { - BackHandler.removeEventListener("hardwareBackPress"); + getComments = async user => { + await getUserComments({ start_author: user, limit: 10 }) + .then(result => { + this.setState({ + isReady: true, + commments: result, + refreshing: false, + loading: false, + }); + }) + .catch(err => { + console.log(err); + }); + }; + + follow = async () => { + let userData; + let privateKey; + + await this.setState({ + follow_loader: true, + }); + + await getUserData().then(result => { + userData = Array.from(result); + }); + + console.log(userData); + privateKey = decryptKey(userData[0].postingKey, "pinCode"); + + followUser( + { + follower: userData[0].username, + following: this.state.author.name, + }, + privateKey + ) + .then(result => { + console.log(result); + this.setState({ + follow_loader: false, + isFolllowing: true, + }); + }) + .catch(err => { + console.log(err); + this.setState({ + follow_loader: false, + isFolllowing: false, + }); + }); + }; + + unfollow = async () => { + let userData; + let privateKey; + + await this.setState({ + follow_loader: true, + }); + + await getUserData().then(result => { + userData = Array.from(result); + }); + + console.log(userData); + privateKey = decryptKey(userData[0].postingKey, "pinCode"); + + unfollowUser( + { + follower: userData[0].username, + following: this.state.author.name, + }, + privateKey + ) + .then(result => { + this.setState({ + follow_loader: false, + isFolllowing: false, + }); + }) + .catch(err => { + this.setState({ + follow_loader: false, + }); + }); + }; + + renderFooter = () => { + if (this.state.loading) return null; + + return ( + + + + ); + }; + + navigationButtonPressed({ buttonId }) { + // will be called when "buttonOne" is clicked + if (buttonId === "back") { + Navigation.pop(this.props.componentId); } + } - render() { - return ( - - - - - - - - {this.state.author.name} - - {this.state.about.about} - {this.state.isFolllowing == true ? ( - - ) : ( - - )} - - - - - - {this.state.author.post_count} Posts - - - - - {this.state.follows.follower_count}{" "} - Followers - - - - - {this.state.follows.following_count}{" "} - Following - - - + componentWillUnmount() { + BackHandler.removeEventListener("hardwareBackPress"); + } - - - - - {this.state.about.location} - - - - - - {moment - .utc(this.state.author.created) - .local() - .fromNow()} - - - - - - ( - - )} - > - - ( - - )} - keyExtractor={(post, index) => index.toString()} - onEndReached={info => { - if (this.state.loading == false) { - console.log(info); - this.getMore(); - } - }} - onEndThreshold={0} - bounces={false} - ListFooterComponent={this.renderFooter} - /> - - - - ( - - )} - keyExtractor={(post, index) => index.toString()} - onEndThreshold={0} - bounces={false} - ListFooterComponent={this.renderFooter} - /> - - - - - - STEEM Balance: {this.state.author.balance} - - - - - SBD Balance: {this.state.author.sbd_balance} - - - - - STEEM Power: {this.state.author.steem_power}{" "} - SP - - - Received STEEM Power:{" "} - {this.state.author.received_steem_power} SP - - - Delegated Power Power:{" "} - {this.state.author.delegated_steem_power} SP - - - - - Saving STEEM Balance:{" "} - {this.state.author.savings_balance} - - - Saving STEEM Balance:{" "} - {this.state.author.savings_sbd_balance} - - - - + render() { + return ( + + + + + + + + {this.state.author.name} + + {this.state.about.about} + {this.state.isFolllowing ? ( + + ) : ( + + )} + + + + + {this.state.author.post_count} Posts - - ); - } + + {this.state.follows.follower_count} Followers + + + {this.state.follows.following_count} Following + + + + + + + + {this.state.about.location} + + + + + + {getTimeFromNow(this.state.author.created)} + + + + + + ( + + )} + > + + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndReached={info => { + if (!this.state.loading) { + console.log(info); + this.getMore(); + } + }} + onEndThreshold={0} + bounces={false} + ListFooterComponent={this.renderFooter} + /> + + + + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndThreshold={0} + bounces={false} + ListFooterComponent={this.renderFooter} + /> + + + + + STEEM Balance: {this.state.author.balance} + + + SBD Balance: {this.state.author.sbd_balance} + + + STEEM Power: {this.state.author.steem_power} SP + + Received STEEM Power: {this.state.author.received_steem_power}{" "} + SP + + + Delegated Power Power:{" "} + {this.state.author.delegated_steem_power} SP + + + + + Saving STEEM Balance: {this.state.author.savings_balance} + + + Saving STEEM Balance: {this.state.author.savings_sbd_balance} + + + + + + + ); + } } export default AuthorScreen; diff --git a/src/screens/home/feed.js b/src/screens/home/feed.js index c3f1391b1..357bec63b 100644 --- a/src/screens/home/feed.js +++ b/src/screens/home/feed.js @@ -1,13 +1,5 @@ import React from "react"; -import { - StyleSheet, - FlatList, - View, - StatusBar, - Dimensions, - ActivityIndicator, - AppState, -} from "react-native"; +import { FlatList, View, ActivityIndicator, AppState } from "react-native"; import { Container, Header, @@ -28,7 +20,9 @@ import { getPosts } from "../../providers/steem/dsteem"; import Placeholder from "rn-placeholder"; // COMPONENTS -import PostCard from "../../components/post-card/postCard"; +import { PostCard } from "../../components/postCard"; +import { FilterBar } from "../../components/filterBar"; + /* eslint-enable no-unused-vars */ class FeedPage extends React.Component { @@ -138,6 +132,20 @@ class FeedPage extends React.Component { render() { return ( + {this.state.isReady && ( + + )} {this.state.isReady ? ( { user = Array.from(res); }); diff --git a/src/screens/home/hot.js b/src/screens/home/hot.js index ad5f1e290..1f0951296 100644 --- a/src/screens/home/hot.js +++ b/src/screens/home/hot.js @@ -1,14 +1,6 @@ /* eslint-disable no-unused-vars */ import React from "react"; -import { - StyleSheet, - FlatList, - View, - Text, - TouchableOpacity, - ActivityIndicator, -} from "react-native"; -import { Navigation } from "react-native-navigation"; +import { FlatList, View, ActivityIndicator } from "react-native"; import styles from "../../styles/hot.styles"; @@ -19,154 +11,169 @@ import { getPosts } from "../../providers/steem/dsteem"; import Placeholder from "rn-placeholder"; // COMPONENTS -import PostCard from "../../components/post-card/postCard"; +import { PostCard } from "../../components/postCard"; +import { FilterBar } from "../../components/filterBar"; // SCREENS /* eslint-enable no-unused-vars */ class HotPage extends React.Component { - constructor(props) { - super(props); + constructor(props) { + super(props); - this.getHotPosts = this.getHotPosts.bind(this); - this.getMoreHot = this.getMoreHot.bind(this); - this.refreshHotPosts = this.refreshHotPosts.bind(this); - this.state = { - isReady: false, - posts: [], - start_author: "", - start_permlink: "", - refreshing: false, - loading: false, - isLoggedIn: this.props.isLoggedIn, - }; - } - - componentDidMount() { - console.log(this.props); - this.getHotPosts(); - } - - getHotPosts = () => { - getPosts("hot", { tag: "", limit: 10 }, this.props.user.name) - .then(result => { - this.setState({ - isReady: true, - posts: result, - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - refreshing: false, - }); - }) - .catch(err => { - alert(err); - }); + this.getHotPosts = this.getHotPosts.bind(this); + this.getMoreHot = this.getMoreHot.bind(this); + this.refreshHotPosts = this.refreshHotPosts.bind(this); + this.state = { + isReady: false, + posts: [], + start_author: "", + start_permlink: "", + refreshing: false, + loading: false, + isLoggedIn: this.props.isLoggedIn, }; + } - getMoreHot = () => { - this.setState({ loading: true }); - getPosts( - "hot", - { - tag: "", - limit: 10, - start_author: this.state.start_author, - start_permlink: this.state.start_permlink, - }, - this.props.user.name - ).then(result => { - let posts = result; - posts.shift(); - this.setState({ - posts: [...this.state.posts, ...posts], - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - }); + componentDidMount() { + console.log(this.props); + this.getHotPosts(); + } + + getHotPosts = () => { + getPosts("hot", { tag: "", limit: 10 }, this.props.user.name) + .then(result => { + this.setState({ + isReady: true, + posts: result, + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + refreshing: false, }); - }; + }) + .catch(err => { + alert(err); + }); + }; - refreshHotPosts = () => { - this.setState( - { - refreshing: true, - }, - () => { - this.getHotPosts(); - } - ); - }; + getMoreHot = () => { + this.setState({ loading: true }); + getPosts( + "hot", + { + tag: "", + limit: 10, + start_author: this.state.start_author, + start_permlink: this.state.start_permlink, + }, + this.props.user.name + ).then(result => { + let posts = result; + posts.shift(); + this.setState({ + posts: [...this.state.posts, ...posts], + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + }); + }); + }; - renderFooter = () => { - if (!this.state.loading) return null; + refreshHotPosts = () => { + this.setState( + { + refreshing: true, + }, + () => { + this.getHotPosts(); + } + ); + }; - return ( - - + renderFooter = () => { + if (!this.state.loading) return null; + + return ( + + + + ); + }; + + render() { + return ( + + {this.state.isReady && ( + + )} + {this.state.isReady ? ( + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndReached={this.getMore} + removeClippedSubviews={true} + refreshing={this.state.refreshing} + onRefresh={() => this.refreshHotPosts()} + onEndThreshold={0} + initialNumToRender={10} + ListFooterComponent={this.renderFooter} + /> + ) : ( + + + - ); - }; - - render() { - return ( - - {this.state.isReady ? ( - ( - - )} - keyExtractor={(post, index) => index.toString()} - onEndReached={this.getMore} - removeClippedSubviews={true} - refreshing={this.state.refreshing} - onRefresh={() => this.refreshHotPosts()} - onEndThreshold={0} - initialNumToRender={10} - ListFooterComponent={this.renderFooter} - /> - ) : ( - - - - - - - - - - - - )} + + - ); - } + + + + + )} + + ); + } } export default HotPage; diff --git a/src/screens/home/trending.js b/src/screens/home/trending.js index 29eba0b9a..de81def49 100644 --- a/src/screens/home/trending.js +++ b/src/screens/home/trending.js @@ -9,154 +9,154 @@ import { getPosts } from "../../providers/steem/dsteem"; import Placeholder from "rn-placeholder"; // COMPONENTS -import PostCard from "../../components/post-card/postCard"; +import { PostCard } from "../../components/postCard"; // SCREENS /* eslint-enable no-unused-vars */ class TrendingPage extends React.Component { - constructor(props) { - super(props); + constructor(props) { + super(props); - this.getTrending = this.getTrending.bind(this); - this.getMore = this.getMore.bind(this); - this.refreshData = this.refreshData.bind(this); - this.state = { - isReady: false, - posts: [], - user: [], - start_author: "", - start_permlink: "", - refreshing: false, - loading: false, - isLoggedIn: this.props.isLoggedIn, - }; - } - - componentDidMount() { - this.getTrending(); - } - - getTrending = () => { - getPosts("trending", { tag: "", limit: 10 }, this.props.user.name) - .then(result => { - this.setState({ - isReady: true, - posts: result, - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - refreshing: false, - }); - }) - .catch(err => { - alert(err); - }); + this.getTrending = this.getTrending.bind(this); + this.getMore = this.getMore.bind(this); + this.refreshData = this.refreshData.bind(this); + this.state = { + isReady: false, + posts: [], + user: [], + start_author: "", + start_permlink: "", + refreshing: false, + loading: false, + isLoggedIn: this.props.isLoggedIn, }; + } - getMore = () => { - this.setState({ loading: true }); - getPosts( - "trending", - { - tag: "", - limit: 10, - start_author: this.state.start_author, - start_permlink: this.state.start_permlink, - }, - this.props.user.name - ).then(result => { - let posts = result; - posts.shift(); - this.setState({ - posts: [...this.state.posts, ...posts], - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - }); + componentDidMount() { + this.getTrending(); + } + + getTrending = () => { + getPosts("trending", { tag: "", limit: 10 }, this.props.user.name) + .then(result => { + this.setState({ + isReady: true, + posts: result, + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + refreshing: false, }); - }; + }) + .catch(err => { + alert(err); + }); + }; - refreshData = () => { - this.setState( - { - refreshing: true, - }, - () => { - this.getTrending(); - } - ); - }; + getMore = () => { + this.setState({ loading: true }); + getPosts( + "trending", + { + tag: "", + limit: 10, + start_author: this.state.start_author, + start_permlink: this.state.start_permlink, + }, + this.props.user.name + ).then(result => { + let posts = result; + posts.shift(); + this.setState({ + posts: [...this.state.posts, ...posts], + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + }); + }); + }; - renderFooter = () => { - if (!this.state.loading) return null; + refreshData = () => { + this.setState( + { + refreshing: true, + }, + () => { + this.getTrending(); + } + ); + }; - return ( - - + renderFooter = () => { + if (!this.state.loading) return null; + + return ( + + + + ); + }; + + render() { + return ( + + {this.state.isReady ? ( + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndReached={this.getMore} + removeClippedSubviews={true} + refreshing={this.state.refreshing} + onRefresh={() => this.refreshData()} + onEndThreshold={0} + initialNumToRender={10} + ListFooterComponent={this.renderFooter} + /> + ) : ( + + + - ); - }; - - render() { - return ( - - {this.state.isReady ? ( - ( - - )} - keyExtractor={(post, index) => index.toString()} - onEndReached={this.getMore} - removeClippedSubviews={true} - refreshing={this.state.refreshing} - onRefresh={() => this.refreshData()} - onEndThreshold={0} - initialNumToRender={10} - ListFooterComponent={this.renderFooter} - /> - ) : ( - - - - - - - - - - - - )} + + - ); - } + + + + + )} + + ); + } } export default TrendingPage; diff --git a/src/screens/login/screen/loginScreen.js b/src/screens/login/screen/loginScreen.js index 45a5a6bbf..dfd84761e 100644 --- a/src/screens/login/screen/loginScreen.js +++ b/src/screens/login/screen/loginScreen.js @@ -1,68 +1,26 @@ import React, { Component } from "react"; -import { - View, - ActivityIndicator, - Text, - Image, - TouchableOpacity, - TextInput, - BackHandler, - Linking, - StatusBar, -} from "react-native"; - -import { Navigation } from "react-native-navigation"; -import Ionicons from "react-native-vector-icons/Ionicons"; -import FastImage from "react-native-fast-image"; - -import { TabBar } from "../../../components/tabBar"; -import { LoginHeader } from "../../../components/loginHeader"; -import { FormInput } from "../../../components/formInput"; -import { InformationArea } from "../../../components/informationArea"; +import { View, BackHandler, Linking, StatusBar } from "react-native"; +import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view"; import ScrollableTabView from "@esteemapp/react-native-scrollable-tab-view"; + +// Internal Components +import { FormInput } from "../../../components/formInput"; +import { TextButton } from "../../../components/buttons"; +import { InformationArea } from "../../../components/informationArea"; import { Login } from "../../../providers/steem/auth"; - +import { LoginHeader } from "../../../components/loginHeader"; +import { MainButton } from "../../../components/mainButton"; +import { Navigation } from "react-native-navigation"; +import { TabBar } from "../../../components/tabBar"; import { addNewAccount } from "../../../redux/actions/accountAction"; - -import { lookupAccounts } from "../../../providers/steem/dsteem"; import { goToAuthScreens } from "../../../navigation"; +import { lookupAccounts } from "../../../providers/steem/dsteem"; +import STEEM_CONNECT_LOGO from "../../../assets/steem_connect.png"; // Styles import styles from "./loginStyles"; class LoginScreen extends Component { - static get options() { - return { - _statusBar: { - visible: true, - drawBehind: false, - }, - topBar: { - animate: true, - hideOnScroll: false, - drawBehind: false, - noBorder: true, - visible: true, - elevation: 0, - leftButtons: {}, - rightButtons: [ - { - id: "signup", - text: "Sign Up", - color: "#a7adaf", - marginRight: 50, - }, - ], - }, - layout: { - backgroundColor: "#f5fcff", - }, - bottomTabs: { - visible: false, - drawBehind: true, - }, - }; - } constructor(props) { super(props); Navigation.events().bindComponent(this); @@ -71,7 +29,8 @@ class LoginScreen extends Component { username: "", password: "", isLoading: false, - isUsernameValid: true, + isUsernameValid: false, + keyboardIsOpen: false, }; } @@ -112,7 +71,7 @@ class LoginScreen extends Component { } }) .catch(err => { - alert(err); + // alert(err); this.setState({ isLoading: false }); }); }; @@ -127,15 +86,13 @@ class LoginScreen extends Component { this.setState({ password: value }); }; - navigationButtonPressed({ buttonId }) { - if (buttonId === "signup") { - Linking.openURL("https://signup.steemit.com/?ref=esteem").catch(err => - console.error("An error occurred", err) - ); - } - } + _handleSignUp = () => { + Linking.openURL("https://signup.steemit.com/?ref=esteem").catch(err => + console.error("An error occurred", err) + ); + }; - loginwithSc2 = () => { + _loginwithSc2 = () => { Navigation.push(this.props.componentId, { component: { name: "navigation.eSteem.SteemConnect", @@ -152,170 +109,98 @@ class LoginScreen extends Component { }; render() { + const { + isLoading, + username, + isUsernameValid, + keyboardIsOpen, + password, + } = this.state; + return ( ); } diff --git a/src/screens/login/screen/loginStyles.js b/src/screens/login/screen/loginStyles.js index 5b10f1ea5..540a5b73e 100644 --- a/src/screens/login/screen/loginStyles.js +++ b/src/screens/login/screen/loginStyles.js @@ -36,9 +36,28 @@ export default EStyleSheet.create({ flex: 1, backgroundColor: "#ffffff", minWidth: "$deviceWidth", + height: "$deviceHeight / 1.95", }, steemConnectTab: { backgroundColor: "#fff", minWidth: "$deviceWidth", + flex: 1, + height: "$deviceHeight / 1.95", + }, + mainButtonWrapper: { + position: "absolute", + right: 24, + bottom: 24, + flexDirection: "row", + }, + footerButtons: { + flex: 1, + flexDirection: "row", + justifyContent: "center", + alignItems: "center", + alignSelf: "flex-end", + position: "absolute", + bottom: 45, + left: "$deviceWidth / 2.3", }, }); diff --git a/src/screens/notification/screen/notificationScreen.js b/src/screens/notification/screen/notificationScreen.js index 0470b511e..844b9e906 100644 --- a/src/screens/notification/screen/notificationScreen.js +++ b/src/screens/notification/screen/notificationScreen.js @@ -1,20 +1,36 @@ -import React from "react"; -import { Container, Text } from "native-base"; - +import React, { Fragment } from "react"; +import { Text, View, SafeAreaView } from "react-native"; +import ScrollableTabView from "@esteemapp/react-native-scrollable-tab-view"; +import { TabBar } from "../../../components/tabBar"; +import { Notification } from "../../../components/notification"; // Styles -//import styles from "./notificationStyles"; +import styles from "./notificationStyles"; class NotificationScreen extends React.Component { - static navigationOptions = { - title: "Notifications", - }; - - render() { - return ( - - Notifications - - ); - } + render() { + return ( + + ( + + )} + > + + + + + Leaderboard + + + + ); + } } export default NotificationScreen; diff --git a/src/screens/notification/screen/notificationStyles.js b/src/screens/notification/screen/notificationStyles.js index 814b1b4f6..7ce8b0bcd 100644 --- a/src/screens/notification/screen/notificationStyles.js +++ b/src/screens/notification/screen/notificationStyles.js @@ -1,3 +1,23 @@ import EStyleSheet from "react-native-extended-stylesheet"; -export default EStyleSheet.create({}); +export default EStyleSheet.create({ + tabbar: { + alignSelf: "center", + height: 55, + backgroundColor: "white", + borderBottomColor: "#f1f1f1", + }, + tabView: { + alignSelf: "center", + backgroundColor: "transparent", + }, + notificationTab: { + backgroundColor: "#fff", + minWidth: "$deviceWidth", + }, + leaderboardTab: { + flex: 1, + backgroundColor: "#ffffff", + minWidth: "$deviceWidth", + }, +}); diff --git a/src/screens/profile/profile.js b/src/screens/profile/profile.js index df8e97bad..a526782aa 100644 --- a/src/screens/profile/profile.js +++ b/src/screens/profile/profile.js @@ -1,387 +1,336 @@ /* eslint-disable no-unused-vars */ import React from "react"; -import { - StatusBar, - Dimensions, - FlatList, - ActivityIndicator, -} from "react-native"; +import { FlatList, ActivityIndicator } from "react-native"; -import moment from "moment"; +import { getTimeFromNow } from "../../utils/time"; import FastImage from "react-native-fast-image"; import ScrollableTabView from "@esteemapp/react-native-scrollable-tab-view"; import { TabBar } from "../../../components/tabBar"; import DiscoverPage from "../discover/discover"; -import PostCard from "../../components/post-card/postCard"; +import { PostCard } from "../../components/postCard"; import Comment from "../../components/comment/comment"; -import { - Content, - Card, - CardItem, - View, - Header, - Left, - Body, - Right, - Button, - Icon, - Title, - Text, - Container, -} from "native-base"; +import { Card, CardItem, View, Body } from "native-base"; import { getUserData, getAuthStatus } from "../../realm/realm"; import { - getUser, - getFollows, - getPosts, - getUserComments, - getUserReplies, + getUser, + getFollows, + getPosts, + getUserComments, } from "../../providers/steem/dsteem"; -import store from "../../redux/store/store"; import styles from "../../styles/profile.styles"; /* eslint-enable no-unused-vars */ class ProfilePage extends React.Component { - static get options() { - return { - _statusBar: { - visible: true, - drawBehind: false, - }, - topBar: { - animate: true, - hideOnScroll: false, - drawBehind: false, - leftButtons: { - id: "back", - }, - }, - layout: { - backgroundColor: "#f5fcff", - }, - bottomTabs: { - visible: false, - drawBehind: true, - }, - }; - } + static get options() { + return { + _statusBar: { + visible: true, + drawBehind: false, + }, + topBar: { + animate: true, + hideOnScroll: false, + drawBehind: false, + leftButtons: { + id: "back", + }, + }, + layout: { + backgroundColor: "#f5fcff", + }, + bottomTabs: { + visible: false, + drawBehind: true, + }, + }; + } - constructor() { - super(); - this.getBlog = this.getBlog.bind(this); - this.getMore = this.getMore.bind(this); - this.getComments = this.getComments.bind(this); - this.state = { - user: [], - posts: [], - commments: [], - replies: [], - about: {}, - follows: {}, - isLoggedIn: false, - }; - } + constructor() { + super(); + this.getBlog = this.getBlog.bind(this); + this.getMore = this.getMore.bind(this); + this.getComments = this.getComments.bind(this); + this.state = { + user: [], + posts: [], + commments: [], + replies: [], + about: {}, + follows: {}, + isLoggedIn: false, + }; + } - async componentDidMount() { - let isLoggedIn; - let user; - let userData; - let follows; - let about; + async componentDidMount() { + let isLoggedIn; + let user; + let userData; + let follows; + let about; - await getAuthStatus().then(res => { - isLoggedIn = res; - }); + await getAuthStatus().then(res => { + isLoggedIn = res; + }); - if (isLoggedIn == true) { - await getUserData().then(res => { - userData = Array.from(res); - }); + if (isLoggedIn) { + await getUserData().then(res => { + userData = Array.from(res); + }); - await getFollows(userData[0].username).then(res => { - follows = res; - }); + await getFollows(userData[0].username).then(res => { + follows = res; + }); - user = await getUser(userData[0].username); - about = JSON.parse(user.json_metadata); - this.setState( - { - user: user, - isLoggedIn: isLoggedIn, - follows: follows, - about: about.profile, - }, - () => { - this.getBlog(userData[0].username); - this.getComments(userData[0].username); - } - ); + user = await getUser(userData[0].username); + about = JSON.parse(user.json_metadata); + this.setState( + { + user: user, + isLoggedIn: isLoggedIn, + follows: follows, + about: about.profile, + }, + () => { + this.getBlog(userData[0].username); + this.getComments(userData[0].username); } + ); } + } - renderFooter = () => { - if (!this.state.loading == false) return null; + renderFooter = () => { + if (this.state.loading) return null; - return ( - - - - ); - }; + return ( + + + + ); + }; - getBlog = user => { - this.setState({ loading: true }); - getPosts("blog", { tag: user, limit: 10 }, user) - .then(result => { - this.setState({ - isReady: true, - posts: result, - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - refreshing: false, - loading: false, - }); - }) - .catch(err => { - alert(err); - }); - }; - - getMore = async () => { - console.log("get more"); - await getPosts( - "blog", - { - tag: this.state.user.name, - limit: 10, - start_author: this.state.start_author, - start_permlink: this.state.start_permlink, - }, - this.state.user.name - ).then(result => { - console.log(result); - let posts = result; - posts.shift(); - this.setState({ - posts: [...this.state.posts, ...posts], - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - loading: false, - }); + getBlog = user => { + this.setState({ loading: true }); + getPosts("blog", { tag: user, limit: 10 }, user) + .then(result => { + this.setState({ + isReady: true, + posts: result, + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + refreshing: false, + loading: false, }); - }; + }) + .catch(err => { + alert(err); + }); + }; - getComments = async user => { - await getUserComments({ start_author: user, limit: 10 }) - .then(result => { - this.setState({ - isReady: true, - commments: result, - refreshing: false, - loading: false, - }); - }) - .catch(err => { - console.log(err); - }); - }; + getMore = async () => { + console.log("get more"); + await getPosts( + "blog", + { + tag: this.state.user.name, + limit: 10, + start_author: this.state.start_author, + start_permlink: this.state.start_permlink, + }, + this.state.user.name + ).then(result => { + console.log(result); + let posts = result; + posts.shift(); + this.setState({ + posts: [...this.state.posts, ...posts], + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + loading: false, + }); + }); + }; - render() { - return ( - - {this.state.isLoggedIn ? ( - - - - - - - {this.state.user.name} - - {this.state.about.about} - - - - - - {this.state.user.post_count} Posts - - - - - {this.state.follows.follower_count}{" "} - Followers - - - - - {this.state.follows.following_count}{" "} - Following - - - + getComments = async user => { + await getUserComments({ start_author: user, limit: 10 }) + .then(result => { + this.setState({ + isReady: true, + commments: result, + refreshing: false, + loading: false, + }); + }) + .catch(err => { + console.log(err); + }); + }; - - - - - {this.state.about.location} - - - - - - {moment - .utc(this.state.user.created) - .local() - .fromNow()} - - - - - - ( - - )} - > - - ( - - )} - keyExtractor={(post, index) => - index.toString() - } - onEndReached={info => { - if (this.state.loading == false) { - console.log(info); - this.getMore(); - } - }} - onEndThreshold={0} - bounces={false} - ListFooterComponent={this.renderFooter} - /> - + render() { + return ( + + {this.state.isLoggedIn ? ( + + + + + + + {this.state.user.name} + + {this.state.about.about} + + + + + {this.state.user.post_count} Posts + + + {this.state.follows.follower_count} Followers + + + {this.state.follows.following_count} Following + + - - ( - - )} - keyExtractor={(post, index) => - index.toString() - } - onEndThreshold={0} - bounces={false} - ListFooterComponent={this.renderFooter} - /> - - - - - - STEEM Balance: {this.state.user.balance} - - - - - SBD Balance:{" "} - {this.state.user.sbd_balance} - - - - - STEEM Power:{" "} - {this.state.user.steem_power} SP - - - Received STEEM Power:{" "} - {this.state.user.received_steem_power}{" "} - SP - - - Delegated Power Power:{" "} - {this.state.user.delegated_steem_power}{" "} - SP - - - - - Saving STEEM Balance:{" "} - {this.state.user.savings_balance} - - - Saving STEEM Balance:{" "} - {this.state.user.savings_sbd_balance} - - - - - - ) : ( - - )} + + + + + {this.state.about.location} + + + + + + {getTimeFromNow(this.state.user.created)} + + + + - ); - } + ( + + )} + > + + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndReached={info => { + if (!this.state.loading) { + console.log(info); + this.getMore(); + } + }} + onEndThreshold={0} + bounces={false} + ListFooterComponent={this.renderFooter} + /> + + + + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndThreshold={0} + bounces={false} + ListFooterComponent={this.renderFooter} + /> + + + + + STEEM Balance: {this.state.user.balance} + + + SBD Balance: {this.state.user.sbd_balance} + + + STEEM Power: {this.state.user.steem_power} SP + + Received STEEM Power: {this.state.user.received_steem_power}{" "} + SP + + + Delegated Power Power:{" "} + {this.state.user.delegated_steem_power} SP + + + + + Saving STEEM Balance: {this.state.user.savings_balance} + + + Saving STEEM Balance: {this.state.user.savings_sbd_balance} + + + + + + ) : ( + + )} + + ); + } } export default ProfilePage; diff --git a/src/screens/profile/screen/profileScreen.js b/src/screens/profile/screen/profileScreen.js index 94316c0ff..35b6a4816 100644 --- a/src/screens/profile/screen/profileScreen.js +++ b/src/screens/profile/screen/profileScreen.js @@ -2,23 +2,24 @@ import React from "react"; import { FlatList, ActivityIndicator } from "react-native"; -import moment from "moment"; +import { getTimeFromNow } from "../../../utils/time"; import FastImage from "react-native-fast-image"; import ScrollableTabView from "@esteemapp/react-native-scrollable-tab-view"; import { TabBar } from "../../../components/tabBar"; import DiscoverPage from "../../discover/discover"; -import PostCard from "../../../components/post-card/postCard"; +import { PostCard } from "../../../components/postCard"; + import Comment from "../../../components/comment/comment"; import { Card, CardItem, View, Body, Icon, Text } from "native-base"; import { getUserData, getAuthStatus } from "../../../realm/realm"; import { - getUser, - getFollows, - getPosts, - getUserComments, + getUser, + getFollows, + getPosts, + getUserComments, } from "../../../providers/steem/dsteem"; // Styles @@ -26,344 +27,314 @@ import styles from "./profileStyles"; /* eslint-enable no-unused-vars */ class ProfileScreen extends React.Component { - static get options() { - return { - _statusBar: { - visible: true, - drawBehind: false, - }, - topBar: { - animate: true, - hideOnScroll: false, - drawBehind: false, - leftButtons: { - id: "back", - }, - }, - layout: { - backgroundColor: "#f5fcff", - }, - bottomTabs: { - visible: false, - drawBehind: true, - }, - }; - } + static get options() { + return { + _statusBar: { + visible: true, + drawBehind: false, + }, + topBar: { + animate: true, + hideOnScroll: false, + drawBehind: false, + leftButtons: { + id: "back", + }, + }, + layout: { + backgroundColor: "#f5fcff", + }, + bottomTabs: { + visible: false, + drawBehind: true, + }, + }; + } - constructor() { - super(); - this.getBlog = this.getBlog.bind(this); - this.getMore = this.getMore.bind(this); - this.getComments = this.getComments.bind(this); - this.state = { - user: [], - posts: [], - commments: [], - replies: [], - about: {}, - follows: {}, - isLoggedIn: false, - }; - } + constructor() { + super(); + this.getBlog = this.getBlog.bind(this); + this.getMore = this.getMore.bind(this); + this.getComments = this.getComments.bind(this); + this.state = { + user: [], + posts: [], + commments: [], + replies: [], + about: {}, + follows: {}, + isLoggedIn: false, + }; + } - async componentDidMount() { - await getAuthStatus().then(res => { - const isLoggedIn = res; - }); + async componentDidMount() { + await getAuthStatus().then(res => { + const isLoggedIn = res; + }); - if (isLoggedIn === true) { - let user; - let userData; - let follows; - let about; + if (isLoggedIn) { + let user; + let userData; + let follows; + let about; - await getUserData().then(res => { - userData = Array.from(res); - }); + await getUserData().then(res => { + userData = Array.from(res); + }); - await getFollows(userData[0].username).then(res => { - follows = res; - }); + await getFollows(userData[0].username).then(res => { + follows = res; + }); - user = await getUser(userData[0].username); - about = JSON.parse(user.json_metadata); - // BUG: json_metadata: "{}" is coming emty object!! - this.setState( - { - user: user, - isLoggedIn: isLoggedIn, - follows: follows, - about: about.profile, - }, - () => { - this.getBlog(userData[0].username); - this.getComments(userData[0].username); - } - ); + user = await getUser(userData[0].username); + about = JSON.parse(user.json_metadata); + // BUG: json_metadata: "{}" is coming emty object!! + this.setState( + { + user: user, + isLoggedIn: isLoggedIn, + follows: follows, + about: about.profile, + }, + () => { + this.getBlog(userData[0].username); + this.getComments(userData[0].username); } + ); } + } - renderFooter = () => { - if (!this.state.loading == false) return null; + renderFooter = () => { + if (this.state.loading) return null; - return ( - - - - ); - }; + return ( + + + + ); + }; - getBlog = user => { - this.setState({ loading: true }); - getPosts("blog", { tag: user, limit: 10 }, user) - .then(result => { - this.setState({ - isReady: true, - posts: result, - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - refreshing: false, - loading: false, - }); - }) - .catch(err => { - alert(err); - }); - }; - - getMore = async () => { - console.log("get more"); - await getPosts( - "blog", - { - tag: this.state.user.name, - limit: 10, - start_author: this.state.start_author, - start_permlink: this.state.start_permlink, - }, - this.state.user.name - ).then(result => { - console.log(result); - let posts = result; - posts.shift(); - this.setState({ - posts: [...this.state.posts, ...posts], - start_author: result[result.length - 1].author, - start_permlink: result[result.length - 1].permlink, - loading: false, - }); + getBlog = user => { + this.setState({ loading: true }); + getPosts("blog", { tag: user, limit: 10 }, user) + .then(result => { + this.setState({ + isReady: true, + posts: result, + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + refreshing: false, + loading: false, }); - }; + }) + .catch(err => { + alert(err); + }); + }; - getComments = async user => { - await getUserComments({ start_author: user, limit: 10 }) - .then(result => { - this.setState({ - isReady: true, - commments: result, - refreshing: false, - loading: false, - }); - }) - .catch(err => { - console.log(err); - }); - }; + getMore = async () => { + console.log("get more"); + await getPosts( + "blog", + { + tag: this.state.user.name, + limit: 10, + start_author: this.state.start_author, + start_permlink: this.state.start_permlink, + }, + this.state.user.name + ).then(result => { + console.log(result); + let posts = result; + posts.shift(); + this.setState({ + posts: [...this.state.posts, ...posts], + start_author: result[result.length - 1].author, + start_permlink: result[result.length - 1].permlink, + loading: false, + }); + }); + }; - render() { - //TODO: Refactor ME ! - return ( - - {this.state.isLoggedIn ? ( - - - - - - - {this.state.user.name} - - {this.state.about.about} - - - - - - {this.state.user.post_count} Posts - - - - - {this.state.follows.follower_count}{" "} - Followers - - - - - {this.state.follows.following_count}{" "} - Following - - - + getComments = async user => { + await getUserComments({ start_author: user, limit: 10 }) + .then(result => { + this.setState({ + isReady: true, + commments: result, + refreshing: false, + loading: false, + }); + }) + .catch(err => { + console.log(err); + }); + }; - - - - - {this.state.about.location} - - - - - - {moment - .utc(this.state.user.created) - .local() - .fromNow()} - - - - - - ( - - )} - > - - ( - - )} - keyExtractor={(post, index) => - index.toString() - } - onEndReached={info => { - if (this.state.loading == false) { - console.log(info); - this.getMore(); - } - }} - onEndThreshold={0} - bounces={false} - ListFooterComponent={this.renderFooter} - /> - + render() { + //TODO: Refactor ME ! + return ( + + {this.state.isLoggedIn ? ( + + + + + + + {this.state.user.name} + + {this.state.about.about} + + + + + {this.state.user.post_count} Posts + + + {this.state.follows.follower_count} Followers + + + {this.state.follows.following_count} Following + + - - ( - - )} - keyExtractor={(post, index) => - index.toString() - } - onEndThreshold={0} - bounces={false} - ListFooterComponent={this.renderFooter} - /> - - - - - - STEEM Balance: {this.state.user.balance} - - - - - SBD Balance:{" "} - {this.state.user.sbd_balance} - - - - - STEEM Power:{" "} - {this.state.user.steem_power} SP - - - Received STEEM Power:{" "} - {this.state.user.received_steem_power}{" "} - SP - - - Delegated Power Power:{" "} - {this.state.user.delegated_steem_power}{" "} - SP - - - - - Saving STEEM Balance:{" "} - {this.state.user.savings_balance} - - - Saving STEEM Balance:{" "} - {this.state.user.savings_sbd_balance} - - - - - - ) : ( - - )} + + + + + {this.state.about.location} + + + + + + {getTimeFromNow(this.state.user.created)} + + + + - ); - } + ( + + )} + > + + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndReached={info => { + if (!this.state.loading) { + console.log(info); + this.getMore(); + } + }} + onEndThreshold={0} + bounces={false} + ListFooterComponent={this.renderFooter} + /> + + + + ( + + )} + keyExtractor={(post, index) => index.toString()} + onEndThreshold={0} + bounces={false} + ListFooterComponent={this.renderFooter} + /> + + + + + STEEM Balance: {this.state.user.balance} + + + SBD Balance: {this.state.user.sbd_balance} + + + STEEM Power: {this.state.user.steem_power} SP + + Received STEEM Power: {this.state.user.received_steem_power}{" "} + SP + + + Delegated Power Power:{" "} + {this.state.user.delegated_steem_power} SP + + + + + Saving STEEM Balance: {this.state.user.savings_balance} + + + Saving STEEM Balance: {this.state.user.savings_sbd_balance} + + + + + + ) : ( + + )} + + ); + } } export default ProfileScreen; diff --git a/src/screens/registerScreens.js b/src/screens/registerScreens.js index 2c0713f8a..87be95758 100644 --- a/src/screens/registerScreens.js +++ b/src/screens/registerScreens.js @@ -22,7 +22,7 @@ import PinCode from "./pinCode"; // COMPONENTS import SteemConnect from "./steem-connect/steemConnect"; -import PostCard from "../components/post-card/postCard"; +import { PostCard } from "../components/postCard"; import Search from "../components/search/search"; export const registerScreens = () => { diff --git a/src/screens/side-menu/authLoading.js b/src/screens/side-menu/authLoading.js index 53981206e..52201fb4c 100644 --- a/src/screens/side-menu/authLoading.js +++ b/src/screens/side-menu/authLoading.js @@ -5,54 +5,54 @@ import { ActivityIndicator, StatusBar, StyleSheet, View } from "react-native"; import { getAuthStatus, getUserData } from "../../realm/realm"; export class AuthLoadingScreen extends React.Component { - constructor(props) { - super(props); - this.checkAuth(); - } + constructor(props) { + super(props); + this.checkAuth(); + } - // Fetch the login state from storage then navigate to our appropriate place - checkAuth = async () => { - await getAuthStatus() - .then(result => { - if (result === true) { - getUserData() - .then(userData => { - // This will switch to the App screen or Auth screen and this loading - // screen will be unmounted and thrown away. - this.props.navigation.navigate("LoggedIn", { - account: userData["0"].username, - }); - }) - .catch(err => { - alert(err); - }); - } else { - this.props.navigation.navigate("LoggedOut"); - } + // Fetch the login state from storage then navigate to our appropriate place + checkAuth = async () => { + await getAuthStatus() + .then(result => { + if (result) { + getUserData() + .then(userData => { + // This will switch to the App screen or Auth screen and this loading + // screen will be unmounted and thrown away. + this.props.navigation.navigate("LoggedIn", { + account: userData["0"].username, + }); }) .catch(err => { - alert(err); + alert(err); }); - }; + } else { + this.props.navigation.navigate("LoggedOut"); + } + }) + .catch(err => { + alert(err); + }); + }; - // Render any loading content that you like here - render() { - return ( - - - - - ); - } + // Render any loading content that you like here + render() { + return ( + + + + + ); + } } const styles = StyleSheet.create({ - container: { - flex: 1, - alignItems: "center", - justifyContent: "center", - }, - text: { - fontSize: 32, - }, + container: { + flex: 1, + alignItems: "center", + justifyContent: "center", + }, + text: { + fontSize: 32, + }, }); diff --git a/src/screens/side-menu/loggedInMenu.js b/src/screens/side-menu/loggedInMenu.js index 6e1228252..6a61e8a15 100644 --- a/src/screens/side-menu/loggedInMenu.js +++ b/src/screens/side-menu/loggedInMenu.js @@ -1,270 +1,262 @@ import React from "react"; /* eslint-disable no-unused-vars */ import { - Content, - Text, - List, - ListItem, - Icon, - Container, - Left, - Right, - View, - Badge, - Thumbnail, + Content, + Text, + List, + ListItem, + Icon, + Container, + Left, + Right, + View, + Badge, + Thumbnail, } from "native-base"; /* eslint-enable no-unused-vars */ import styles from "./style"; -import FastImage from "react-native-fast-image"; import { getAccount } from "../../providers/steem/dsteem"; import { setAuthStatus } from "../../realm/realm"; import RNRestart from "react-native-restart"; import { Navigation } from "react-native-navigation"; const masterKeyMenuOptions = [ - { - name: "Profile", - route: "Profile", - icon: "contact", - bg: "#C5F442", - }, - { - name: "Bookmarks", - route: "bookmarks", - icon: "bookmarks", - bg: "#DA4437", - }, - { - name: "Favorites", - route: "favorites", - icon: "heart", - bg: "#DA4437", - }, - { - name: "Drafts", - route: "drafts", - icon: "create", - bg: "#DA4437", - }, - { - name: "Schedules", - route: "schedules", - icon: "time", - bg: "#DA4437", - }, - { - name: "Gallery", - route: "galery", - icon: "images", - bg: "#DA4437", - }, - { - name: "Settings", - route: "Settings", - icon: "settings", - bg: "#DA4437", - }, + { + name: "Profile", + route: "Profile", + icon: "contact", + bg: "#C5F442", + }, + { + name: "Bookmarks", + route: "bookmarks", + icon: "bookmarks", + bg: "#DA4437", + }, + { + name: "Favorites", + route: "favorites", + icon: "heart", + bg: "#DA4437", + }, + { + name: "Drafts", + route: "drafts", + icon: "create", + bg: "#DA4437", + }, + { + name: "Schedules", + route: "schedules", + icon: "time", + bg: "#DA4437", + }, + { + name: "Gallery", + route: "galery", + icon: "images", + bg: "#DA4437", + }, + { + name: "Settings", + route: "Settings", + icon: "settings", + bg: "#DA4437", + }, ]; const postingKeyMenuOptions = [ - { - name: "Profile", - route: "Profile", - icon: "contact", - bg: "#C5F442", - }, - { - name: "Bookmarks", - route: "bookmarks", - icon: "bookmarks", - bg: "#DA4437", - }, - { - name: "Favorites", - route: "favorites", - icon: "heart", - bg: "#DA4437", - }, - { - name: "Drafts", - route: "drafts", - icon: "create", - bg: "#DA4437", - }, - { - name: "Schedules", - route: "schedules", - icon: "time", - bg: "#DA4437", - }, - { - name: "Gallery", - route: "galery", - icon: "images", - bg: "#DA4437", - }, - { - name: "Settings", - route: "Settings", - icon: "settings", - bg: "#DA4437", - }, + { + name: "Profile", + route: "Profile", + icon: "contact", + bg: "#C5F442", + }, + { + name: "Bookmarks", + route: "bookmarks", + icon: "bookmarks", + bg: "#DA4437", + }, + { + name: "Favorites", + route: "favorites", + icon: "heart", + bg: "#DA4437", + }, + { + name: "Drafts", + route: "drafts", + icon: "create", + bg: "#DA4437", + }, + { + name: "Schedules", + route: "schedules", + icon: "time", + bg: "#DA4437", + }, + { + name: "Gallery", + route: "galery", + icon: "images", + bg: "#DA4437", + }, + { + name: "Settings", + route: "Settings", + icon: "settings", + bg: "#DA4437", + }, ]; export default class LoggedInSideBar extends React.Component { - constructor(props) { - super(props); - this.state = { - shadowOffsetWidth: 1, - shadowRadius: 4, - user: [], - loginType: "", - json_metadata: {}, - }; - } - - componentDidMount() { - getAccount(this.props.user) - .then(result => { - let json_metadata = JSON.parse(result[0].json_metadata); - this.setState({ - user: result[0], - avatar: `https://steemitimages.com/u/${ - result[0].name - }/avatar/small`, - json_metadata: json_metadata.profile, - }); - }) - .catch(err => { - alert(err); - }); - } - - hideSideMenu() { - Navigation.mergeOptions("Component14", { - sideMenu: { - ["right"]: { - visible: false, - }, - }, - }); - } - - Logout = () => { - let authData = { - isLoggedIn: false, - }; - setAuthStatus(authData) - .then(() => { - RNRestart.Restart(); - }) - .catch(err => { - alert(err); - }); + constructor(props) { + super(props); + this.state = { + shadowOffsetWidth: 1, + shadowRadius: 4, + user: [], + loginType: "", + json_metadata: {}, }; + } - render() { - return ( - - - - - - - {(this.state.json_metadata && - this.state.json_metadata.name) || - ""} - - - @{this.state.user.name} - - - ( - { - Navigation.push("tab1Stack", { - component: { - name: `navigation.eSteem.${ - data.route - }`, - passProps: {}, - options: { - topBar: { - title: {}, - }, - }, - }, - }); - this.hideSideMenu(); - }} - > - - - {data.name} - - {data.types && ( - - - {`${ - data.types - } Types`} - - - )} - - )} - /> - this.Logout()} + componentDidMount() { + getAccount(this.props.user) + .then(result => { + let json_metadata = JSON.parse(result[0].json_metadata); + this.setState({ + user: result[0], + avatar: `https://steemitimages.com/u/${result[0].name}/avatar/small`, + json_metadata: json_metadata.profile, + }); + }) + .catch(err => { + alert(err); + }); + } + + hideSideMenu() { + Navigation.mergeOptions("Component14", { + sideMenu: { + ["right"]: { + visible: false, + }, + }, + }); + } + + Logout = () => { + let authData = { + isLoggedIn: false, + }; + setAuthStatus(authData) + .then(() => { + RNRestart.Restart(); + }) + .catch(err => { + alert(err); + }); + }; + + render() { + return ( + + + + + + + {(this.state.json_metadata && this.state.json_metadata.name) || + ""} + + @{this.state.user.name} + + ( + { + Navigation.push("tab1Stack", { + component: { + name: `navigation.eSteem.${data.route}`, + passProps: {}, + options: { + topBar: { + title: {}, + }, + }, + }, + }); + this.hideSideMenu(); + }} + > + + + {data.name} + + {data.types && ( + + - - - Logout - - - - - ); - } + {`${ + data.types + } Types`} + + + )} + + )} + /> + this.Logout()} + > + + + Logout + + + + + ); + } } diff --git a/src/screens/sideMenuScreen.js b/src/screens/sideMenuScreen.js index fdca14386..817444665 100755 --- a/src/screens/sideMenuScreen.js +++ b/src/screens/sideMenuScreen.js @@ -7,57 +7,57 @@ import LoggedOutMenu from "./side-menu/loggedOutMenu"; import { getAuthStatus, getUserData } from "../realm/realm"; class SideMenuScreen extends Component { - constructor() { - super(); + constructor() { + super(); - this.state = { - isLoggedIn: false, - username: "", - }; + this.state = { + isLoggedIn: false, + username: "", + }; + } + + async componentDidMount() { + let user; + let isLoggedIn; + + await getAuthStatus().then(res => { + isLoggedIn = res; + }); + + if (isLoggedIn) { + await getUserData().then(res => { + user = Array.from(res); + }); + + this.setState({ + username: user[0].username, + isLoggedIn: isLoggedIn, + isLoading: false, + }); + } else { + await this.setState({ + isLoggedIn: false, + }); } + } - async componentDidMount() { - let user; - let isLoggedIn; - - await getAuthStatus().then(res => { - isLoggedIn = res; - }); - - if (isLoggedIn == true) { - await getUserData().then(res => { - user = Array.from(res); - }); - - this.setState({ - username: user[0].username, - isLoggedIn: isLoggedIn, - isLoading: false, - }); - } else { - await this.setState({ - isLoggedIn: false, - }); - } - } - - render() { - return ( - - {this.state.isLoggedIn ? ( - - ) : ( - - )} - - ); - } + render() { + return ( + + {this.state.isLoggedIn ? ( + + ) : ( + + )} + + ); + } } module.exports = SideMenuScreen; const styles = { - root: { - flexGrow: 1, - backgroundColor: "#f5fcff", - }, + root: { + flexGrow: 1, + backgroundColor: "#f5fcff", + }, }; diff --git a/src/screens/splash/splashContainer.js b/src/screens/splash/splashContainer.js index 4fe88fb5f..32951dc58 100644 --- a/src/screens/splash/splashContainer.js +++ b/src/screens/splash/splashContainer.js @@ -14,7 +14,7 @@ class SplashContainer extends React.Component { async componentDidMount() { await getAuthStatus() .then(result => { - if (result === true) { + if (result) { goToAuthScreens(); } else { goToNoAuthScreens(); diff --git a/src/screens/steem-connect/steemConnect.js b/src/screens/steem-connect/steemConnect.js index b2d9aedb8..6bedae265 100644 --- a/src/screens/steem-connect/steemConnect.js +++ b/src/screens/steem-connect/steemConnect.js @@ -7,58 +7,54 @@ import { Navigation } from "react-native-navigation"; import { goToAuthScreens } from "../../navigation"; export default class SteemConnect extends Component { - constructor(props) { - super(props); - this.state = {}; - } + constructor(props) { + super(props); + this.state = {}; + } - onNavigationStateChange(event) { - let access_token; - if (event.url.indexOf("?access_token=") > -1) { - this.webview.stopLoading(); - try { - access_token = event.url.match( - /\?(?:access_token)\=([\S\s]*?)\&/ - )[1]; - } catch (error) { - console.log(error); - } + onNavigationStateChange(event) { + let access_token; + if (event.url.indexOf("?access_token=") > -1) { + this.webview.stopLoading(); + try { + access_token = event.url.match(/\?(?:access_token)\=([\S\s]*?)\&/)[1]; + } catch (error) { + console.log(error); + } - loginWithSC2(access_token, "pinCode") - .then(result => { - if (result === true) { - // TODO: Handle pinCode and navigate to home page - goToAuthScreens(); - } else { - // TODO: Error alert (Toast Message) - console.log("loginWithSC2 error"); - } - }) - .catch(error => { - console.log(error); - }); - } + loginWithSC2(access_token, "pinCode") + .then(result => { + if (result) { + // TODO: Handle pinCode and navigate to home page + goToAuthScreens(); + } else { + // TODO: Error alert (Toast Message) + console.log("loginWithSC2 error"); + } + }) + .catch(error => { + console.log(error); + }); } + } - render() { - return ( - - { - this.webview = ref; - }} - /> - - ); - } + render() { + return ( + + { + this.webview = ref; + }} + /> + + ); + } } diff --git a/src/screens/wallet/wallet.js b/src/screens/wallet/wallet.js index a261ce5b6..4dbefe4e9 100644 --- a/src/screens/wallet/wallet.js +++ b/src/screens/wallet/wallet.js @@ -4,496 +4,447 @@ import Slider from "react-native-slider"; import { Container, Button, Content, Card, Input } from "native-base"; import { getUserData, getAuthStatus } from "../../realm/realm"; import { - getUser, - transferToken, - delegate, - globalProps, - transferToVesting, - withdrawVesting, + getUser, + transferToken, + delegate, + globalProps, + transferToVesting, + withdrawVesting, } from "../../providers/steem/dsteem"; import { decryptKey } from "../../utils/crypto"; class WalletPage extends Component { - constructor(props) { - super(props); + constructor(props) { + super(props); - this.state = { - receiver: "", - amount: "", - asset: "STEEM", - memo: "", - user: {}, - avail: "", - globalProps: "", - vestSteem: "", - percent: 0.05, - value: 0.0, - }; + this.state = { + receiver: "", + amount: "", + asset: "STEEM", + memo: "", + user: {}, + avail: "", + globalProps: "", + vestSteem: "", + percent: 0.05, + value: 0.0, + }; + } + async componentDidMount() { + let isLoggedIn; + let user; + let userData; + let avail; + let vestSteem; + let globalProperties; + + await getAuthStatus().then(res => { + isLoggedIn = res; + }); + + if (isLoggedIn) { + await getUserData().then(res => { + userData = Array.from(res); + }); + + user = await getUser(userData[0].username); + + await this.setState({ + user: user, + }); + + globalProperties = await globalProps(); + avail = + parseFloat(this.state.user.vesting_shares) - + (parseFloat(this.state.user.to_withdraw) - + parseFloat(this.state.user.withdrawn)) / + 1e6 - + parseFloat(this.state.user.delegated_vesting_shares); + vestSteem = parseFloat( + parseFloat(globalProperties.total_vesting_fund_steem) * + (parseFloat(avail) / + parseFloat(globalProperties.total_vesting_shares)), + 6 + ); + + console.log(avail); + console.log(vestSteem); + console.log(globalProperties); + + console.log( + (parseFloat(globalProperties.total_vesting_fund_steem) / + parseFloat(globalProperties.total_vesting_shares)) * + parseFloat(avail * this.state.value) + ); + await this.setState({ + avail: avail, + vestSteem: vestSteem, + globalProps: globalProperties, + }); } - async componentDidMount() { - let isLoggedIn; - let user; - let userData; - let avail; - let vestSteem; - let globalProperties; + } - await getAuthStatus().then(res => { - isLoggedIn = res; - }); + sendSteem = async () => { + let userData; + let activeKey; - if (isLoggedIn == true) { - await getUserData().then(res => { - userData = Array.from(res); - }); - - user = await getUser(userData[0].username); - - await this.setState({ - user: user, - }); - - globalProperties = await globalProps(); - avail = - parseFloat(this.state.user.vesting_shares) - - (parseFloat(this.state.user.to_withdraw) - - parseFloat(this.state.user.withdrawn)) / - 1e6 - - parseFloat(this.state.user.delegated_vesting_shares); - vestSteem = parseFloat( - parseFloat(globalProperties.total_vesting_fund_steem) * - (parseFloat(avail) / - parseFloat(globalProperties.total_vesting_shares)), - 6 - ); - - console.log(avail); - console.log(vestSteem); - console.log(globalProperties); - - console.log( - (parseFloat(globalProperties.total_vesting_fund_steem) / - parseFloat(globalProperties.total_vesting_shares)) * - parseFloat(avail * this.state.value) - ); - await this.setState({ - avail: avail, - vestSteem: vestSteem, - globalProps: globalProperties, - }); - } - } - - sendSteem = async () => { - let userData; - let activeKey; - - transferData = { - from: this.state.user.name, - to: this.state.receiver, - amount: this.state.amount + " " + this.state.asset, - memo: this.state.memo, - }; - - await getUserData() - .then(result => { - userData = Array.from(result); - activeKey = userData[0].activeKey; - console.log(userData); - console.log(activeKey); - }) - .then(() => { - activeKey = decryptKey(activeKey, "pinCode"); - transferToken(transferData, activeKey); - }) - .catch(error => { - console.log(error); - }); + transferData = { + from: this.state.user.name, + to: this.state.receiver, + amount: this.state.amount + " " + this.state.asset, + memo: this.state.memo, }; - delegateSP = async () => { - let userData; - let activeKey; + await getUserData() + .then(result => { + userData = Array.from(result); + activeKey = userData[0].activeKey; + console.log(userData); + console.log(activeKey); + }) + .then(() => { + activeKey = decryptKey(activeKey, "pinCode"); + transferToken(transferData, activeKey); + }) + .catch(error => { + console.log(error); + }); + }; - vestSteem = parseFloat( - parseFloat(this.state.globalProps.total_vesting_fund_steem) * - (parseFloat(this.state.avail * this.state.value) / - parseFloat(this.state.globalProps.total_vesting_shares)), - 6 - ); - let toWithdraw = - (vestSteem * 1e6) / - (parseFloat(this.state.globalProps.total_vesting_fund_steem) / - (parseFloat(this.state.globalProps.total_vesting_shares) / - 1e6)); - console.log(toWithdraw); - data = { - delegator: this.state.user.name, - delegatee: "demo", - vesting_shares: `${toWithdraw.toFixed(6)} VESTS`, - }; - await getUserData().then(res => { - userData = Array.from(res); - }); + delegateSP = async () => { + let userData; + let activeKey; - activeKey = decryptKey(userData[0].activeKey, "pinCode"); + vestSteem = parseFloat( + parseFloat(this.state.globalProps.total_vesting_fund_steem) * + (parseFloat(this.state.avail * this.state.value) / + parseFloat(this.state.globalProps.total_vesting_shares)), + 6 + ); + let toWithdraw = + (vestSteem * 1e6) / + (parseFloat(this.state.globalProps.total_vesting_fund_steem) / + (parseFloat(this.state.globalProps.total_vesting_shares) / 1e6)); + console.log(toWithdraw); + data = { + delegator: this.state.user.name, + delegatee: "demo", + vesting_shares: `${toWithdraw.toFixed(6)} VESTS`, + }; + await getUserData().then(res => { + userData = Array.from(res); + }); - delegate(data, activeKey) - .then(res => { - console.log(res); - }) - .catch(err => { - console.log(err); - }); + activeKey = decryptKey(userData[0].activeKey, "pinCode"); + + delegate(data, activeKey) + .then(res => { + console.log(res); + }) + .catch(err => { + console.log(err); + }); + }; + + powerUpSteem = async () => { + let userData; + let activeKey; + + await getUserData().then(res => { + userData = Array.from(res); + }); + + activeKey = decryptKey(userData[0].activeKey, "pinCode"); + + let data = { + from: this.state.user.name, + to: "hsynterkr", + amount: "001.000 STEEM", }; - powerUpSteem = async () => { - let userData; - let activeKey; + transferToVesting(data, activeKey) + .then(res => { + console.log(res); + }) + .catch(error => { + console.log(error); + }); + }; - await getUserData().then(res => { - userData = Array.from(res); - }); + powerDownSteem = async () => { + let userData; + let activeKey; + let avail; - activeKey = decryptKey(userData[0].activeKey, "pinCode"); + await getUserData().then(res => { + userData = Array.from(res); + }); - let data = { - from: this.state.user.name, - to: "hsynterkr", - amount: "001.000 STEEM", - }; + activeKey = decryptKey(userData[0].activeKey, "pinCode"); - transferToVesting(data, activeKey) - .then(res => { - console.log(res); - }) - .catch(error => { - console.log(error); - }); + avail = + parseFloat(this.state.user.vesting_shares) - + (parseFloat(this.state.user.to_withdraw) - + parseFloat(this.state.user.withdrawn)) / + 1e6 - + parseFloat(this.state.user.delegated_vesting_shares); + let vestSteem = parseFloat( + parseFloat(this.state.globalProps.total_vesting_fund_steem) * + (parseFloat(avail * this.state.value) / + parseFloat(this.state.globalProps.total_vesting_shares)), + 6 + ); + let toWithdraw = + (vestSteem * 1e6) / + (parseFloat(this.state.globalProps.total_vesting_fund_steem) / + (parseFloat(this.state.globalProps.total_vesting_shares) / 1e6)); + + let data = { + account: this.state.user.name, + vesting_shares: `${toWithdraw.toFixed(6)} VESTS`, }; - powerDownSteem = async () => { - let userData; - let activeKey; - let avail; + withdrawVesting(data, activeKey) + .then(result => { + console.log(result); + }) + .catch(error => { + console.log(error); + }); + }; - await getUserData().then(res => { - userData = Array.from(res); - }); + render() { + return ( + + + + STEEM Balance: {this.state.user.balance} + + + SBD Balance: {this.state.user.sbd_balance} + + + STEEM Power: {this.state.user.steem_power} SP + + Received STEEM Power: {this.state.user.received_steem_power} SP + + + Delegated Power Power: {this.state.user.delegated_steem_power} SP + + + + Saving STEEM Balance: {this.state.user.savings_balance} + + Saving STEEM Balance: {this.state.user.savings_sbd_balance} + + - activeKey = decryptKey(userData[0].activeKey, "pinCode"); + + this.setState({ receiver: user })} + value={this.state.receiver} + /> + this.setState({ amount: amount })} + value={this.state.amount} + /> + this.setState({ memo: memo })} + value={this.state.memo} + /> + + + this.setState({ asset: itemValue }) + } + > + + + + + - avail = - parseFloat(this.state.user.vesting_shares) - - (parseFloat(this.state.user.to_withdraw) - - parseFloat(this.state.user.withdrawn)) / - 1e6 - - parseFloat(this.state.user.delegated_vesting_shares); - let vestSteem = parseFloat( - parseFloat(this.state.globalProps.total_vesting_fund_steem) * - (parseFloat(avail * this.state.value) / - parseFloat(this.state.globalProps.total_vesting_shares)), - 6 - ); - let toWithdraw = - (vestSteem * 1e6) / - (parseFloat(this.state.globalProps.total_vesting_fund_steem) / - (parseFloat(this.state.globalProps.total_vesting_shares) / - 1e6)); + + { + this.setState({ + value: value, + percent: Math.floor(value.toFixed(2) * 100), + }); + }} + /> + + Total:{" "} + {(parseInt(this.state.vestSteem) * this.state.percent) / 100} SP + + {Math.floor(this.state.value * 100)}% + + - let data = { - account: this.state.user.name, - vesting_shares: `${toWithdraw.toFixed(6)} VESTS`, - }; + + + - withdrawVesting(data, activeKey) - .then(result => { - console.log(result); - }) - .catch(error => { - console.log(error); - }); - }; - - render() { - return ( - - - - STEEM Balance: {this.state.user.balance} - - - SBD Balance: {this.state.user.sbd_balance} - - - - STEEM Power: {this.state.user.steem_power} SP - - - Received STEEM Power:{" "} - {this.state.user.received_steem_power} SP - - - Delegated Power Power:{" "} - {this.state.user.delegated_steem_power} SP - - - - - Saving STEEM Balance:{" "} - {this.state.user.savings_balance} - - - Saving STEEM Balance:{" "} - {this.state.user.savings_sbd_balance} - - - - - - this.setState({ receiver: user }) - } - value={this.state.receiver} - /> - - this.setState({ amount: amount }) - } - value={this.state.amount} - /> - this.setState({ memo: memo })} - value={this.state.memo} - /> - - - this.setState({ asset: itemValue }) - } - > - - - - - - - - { - this.setState({ - value: value, - percent: Math.floor( - value.toFixed(2) * 100 - ), - }); - }} - /> - - Total:{" "} - {(parseInt(this.state.vestSteem) * - this.state.percent) / - 100}{" "} - SP - - {Math.floor(this.state.value * 100)}% - - - - - - - - - { - this.setState( - { - value: value, - percent: Math.floor( - value.toFixed(2) * 100 - ), - }, - () => { - let avail = - parseFloat( - this.state.user - .vesting_shares - ) - - (parseFloat( - this.state.user.to_withdraw - ) - - parseFloat( - this.state.user - .withdrawn - )) / - 1e6 - - parseFloat( - this.state.user - .delegated_vesting_shares - ); - let vestSteem = parseFloat( - parseFloat( - this.state.globalProps - .total_vesting_fund_steem - ) * - (parseFloat( - avail * this.state.value - ) / - parseFloat( - this.state - .globalProps - .total_vesting_shares - )), - 6 - ); - console.log(vestSteem); - console.log( - (vestSteem * 1e6) / - (parseFloat( - this.state.globalProps - .total_vesting_fund_steem - ) / - (parseFloat( - this.state - .globalProps - .total_vesting_shares - ) / - 1e6)) - ); - } - ); - }} - /> - - Total Steem Power:{" "} - {(parseInt(this.state.vestSteem) * - this.state.percent) / - 100}{" "} - SP - - - Estimated Weekly:{" "} - {Math.floor( - (( - (parseInt(this.state.vestSteem) * - this.state.percent) / - 100 - ).toFixed(0) / - 13) * - 100 - ) / 100}{" "} - SP - - {Math.floor(this.state.value * 100)}% - - - - - - ); - } + + { + this.setState( + { + value: value, + percent: Math.floor(value.toFixed(2) * 100), + }, + () => { + let avail = + parseFloat(this.state.user.vesting_shares) - + (parseFloat(this.state.user.to_withdraw) - + parseFloat(this.state.user.withdrawn)) / + 1e6 - + parseFloat(this.state.user.delegated_vesting_shares); + let vestSteem = parseFloat( + parseFloat( + this.state.globalProps.total_vesting_fund_steem + ) * + (parseFloat(avail * this.state.value) / + parseFloat( + this.state.globalProps.total_vesting_shares + )), + 6 + ); + console.log(vestSteem); + console.log( + (vestSteem * 1e6) / + (parseFloat( + this.state.globalProps.total_vesting_fund_steem + ) / + (parseFloat( + this.state.globalProps.total_vesting_shares + ) / + 1e6)) + ); + } + ); + }} + /> + + Total Steem Power:{" "} + {(parseInt(this.state.vestSteem) * this.state.percent) / 100} SP + + + Estimated Weekly:{" "} + {Math.floor( + (( + (parseInt(this.state.vestSteem) * this.state.percent) / + 100 + ).toFixed(0) / + 13) * + 100 + ) / 100}{" "} + SP + + {Math.floor(this.state.value * 100)}% + + + + + + ); + } } export default WalletPage; diff --git a/src/styles/feed.styles.js b/src/styles/feed.styles.js index 8219e3831..de94db078 100644 --- a/src/styles/feed.styles.js +++ b/src/styles/feed.styles.js @@ -1,36 +1,34 @@ -import { createStyle } from "react-native-theming"; -import { StatusBar, Dimensions } from "react-native"; +import EStyleSheet from "react-native-extended-stylesheet"; +import { StatusBar } from "react-native"; -const styles = createStyle({ - container: { - backgroundColor: "#F9F9F9", - flex: 1, - top: StatusBar.currentHeight, - }, - placeholder: { - backgroundColor: "white", - padding: 20, - borderStyle: "solid", - borderWidth: 1, - borderTopWidth: 1, - borderColor: "#e2e5e8", - borderRadius: 5, - marginRight: 0, - marginLeft: 0, - marginTop: 10, - }, - tabs: { - position: "absolute", - top: Dimensions.get("window").width / 30, - alignItems: "center", - }, - flatlistFooter: { - alignContent: "center", - alignItems: "center", - marginTop: 10, - marginBottom: 40, - borderColor: "#CED0CE", - }, +export default EStyleSheet.create({ + container: { + backgroundColor: "#F9F9F9", + flex: 1, + top: StatusBar.currentHeight, + }, + placeholder: { + backgroundColor: "white", + padding: 20, + borderStyle: "solid", + borderWidth: 1, + borderTopWidth: 1, + borderColor: "#e2e5e8", + borderRadius: 5, + marginRight: 0, + marginLeft: 0, + marginTop: 10, + }, + tabs: { + position: "absolute", + top: "$deviceWidth / 30", + alignItems: "center", + }, + flatlistFooter: { + alignContent: "center", + alignItems: "center", + marginTop: 10, + marginBottom: 40, + borderColor: "#CED0CE", + }, }); - -export default styles; diff --git a/src/styles/formInput.styles.js b/src/styles/formInput.styles.js index 1a07a8abd..747bd3581 100644 --- a/src/styles/formInput.styles.js +++ b/src/styles/formInput.styles.js @@ -1,18 +1,15 @@ -import { createStyle } from "react-native-theming"; -import { Dimensions } from "react-native"; +import EStyleSheet from "react-native-extended-stylesheet"; -const deviceWidth = Dimensions.get("window").width; - -export default createStyle({ - container: { - flex: 1, - alignItems: "center", - justifyContent: "center", - }, - input: { - backgroundColor: "#f5f5f5", - borderRadius: 5, - padding: 15, - minWidth: deviceWidth / 2, - }, +export default EStyleSheet.create({ + container: { + flex: 1, + alignItems: "center", + justifyContent: "center", + }, + input: { + backgroundColor: "#f5f5f5", + borderRadius: 5, + padding: 15, + minWidth: "$deviceWidth / 2", + }, }); diff --git a/src/styles/home.styles.js b/src/styles/home.styles.js index 05451ac8d..08b8036a8 100644 --- a/src/styles/home.styles.js +++ b/src/styles/home.styles.js @@ -1,61 +1,58 @@ -import { createStyle } from "react-native-theming"; -import { StatusBar, Dimensions } from "react-native"; +import EStyleSheet from "react-native-extended-stylesheet"; -const styles = createStyle({ - container: { - backgroundColor: "#F9F9F9", - flex: 1, - }, - tabs: { - flex: 1, - }, - placeholder: { - backgroundColor: "white", - padding: 20, - borderStyle: "solid", - borderWidth: 1, - borderTopWidth: 1, - borderColor: "#e2e5e8", - borderRadius: 5, - marginRight: 0, - marginLeft: 0, - marginTop: 10, - }, - header: { - backgroundColor: "#284b78", - borderBottomWidth: 0, - borderColor: "#284b78", - }, - avatar: { - width: 30, - height: 30, - borderRadius: 15, - borderWidth: 1, - borderColor: "white", - }, - searchButton: { - color: "white", - fontWeight: "bold", - }, - tabView: { - alignSelf: "center", - backgroundColor: "transparent", - }, - tabbar: { - alignSelf: "center", - height: 40, - backgroundColor: "#284b78", - }, - tabbarItem: { - flex: 1, - paddingHorizontal: 7, - backgroundColor: "#f9f9f9", - minWidth: Dimensions.get("window").width, - }, - loginButton: { - alignSelf: "center", - marginTop: 100, - }, +export default EStyleSheet.create({ + container: { + backgroundColor: "#F9F9F9", + flex: 1, + }, + tabs: { + flex: 1, + }, + placeholder: { + backgroundColor: "white", + padding: 20, + borderStyle: "solid", + borderWidth: 1, + borderTopWidth: 1, + borderColor: "#e2e5e8", + borderRadius: 5, + marginRight: 0, + marginLeft: 0, + marginTop: 10, + }, + header: { + backgroundColor: "#284b78", + borderBottomWidth: 0, + borderColor: "#284b78", + }, + avatar: { + width: 30, + height: 30, + borderRadius: 15, + borderWidth: 1, + borderColor: "white", + }, + searchButton: { + color: "white", + fontWeight: "bold", + }, + tabView: { + alignSelf: "center", + backgroundColor: "transparent", + }, + tabbar: { + alignSelf: "center", + height: 40, + backgroundColor: "#284b78", + }, + tabbarItem: { + flex: 1, + paddingHorizontal: 7, + backgroundColor: "#f9f9f9", + minWidth: "$deviceWidth", + }, + loginButton: { + alignSelf: "center", + marginTop: 100, + }, }); - -export default styles; diff --git a/src/styles/hot.styles.js b/src/styles/hot.styles.js index 8219e3831..a8377f676 100644 --- a/src/styles/hot.styles.js +++ b/src/styles/hot.styles.js @@ -1,36 +1,33 @@ -import { createStyle } from "react-native-theming"; -import { StatusBar, Dimensions } from "react-native"; - -const styles = createStyle({ - container: { - backgroundColor: "#F9F9F9", - flex: 1, - top: StatusBar.currentHeight, - }, - placeholder: { - backgroundColor: "white", - padding: 20, - borderStyle: "solid", - borderWidth: 1, - borderTopWidth: 1, - borderColor: "#e2e5e8", - borderRadius: 5, - marginRight: 0, - marginLeft: 0, - marginTop: 10, - }, - tabs: { - position: "absolute", - top: Dimensions.get("window").width / 30, - alignItems: "center", - }, - flatlistFooter: { - alignContent: "center", - alignItems: "center", - marginTop: 10, - marginBottom: 40, - borderColor: "#CED0CE", - }, +import EStyleSheet from "react-native-extended-stylesheet"; +import { StatusBar } from "react-native"; +export default EStyleSheet.create({ + container: { + backgroundColor: "#F9F9F9", + flex: 1, + top: StatusBar.currentHeight, + }, + placeholder: { + backgroundColor: "white", + padding: 20, + borderStyle: "solid", + borderWidth: 1, + borderTopWidth: 1, + borderColor: "#e2e5e8", + borderRadius: 5, + marginRight: 0, + marginLeft: 0, + marginTop: 10, + }, + tabs: { + position: "absolute", + top: "$deviceWidth / 30", + alignItems: "center", + }, + flatlistFooter: { + alignContent: "center", + alignItems: "center", + marginTop: 10, + marginBottom: 40, + borderColor: "#CED0CE", + }, }); - -export default styles; diff --git a/src/styles/themes.js b/src/styles/themes.js deleted file mode 100644 index e79ab1efd..000000000 --- a/src/styles/themes.js +++ /dev/null @@ -1,37 +0,0 @@ -import { createTheme } from 'react-native-theming'; - -const fonts = { - FONT_SIZE_SMALL: '12', - FONT_SIZE_MEDIUM: '14', - FONT_SIZE_LARGE: '16', - FONT_WEIGHT_LIGHT: '200', - FONT_WEIGHT_MEDIUM: '600', - FONT_WEIGHT_HEAVY: '800', -}; - -const themes = [ - createTheme( - { - backgroundColor: 'white', - textColor: 'black', - buttonColor: 'blue', - buttonText: 'white', - statusBar: 'dark-content', - fontSize: fonts.FONT_SIZE_MEDIUM, - fontWeight: fonts.FONT_WEIGHT_MEDIUM, - }, - 'Light' - ), - createTheme( - { - backgroundColor: 'black', - textColor: 'white', - buttonColor: 'yellow', - buttonText: 'black', - statusBar: 'light-content', - fontSize: fonts.FONT_SIZE_MEDIUM, - fontWeight: fonts.FONT_WEIGHT_MEDIUM, - }, - 'Dark' - ), -]; diff --git a/src/utils/formatter.js b/src/utils/formatter.js new file mode 100644 index 000000000..56dbac23c --- /dev/null +++ b/src/utils/formatter.js @@ -0,0 +1,27 @@ +// TODO: Move all formats functions here! + +// const imgRegex = /(https?:\/\/.*\.(?:tiff?|jpe?g|gif|png|svg|ico))/gim; +// const postRegex = /^https?:\/\/(.*)\/(.*)\/(@[\w\.\d-]+)\/(.*)/i; +// const youTubeRegex = /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([^& \n<]+)(?:[^ \n<]+)?/g; +// const vimeoRegex = /(https?:\/\/)?(www\.)?(?:vimeo)\.com.*(?:videos|video|channels|)\/([\d]+)/i; +// const dTubeRegex = /(https?:\/\/d.tube.#!\/v\/)(\w+)\/(\w+)/g; + +export const getPostSummary = (postBody, length) => { + if (!postBody) { + return ""; + } + + postBody = postBody + .replace(/(<([^>]+)>)/gi, "") // Remove html tags + .replace(/\r?\n|\r/g, " ") // Remove new lines + .replace(/(?:https?|ftp):\/\/[\n\S]+/g, "") // Remove urls + .trim() + .replace(/ +(?= )/g, ""); // Remove all multiple spaces + + if (length) { + // Truncate + postBody = postBody.substring(0, length); + } + + return postBody; +}; diff --git a/src/utils/postParser.js b/src/utils/postParser.js index 328a75e23..9c9eef459 100644 --- a/src/utils/postParser.js +++ b/src/utils/postParser.js @@ -1,231 +1,210 @@ import Remarkable from "remarkable"; -import { postSummary } from "./postSummary"; -import { reputation } from "./reputation"; -import moment from "moment"; +import { getPostSummary } from "../utils/formatter"; +import { getReputation } from "./reputation"; +import { getTimeFromNow } from "../utils/time"; const md = new Remarkable({ html: true, breaks: true, linkify: true }); export const replaceAuthorNames = input => { - return input.replace( - /* eslint-disable-next-line */ - /(^|[^a-zA-Z0-9_!#$%&*@ï¼ \/]|(^|[^a-zA-Z0-9_+~.-\/]))[@ï¼ ]([a-z][-\.a-z\d]+[a-z\d])/gi, - (match, preceeding1, preceeding2, user) => { - const userLower = user.toLowerCase(); - const preceedings = (preceeding1 || "") + (preceeding2 || ""); + return input.replace( + /* eslint-disable-next-line */ + /(^|[^a-zA-Z0-9_!#$%&*@ï¼ \/]|(^|[^a-zA-Z0-9_+~.-\/]))[@ï¼ ]([a-z][-\.a-z\d]+[a-z\d])/gi, + (match, preceeding1, preceeding2, user) => { + const userLower = user.toLowerCase(); + const preceedings = (preceeding1 || "") + (preceeding2 || ""); - return `${preceedings}@${user}`; - } - ); + return `${preceedings}@${user}`; + } + ); }; export const replaceTags = input => { - return input.replace(/(^|\s|>)(#[-a-z\d]+)/gi, tag => { - if (/#[\d]+$/.test(tag)) return tag; // do not allow only numbers (like #1) - const preceding = /^\s|>/.test(tag) ? tag[0] : ""; // space or closing tag (>) - tag = tag.replace(">", ""); // remove closing tag - const tag2 = tag.trim().substring(1); - const tagLower = tag2.toLowerCase(); - return ( - preceding + - `${tag.trim()}` - ); - }); + return input.replace(/(^|\s|>)(#[-a-z\d]+)/gi, tag => { + if (/#[\d]+$/.test(tag)) return tag; // do not allow only numbers (like #1) + const preceding = /^\s|>/.test(tag) ? tag[0] : ""; // space or closing tag (>) + tag = tag.replace(">", ""); // remove closing tag + const tag2 = tag.trim().substring(1); + const tagLower = tag2.toLowerCase(); + return ( + preceding + + `${tag.trim()}` + ); + }); }; export const markDown2Html = input => { - if (!input) { - return ""; - } + if (!input) { + return ""; + } - // Start replacing user names - let output = replaceAuthorNames(input); + // Start replacing user names + let output = replaceAuthorNames(input); - // Replace tags - output = replaceTags(output); + // Replace tags + output = replaceTags(output); - output = md.render(output); + output = md.render(output); - /* eslint-disable */ - const imgRegex = /(https?:\/\/.*\.(?:tiff?|jpe?g|gif|png|svg|ico))/gim; - const postRegex = /^https?:\/\/(.*)\/(.*)\/(@[\w\.\d-]+)\/(.*)/i; - const youTubeRegex = /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([^& \n<]+)(?:[^ \n<]+)?/g; - const vimeoRegex = /(https?:\/\/)?(www\.)?(?:vimeo)\.com.*(?:videos|video|channels|)\/([\d]+)/i; - const dTubeRegex = /(https?:\/\/d.tube.#!\/v\/)(\w+)\/(\w+)/g; - /* eslint-enable */ + // TODO: Implement Regex --> Look at utls/formatter.js - // TODO: Implement Regex - - return output; + return output; }; export const parsePosts = (posts, user) => { - posts.map(post => { - post.json_metadata = JSON.parse(post.json_metadata); - post.json_metadata.image - ? (post.image = post.json_metadata.image[0]) - : ""; - post.pending_payout_value = parseFloat( - post.pending_payout_value - ).toFixed(2); - post.created = moment - .utc(post.created) - .local() - .fromNow(); - post.vote_count = post.active_votes.length; - post.author_reputation = reputation(post.author_reputation); - post.avatar = `https://steemitimages.com/u/${post.author}/avatar/small`; - post.body = markDown2Html(post.body); - post.summary = postSummary(post.body, 100); - post.raw_body = post.body; - post.active_votes.sort((a, b) => { - return b.rshares - a.rshares; - }); - - let totalPayout = - parseFloat(post.pending_payout_value) + - parseFloat(post.total_payout_value) + - parseFloat(post.curator_payout_value); - - let voteRshares = post.active_votes.reduce( - (a, b) => a + parseFloat(b.rshares), - 0 - ); - let ratio = totalPayout / voteRshares; - post.isVoted = false; - - for (let i in post.active_votes) { - if (post.active_votes[i].voter == user) { - post.isVoted = true; - } - post.active_votes[i].value = ( - post.active_votes[i].rshares * ratio - ).toFixed(2); - post.active_votes[i].reputation = reputation( - post.active_votes[i].reputation - ); - post.active_votes[i].percent = post.active_votes[i].percent / 100; - post.active_votes[i].avatar = - "https://steemitimages.com/u/" + - post.active_votes[i].voter + - "/avatar/small"; - } - - if (post.active_votes.length > 2) { - post.top_likers = [ - post.active_votes[0].voter, - post.active_votes[1].voter, - post.active_votes[2].voter, - ]; - } - }); - return posts; -}; - -export const parsePost = post => { + posts.map(post => { post.json_metadata = JSON.parse(post.json_metadata); post.json_metadata.image ? (post.image = post.json_metadata.image[0]) : ""; post.pending_payout_value = parseFloat(post.pending_payout_value).toFixed( - 2 + 2 ); - post.created = moment - .utc(post.created) - .local() - .fromNow(); + post.created = getTimeFromNow(post.created); post.vote_count = post.active_votes.length; - post.author_reputation = reputation(post.author_reputation); + post.author_reputation = getReputation(post.author_reputation); post.avatar = `https://steemitimages.com/u/${post.author}/avatar/small`; post.body = markDown2Html(post.body); - post.summary = postSummary(post.body, 100); + post.summary = getPostSummary(post.body, 100); post.raw_body = post.body; post.active_votes.sort((a, b) => { - return b.rshares - a.rshares; + return b.rshares - a.rshares; }); + let totalPayout = - parseFloat(post.pending_payout_value) + - parseFloat(post.total_payout_value) + - parseFloat(post.curator_payout_value); + parseFloat(post.pending_payout_value) + + parseFloat(post.total_payout_value) + + parseFloat(post.curator_payout_value); let voteRshares = post.active_votes.reduce( - (a, b) => a + parseFloat(b.rshares), - 0 + (a, b) => a + parseFloat(b.rshares), + 0 ); let ratio = totalPayout / voteRshares; + post.isVoted = false; for (let i in post.active_votes) { - post.active_votes[i].value = ( - post.active_votes[i].rshares * ratio - ).toFixed(2); - post.active_votes[i].reputation = reputation( - post.active_votes[i].reputation - ); - post.active_votes[i].percent = post.active_votes[i].percent / 100; - post.active_votes[i].avatar = - "https://steemitimages.com/u/" + - post.active_votes[i].voter + - "/avatar/small"; + if (post.active_votes[i].voter == user) { + post.isVoted = true; + } + post.active_votes[i].value = ( + post.active_votes[i].rshares * ratio + ).toFixed(2); + post.active_votes[i].reputation = getReputation( + post.active_votes[i].reputation + ); + post.active_votes[i].percent = post.active_votes[i].percent / 100; + post.active_votes[i].avatar = + "https://steemitimages.com/u/" + + post.active_votes[i].voter + + "/avatar/small"; } if (post.active_votes.length > 2) { - post.top_likers = [ - post.active_votes[0].voter, - post.active_votes[1].voter, - post.active_votes[2].voter, - ]; + post.top_likers = [ + post.active_votes[0].voter, + post.active_votes[1].voter, + post.active_votes[2].voter, + ]; } - return post; + }); + return posts; +}; + +export const parsePost = post => { + post.json_metadata = JSON.parse(post.json_metadata); + post.json_metadata.image ? (post.image = post.json_metadata.image[0]) : ""; + post.pending_payout_value = parseFloat(post.pending_payout_value).toFixed(2); + post.created = getTimeFromNow(post.created); + post.vote_count = post.active_votes.length; + post.author_reputation = getReputation(post.author_reputation); + post.avatar = `https://steemitimages.com/u/${post.author}/avatar/small`; + post.body = markDown2Html(post.body); + post.summary = getPostSummary(post.body, 100); + post.raw_body = post.body; + post.active_votes.sort((a, b) => { + return b.rshares - a.rshares; + }); + let totalPayout = + parseFloat(post.pending_payout_value) + + parseFloat(post.total_payout_value) + + parseFloat(post.curator_payout_value); + + let voteRshares = post.active_votes.reduce( + (a, b) => a + parseFloat(b.rshares), + 0 + ); + let ratio = totalPayout / voteRshares; + + for (let i in post.active_votes) { + post.active_votes[i].value = (post.active_votes[i].rshares * ratio).toFixed( + 2 + ); + post.active_votes[i].reputation = getReputation( + post.active_votes[i].reputation + ); + post.active_votes[i].percent = post.active_votes[i].percent / 100; + post.active_votes[i].avatar = + "https://steemitimages.com/u/" + + post.active_votes[i].voter + + "/avatar/small"; + } + + if (post.active_votes.length > 2) { + post.top_likers = [ + post.active_votes[0].voter, + post.active_votes[1].voter, + post.active_votes[2].voter, + ]; + } + return post; }; export const protocolUrl2Obj = url => { - let urlPart = url.split("://")[1]; + let urlPart = url.split("://")[1]; - // remove last char if / - if (urlPart.endsWith("/")) { - urlPart = urlPart.substring(0, urlPart.length - 1); - } + // remove last char if / + if (urlPart.endsWith("/")) { + urlPart = urlPart.substring(0, urlPart.length - 1); + } - const parts = urlPart.split("/"); + const parts = urlPart.split("/"); - // filter - if (parts.length === 1) { - return { type: "filter" }; - } + // filter + if (parts.length === 1) { + return { type: "filter" }; + } - // filter with tag - if (parts.length === 2) { - return { type: "filter-tag", filter: parts[0], tag: parts[1] }; - } + // filter with tag + if (parts.length === 2) { + return { type: "filter-tag", filter: parts[0], tag: parts[1] }; + } - // account - if (parts.length === 1 && parts[0].startsWith("@")) { - return { type: "account", account: parts[0].replace("@", "") }; - } + // account + if (parts.length === 1 && parts[0].startsWith("@")) { + return { type: "account", account: parts[0].replace("@", "") }; + } - // post - if (parts.length === 3 && parts[1].startsWith("@")) { - return { - type: "post", - cat: parts[0], - author: parts[1].replace("@", ""), - permlink: parts[2], - }; - } + // post + if (parts.length === 3 && parts[1].startsWith("@")) { + return { + type: "post", + cat: parts[0], + author: parts[1].replace("@", ""), + permlink: parts[2], + }; + } }; export const parseComments = comments => { - comments.map(comment => { - comment.pending_payout_value = parseFloat( - comment.pending_payout_value - ).toFixed(2); - comment.created = moment - .utc(comment.created) - .local() - .fromNow(); - comment.vote_count = comment.active_votes.length; - comment.author_reputation = reputation(comment.author_reputation); - comment.avatar = `https://steemitimages.com/u/${ - comment.author - }/avatar/small`; - comment.body = markDown2Html(comment.body); - }); - return comments; + comments.map(comment => { + comment.pending_payout_value = parseFloat( + comment.pending_payout_value + ).toFixed(2); + comment.created = getTimeFromNow(comment.created); + comment.vote_count = comment.active_votes.length; + comment.author_reputation = getReputation(comment.author_reputation); + comment.avatar = `https://steemitimages.com/u/${ + comment.author + }/avatar/small`; + comment.body = markDown2Html(comment.body); + }); + return comments; }; diff --git a/src/utils/postSummary.js b/src/utils/postSummary.js deleted file mode 100644 index eae7044b6..000000000 --- a/src/utils/postSummary.js +++ /dev/null @@ -1,19 +0,0 @@ -export const postSummary = (postBody, length) => { - if (!postBody) { - return ""; - } - - postBody = postBody - .replace(/(<([^>]+)>)/gi, "") // Remove html tags - .replace(/\r?\n|\r/g, " ") // Remove new lines - .replace(/(?:https?|ftp):\/\/[\n\S]+/g, "") // Remove urls - .trim() - .replace(/ +(?= )/g, ""); // Remove all multiple spaces - - if (length) { - // Truncate - postBody = postBody.substring(0, length); - } - - return postBody; -}; diff --git a/src/utils/reputation.js b/src/utils/reputation.js index ed8ca4be4..d320902f2 100644 --- a/src/utils/reputation.js +++ b/src/utils/reputation.js @@ -1,18 +1,23 @@ -export const reputation = reputation => { - if (reputation == null) return reputation; - reputation = parseInt(reputation); - let rep = String(reputation); - const neg = rep.charAt(0) === "-"; - rep = neg ? rep.substring(1) : rep; - const str = rep; - const leadingDigits = parseInt(str.substring(0, 4)); - const log = Math.log(leadingDigits) / Math.log(10); - const n = str.length - 1; - let out = n + (log - parseInt(log)); - if (isNaN(out)) out = 0; - out = Math.max(out - 9, 0); - out = (neg ? -1 : 1) * out; - out = out * 9 + 25; - out = parseInt(out); - return out; +export const getReputation = reputation => { + if (reputation === null) return reputation; + + let _reputation = String(parseInt(reputation)); + + const neg = _reputation.charAt(0) === "-"; + _reputation = neg ? _reputation.substring(1) : _reputation; + + const str = _reputation; + const leadingDigits = parseInt(str.substring(0, 4)); + const log = Math.log(leadingDigits) / Math.log(10); + const n = str.length - 1; + let out = n + (log - parseInt(log)); + + if (isNaN(out)) out = 0; + + out = Math.max(out - 9, 0); + out = (neg ? -1 : 1) * out; + out = out * 9 + 25; + out = parseInt(out); + + return out; }; diff --git a/src/utils/time.js b/src/utils/time.js new file mode 100644 index 000000000..fab06c050 --- /dev/null +++ b/src/utils/time.js @@ -0,0 +1,10 @@ +import moment from "moment"; + +export const getTimeFromNow = value => { + if (!value) return null; + + return moment + .utc(value) + .local() + .fromNow(); +}; diff --git a/yarn.lock b/yarn.lock index e673503a7..360de0dcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,18 +14,12 @@ dependencies: "@babel/highlight" "7.0.0-beta.47" -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" dependencies: "@babel/highlight" "^7.0.0" -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz#5c2154415d6c09959a71845ef519d11157e95d10" - dependencies: - "@babel/highlight" "7.0.0-rc.1" - "@babel/core@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.47.tgz#b9c164fb9a1e1083f067c236a9da1d7a7d759271" @@ -255,14 +249,6 @@ esutils "^2.0.2" js-tokens "^3.0.0" -"@babel/highlight@7.0.0-rc.1": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.1.tgz#e0ca4731fa4786f7b9500421d6ff5e5a7753e81e" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -598,18 +584,9 @@ dependencies: any-observable "^0.3.0" -"@types/prop-types@*", "@types/prop-types@^15.5.2": - version "15.5.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" - dependencies: - "@types/react" "*" - -"@types/react@*": - version "16.4.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.14.tgz#47c604c8e46ed674bbdf4aabf82b34b9041c6a04" - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" +"@types/prop-types@^15.5.2": + version "15.5.6" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.6.tgz#9c03d3fed70a8d517c191b7734da2879b50ca26c" abab@^2.0.0: version "2.0.0" @@ -631,10 +608,11 @@ accepts@~1.3.3, accepts@~1.3.5: negotiator "0.6.1" acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" dependencies: - acorn "^5.0.0" + acorn "^6.0.1" + acorn-walk "^6.0.1" acorn-jsx@^4.1.1: version "4.1.1" @@ -642,14 +620,18 @@ acorn-jsx@^4.1.1: dependencies: acorn "^5.0.3" -acorn@^5.0.0, acorn@^5.5.3: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn-walk@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.0.tgz#c957f4a1460da46af4a0388ce28b4c99355b0cbc" -acorn@^5.0.3, acorn@^5.6.0: +acorn@^5.0.3, acorn@^5.5.3, acorn@^5.6.0: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" +acorn@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" + ajv-keywords@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" @@ -664,29 +646,17 @@ ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.0.1, ajv@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + version "6.5.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - ansi-colors@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + resolved "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" dependencies: ansi-wrap "^0.1.0" @@ -783,11 +753,11 @@ appcenter@1.8.1, appcenter@^1.7.1: dependencies: appcenter-link-scripts "1.8.1" -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" dependencies: - default-require-extensions "^2.0.0" + default-require-extensions "^1.0.0" aproba@^1.0.3: version "1.2.0" @@ -933,11 +903,7 @@ async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.4, async@^2.4.0: +async@^2.1.4, async@^2.4.0, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: @@ -1102,13 +1068,20 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@23.4.2, babel-jest@^23.4.2: +babel-jest@23.4.2: version "23.4.2" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877" dependencies: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.2.0" +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -1129,7 +1102,7 @@ babel-plugin-external-helpers@^6.22.0: babel-plugin-istanbul@^4.1.6: version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" dependencies: babel-plugin-syntax-object-rest-spread "^6.13.0" find-up "^2.1.0" @@ -1142,19 +1115,19 @@ babel-plugin-jest-hoist@^23.2.0: babel-plugin-syntax-class-properties@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.8.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + resolved "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + resolved "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" babel-plugin-syntax-trailing-function-commas@^6.8.0: version "6.22.0" @@ -1362,8 +1335,8 @@ babel-preset-es2015-node@^6.1.1: semver "5.x" babel-preset-fbjs@^2.1.2, babel-preset-fbjs@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.2.0.tgz#c25b879a914feefd964052b1bce4c90ee915023a" + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.3.0.tgz#92ff81307c18b926895114f9828ae1674c097f80" dependencies: babel-plugin-check-es2015-constants "^6.8.0" babel-plugin-syntax-class-properties "^6.8.0" @@ -1532,10 +1505,10 @@ base@^0.11.1: pascalcase "^0.1.1" basic-auth@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" dependencies: - safe-buffer "5.1.1" + safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -1544,8 +1517,8 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" big-integer@^1.6.7: - version "1.6.34" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.34.tgz#701affc8f0d73c490930a6b482dc23ed6ffc7484" + version "1.6.36" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" bindings@^1.2.1: version "1.3.0" @@ -1619,8 +1592,8 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" browser-resolve@^1.11.3: version "1.11.3" @@ -1655,7 +1628,7 @@ buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" -buffer-alloc@^1.1.0: +buffer-alloc@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" dependencies: @@ -1736,10 +1709,6 @@ callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1758,13 +1727,6 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chalk@1.1.1: version "1.1.1" resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz#509afb67066e7499f7eb3535c77445772ae2d019" @@ -1802,12 +1764,12 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" -ci-info@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.4.0.tgz#4841d53cad49f11b827b648ebde27a6e189b412f" +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1856,14 +1818,6 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -1895,26 +1849,20 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.8.2: +color-convert@^1.8.2, color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" dependencies: color-name "1.1.3" -color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" - dependencies: - color-name "1.1.1" - -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - -color-name@1.1.3, color-name@^1.0.0: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + color-string@^1.4.0: version "1.5.3" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" @@ -1933,9 +1881,15 @@ color@~1.0.3: color-convert "^1.8.2" color-string "^1.4.0" -combined-stream@1.0.6, combined-stream@~1.0.6: +combined-stream@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" dependencies: delayed-stream "~1.0.0" @@ -1947,18 +1901,18 @@ command-line-args@^4.0.6: find-replace "^1.0.3" typical "^2.6.1" -commander@^2.14.1: +commander@^2.14.1, commander@^2.9.0: version "2.18.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" -commander@^2.9.0: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + commander@~2.8.1: version "2.8.1" resolved "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -1969,19 +1923,15 @@ commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" -compare-versions@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.1.tgz#1ede3172b713c15f7c7beb98cb74d2d82576dad3" - component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" compressible@~2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + version "2.0.15" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" dependencies: - mime-db ">= 1.34.0 < 2" + mime-db ">= 1.36.0 < 2" compression@^1.7.1: version "1.7.3" @@ -2026,8 +1976,10 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" copy-descriptor@^0.1.0: version "0.1.1" @@ -2082,6 +2034,13 @@ create-react-class@^15.6.2, create-react-class@^15.6.3: loose-envify "^1.3.1" object-assign "^4.1.1" +cross-fetch@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-1.1.1.tgz#dede6865ae30f37eae62ac90ebb7bdac002b05a0" + dependencies: + node-fetch "1.7.3" + whatwg-fetch "2.0.3" + cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -2104,6 +2063,10 @@ crypto-js@^3.1.9-1: version "3.1.9-1" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8" +css-mediaquery@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" @@ -2114,10 +2077,6 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" -csstype@^2.2.0: - version "2.5.7" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2143,12 +2102,18 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6. ms "2.0.0" debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + version "3.2.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" dependencies: - ms "2.0.0" + ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1: +debug@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.0.1.tgz#f9bb36d439b8d1f0dd52d8fb6b46e4ebb8c1cd5b" + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2224,11 +2189,11 @@ deepmerge@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.0.tgz#511a54fff405fc346f0240bb270a3e9533a31102" -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" dependencies: - strip-bom "^3.0.0" + strip-bom "^2.0.0" define-properties@^1.1.2: version "1.1.3" @@ -2279,7 +2244,7 @@ denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" -depd@~1.1.1, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2364,9 +2329,9 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -dsteem@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/dsteem/-/dsteem-0.9.0.tgz#43daa6107035a399e7a2e56d716ed4fd5d8cbea8" +dsteem@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/dsteem/-/dsteem-0.10.1.tgz#1921d9f662f138c0b52f8fa77c7abc37ceab42f4" dependencies: bs58 "^4.0.1" bytebuffer "^5.0.1" @@ -2455,12 +2420,12 @@ es-abstract@^1.5.1, es-abstract@^1.7.0: is-regex "^1.0.4" es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" escape-html@~1.0.3: version "1.0.3" @@ -2573,14 +2538,14 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" eslint@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.5.0.tgz#8557fcceab5141a8197da9ffd9904f89f64425c6" + version "5.6.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.1.tgz#348134e32ccc09abb2df1bf282b3f6eed8c7b480" dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.5.3" chalk "^2.1.0" cross-spawn "^6.0.5" - debug "^3.1.0" + debug "^4.0.1" doctrine "^2.1.0" eslint-scope "^4.0.0" eslint-utils "^1.3.1" @@ -2664,7 +2629,7 @@ eventemitter3@^3.0.0: events@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" evp_bytestokey@^1.0.3: version "1.0.3" @@ -2735,14 +2700,14 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.5.0.tgz#18999a0eef8f8acf99023fde766d9c323c2562ed" +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" dependencies: ansi-styles "^3.2.0" - jest-diff "^23.5.0" + jest-diff "^23.6.0" jest-get-type "^22.1.0" - jest-matcher-utils "^23.5.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" @@ -2779,7 +2744,7 @@ external-editor@^1.0.1: external-editor@^2.0.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -3133,14 +3098,14 @@ get-own-enumerable-property-symbols@^2.0.1: get-stream@^2.2.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + resolved "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" dependencies: object-assign "^4.0.1" pinkie-promise "^2.0.0" get-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -3176,8 +3141,8 @@ glob@^5.0.15: path-is-absolute "^1.0.0" glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3194,8 +3159,8 @@ global@^4.3.0: process "~0.5.1" globals@^11.1.0, globals@^11.7.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" globals@^9.18.0: version "9.18.0" @@ -3225,14 +3190,14 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: - async "^1.4.0" + async "^2.5.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" @@ -3259,6 +3224,10 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3378,7 +3347,7 @@ http-basic@^2.5.1: http-errors@~1.6.2: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" dependencies: depd "~1.1.2" inherits "2.0.3" @@ -3405,13 +3374,7 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: @@ -3557,19 +3520,19 @@ is-buffer@^1.1.5: is-builtin-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: +is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" dependencies: - ci-info "^1.3.0" + ci-info "^1.5.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -3749,9 +3712,11 @@ is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" @@ -3795,66 +3760,65 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" istanbul-api@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" dependencies: async "^2.1.4" - compare-versions "^3.1.0" fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - -istanbul-lib-hook@^1.2.0: +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" - dependencies: - append-transform "^1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" -istanbul-lib-instrument@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" semver "^5.3.0" -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" dependencies: - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" dependencies: debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" dependencies: handlebars "^4.0.3" @@ -3865,8 +3829,8 @@ jest-changed-files@^23.4.2: throat "^4.0.0" jest-cli@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.5.0.tgz#d316b8e34a38a610a1efc4f0403d8ef8a55e4492" + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -3880,18 +3844,18 @@ jest-cli@^23.5.0: istanbul-lib-instrument "^1.10.1" istanbul-lib-source-maps "^1.2.4" jest-changed-files "^23.4.2" - jest-config "^23.5.0" + jest-config "^23.6.0" jest-environment-jsdom "^23.4.0" jest-get-type "^22.1.0" - jest-haste-map "^23.5.0" + jest-haste-map "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" - jest-resolve-dependencies "^23.5.0" - jest-runner "^23.5.0" - jest-runtime "^23.5.0" - jest-snapshot "^23.5.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.5.0" + jest-validate "^23.6.0" jest-watcher "^23.4.0" jest-worker "^23.2.0" micromatch "^2.3.11" @@ -3905,33 +3869,33 @@ jest-cli@^23.5.0: which "^1.2.12" yargs "^11.0.0" -jest-config@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.5.0.tgz#3770fba03f7507ee15f3b8867c742e48f31a9773" +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" dependencies: babel-core "^6.0.0" - babel-jest "^23.4.2" + babel-jest "^23.6.0" chalk "^2.0.1" glob "^7.1.1" jest-environment-jsdom "^23.4.0" jest-environment-node "^23.4.0" jest-get-type "^22.1.0" - jest-jasmine2 "^23.5.0" + jest-jasmine2 "^23.6.0" jest-regex-util "^23.3.0" - jest-resolve "^23.5.0" + jest-resolve "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.5.0" + jest-validate "^23.6.0" micromatch "^2.3.11" - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-diff@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.5.0.tgz#250651a433dd0050290a07642946cc9baaf06fba" +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^22.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-docblock@23.0.1: version "23.0.1" @@ -3945,12 +3909,12 @@ jest-docblock@^23.0.1, jest-docblock@^23.2.0: dependencies: detect-newline "^2.1.0" -jest-each@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.5.0.tgz#77f7e2afe6132a80954b920006e78239862b10ba" +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" dependencies: chalk "^2.0.1" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-environment-jsdom@^23.4.0: version "23.4.0" @@ -3983,9 +3947,9 @@ jest-haste-map@23.1.0: micromatch "^2.3.11" sane "^2.0.0" -jest-haste-map@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.5.0.tgz#d4ca618188bd38caa6cb20349ce6610e194a8065" +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" @@ -3996,36 +3960,36 @@ jest-haste-map@^23.5.0: micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.5.0.tgz#05fe7f1788e650eeb5a03929e6461ea2e9f3db53" +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" dependencies: babel-traverse "^6.0.0" chalk "^2.0.1" co "^4.6.0" - expect "^23.5.0" + expect "^23.6.0" is-generator-fn "^1.0.0" - jest-diff "^23.5.0" - jest-each "^23.5.0" - jest-matcher-utils "^23.5.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" - jest-snapshot "^23.5.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-leak-detector@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.5.0.tgz#14ac2a785bd625160a2ea968fd5d98b7dcea3e64" +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" dependencies: - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-matcher-utils@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.5.0.tgz#0e2ea67744cab78c9ab15011c4d888bdd3e49e2a" +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-message-util@^23.4.0: version "23.4.0" @@ -4049,42 +4013,42 @@ jest-regex-util@^23.3.0: version "23.3.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" -jest-resolve-dependencies@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.5.0.tgz#10c4d135beb9d2256de1fedc7094916c3ad74af7" +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" dependencies: jest-regex-util "^23.3.0" - jest-snapshot "^23.5.0" + jest-snapshot "^23.6.0" -jest-resolve@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.5.0.tgz#3b8e7f67e84598f0caf63d1530bd8534a189d0e6" +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" dependencies: browser-resolve "^1.11.3" chalk "^2.0.1" realpath-native "^1.0.0" -jest-runner@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.5.0.tgz#570f7a044da91648b5bb9b6baacdd511076c71d7" +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" dependencies: exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^23.5.0" + jest-config "^23.6.0" jest-docblock "^23.2.0" - jest-haste-map "^23.5.0" - jest-jasmine2 "^23.5.0" - jest-leak-detector "^23.5.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" jest-message-util "^23.4.0" - jest-runtime "^23.5.0" + jest-runtime "^23.6.0" jest-util "^23.4.0" jest-worker "^23.2.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.5.0.tgz#eb503525a196dc32f2f9974e3482d26bdf7b63ce" +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.1.6" @@ -4093,14 +4057,14 @@ jest-runtime@^23.5.0: exit "^0.1.2" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^23.5.0" - jest-haste-map "^23.5.0" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" - jest-resolve "^23.5.0" - jest-snapshot "^23.5.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.5.0" + jest-validate "^23.6.0" micromatch "^2.3.11" realpath-native "^1.0.0" slash "^1.0.0" @@ -4112,19 +4076,19 @@ jest-serializer@23.0.1, jest-serializer@^23.0.1: version "23.0.1" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" -jest-snapshot@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.5.0.tgz#cc368ebd8513e1175e2a7277f37a801b7358ae79" +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" dependencies: babel-types "^6.0.0" chalk "^2.0.1" - jest-diff "^23.5.0" - jest-matcher-utils "^23.5.0" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" - jest-resolve "^23.5.0" + jest-resolve "^23.6.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" semver "^5.5.0" jest-util@^23.4.0: @@ -4140,14 +4104,14 @@ jest-util@^23.4.0: slash "^1.0.0" source-map "^0.6.0" -jest-validate@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.5.0.tgz#f5df8f761cf43155e1b2e21d6e9de8a2852d0231" +jest-validate@^23.5.0, jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-watcher@^23.4.0: version "23.4.0" @@ -4270,15 +4234,15 @@ json-stringify-safe@~5.0.1: json5@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + resolved "http://registry.npmjs.org/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" json5@^0.5.0, json5@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + resolved "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" optionalDependencies: graceful-fs "^4.1.6" @@ -4309,7 +4273,7 @@ jsx-ast-utils@^2.0.1: kind-of@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + resolved "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -4338,12 +4302,8 @@ klaw@^1.0.0: graceful-fs "^4.1.9" kleur@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.1.tgz#7cc64b0d188d0dcbc98bdcdfdda2cc10619ddce8" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" lcid@^1.0.0: version "1.0.0" @@ -4367,8 +4327,8 @@ levn@^0.3.0, levn@~0.3.0: type-check "~0.3.2" lint-staged@^7.2.0: - version "7.2.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.2.2.tgz#0983d55d497f19f36d11ff2c8242b2f56cc2dd05" + version "7.3.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.3.0.tgz#90ff33e5ca61ed3dbac35b6f6502dbefdc0db58d" dependencies: chalk "^2.3.1" commander "^2.14.1" @@ -4435,7 +4395,7 @@ listr@^0.14.1: load-json-file@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4445,7 +4405,7 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4487,11 +4447,11 @@ lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" -lodash@4.17.10, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: +lodash@4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" -lodash@4.x.x, lodash@^4.0.0, lodash@^4.10.1, lodash@^4.11.1, lodash@^4.2.0: +lodash@4.x.x, lodash@^4.0.0, lodash@^4.10.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -4518,10 +4478,6 @@ long@~3: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4562,11 +4518,12 @@ math-random@^1.0.1: resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" mem@^1.1.0: version "1.1.0" @@ -4777,7 +4734,7 @@ micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" -"mime-db@>= 1.34.0 < 2": +"mime-db@>= 1.36.0 < 2", mime-db@~1.36.0: version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" @@ -4785,10 +4742,6 @@ mime-db@~1.23.0: version "1.23.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" -mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" - mime-types@2.1.11: version "2.1.11" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" @@ -4796,10 +4749,10 @@ mime-types@2.1.11: mime-db "~1.23.0" mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" dependencies: - mime-db "~1.35.0" + mime-db "~1.36.0" mime@1.4.1: version "1.4.1" @@ -4835,15 +4788,15 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: minimist@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minimist@~0.0.1: version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" minipass@^2.2.1, minipass@^2.3.3: version "2.3.4" @@ -4867,7 +4820,7 @@ mixin-deep@^1.2.0: mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" @@ -4876,12 +4829,12 @@ moment@^2.22.2: resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" morgan@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" dependencies: basic-auth "~2.0.0" debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" on-finished "~2.3.0" on-headers "~1.0.1" @@ -4889,6 +4842,10 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" @@ -4901,13 +4858,9 @@ nan@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" -nan@^2.2.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" - -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" +nan@^2.2.1, nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" nanomatch@^1.2.9: version "1.2.13" @@ -4958,8 +4911,8 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" needle@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -4973,7 +4926,7 @@ nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" -node-fetch@^1.0.1, node-fetch@^1.3.3, node-fetch@^1.6.3: +node-fetch@1.7.3, node-fetch@^1.0.1, node-fetch@^1.3.3, node-fetch@^1.6.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" dependencies: @@ -5110,8 +5063,8 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" nwsapi@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.8.tgz#e3603579b7e162b3dbedae4fb24e46f771d8fa24" + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" oauth-sign@~0.9.0: version "0.9.0" @@ -5133,6 +5086,10 @@ object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" +object-resolve-path@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-resolve-path/-/object-resolve-path-1.1.1.tgz#a7f8f93e8a20af80e44217ba7db54316d9d12232" + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -5187,7 +5144,7 @@ onetime@^2.0.0: opn@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" + resolved "http://registry.npmjs.org/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" dependencies: object-assign "^4.0.1" @@ -5340,7 +5297,7 @@ path-type@^2.0.0: pegjs@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" + resolved "http://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" pend@~1.2.0: version "1.2.0" @@ -5439,19 +5396,19 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@^1.14.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9" + version "1.14.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" -pretty-format@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.5.0.tgz#0f9601ad9da70fe690a269cd3efca732c210687c" +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" pretty-format@^4.2.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d" + resolved "http://registry.npmjs.org/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d" print-message@^2.1.0: version "2.1.0" @@ -5547,27 +5504,23 @@ rc@^1.2.7: strip-json-comments "~2.0.1" react-clone-referenced-element@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.0.1.tgz#2bba8c69404c5e4a944398600bcc4c941f860682" + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz#9cdda7f2aeb54fea791f3ab8c6ab96c7a77d0158" react-deep-force-update@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.1.tgz#bcd31478027b64b3339f108921ab520b4313dc2c" + version "1.1.2" + resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" react-devtools-core@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.2.3.tgz#a37e199d94865e2cbb616b97be8f5820674e6abd" + version "3.4.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.4.0.tgz#6b61594dce01b129a9e0b44b5bc4952f8f59ceec" dependencies: shell-quote "^1.6.1" ws "^3.3.1" -react-is@^16.3.2: - version "16.5.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.5.1.tgz#c6e8734fd548a22e1cef4fd0833afbeb433b85ee" - -react-is@^16.4.1: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88" +react-is@^16.3.2, react-is@^16.4.1: + version "16.5.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.5.2.tgz#e2a7b7c3f5d48062eb769fcb123505eb928722e3" react-lifecycles-compat@2.0.0: version "2.0.0" @@ -5592,6 +5545,13 @@ react-native-easy-grid@0.2.0: dependencies: lodash "^4.11.1" +react-native-extended-stylesheet@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/react-native-extended-stylesheet/-/react-native-extended-stylesheet-0.10.0.tgz#bc77caf7494dcc67f681128dd8cb5e07dacef9dd" + dependencies: + css-mediaquery "^0.1.2" + object-resolve-path "^1.1.0" + react-native-fast-image@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/react-native-fast-image/-/react-native-fast-image-4.0.14.tgz#1e84c9a01b1471793e294ef4e7c3cc20e09562a0" @@ -5609,9 +5569,9 @@ react-native-html-renderer@^1.0.0: react-native-lightbox "git+https://github.com/oblador/react-native-lightbox.git" stream "0.0.2" -react-native-iphone-x-helper@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.1.0.tgz#3a881720900bd8d1c67de2c465ea9aa9296180a7" +react-native-iphone-x-helper@^1.0.1, react-native-iphone-x-helper@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.0.tgz#9f8a376eb00bc712115abff4420318a0063fa796" react-native-keyboard-aware-scroll-view@0.5.0: version "0.5.0" @@ -5620,6 +5580,13 @@ react-native-keyboard-aware-scroll-view@0.5.0: prop-types "^15.6.0" react-native-iphone-x-helper "^1.0.1" +react-native-keyboard-aware-scroll-view@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.7.2.tgz#3c758dea21bfe1d292ad907b89b74fcbd9d13a73" + dependencies: + prop-types "^15.6.2" + react-native-iphone-x-helper "^1.0.3" + "react-native-lightbox@git+https://github.com/oblador/react-native-lightbox.git": version "0.8.0" resolved "git+https://github.com/oblador/react-native-lightbox.git#4448979323623a56c62b5f8be1032322485cbd31" @@ -5640,6 +5607,12 @@ react-native-markdown-view@^1.0.0: react-native-tabular-grid-markdown-view "0.1.x" simple-markdown "0.3.x" +react-native-modal-dropdown@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/react-native-modal-dropdown/-/react-native-modal-dropdown-0.6.2.tgz#da6027b3546d2031fbce46242bffc95561e13599" + dependencies: + prop-types "^15.6.0" + react-native-modal-popover@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/react-native-modal-popover/-/react-native-modal-popover-0.0.10.tgz#89271eb45f6c3f83702669378c6af97f0c258711" @@ -5656,8 +5629,8 @@ react-native-modal@^6.5.0: react-native-animatable "^1.2.4" react-native-navigation@^2.0.2519: - version "2.0.2544" - resolved "https://registry.yarnpkg.com/react-native-navigation/-/react-native-navigation-2.0.2544.tgz#74987014205db784df79a58ace80b2b8bb714b62" + version "2.0.2571" + resolved "https://registry.yarnpkg.com/react-native-navigation/-/react-native-navigation-2.0.2571.tgz#d85c566d2c149f08de27595ef9d611a69a163f49" dependencies: hoist-non-react-statics "3.x.x" lodash "4.x.x" @@ -5680,15 +5653,9 @@ react-native-tabular-grid-markdown-view@0.1.x: dependencies: prop-types "^15.5.10" -react-native-theming@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/react-native-theming/-/react-native-theming-1.0.16.tgz#7cf3500c7e951957cf03defc5bea3dfce6a047e9" - dependencies: - prop-types "^15.6.0" - react-native-vector-icons@4.6.0, react-native-vector-icons@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-4.6.0.tgz#e4014311ffa6de397d914ffc31b7097a874cc8d5" + resolved "http://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-4.6.0.tgz#e4014311ffa6de397d914ffc31b7097a874cc8d5" dependencies: lodash "^4.0.0" prop-types "^15.5.10" @@ -5759,7 +5726,7 @@ react-proxy@^1.1.7: react-redux@^5.0.7: version "5.0.7" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" + resolved "http://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" dependencies: hoist-non-react-statics "^2.5.0" invariant "^2.0.0" @@ -5836,7 +5803,7 @@ read-pkg@^2.0.0: readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5847,8 +5814,8 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable util-deprecate "~1.0.1" realm@^2.15.3: - version "2.15.3" - resolved "https://registry.yarnpkg.com/realm/-/realm-2.15.3.tgz#1ac9916b240fae310de2c039c3ecc2d2f1509e3b" + version "2.17.0" + resolved "https://registry.yarnpkg.com/realm/-/realm-2.17.0.tgz#91366b8cc05d1f8012da6f18b5a2dacc1d990f59" dependencies: command-line-args "^4.0.6" decompress "^4.2.0" @@ -5866,8 +5833,8 @@ realm@^2.15.3: url-parse "^1.2.0" realpath-native@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" + version "1.0.2" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" dependencies: util.promisify "^1.0.0" @@ -6104,12 +6071,6 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -6118,7 +6079,7 @@ rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: rimraf@~2.2.6: version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -6158,15 +6119,11 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" rxjs@^6.1.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" dependencies: tslib "^1.9.0" -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -6202,7 +6159,13 @@ sax@^1.2.4: sax@~1.1.1: version "1.1.6" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" + resolved "http://registry.npmjs.org/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" + +sc2-sdk@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/sc2-sdk/-/sc2-sdk-1.1.0.tgz#d44ef79bcc096606cb42154438b4f56327133a0a" + dependencies: + cross-fetch "^1.1.1" secp256k1@^3.3.1: version "3.5.2" @@ -6420,17 +6383,11 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -6442,15 +6399,15 @@ spawn-sync@^1.0.15: os-shim "^0.1.2" spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.1.tgz#434434ff9d1726b4d9f4219d1004813d80639e30" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" spdx-expression-parse@^3.0.0: version "3.0.0" @@ -6460,8 +6417,8 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -6579,7 +6536,7 @@ stringify-object@^3.2.2: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" @@ -6661,15 +6618,15 @@ table@^4.0.3: string-width "^2.1.1" tar-stream@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" dependencies: bl "^1.0.0" - buffer-alloc "^1.1.0" + buffer-alloc "^1.2.0" end-of-stream "^1.0.0" fs-constants "^1.0.0" readable-stream "^2.3.0" - to-buffer "^1.1.0" + to-buffer "^1.1.1" xtend "^4.0.0" tar@^4: @@ -6692,11 +6649,11 @@ temp@0.8.3: rimraf "~2.2.6" test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" dependencies: arrify "^1.0.1" - micromatch "^3.1.8" + micromatch "^2.3.11" object-assign "^4.1.0" read-pkg-up "^1.0.1" require-main-filename "^1.0.1" @@ -6736,7 +6693,7 @@ through2@^2.0.0: through@^2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" time-stamp@^1.0.0: version "1.1.0" @@ -6758,7 +6715,7 @@ tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" -to-buffer@^1.1.0: +to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" @@ -6852,18 +6809,12 @@ uglify-es@^3.1.9: commander "~2.13.0" source-map "~0.6.1" -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + commander "~2.17.1" + source-map "~0.6.1" ultron@1.0.x: version "1.0.2" @@ -6874,8 +6825,8 @@ ultron@~1.1.0: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" unbzip2-stream@^1.0.9: - version "1.2.5" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" + version "1.3.0" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.0.tgz#745ad5745bc4d8f1ac2eb6fc707cfa51d52ab215" dependencies: buffer "^3.0.1" through "^2.3.6" @@ -6969,7 +6920,7 @@ utils-merge@1.0.1: uuid@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + resolved "http://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" uuid@^3.3.2: version "3.3.2" @@ -7018,18 +6969,26 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" dependencies: - iconv-lite "0.4.23" + iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.3: +whatwg-fetch@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + +whatwg-fetch@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + version "2.2.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" whatwg-url@^6.4.1: version "6.5.0" @@ -7063,14 +7022,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -7081,7 +7032,7 @@ wordwrap@~0.0.2: wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -7205,7 +7156,7 @@ yargs-parser@^9.0.2: yargs@^11.0.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -7256,15 +7207,6 @@ yargs@^9.0.0: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"