mirror of
https://github.com/ecency/ecency-mobile.git
synced 2024-11-26 09:13:33 +03:00
Merge branch 'development' of github.com:esteemapp/esteem-mobile into bugfix/post-display
This commit is contained in:
commit
879ed728af
@ -24,7 +24,6 @@
|
|||||||
4D1363A2D0804E3EA7132027 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 420ABF9795564845A0963C27 /* Feather.ttf */; };
|
4D1363A2D0804E3EA7132027 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 420ABF9795564845A0963C27 /* Feather.ttf */; };
|
||||||
54D038BB7E4B4CA0805EF769 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 93B182C6FFA44610AB188D7C /* Entypo.ttf */; };
|
54D038BB7E4B4CA0805EF769 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 93B182C6FFA44610AB188D7C /* Entypo.ttf */; };
|
||||||
58190B3C23294814000EA0E1 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58190B3B23294814000EA0E1 /* StoreKit.framework */; };
|
58190B3C23294814000EA0E1 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58190B3B23294814000EA0E1 /* StoreKit.framework */; };
|
||||||
58190B582329808D000EA0E1 /* libRealmReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58190B572329807B000EA0E1 /* libRealmReact.a */; };
|
|
||||||
588019272355C26C008397D1 /* AppCenter-Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 588019232355C26B008397D1 /* AppCenter-Config.plist */; };
|
588019272355C26C008397D1 /* AppCenter-Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 588019232355C26B008397D1 /* AppCenter-Config.plist */; };
|
||||||
588A5055232A3A4C00FC1361 /* Sansation_Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A504E232A3A4B00FC1361 /* Sansation_Bold.ttf */; };
|
588A5055232A3A4C00FC1361 /* Sansation_Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A504E232A3A4B00FC1361 /* Sansation_Bold.ttf */; };
|
||||||
588A5056232A3A4C00FC1361 /* RobotoMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5050232A3A4B00FC1361 /* RobotoMono-Regular.ttf */; };
|
588A5056232A3A4C00FC1361 /* RobotoMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5050232A3A4B00FC1361 /* RobotoMono-Regular.ttf */; };
|
||||||
@ -32,7 +31,6 @@
|
|||||||
588A5058232A3A4C00FC1361 /* Sansation_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5052232A3A4C00FC1361 /* Sansation_Regular.ttf */; };
|
588A5058232A3A4C00FC1361 /* Sansation_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5052232A3A4C00FC1361 /* Sansation_Regular.ttf */; };
|
||||||
588A5059232A3A4C00FC1361 /* Roboto.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5053232A3A4C00FC1361 /* Roboto.ttf */; };
|
588A5059232A3A4C00FC1361 /* Roboto.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5053232A3A4C00FC1361 /* Roboto.ttf */; };
|
||||||
588A505A232A3A4C00FC1361 /* Roboto-medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5054232A3A4C00FC1361 /* Roboto-medium.ttf */; };
|
588A505A232A3A4C00FC1361 /* Roboto-medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 588A5054232A3A4C00FC1361 /* Roboto-medium.ttf */; };
|
||||||
58F630102350580B0017C953 /* libRealmJS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58F6300F2350580B0017C953 /* libRealmJS.a */; };
|
|
||||||
60B4658C6F794BF28A644ADC /* FontAwesome5_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4EB466C53BAE4EDC904357B3 /* FontAwesome5_Solid.ttf */; };
|
60B4658C6F794BF28A644ADC /* FontAwesome5_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4EB466C53BAE4EDC904357B3 /* FontAwesome5_Solid.ttf */; };
|
||||||
834D70F2C64AF4A71AFB8536 /* libPods-eSteemTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FEBCC53EBF278472CC890AA8 /* libPods-eSteemTests.a */; };
|
834D70F2C64AF4A71AFB8536 /* libPods-eSteemTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FEBCC53EBF278472CC890AA8 /* libPods-eSteemTests.a */; };
|
||||||
8739625C16E2FD1D46235BB0 /* libPods-eSteem-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 926635867AC7C716988E74B7 /* libPods-eSteem-tvOS.a */; };
|
8739625C16E2FD1D46235BB0 /* libPods-eSteem-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 926635867AC7C716988E74B7 /* libPods-eSteem-tvOS.a */; };
|
||||||
@ -65,13 +63,6 @@
|
|||||||
remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
|
remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
|
||||||
remoteInfo = "eSteem-tvOS";
|
remoteInfo = "eSteem-tvOS";
|
||||||
};
|
};
|
||||||
58190B562329807B000EA0E1 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = 58190B512329807B000EA0E1 /* RealmReact.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = F60690131CA2766F0003FB26;
|
|
||||||
remoteInfo = RealmReact;
|
|
||||||
};
|
|
||||||
588A5069232A497100FC1361 /* PBXContainerItemProxy */ = {
|
588A5069232A497100FC1361 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = 588A5064232A497100FC1361 /* ReactNativeConfig.xcodeproj */;
|
containerPortal = 588A5064232A497100FC1361 /* ReactNativeConfig.xcodeproj */;
|
||||||
@ -117,7 +108,6 @@
|
|||||||
58190B3B23294814000EA0E1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
|
58190B3B23294814000EA0E1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
|
||||||
58190B3D23294823000EA0E1 /* eSteem.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = eSteem.entitlements; path = eSteem/eSteem.entitlements; sourceTree = "<group>"; };
|
58190B3D23294823000EA0E1 /* eSteem.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = eSteem.entitlements; path = eSteem/eSteem.entitlements; sourceTree = "<group>"; };
|
||||||
58190B4723294D1D000EA0E1 /* libreact-native-config.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libreact-native-config.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
58190B4723294D1D000EA0E1 /* libreact-native-config.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libreact-native-config.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
58190B512329807B000EA0E1 /* RealmReact.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RealmReact.xcodeproj; path = "../node_modules/realm/react-native/ios/RealmReact.xcodeproj"; sourceTree = "<group>"; };
|
|
||||||
588019232355C26B008397D1 /* AppCenter-Config.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AppCenter-Config.plist"; sourceTree = "<group>"; };
|
588019232355C26B008397D1 /* AppCenter-Config.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AppCenter-Config.plist"; sourceTree = "<group>"; };
|
||||||
588A504E232A3A4B00FC1361 /* Sansation_Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = Sansation_Bold.ttf; path = ../src/assets/Fonts/Sansation_Bold.ttf; sourceTree = "<group>"; };
|
588A504E232A3A4B00FC1361 /* Sansation_Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = Sansation_Bold.ttf; path = ../src/assets/Fonts/Sansation_Bold.ttf; sourceTree = "<group>"; };
|
||||||
588A5050232A3A4B00FC1361 /* RobotoMono-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "RobotoMono-Regular.ttf"; path = "../src/assets/Fonts/RobotoMono-Regular.ttf"; sourceTree = "<group>"; };
|
588A5050232A3A4B00FC1361 /* RobotoMono-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "RobotoMono-Regular.ttf"; path = "../src/assets/Fonts/RobotoMono-Regular.ttf"; sourceTree = "<group>"; };
|
||||||
@ -164,8 +154,6 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
58F630102350580B0017C953 /* libRealmJS.a in Frameworks */,
|
|
||||||
58190B582329808D000EA0E1 /* libRealmReact.a in Frameworks */,
|
|
||||||
58190B3C23294814000EA0E1 /* StoreKit.framework in Frameworks */,
|
58190B3C23294814000EA0E1 /* StoreKit.framework in Frameworks */,
|
||||||
350AB4A00BAFD4D99C09E484 /* libPods-eSteem.a in Frameworks */,
|
350AB4A00BAFD4D99C09E484 /* libPods-eSteem.a in Frameworks */,
|
||||||
);
|
);
|
||||||
@ -269,14 +257,6 @@
|
|||||||
name = Resources;
|
name = Resources;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
58190B522329807B000EA0E1 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
58190B572329807B000EA0E1 /* libRealmReact.a */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
588A5065232A497100FC1361 /* Products */ = {
|
588A5065232A497100FC1361 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -298,7 +278,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
588A5064232A497100FC1361 /* ReactNativeConfig.xcodeproj */,
|
588A5064232A497100FC1361 /* ReactNativeConfig.xcodeproj */,
|
||||||
58190B512329807B000EA0E1 /* RealmReact.xcodeproj */,
|
|
||||||
);
|
);
|
||||||
name = Libraries;
|
name = Libraries;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -483,10 +462,6 @@
|
|||||||
ProductGroup = 588A5065232A497100FC1361 /* Products */;
|
ProductGroup = 588A5065232A497100FC1361 /* Products */;
|
||||||
ProjectRef = 588A5064232A497100FC1361 /* ReactNativeConfig.xcodeproj */;
|
ProjectRef = 588A5064232A497100FC1361 /* ReactNativeConfig.xcodeproj */;
|
||||||
},
|
},
|
||||||
{
|
|
||||||
ProductGroup = 58190B522329807B000EA0E1 /* Products */;
|
|
||||||
ProjectRef = 58190B512329807B000EA0E1 /* RealmReact.xcodeproj */;
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
@ -499,13 +474,6 @@
|
|||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXReferenceProxy section */
|
/* Begin PBXReferenceProxy section */
|
||||||
58190B572329807B000EA0E1 /* libRealmReact.a */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = archive.ar;
|
|
||||||
path = libRealmReact.a;
|
|
||||||
remoteRef = 58190B562329807B000EA0E1 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
588A506A232A497100FC1361 /* libReactNativeConfig.a */ = {
|
588A506A232A497100FC1361 /* libReactNativeConfig.a */ = {
|
||||||
isa = PBXReferenceProxy;
|
isa = PBXReferenceProxy;
|
||||||
fileType = archive.ar;
|
fileType = archive.ar;
|
||||||
|
@ -81,7 +81,6 @@
|
|||||||
"react-navigation-stack": "^1.9.3",
|
"react-navigation-stack": "^1.9.3",
|
||||||
"react-navigation-tabs": "^2.5.5",
|
"react-navigation-tabs": "^2.5.5",
|
||||||
"react-redux": "^7.1.1",
|
"react-redux": "^7.1.1",
|
||||||
"realm": "^3.2.0",
|
|
||||||
"redux": "^4.0.4",
|
"redux": "^4.0.4",
|
||||||
"redux-persist": "^6.0.0",
|
"redux-persist": "^6.0.0",
|
||||||
"redux-promise": "^0.6.0",
|
"redux-promise": "^0.6.0",
|
||||||
|
@ -26,13 +26,15 @@ class BasicHeaderContainer extends Component {
|
|||||||
|
|
||||||
if (isNewPost) {
|
if (isNewPost) {
|
||||||
navigation.navigate({
|
navigation.navigate({
|
||||||
routeName: ROUTES.SCREENS.HOME,
|
routeName: ROUTES.SCREENS.FEED,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handleOnBackPress) handleOnBackPress();
|
if (handleOnBackPress) {
|
||||||
|
handleOnBackPress();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
@ -21,7 +21,7 @@ import styles from './bottomTabBarStyles';
|
|||||||
const _jumpTo = (route, index, routes, jumpTo) => {
|
const _jumpTo = (route, index, routes, jumpTo) => {
|
||||||
const _routeName = routes[index].routeName;
|
const _routeName = routes[index].routeName;
|
||||||
|
|
||||||
if (!!get(route, 'params.scrollToTop') && _routeName === ROUTES.TABBAR.HOME) {
|
if (!!get(route, 'params.scrollToTop') && _routeName === ROUTES.TABBAR.FEED) {
|
||||||
route.params.scrollToTop();
|
route.params.scrollToTop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,14 @@ export default EStyleSheet.create({
|
|||||||
},
|
},
|
||||||
zIndex: 99,
|
zIndex: 99,
|
||||||
},
|
},
|
||||||
|
dropdownWrapper: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
filterBarWrapper: {
|
filterBarWrapper: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
justifyContent: 'space-between',
|
justifyContent: 'space-between',
|
||||||
},
|
},
|
||||||
rightIconWrapper: {
|
rightIconWrapper: {
|
||||||
@ -24,4 +30,8 @@ export default EStyleSheet.create({
|
|||||||
color: '$darkIconColor',
|
color: '$darkIconColor',
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
|
customOptionWrapper: {
|
||||||
|
left: 120,
|
||||||
|
position: 'absolute',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { View, TouchableOpacity } from 'react-native';
|
import { View, Text, TouchableOpacity } from 'react-native';
|
||||||
import { Icon } from '../../icon';
|
import { Icon } from '../../icon';
|
||||||
|
|
||||||
// External Components
|
// External Components
|
||||||
import { DropdownButton } from '../../dropdownButton';
|
import { DropdownButton } from '../../dropdownButton';
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import { LineBreak } from '../../basicUIElements';
|
import { LineBreak, Tag } from '../../basicUIElements';
|
||||||
|
|
||||||
// Styles
|
// Styles
|
||||||
import styles from './filterBarStyles';
|
import styles from './filterBarStyles';
|
||||||
@ -27,18 +27,27 @@ const FilterBarView = ({
|
|||||||
rightIconName,
|
rightIconName,
|
||||||
rightIconType,
|
rightIconType,
|
||||||
selectedOptionIndex,
|
selectedOptionIndex,
|
||||||
|
customOption,
|
||||||
}) => (
|
}) => (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
{!isHide && (
|
{!isHide && (
|
||||||
<LineBreak height={38}>
|
<LineBreak height={38}>
|
||||||
<View style={styles.filterBarWrapper}>
|
<View style={styles.filterBarWrapper}>
|
||||||
<DropdownButton
|
<View style={styles.dropdownWrapper}>
|
||||||
iconName={dropdownIconName}
|
<DropdownButton
|
||||||
options={options}
|
iconName={dropdownIconName}
|
||||||
defaultText={defaultText}
|
options={options}
|
||||||
onSelect={onDropdownSelect}
|
defaultText={defaultText}
|
||||||
selectedOptionIndex={selectedOptionIndex}
|
onSelect={onDropdownSelect}
|
||||||
/>
|
selectedOptionIndex={selectedOptionIndex}
|
||||||
|
/>
|
||||||
|
<View style={styles.customOptionWrapper}>
|
||||||
|
{customOption && (
|
||||||
|
<Tag value={customOption} isPin onPress={() => onDropdownSelect(3)} />
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
{rightIconName && (
|
{rightIconName && (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
onPress={() => onRightIconPress && onRightIconPress()}
|
onPress={() => onRightIconPress && onRightIconPress()}
|
||||||
|
@ -6,9 +6,9 @@ export default EStyleSheet.create({
|
|||||||
borderTopRightRadius: 8,
|
borderTopRightRadius: 8,
|
||||||
marginTop: 16,
|
marginTop: 16,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
backgroundColor: '$primaryLightBackground',
|
|
||||||
height: 60,
|
height: 60,
|
||||||
borderBottomWidth: 2,
|
borderBottomWidth: 2,
|
||||||
|
backgroundColor: '$primaryWhiteLightBackground',
|
||||||
},
|
},
|
||||||
firstImage: {
|
firstImage: {
|
||||||
width: 24,
|
width: 24,
|
||||||
|
@ -1,80 +1,53 @@
|
|||||||
import React, { PureComponent } from 'react';
|
import React from 'react';
|
||||||
import { withNavigation } from 'react-navigation';
|
import { withNavigation } from 'react-navigation';
|
||||||
import { connect } from 'react-redux';
|
import get from 'lodash/get';
|
||||||
import { get, has } from 'lodash';
|
import has from 'lodash/has';
|
||||||
|
|
||||||
// Component
|
// Component
|
||||||
import HeaderView from '../view/headerView';
|
import HeaderView from '../view/headerView';
|
||||||
|
|
||||||
/*
|
import { AccountContainer, ThemeContainer } from '../../../containers';
|
||||||
* Props Name Description Value
|
|
||||||
*@props --> props name here description here Value Type Here
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
class HeaderContainer extends PureComponent {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Component Life Cycle Functions
|
|
||||||
|
|
||||||
// Component Functions
|
|
||||||
|
|
||||||
_handleOpenDrawer = () => {
|
|
||||||
const { navigation } = this.props;
|
|
||||||
|
|
||||||
|
const HeaderContainer = ({ selectedUser, isReverse, navigation, handleOnBackPress }) => {
|
||||||
|
const _handleOpenDrawer = () => {
|
||||||
if (has(navigation, 'openDrawer') && typeof get(navigation, 'openDrawer') === 'function') {
|
if (has(navigation, 'openDrawer') && typeof get(navigation, 'openDrawer') === 'function') {
|
||||||
navigation.openDrawer();
|
navigation.openDrawer();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleOnPressBackButton = () => {
|
const _handleOnPressBackButton = () => {
|
||||||
const { navigation, handleOnBackPress } = this.props;
|
if (handleOnBackPress) {
|
||||||
|
handleOnBackPress();
|
||||||
if (handleOnBackPress) handleOnBackPress();
|
}
|
||||||
|
|
||||||
navigation.goBack();
|
navigation.goBack();
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
return (
|
||||||
const {
|
<ThemeContainer>
|
||||||
isLoggedIn,
|
{({ isDarkTheme }) => (
|
||||||
currentAccount,
|
<AccountContainer>
|
||||||
selectedUser,
|
{({ currentAccount, isLoggedIn, isLoginDone }) => {
|
||||||
isReverse,
|
const _user = isReverse && selectedUser ? selectedUser : currentAccount;
|
||||||
isLoginDone,
|
|
||||||
isDarkTheme,
|
|
||||||
} = this.props;
|
|
||||||
const _user = isReverse && selectedUser ? selectedUser : currentAccount;
|
|
||||||
|
|
||||||
const displayName = get(_user, 'display_name');
|
return (
|
||||||
const username = get(_user, 'name');
|
<HeaderView
|
||||||
const reputation = get(_user, 'reputation');
|
displayName={get(_user, 'display_name')}
|
||||||
|
handleOnPressBackButton={_handleOnPressBackButton}
|
||||||
|
handleOpenDrawer={_handleOpenDrawer}
|
||||||
|
isDarkTheme={isDarkTheme}
|
||||||
|
isLoggedIn={isLoggedIn}
|
||||||
|
isLoginDone={isLoginDone}
|
||||||
|
isReverse={isReverse}
|
||||||
|
reputation={get(_user, 'reputation')}
|
||||||
|
username={get(_user, 'name')}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</AccountContainer>
|
||||||
|
)}
|
||||||
|
</ThemeContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
export default withNavigation(HeaderContainer);
|
||||||
<HeaderView
|
|
||||||
handleOnPressBackButton={this._handleOnPressBackButton}
|
|
||||||
handleOpenDrawer={this._handleOpenDrawer}
|
|
||||||
isLoggedIn={isLoggedIn}
|
|
||||||
isReverse={isReverse}
|
|
||||||
isLoginDone={isLoginDone}
|
|
||||||
displayName={displayName}
|
|
||||||
username={username}
|
|
||||||
reputation={reputation}
|
|
||||||
isDarkTheme={isDarkTheme}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
|
||||||
isLoggedIn: state.application.isLoggedIn,
|
|
||||||
isLoginDone: state.application.isLoginDone,
|
|
||||||
isDarkTheme: state.application.isDarkTheme,
|
|
||||||
|
|
||||||
currentAccount: state.account.currentAccount,
|
|
||||||
});
|
|
||||||
|
|
||||||
export default connect(mapStateToProps)(withNavigation(HeaderContainer));
|
|
||||||
|
@ -7,7 +7,7 @@ export default EStyleSheet.create({
|
|||||||
width: '$deviceWidth',
|
width: '$deviceWidth',
|
||||||
backgroundColor: '$primaryBackgroundColor',
|
backgroundColor: '$primaryBackgroundColor',
|
||||||
flex: 1,
|
flex: 1,
|
||||||
maxHeight: Platform.OS === 'ios' ? 95 : 80,
|
maxHeight: Platform.OS === 'ios' ? 105 : 80,
|
||||||
},
|
},
|
||||||
containerReverse: {
|
containerReverse: {
|
||||||
justifyContent: 'space-between',
|
justifyContent: 'space-between',
|
||||||
@ -33,8 +33,7 @@ export default EStyleSheet.create({
|
|||||||
titleWrapper: {
|
titleWrapper: {
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
marginLeft: 8,
|
marginHorizontal: 8,
|
||||||
marginRight: 8,
|
|
||||||
},
|
},
|
||||||
title: {
|
title: {
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
|
@ -1,131 +1,107 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { View, Text, SafeAreaView, TouchableOpacity } from 'react-native';
|
import { View, Text, SafeAreaView, TouchableOpacity } from 'react-native';
|
||||||
import LinearGradient from 'react-native-linear-gradient';
|
import LinearGradient from 'react-native-linear-gradient';
|
||||||
import { injectIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import { SearchModal } from '../../searchModal';
|
import { SearchModal } from '../../searchModal';
|
||||||
import { IconButton } from '../../iconButton';
|
import { IconButton } from '../../iconButton';
|
||||||
import { UserAvatar } from '../../userAvatar';
|
import { UserAvatar } from '../../userAvatar';
|
||||||
|
|
||||||
// Styles
|
// Styles
|
||||||
import styles from './headerStyles';
|
import styles from './headerStyles';
|
||||||
|
|
||||||
class HeaderView extends Component {
|
const HeaderView = ({
|
||||||
/* Props
|
displayName,
|
||||||
* ------------------------------------------------
|
handleOnPressBackButton,
|
||||||
* @prop { boolean } hideStatusBar - Can declare status bar is hide or not.
|
handleOpenDrawer,
|
||||||
*
|
isDarkTheme,
|
||||||
*/
|
isLoggedIn,
|
||||||
|
isLoginDone,
|
||||||
|
isReverse,
|
||||||
|
reputation,
|
||||||
|
username,
|
||||||
|
}) => {
|
||||||
|
const [isSearchModalOpen, setIsSearchModalOpen] = useState(false);
|
||||||
|
const intl = useIntl();
|
||||||
|
let gradientColor;
|
||||||
|
|
||||||
constructor(props) {
|
if (isReverse) {
|
||||||
super(props);
|
gradientColor = isDarkTheme ? ['#43638e', '#081c36'] : ['#357ce6', '#2d5aa0'];
|
||||||
this.state = {
|
} else {
|
||||||
isSearchModalOpen: false,
|
gradientColor = isDarkTheme ? ['#081c36', '#43638e'] : ['#2d5aa0', '#357ce6'];
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Component Life Cycles
|
return (
|
||||||
|
<SafeAreaView style={[styles.container, isReverse && styles.containerReverse]}>
|
||||||
// Component Functions
|
<SearchModal
|
||||||
|
placeholder={intl.formatMessage({
|
||||||
_handleOnCloseSearch = () => {
|
id: 'header.search',
|
||||||
this.setState({ isSearchModalOpen: false });
|
})}
|
||||||
};
|
isOpen={isSearchModalOpen}
|
||||||
|
handleOnClose={() => setIsSearchModalOpen(false)}
|
||||||
render() {
|
/>
|
||||||
const {
|
<TouchableOpacity
|
||||||
displayName,
|
style={styles.avatarWrapper}
|
||||||
handleOnPressBackButton,
|
onPress={handleOpenDrawer}
|
||||||
handleOpenDrawer,
|
disabled={isReverse}
|
||||||
intl,
|
>
|
||||||
isDarkTheme,
|
<LinearGradient
|
||||||
isLoggedIn,
|
start={{ x: 0, y: 0 }}
|
||||||
isLoginDone,
|
end={{ x: 1, y: 0 }}
|
||||||
isReverse,
|
colors={gradientColor}
|
||||||
reputation,
|
style={[
|
||||||
username,
|
styles.avatarButtonWrapper,
|
||||||
} = this.props;
|
isReverse ? styles.avatarButtonWrapperReverse : styles.avatarDefault,
|
||||||
const { isSearchModalOpen } = this.state;
|
]}
|
||||||
let gredientColor;
|
|
||||||
|
|
||||||
if (isReverse) {
|
|
||||||
gredientColor = isDarkTheme ? ['#43638e', '#081c36'] : ['#357ce6', '#2d5aa0'];
|
|
||||||
} else {
|
|
||||||
gredientColor = isDarkTheme ? ['#081c36', '#43638e'] : ['#2d5aa0', '#357ce6'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<SafeAreaView style={[styles.container, isReverse && styles.containerReverse]}>
|
|
||||||
<SearchModal
|
|
||||||
placeholder={intl.formatMessage({
|
|
||||||
id: 'header.search',
|
|
||||||
})}
|
|
||||||
isOpen={isSearchModalOpen}
|
|
||||||
handleOnClose={this._handleOnCloseSearch}
|
|
||||||
/>
|
|
||||||
<TouchableOpacity
|
|
||||||
style={styles.avatarWrapper}
|
|
||||||
onPress={() => handleOpenDrawer()}
|
|
||||||
disabled={isReverse}
|
|
||||||
>
|
>
|
||||||
<LinearGradient
|
<UserAvatar
|
||||||
start={{ x: 0, y: 0 }}
|
noAction
|
||||||
end={{ x: 1, y: 0 }}
|
style={isReverse ? styles.reverseAvatar : styles.avatar}
|
||||||
colors={gredientColor}
|
username={username}
|
||||||
style={[
|
/>
|
||||||
styles.avatarButtonWrapper,
|
</LinearGradient>
|
||||||
isReverse ? styles.avatarButtonWrapperReverse : styles.avatarDefault,
|
</TouchableOpacity>
|
||||||
]}
|
{displayName || username ? (
|
||||||
>
|
<View style={styles.titleWrapper}>
|
||||||
<UserAvatar
|
{displayName && <Text style={styles.title}>{displayName}</Text>}
|
||||||
noAction
|
<Text style={styles.subTitle}>
|
||||||
style={isReverse ? styles.reverseAvatar : styles.avatar}
|
{`@${username}`}
|
||||||
username={username}
|
{reputation && ` (${reputation})`}
|
||||||
/>
|
</Text>
|
||||||
</LinearGradient>
|
</View>
|
||||||
</TouchableOpacity>
|
) : (
|
||||||
{displayName || username ? (
|
<View style={styles.titleWrapper}>
|
||||||
<View style={styles.titleWrapper}>
|
{isLoginDone && !isLoggedIn && (
|
||||||
{displayName && <Text style={styles.title}>{displayName}</Text>}
|
<Text style={styles.noAuthTitle}>
|
||||||
<Text style={styles.subTitle}>
|
{intl.formatMessage({
|
||||||
{`@${username}`}
|
id: 'header.title',
|
||||||
{reputation && ` (${reputation})`}
|
})}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
)}
|
||||||
) : (
|
</View>
|
||||||
<View style={styles.titleWrapper}>
|
)}
|
||||||
{isLoginDone && !isLoggedIn && (
|
|
||||||
<Text style={styles.noAuthTitle}>
|
|
||||||
{intl.formatMessage({
|
|
||||||
id: 'header.title',
|
|
||||||
})}
|
|
||||||
</Text>
|
|
||||||
)}
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
{isReverse && (
|
|
||||||
<View style={styles.reverseBackButtonWrapper}>
|
|
||||||
<IconButton
|
|
||||||
style={styles.backButton}
|
|
||||||
iconStyle={styles.backIcon}
|
|
||||||
name="md-arrow-back"
|
|
||||||
onPress={() => handleOnPressBackButton()}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{!isReverse && (
|
{isReverse ? (
|
||||||
<View style={styles.backButtonWrapper}>
|
<View style={styles.reverseBackButtonWrapper}>
|
||||||
<IconButton
|
<IconButton
|
||||||
iconStyle={styles.backIcon}
|
style={styles.backButton}
|
||||||
name="md-search"
|
iconStyle={styles.backIcon}
|
||||||
onPress={() => this.setState({ isSearchModalOpen: true })}
|
name="md-arrow-back"
|
||||||
/>
|
onPress={handleOnPressBackButton}
|
||||||
</View>
|
/>
|
||||||
)}
|
</View>
|
||||||
</SafeAreaView>
|
) : (
|
||||||
);
|
<View style={styles.backButtonWrapper}>
|
||||||
}
|
<IconButton
|
||||||
}
|
iconStyle={styles.backIcon}
|
||||||
|
name="md-search"
|
||||||
|
onPress={() => setIsSearchModalOpen(true)}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</SafeAreaView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default injectIntl(HeaderView);
|
export default HeaderView;
|
||||||
|
@ -165,17 +165,17 @@ class NotificationView extends PureComponent {
|
|||||||
rightIconType="MaterialIcons"
|
rightIconType="MaterialIcons"
|
||||||
onRightIconPress={readAllNotification}
|
onRightIconPress={readAllNotification}
|
||||||
/>
|
/>
|
||||||
<FlatList
|
<ThemeContainer>
|
||||||
data={_notifications}
|
{({ isDarkTheme }) => (
|
||||||
refreshing={isNotificationRefreshing}
|
<FlatList
|
||||||
onRefresh={() => getActivities()}
|
data={_notifications}
|
||||||
keyExtractor={item => item.title}
|
refreshing={isNotificationRefreshing}
|
||||||
onEndReached={() => getActivities(null, selectedFilter, true)}
|
onRefresh={() => getActivities()}
|
||||||
ListFooterComponent={this._renderFooterLoading}
|
keyExtractor={item => item.title}
|
||||||
ListEmptyComponent={<ListPlaceHolder />}
|
onEndReached={() => getActivities(null, selectedFilter, true)}
|
||||||
refreshControl={
|
ListFooterComponent={this._renderFooterLoading}
|
||||||
<ThemeContainer>
|
ListEmptyComponent={<ListPlaceHolder />}
|
||||||
{({ isDarkTheme }) => (
|
refreshControl={
|
||||||
<RefreshControl
|
<RefreshControl
|
||||||
refreshing={isNotificationRefreshing}
|
refreshing={isNotificationRefreshing}
|
||||||
progressBackgroundColor="#357CE6"
|
progressBackgroundColor="#357CE6"
|
||||||
@ -183,21 +183,21 @@ class NotificationView extends PureComponent {
|
|||||||
titleColor="#fff"
|
titleColor="#fff"
|
||||||
colors={['#fff']}
|
colors={['#fff']}
|
||||||
/>
|
/>
|
||||||
|
}
|
||||||
|
renderItem={({ item, index }) => (
|
||||||
|
<Fragment>
|
||||||
|
<ContainerHeader
|
||||||
|
hasSeperator={index !== 0}
|
||||||
|
isBoldTitle
|
||||||
|
title={item.title}
|
||||||
|
key={item.title}
|
||||||
|
/>
|
||||||
|
{this._renderList(item.notifications)}
|
||||||
|
</Fragment>
|
||||||
)}
|
)}
|
||||||
</ThemeContainer>
|
/>
|
||||||
}
|
|
||||||
renderItem={({ item, index }) => (
|
|
||||||
<Fragment>
|
|
||||||
<ContainerHeader
|
|
||||||
hasSeperator={index !== 0}
|
|
||||||
isBoldTitle
|
|
||||||
title={item.title}
|
|
||||||
key={item.title}
|
|
||||||
/>
|
|
||||||
{this._renderList(item.notifications)}
|
|
||||||
</Fragment>
|
|
||||||
)}
|
)}
|
||||||
/>
|
</ThemeContainer>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,7 @@ export default EStyleSheet.create({
|
|||||||
scrollContainer: {
|
scrollContainer: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
backgroundColor: '$primaryBackgroundColor',
|
backgroundColor: '$primaryBackgroundColor',
|
||||||
|
marginBottom: 60,
|
||||||
},
|
},
|
||||||
popoverDetails: {
|
popoverDetails: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
|
@ -40,22 +40,18 @@ class PointsView extends Component {
|
|||||||
|
|
||||||
// Component Functions
|
// Component Functions
|
||||||
|
|
||||||
refreshControl = () => {
|
refreshControl = ({ isDarkTheme }) => {
|
||||||
const { fetchUserActivity, refreshing } = this.props;
|
const { fetchUserActivity, refreshing } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ThemeContainer>
|
<RefreshControl
|
||||||
{isDarkTheme => (
|
refreshing={refreshing}
|
||||||
<RefreshControl
|
onRefresh={fetchUserActivity}
|
||||||
refreshing={refreshing}
|
progressBackgroundColor="#357CE6"
|
||||||
onRefresh={fetchUserActivity}
|
tintColor={!isDarkTheme ? '#357ce6' : '#96c0ff'}
|
||||||
progressBackgroundColor="#357CE6"
|
titleColor="#fff"
|
||||||
tintColor={!isDarkTheme ? '#357ce6' : '#96c0ff'}
|
colors={['#fff']}
|
||||||
titleColor="#fff"
|
/>
|
||||||
colors={['#fff']}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</ThemeContainer>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -100,147 +96,166 @@ class PointsView extends Component {
|
|||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<LineBreak height={12} />
|
<LineBreak height={12} />
|
||||||
<ScrollView style={styles.scrollContainer} refreshControl={this.refreshControl()}>
|
<ThemeContainer>
|
||||||
<View style={styles.pointsWrapper}>
|
{isDarkTheme => (
|
||||||
<Text onPress={this._showDropdown} style={styles.pointText}>
|
<ScrollView
|
||||||
{get(userPoints, 'points')}
|
style={styles.scrollContainer}
|
||||||
</Text>
|
refreshControl={this.refreshControl({ isDarkTheme })}
|
||||||
<DropdownButton
|
>
|
||||||
dropdownRowWrapper={styles.dropdownRowStyle}
|
<View style={styles.pointsWrapper}>
|
||||||
dropdownRef={this.dropdownRef}
|
<Text onPress={this._showDropdown} style={styles.pointText}>
|
||||||
isHasChildIcon
|
{get(userPoints, 'points')}
|
||||||
iconName="arrow-drop-down"
|
</Text>
|
||||||
options={[
|
<DropdownButton
|
||||||
intl.formatMessage({ id: 'points.dropdown_transfer' }),
|
dropdownRowWrapper={styles.dropdownRowStyle}
|
||||||
intl.formatMessage({ id: 'points.dropdown_promote' }),
|
dropdownRef={this.dropdownRef}
|
||||||
intl.formatMessage({ id: 'points.dropdown_boost' }),
|
isHasChildIcon
|
||||||
]}
|
iconName="arrow-drop-down"
|
||||||
noHighlight
|
options={[
|
||||||
dropdownButtonStyle={styles.dropdownButtonStyle}
|
intl.formatMessage({ id: 'points.dropdown_transfer' }),
|
||||||
onSelect={handleOnDropdownSelected}
|
intl.formatMessage({ id: 'points.dropdown_promote' }),
|
||||||
rowTextStyle={styles.dropdownRowText}
|
intl.formatMessage({ id: 'points.dropdown_boost' }),
|
||||||
dropdownStyle={styles.dropdownStyle}
|
]}
|
||||||
/>
|
noHighlight
|
||||||
</View>
|
dropdownButtonStyle={styles.dropdownButtonStyle}
|
||||||
<Text style={styles.subText}>{intl.formatMessage({ id: 'points.esteemPoints' })}</Text>
|
onSelect={handleOnDropdownSelected}
|
||||||
|
rowTextStyle={styles.dropdownRowText}
|
||||||
<MainButton
|
dropdownStyle={styles.dropdownStyle}
|
||||||
isLoading={isClaiming}
|
/>
|
||||||
isDisable={isClaiming}
|
|
||||||
style={styles.mainButton}
|
|
||||||
height={50}
|
|
||||||
onPress={() =>
|
|
||||||
unclaimedPoints > 0 ? claimPoints() : navigation.navigate(ROUTES.SCREENS.BOOST)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<View style={styles.mainButtonWrapper}>
|
|
||||||
<Text style={styles.unclaimedText}>
|
|
||||||
{unclaimedPoints > 0 ? unclaimedPoints : intl.formatMessage({ id: 'boost.buy' })}
|
|
||||||
</Text>
|
|
||||||
<View style={styles.mainIconWrapper}>
|
|
||||||
<Icon name="add" iconType="MaterialIcons" color="#357ce6" size={23} />
|
|
||||||
</View>
|
</View>
|
||||||
</View>
|
<Text style={styles.subText}>
|
||||||
</MainButton>
|
{intl.formatMessage({ id: 'points.esteemPoints' })}
|
||||||
|
</Text>
|
||||||
|
|
||||||
<View style={styles.iconsWrapper}>
|
<MainButton
|
||||||
<FlatList
|
isLoading={isClaiming}
|
||||||
style={styles.iconsList}
|
isDisable={isClaiming}
|
||||||
data={POINTS_KEYS}
|
style={styles.mainButton}
|
||||||
keyExtractor={item => get(item, 'type', Math.random()).toString()}
|
height={50}
|
||||||
horizontal
|
onPress={() =>
|
||||||
renderItem={({ item }) => (
|
unclaimedPoints > 0 ? claimPoints() : navigation.navigate(ROUTES.SCREENS.BOOST)
|
||||||
<PopoverController key={get(item, 'type')}>
|
}
|
||||||
{({
|
>
|
||||||
openPopover,
|
<View style={styles.mainButtonWrapper}>
|
||||||
closePopover,
|
<Text style={styles.unclaimedText}>
|
||||||
popoverVisible,
|
{unclaimedPoints > 0
|
||||||
setPopoverAnchor,
|
? unclaimedPoints
|
||||||
popoverAnchorRect,
|
: intl.formatMessage({ id: 'boost.buy' })}
|
||||||
}) => (
|
</Text>
|
||||||
<View styles={styles.iconWrapper} key={get(item, 'type')}>
|
<View style={styles.mainIconWrapper}>
|
||||||
<View style={styles.iconWrapper}>
|
<Icon name="add" iconType="MaterialIcons" color="#357ce6" size={23} />
|
||||||
<TouchableOpacity ref={setPopoverAnchor} onPress={openPopover}>
|
</View>
|
||||||
<IconButton
|
</View>
|
||||||
iconStyle={styles.icon}
|
</MainButton>
|
||||||
style={styles.iconButton}
|
|
||||||
iconType={get(POINTS[get(item, 'type')], 'iconType')}
|
<View style={styles.iconsWrapper}>
|
||||||
name={get(POINTS[get(item, 'type')], 'icon')}
|
<FlatList
|
||||||
badgeCount={get(POINTS[get(item, 'type')], 'point')}
|
style={styles.iconsList}
|
||||||
badgeStyle={styles.badge}
|
data={POINTS_KEYS}
|
||||||
badgeTextStyle={styles.badgeText}
|
keyExtractor={item => get(item, 'type', Math.random()).toString()}
|
||||||
disabled
|
horizontal
|
||||||
/>
|
renderItem={({ item }) => (
|
||||||
</TouchableOpacity>
|
<PopoverController key={get(item, 'type')}>
|
||||||
</View>
|
{({
|
||||||
<Text style={styles.subText}>
|
openPopover,
|
||||||
{this._getTranslation(get(POINTS[get(item, 'type')], 'nameKey'))}
|
closePopover,
|
||||||
</Text>
|
popoverVisible,
|
||||||
<Popover
|
setPopoverAnchor,
|
||||||
backgroundStyle={styles.overlay}
|
popoverAnchorRect,
|
||||||
contentStyle={styles.popoverDetails}
|
}) => (
|
||||||
arrowStyle={styles.arrow}
|
<View styles={styles.iconWrapper} key={get(item, 'type')}>
|
||||||
visible={popoverVisible}
|
<View style={styles.iconWrapper}>
|
||||||
onClose={() => closePopover()}
|
<TouchableOpacity ref={setPopoverAnchor} onPress={openPopover}>
|
||||||
fromRect={popoverAnchorRect}
|
<IconButton
|
||||||
placement="top"
|
iconStyle={styles.icon}
|
||||||
supportedOrientations={['portrait', 'landscape']}
|
style={styles.iconButton}
|
||||||
>
|
iconType={get(POINTS[get(item, 'type')], 'iconType')}
|
||||||
<View style={styles.popoverWrapper}>
|
name={get(POINTS[get(item, 'type')], 'icon')}
|
||||||
<Text style={styles.popoverText}>
|
badgeCount={get(POINTS[get(item, 'type')], 'point')}
|
||||||
{this._getTranslation(get(POINTS[get(item, 'type')], 'descriptionKey'))}
|
badgeStyle={styles.badge}
|
||||||
|
badgeTextStyle={styles.badgeText}
|
||||||
|
disabled
|
||||||
|
/>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
<Text style={styles.subText}>
|
||||||
|
{this._getTranslation(get(POINTS[get(item, 'type')], 'nameKey'))}
|
||||||
</Text>
|
</Text>
|
||||||
|
<Popover
|
||||||
|
backgroundStyle={styles.overlay}
|
||||||
|
contentStyle={styles.popoverDetails}
|
||||||
|
arrowStyle={styles.arrow}
|
||||||
|
visible={popoverVisible}
|
||||||
|
onClose={() => closePopover()}
|
||||||
|
fromRect={popoverAnchorRect}
|
||||||
|
placement="top"
|
||||||
|
supportedOrientations={['portrait', 'landscape']}
|
||||||
|
>
|
||||||
|
<View style={styles.popoverWrapper}>
|
||||||
|
<Text style={styles.popoverText}>
|
||||||
|
{this._getTranslation(
|
||||||
|
get(POINTS[get(item, 'type')], 'descriptionKey'),
|
||||||
|
)}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</Popover>
|
||||||
</View>
|
</View>
|
||||||
</Popover>
|
)}
|
||||||
</View>
|
</PopoverController>
|
||||||
)}
|
)}
|
||||||
</PopoverController>
|
/>
|
||||||
)}
|
</View>
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
<View style={styles.listWrapper}>
|
<View style={styles.listWrapper}>
|
||||||
<FlatList
|
<FlatList
|
||||||
data={userActivities}
|
data={userActivities}
|
||||||
keyExtractor={item => item.id.toString()}
|
keyExtractor={item => item.id.toString()}
|
||||||
ListEmptyComponent={this._renderLoading()}
|
ListEmptyComponent={this._renderLoading()}
|
||||||
renderItem={({ item, index }) => (
|
renderItem={({ item, index }) => (
|
||||||
<CollapsibleCard
|
<CollapsibleCard
|
||||||
noBorder
|
noBorder
|
||||||
noContainer
|
noContainer
|
||||||
key={item.id.toString()}
|
key={item.id.toString()}
|
||||||
titleComponent={
|
titleComponent={
|
||||||
<WalletLineItem
|
<WalletLineItem
|
||||||
index={index + 1}
|
index={index + 1}
|
||||||
text={this._getTranslation(get(item, 'textKey'))}
|
text={this._getTranslation(get(item, 'textKey'))}
|
||||||
description={getTimeFromNow(get(item, 'created'))}
|
description={getTimeFromNow(get(item, 'created'))}
|
||||||
isCircleIcon
|
isCircleIcon
|
||||||
isThin
|
isThin
|
||||||
isBlackText
|
isBlackText
|
||||||
iconName={get(item, 'icon')}
|
iconName={get(item, 'icon')}
|
||||||
iconType={get(item, 'iconType')}
|
iconType={get(item, 'iconType')}
|
||||||
rightText={`${get(item, 'amount')} ESTM`}
|
rightText={`${get(item, 'amount')} ESTM`}
|
||||||
/>
|
/>
|
||||||
}
|
|
||||||
>
|
|
||||||
{(get(item, 'memo') || get(item, 'sender')) && (
|
|
||||||
<WalletLineItem
|
|
||||||
isBlackText
|
|
||||||
isThin
|
|
||||||
text={
|
|
||||||
get(item, 'sender')
|
|
||||||
? `${intl.formatMessage({ id: 'points.from' })} @${get(item, 'sender')}`
|
|
||||||
: get(item, 'receiver') &&
|
|
||||||
`${intl.formatMessage({ id: 'points.to' })} @${get(item, 'receiver')}`
|
|
||||||
}
|
}
|
||||||
description={get(item, 'memo')}
|
>
|
||||||
/>
|
{(get(item, 'memo') || get(item, 'sender')) && (
|
||||||
|
<WalletLineItem
|
||||||
|
isBlackText
|
||||||
|
isThin
|
||||||
|
text={
|
||||||
|
get(item, 'sender')
|
||||||
|
? `${intl.formatMessage({ id: 'points.from' })} @${get(
|
||||||
|
item,
|
||||||
|
'sender',
|
||||||
|
)}`
|
||||||
|
: get(item, 'receiver') &&
|
||||||
|
`${intl.formatMessage({ id: 'points.to' })} @${get(
|
||||||
|
item,
|
||||||
|
'receiver',
|
||||||
|
)}`
|
||||||
|
}
|
||||||
|
description={get(item, 'memo')}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</CollapsibleCard>
|
||||||
)}
|
)}
|
||||||
</CollapsibleCard>
|
/>
|
||||||
)}
|
</View>
|
||||||
/>
|
</ScrollView>
|
||||||
</View>
|
)}
|
||||||
</ScrollView>
|
</ThemeContainer>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,94 +1,73 @@
|
|||||||
import React, { PureComponent } from 'react';
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect, useDispatch } from 'react-redux';
|
||||||
import get from 'lodash/get';
|
|
||||||
|
|
||||||
// Component
|
// Component
|
||||||
import PostsView from '../view/postsView';
|
import PostsView from '../view/postsView';
|
||||||
|
|
||||||
|
// Container
|
||||||
|
import { AccountContainer } from '../../../containers';
|
||||||
|
|
||||||
// Actions
|
// Actions
|
||||||
import { setFeedPosts } from '../../../redux/actions/postsAction';
|
import { setFeedPosts } from '../../../redux/actions/postsAction';
|
||||||
import { hidePostsThumbnails } from '../../../redux/actions/uiAction';
|
import { hidePostsThumbnails } from '../../../redux/actions/uiAction';
|
||||||
|
|
||||||
/*
|
const PostsContainer = ({
|
||||||
* Props Name Description Value
|
changeForceLoadPostState,
|
||||||
*@props --> props name here description here Value Type Here
|
feedPosts,
|
||||||
*
|
filterOptions,
|
||||||
*/
|
forceLoadPost,
|
||||||
|
getFor,
|
||||||
class PostsContainer extends PureComponent {
|
handleOnScroll,
|
||||||
constructor(props) {
|
isConnected,
|
||||||
super(props);
|
isHideImages,
|
||||||
this.state = {
|
pageType,
|
||||||
promotedPosts: [],
|
selectedOptionIndex,
|
||||||
};
|
tag,
|
||||||
}
|
nsfw,
|
||||||
|
filterOptionsValue,
|
||||||
// Component Life Cycle Functions
|
customOption,
|
||||||
|
}) => {
|
||||||
// Component Functions
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
_setFeedPosts = posts => {
|
|
||||||
const { dispatch } = this.props;
|
|
||||||
|
|
||||||
|
const _setFeedPosts = posts => {
|
||||||
dispatch(setFeedPosts(posts));
|
dispatch(setFeedPosts(posts));
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleImagesHide = () => {
|
const _handleImagesHide = () => {
|
||||||
const { dispatch, isHideImages } = this.props;
|
|
||||||
|
|
||||||
dispatch(hidePostsThumbnails(!isHideImages));
|
dispatch(hidePostsThumbnails(!isHideImages));
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
return (
|
||||||
const {
|
<AccountContainer>
|
||||||
changeForceLoadPostState,
|
{({ username, isLoggedIn, isLoginDone }) => (
|
||||||
currentAccount,
|
<PostsView
|
||||||
feedPosts,
|
changeForceLoadPostState={changeForceLoadPostState}
|
||||||
filterOptions,
|
currentAccountUsername={username}
|
||||||
forceLoadPost,
|
feedPosts={feedPosts}
|
||||||
getFor,
|
filterOptions={filterOptions}
|
||||||
handleOnScroll,
|
forceLoadPost={forceLoadPost}
|
||||||
isConnected,
|
getFor={getFor}
|
||||||
isHideImages,
|
handleImagesHide={_handleImagesHide}
|
||||||
pageType,
|
handleOnScroll={handleOnScroll}
|
||||||
selectedOptionIndex,
|
hidePostsThumbnails={hidePostsThumbnails}
|
||||||
tag,
|
isConnected={isConnected}
|
||||||
isLoginDone,
|
isHideImage={isHideImages}
|
||||||
isLoggedIn,
|
isLoggedIn={isLoggedIn}
|
||||||
nsfw,
|
isLoginDone={isLoginDone}
|
||||||
} = this.props;
|
nsfw={nsfw}
|
||||||
const { promotedPosts } = this.state;
|
pageType={pageType}
|
||||||
|
selectedOptionIndex={selectedOptionIndex}
|
||||||
return (
|
setFeedPosts={_setFeedPosts}
|
||||||
<PostsView
|
tag={tag}
|
||||||
changeForceLoadPostState={changeForceLoadPostState}
|
filterOptionsValue={filterOptionsValue}
|
||||||
currentAccountUsername={get(currentAccount, 'name', '')}
|
customOption={customOption}
|
||||||
feedPosts={feedPosts}
|
/>
|
||||||
filterOptions={filterOptions}
|
)}
|
||||||
forceLoadPost={forceLoadPost}
|
</AccountContainer>
|
||||||
getFor={getFor}
|
);
|
||||||
handleOnScroll={handleOnScroll}
|
};
|
||||||
handleImagesHide={this._handleImagesHide}
|
|
||||||
hidePostsThumbnails={hidePostsThumbnails}
|
|
||||||
isConnected={isConnected}
|
|
||||||
isHideImage={isHideImages}
|
|
||||||
pageType={pageType}
|
|
||||||
promotedPosts={promotedPosts}
|
|
||||||
selectedOptionIndex={selectedOptionIndex}
|
|
||||||
setFeedPosts={this._setFeedPosts}
|
|
||||||
tag={tag}
|
|
||||||
isLoginDone={isLoginDone}
|
|
||||||
isLoggedIn={isLoggedIn}
|
|
||||||
nsfw={nsfw}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
currentAccount: state.account.currentAccount,
|
|
||||||
isLoggedIn: state.application.isLoggedIn,
|
|
||||||
isLoginDone: state.application.isLoginDone,
|
|
||||||
nsfw: state.application.nsfw,
|
nsfw: state.application.nsfw,
|
||||||
feedPosts: state.posts.feedPosts,
|
feedPosts: state.posts.feedPosts,
|
||||||
isConnected: state.application.isConnected,
|
isConnected: state.application.isConnected,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* eslint-disable react/jsx-wrap-multilines */
|
/* eslint-disable react/jsx-wrap-multilines */
|
||||||
import React, { Component, Fragment } from 'react';
|
import React, { useState, Fragment, useEffect, useCallback } from 'react';
|
||||||
import { FlatList, View, ActivityIndicator, RefreshControl } from 'react-native';
|
import { FlatList, View, ActivityIndicator, RefreshControl } from 'react-native';
|
||||||
import { injectIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
import { withNavigation } from 'react-navigation';
|
import { withNavigation } from 'react-navigation';
|
||||||
import { get, isEqual, unionWith } from 'lodash';
|
import { get, isEqual, unionWith } from 'lodash';
|
||||||
|
|
||||||
@ -13,272 +13,272 @@ import { getPromotePosts } from '../../../providers/esteem/esteem';
|
|||||||
import { PostCard } from '../../postCard';
|
import { PostCard } from '../../postCard';
|
||||||
import { FilterBar } from '../../filterBar';
|
import { FilterBar } from '../../filterBar';
|
||||||
import { PostCardPlaceHolder, NoPost } from '../../basicUIElements';
|
import { PostCardPlaceHolder, NoPost } from '../../basicUIElements';
|
||||||
import { POPULAR_FILTERS, PROFILE_FILTERS } from '../../../constants/options/filters';
|
|
||||||
import { ThemeContainer } from '../../../containers';
|
import { ThemeContainer } from '../../../containers';
|
||||||
|
|
||||||
// Styles
|
// Styles
|
||||||
import styles from './postsStyles';
|
import styles from './postsStyles';
|
||||||
import { default as ROUTES } from '../../../constants/routeNames';
|
import { default as ROUTES } from '../../../constants/routeNames';
|
||||||
|
|
||||||
class PostsView extends Component {
|
const PostsView = ({
|
||||||
constructor(props) {
|
filterOptions,
|
||||||
super(props);
|
selectedOptionIndex,
|
||||||
|
isHideImage,
|
||||||
this.state = {
|
handleImagesHide,
|
||||||
posts: props.isConnected ? [] : props.feedPosts,
|
feedPosts,
|
||||||
startAuthor: '',
|
isConnected,
|
||||||
startPermlink: '',
|
currentAccountUsername,
|
||||||
refreshing: false,
|
getFor,
|
||||||
isLoading: false,
|
tag,
|
||||||
isShowFilterBar: true,
|
nsfw,
|
||||||
selectedFilterIndex: get(props, 'selectedOptionIndex', 0),
|
setFeedPosts,
|
||||||
isNoPost: false,
|
pageType,
|
||||||
promotedPosts: [],
|
isLoginDone,
|
||||||
scrollOffsetY: 0,
|
isLoggedIn,
|
||||||
lockFilterBar: false,
|
handleOnScroll,
|
||||||
};
|
navigation,
|
||||||
}
|
changeForceLoadPostState,
|
||||||
|
forceLoadPost,
|
||||||
// Component Functions
|
filterOptionsValue,
|
||||||
componentWillMount() {
|
customOption,
|
||||||
const { navigation } = this.props;
|
}) => {
|
||||||
|
const [posts, setPosts] = useState(isConnected ? [] : feedPosts);
|
||||||
navigation.setParams({
|
const [startAuthor, setStartAuthor] = useState('');
|
||||||
scrollToTop: this._scrollToTop,
|
const [startPermlink, setStartPermlink] = useState('');
|
||||||
});
|
const [refreshing, setRefreshing] = useState(false);
|
||||||
}
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
|
const [isShowFilterBar, setIsShowFilterBar] = useState(true);
|
||||||
async componentDidMount() {
|
const [selectedFilterIndex, setSelectedFilterIndex] = useState(selectedOptionIndex || 0);
|
||||||
const { isConnected, pageType } = this.props;
|
const [isNoPost, setIsNoPost] = useState(false);
|
||||||
|
const [promotedPosts, setPromotedPosts] = useState([]);
|
||||||
|
const [scrollOffsetY, setScrollOffsetY] = useState(0);
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
if (isConnected) {
|
if (isConnected) {
|
||||||
if (pageType !== 'profiles') {
|
const fetchPromotePost = async () => {
|
||||||
await this._getPromotePosts();
|
if (pageType !== 'profiles') {
|
||||||
}
|
await _getPromotePosts();
|
||||||
this._loadPosts();
|
}
|
||||||
} else {
|
};
|
||||||
this.setState({
|
fetchPromotePost();
|
||||||
refreshing: false,
|
_loadPosts();
|
||||||
isLoading: false,
|
setRefreshing(false);
|
||||||
});
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
}
|
}, [
|
||||||
|
_getPromotePosts,
|
||||||
|
_loadPosts,
|
||||||
|
changeForceLoadPostState,
|
||||||
|
currentAccountUsername,
|
||||||
|
forceLoadPost,
|
||||||
|
isConnected,
|
||||||
|
pageType,
|
||||||
|
selectedOptionIndex,
|
||||||
|
]);
|
||||||
|
|
||||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
useEffect(() => {
|
||||||
const { currentAccountUsername, changeForceLoadPostState } = this.props;
|
if (forceLoadPost) {
|
||||||
|
setPosts([]);
|
||||||
|
setStartAuthor('');
|
||||||
|
setStartPermlink('');
|
||||||
|
setRefreshing(false);
|
||||||
|
setIsLoading(false);
|
||||||
|
setSelectedFilterIndex(selectedOptionIndex || 0);
|
||||||
|
setIsNoPost(false);
|
||||||
|
|
||||||
if (
|
_loadPosts();
|
||||||
(currentAccountUsername &&
|
|
||||||
currentAccountUsername !== nextProps.currentAccountUsername &&
|
if (changeForceLoadPostState) {
|
||||||
nextProps.currentAccountUsername) ||
|
changeForceLoadPostState(false);
|
||||||
nextProps.forceLoadPost
|
}
|
||||||
) {
|
}
|
||||||
// Set all initial data (New user new rules)
|
}, [
|
||||||
this.setState(
|
_loadPosts,
|
||||||
{
|
changeForceLoadPostState,
|
||||||
posts: [],
|
currentAccountUsername,
|
||||||
startAuthor: '',
|
forceLoadPost,
|
||||||
startPermlink: '',
|
selectedOptionIndex,
|
||||||
refreshing: false,
|
]);
|
||||||
isLoading: false,
|
|
||||||
selectedFilterIndex: get(nextProps, 'selectedOptionIndex', 0),
|
useEffect(() => {
|
||||||
isNoPost: false,
|
if (!startAuthor && !startPermlink) {
|
||||||
},
|
_loadPosts(
|
||||||
() => {
|
filterOptions && filterOptions.length > 0 && filterOptionsValue[selectedFilterIndex],
|
||||||
this._loadPosts();
|
|
||||||
if (changeForceLoadPostState) {
|
|
||||||
changeForceLoadPostState(false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}, [
|
||||||
|
_loadPosts,
|
||||||
|
filterOptions,
|
||||||
|
filterOptionsValue,
|
||||||
|
selectedFilterIndex,
|
||||||
|
startAuthor,
|
||||||
|
startPermlink,
|
||||||
|
]);
|
||||||
|
|
||||||
_getPromotePosts = async () => {
|
const _handleOnDropdownSelect = async index => {
|
||||||
const { currentAccountUsername } = this.props;
|
setSelectedFilterIndex(index);
|
||||||
|
setPosts([]);
|
||||||
|
setStartPermlink('');
|
||||||
|
setStartAuthor('');
|
||||||
|
setIsNoPost(false);
|
||||||
|
};
|
||||||
|
|
||||||
await getPromotePosts().then(async res => {
|
const _getPromotePosts = useCallback(async () => {
|
||||||
if (res && res.length) {
|
await getPromotePosts()
|
||||||
const promotedPosts = await Promise.all(
|
.then(async res => {
|
||||||
res.map(item =>
|
if (res && res.length) {
|
||||||
getPost(get(item, 'author'), get(item, 'permlink'), currentAccountUsername, true).then(
|
const _promotedPosts = await Promise.all(
|
||||||
post => post,
|
res.map(item =>
|
||||||
|
getPost(
|
||||||
|
get(item, 'author'),
|
||||||
|
get(item, 'permlink'),
|
||||||
|
currentAccountUsername,
|
||||||
|
true,
|
||||||
|
).then(post => post),
|
||||||
),
|
),
|
||||||
),
|
);
|
||||||
);
|
|
||||||
|
|
||||||
this.setState({ promotedPosts });
|
setPromotedPosts(_promotedPosts);
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
_scrollToTop = () => {
|
|
||||||
if (this.flatList) {
|
|
||||||
this.flatList.scrollToOffset({ x: 0, y: 0, animated: true });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
_loadPosts = async () => {
|
|
||||||
const {
|
|
||||||
getFor,
|
|
||||||
tag,
|
|
||||||
currentAccountUsername,
|
|
||||||
pageType,
|
|
||||||
nsfw,
|
|
||||||
setFeedPosts,
|
|
||||||
isConnected,
|
|
||||||
} = this.props;
|
|
||||||
const {
|
|
||||||
posts,
|
|
||||||
startAuthor,
|
|
||||||
startPermlink,
|
|
||||||
refreshing,
|
|
||||||
selectedFilterIndex,
|
|
||||||
isLoading,
|
|
||||||
promotedPosts,
|
|
||||||
} = this.state;
|
|
||||||
const filter =
|
|
||||||
pageType === 'posts'
|
|
||||||
? POPULAR_FILTERS[selectedFilterIndex].toLowerCase()
|
|
||||||
: PROFILE_FILTERS[selectedFilterIndex].toLowerCase();
|
|
||||||
let options;
|
|
||||||
const limit = 3;
|
|
||||||
|
|
||||||
if (!isConnected) {
|
|
||||||
this.setState({
|
|
||||||
refreshing: false,
|
|
||||||
isLoading: false,
|
|
||||||
});
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isLoading) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setState({ isLoading: true });
|
|
||||||
if (tag || filter === 'feed' || filter === 'blog' || getFor === 'blog') {
|
|
||||||
options = {
|
|
||||||
tag,
|
|
||||||
limit,
|
|
||||||
};
|
|
||||||
} else if (filter === 'reblogs') {
|
|
||||||
options = {
|
|
||||||
tag,
|
|
||||||
limit,
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
options = {
|
|
||||||
limit,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startAuthor && startPermlink && !refreshing) {
|
|
||||||
options.start_author = startAuthor;
|
|
||||||
options.start_permlink = startPermlink;
|
|
||||||
}
|
|
||||||
|
|
||||||
getPostsSummary(filter, options, currentAccountUsername, nsfw)
|
|
||||||
.then(result => {
|
|
||||||
if (result.length > 0) {
|
|
||||||
let _posts = result;
|
|
||||||
|
|
||||||
if (filter === 'reblogs') {
|
|
||||||
for (let i = _posts.length - 1; i >= 0; i--) {
|
|
||||||
if (_posts[i].author === currentAccountUsername) {
|
|
||||||
_posts.splice(i, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_posts.length > 0) {
|
|
||||||
if (posts.length > 0) {
|
|
||||||
if (refreshing) {
|
|
||||||
_posts = unionWith(_posts, posts, isEqual);
|
|
||||||
} else {
|
|
||||||
_posts.shift();
|
|
||||||
_posts = [...posts, ..._posts];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (posts.length < 5) {
|
|
||||||
setFeedPosts(_posts);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Promoted post start
|
|
||||||
if (promotedPosts && promotedPosts.length > 0) {
|
|
||||||
const insert = (arr, index, newItem) => [
|
|
||||||
...arr.slice(0, index),
|
|
||||||
|
|
||||||
newItem,
|
|
||||||
|
|
||||||
...arr.slice(index),
|
|
||||||
];
|
|
||||||
|
|
||||||
if (refreshing) {
|
|
||||||
_posts = _posts.filter(item => !item.is_promoted);
|
|
||||||
}
|
|
||||||
|
|
||||||
_posts.map((d, i) => {
|
|
||||||
if ([3, 6, 9].includes(i)) {
|
|
||||||
const ix = i / 3 - 1;
|
|
||||||
if (promotedPosts[ix] !== undefined) {
|
|
||||||
if (get(_posts, [i], {}).permlink !== promotedPosts[ix].permlink) {
|
|
||||||
_posts = insert(_posts, i, promotedPosts[ix]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// Promoted post end
|
|
||||||
|
|
||||||
if (refreshing) {
|
|
||||||
this.setState({
|
|
||||||
posts: _posts,
|
|
||||||
});
|
|
||||||
} else if (!refreshing) {
|
|
||||||
this.setState({
|
|
||||||
posts: _posts,
|
|
||||||
startAuthor: result[result.length - 1] && result[result.length - 1].author,
|
|
||||||
startPermlink: result[result.length - 1] && result[result.length - 1].permlink,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
refreshing: false,
|
|
||||||
isLoading: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (result.length === 0) {
|
|
||||||
this.setState({ isNoPost: true });
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {});
|
||||||
this.setState({
|
}, [currentAccountUsername]);
|
||||||
refreshing: false,
|
|
||||||
|
const _loadPosts = useCallback(
|
||||||
|
async type => {
|
||||||
|
if (isLoading) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
setIsLoading(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const filter =
|
||||||
|
type ||
|
||||||
|
(filterOptions && filterOptions.length > 0 && filterOptionsValue[selectedFilterIndex]);
|
||||||
|
let options;
|
||||||
|
const limit = 3;
|
||||||
|
|
||||||
|
if (!isConnected) {
|
||||||
|
setRefreshing(false);
|
||||||
|
setIsLoading(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filter === 'feed' || filter === 'blog' || getFor === 'blog' || filter === 'reblogs') {
|
||||||
|
options = {
|
||||||
|
tag,
|
||||||
|
limit,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
options = {
|
||||||
|
limit,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startAuthor && startPermlink && !refreshing) {
|
||||||
|
options.start_author = startAuthor;
|
||||||
|
options.start_permlink = startPermlink;
|
||||||
|
}
|
||||||
|
|
||||||
|
getPostsSummary(filter, options, currentAccountUsername, nsfw)
|
||||||
|
.then(result => {
|
||||||
|
if (result.length > 0) {
|
||||||
|
let _posts = result;
|
||||||
|
|
||||||
|
if (filter === 'reblogs') {
|
||||||
|
for (let i = _posts.length - 1; i >= 0; i--) {
|
||||||
|
if (_posts[i].author === currentAccountUsername) {
|
||||||
|
_posts.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_posts.length > 0) {
|
||||||
|
if (posts.length > 0) {
|
||||||
|
if (refreshing) {
|
||||||
|
_posts = unionWith(_posts, posts, isEqual);
|
||||||
|
} else {
|
||||||
|
_posts.shift();
|
||||||
|
_posts = [...posts, ..._posts];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (posts.length < 5) {
|
||||||
|
setFeedPosts(_posts);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Promoted post start
|
||||||
|
if (promotedPosts && promotedPosts.length > 0) {
|
||||||
|
const insert = (arr, index, newItem) => [
|
||||||
|
...arr.slice(0, index),
|
||||||
|
|
||||||
|
newItem,
|
||||||
|
|
||||||
|
...arr.slice(index),
|
||||||
|
];
|
||||||
|
|
||||||
|
if (refreshing) {
|
||||||
|
_posts = _posts.filter(item => !item.is_promoted);
|
||||||
|
}
|
||||||
|
|
||||||
|
_posts.map((d, i) => {
|
||||||
|
if ([3, 6, 9].includes(i)) {
|
||||||
|
const ix = i / 3 - 1;
|
||||||
|
if (promotedPosts[ix] !== undefined) {
|
||||||
|
if (get(_posts, [i], {}).permlink !== promotedPosts[ix].permlink) {
|
||||||
|
_posts = insert(_posts, i, promotedPosts[ix]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Promoted post end
|
||||||
|
|
||||||
|
if (refreshing) {
|
||||||
|
} else if (!refreshing) {
|
||||||
|
setStartAuthor(result[result.length - 1] && result[result.length - 1].author);
|
||||||
|
setStartPermlink(result[result.length - 1] && result[result.length - 1].permlink);
|
||||||
|
}
|
||||||
|
setPosts(_posts);
|
||||||
|
setRefreshing(false);
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
} else if (result.length === 0) {
|
||||||
|
setIsNoPost(true);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setRefreshing(false);
|
||||||
});
|
});
|
||||||
});
|
},
|
||||||
|
[
|
||||||
|
currentAccountUsername,
|
||||||
|
filterOptions,
|
||||||
|
filterOptionsValue,
|
||||||
|
getFor,
|
||||||
|
isConnected,
|
||||||
|
isLoading,
|
||||||
|
nsfw,
|
||||||
|
posts,
|
||||||
|
promotedPosts,
|
||||||
|
refreshing,
|
||||||
|
selectedFilterIndex,
|
||||||
|
setFeedPosts,
|
||||||
|
startAuthor,
|
||||||
|
startPermlink,
|
||||||
|
tag,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
const _handleOnRefreshPosts = async () => {
|
||||||
|
setRefreshing(true);
|
||||||
|
if (pageType !== 'profiles') {
|
||||||
|
await _getPromotePosts();
|
||||||
|
}
|
||||||
|
|
||||||
|
_loadPosts();
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleOnRefreshPosts = () => {
|
const _renderFooter = () => {
|
||||||
const { pageType } = this.props;
|
|
||||||
|
|
||||||
this.setState(
|
|
||||||
{
|
|
||||||
refreshing: true,
|
|
||||||
},
|
|
||||||
async () => {
|
|
||||||
if (pageType !== 'profiles') {
|
|
||||||
await this._getPromotePosts();
|
|
||||||
}
|
|
||||||
|
|
||||||
this._loadPosts();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
_renderFooter = () => {
|
|
||||||
const { isLoading } = this.state;
|
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
<View style={styles.flatlistFooter}>
|
<View style={styles.flatlistFooter}>
|
||||||
@ -286,29 +286,15 @@ class PostsView extends Component {
|
|||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleOnDropdownSelect = async index => {
|
const _handleOnPressLogin = () => {
|
||||||
await this.setState({
|
|
||||||
selectedFilterIndex: index,
|
|
||||||
posts: [],
|
|
||||||
startAuthor: '',
|
|
||||||
startPermlink: '',
|
|
||||||
isNoPost: false,
|
|
||||||
});
|
|
||||||
this._loadPosts();
|
|
||||||
};
|
|
||||||
|
|
||||||
_handleOnPressLogin = () => {
|
|
||||||
const { navigation } = this.props;
|
|
||||||
navigation.navigate(ROUTES.SCREENS.LOGIN);
|
navigation.navigate(ROUTES.SCREENS.LOGIN);
|
||||||
};
|
};
|
||||||
|
|
||||||
_renderEmptyContent = () => {
|
const _renderEmptyContent = () => {
|
||||||
const { intl, getFor, isLoginDone, isLoggedIn, tag } = this.props;
|
|
||||||
const { isNoPost } = this.state;
|
|
||||||
|
|
||||||
if (getFor === 'feed' && isLoginDone && !isLoggedIn) {
|
if (getFor === 'feed' && isLoginDone && !isLoggedIn) {
|
||||||
return (
|
return (
|
||||||
<NoPost
|
<NoPost
|
||||||
@ -317,7 +303,7 @@ class PostsView extends Component {
|
|||||||
defaultText={intl.formatMessage({
|
defaultText={intl.formatMessage({
|
||||||
id: 'profile.login_to_see',
|
id: 'profile.login_to_see',
|
||||||
})}
|
})}
|
||||||
handleOnButtonPress={this._handleOnPressLogin}
|
handleOnButtonPress={_handleOnPressLogin}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -345,76 +331,68 @@ class PostsView extends Component {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleOnScroll = event => {
|
const _handleOnScroll = event => {
|
||||||
const { scrollOffsetY } = this.state;
|
|
||||||
const { handleOnScroll } = this.props;
|
|
||||||
const currentOffset = event.nativeEvent.contentOffset.y;
|
const currentOffset = event.nativeEvent.contentOffset.y;
|
||||||
|
|
||||||
if (handleOnScroll) {
|
if (handleOnScroll) {
|
||||||
handleOnScroll();
|
handleOnScroll();
|
||||||
}
|
}
|
||||||
this.setState({ scrollOffsetY: currentOffset });
|
|
||||||
this.setState({ isShowFilterBar: scrollOffsetY > currentOffset || scrollOffsetY <= 0 });
|
setScrollOffsetY(currentOffset);
|
||||||
|
setIsShowFilterBar(scrollOffsetY > currentOffset || scrollOffsetY <= 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
return (
|
||||||
const { refreshing, posts, isShowFilterBar } = this.state;
|
<ThemeContainer>
|
||||||
const { filterOptions, selectedOptionIndex, isHideImage, handleImagesHide } = this.props;
|
{({ isDarkTheme }) => (
|
||||||
|
<View style={styles.container}>
|
||||||
|
{filterOptions && isShowFilterBar && (
|
||||||
|
<FilterBar
|
||||||
|
dropdownIconName="arrow-drop-down"
|
||||||
|
options={filterOptions}
|
||||||
|
selectedOptionIndex={selectedOptionIndex}
|
||||||
|
defaultText={filterOptions[selectedOptionIndex]}
|
||||||
|
rightIconName="view-module"
|
||||||
|
rightIconType="MaterialIcons"
|
||||||
|
onDropdownSelect={_handleOnDropdownSelect}
|
||||||
|
onRightIconPress={handleImagesHide}
|
||||||
|
customOption={customOption}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
return (
|
<FlatList
|
||||||
<View style={styles.container}>
|
data={posts}
|
||||||
{filterOptions && isShowFilterBar && (
|
showsVerticalScrollIndicator={false}
|
||||||
<FilterBar
|
renderItem={({ item }) =>
|
||||||
dropdownIconName="arrow-drop-down"
|
get(item, 'author', null) && (
|
||||||
options={filterOptions}
|
<PostCard isRefresh={refreshing} content={item} isHideImage={isHideImage} />
|
||||||
selectedOptionIndex={selectedOptionIndex}
|
)
|
||||||
defaultText={filterOptions[selectedOptionIndex]}
|
}
|
||||||
rightIconName="view-module"
|
keyExtractor={(content, i) => `${get(content, 'permlink', '')}${i.toString()}`}
|
||||||
rightIconType="MaterialIcons"
|
onEndReached={_loadPosts}
|
||||||
onDropdownSelect={this._handleOnDropdownSelect}
|
removeClippedSubviews
|
||||||
onRightIconPress={handleImagesHide}
|
refreshing={refreshing}
|
||||||
|
onRefresh={_handleOnRefreshPosts}
|
||||||
|
onEndThreshold={0}
|
||||||
|
initialNumToRender={10}
|
||||||
|
ListFooterComponent={_renderFooter}
|
||||||
|
onScrollEndDrag={_handleOnScroll}
|
||||||
|
ListEmptyComponent={_renderEmptyContent}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={refreshing}
|
||||||
|
onRefresh={_handleOnRefreshPosts}
|
||||||
|
progressBackgroundColor="#357CE6"
|
||||||
|
tintColor={!isDarkTheme ? '#357ce6' : '#96c0ff'}
|
||||||
|
titleColor="#fff"
|
||||||
|
colors={['#fff']}
|
||||||
|
/>
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
)}
|
</View>
|
||||||
|
)}
|
||||||
|
</ThemeContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
<FlatList
|
export default withNavigation(PostsView);
|
||||||
data={posts}
|
|
||||||
showsVerticalScrollIndicator={false}
|
|
||||||
renderItem={({ item }) =>
|
|
||||||
get(item, 'author', null) && (
|
|
||||||
<PostCard isRefresh={refreshing} content={item} isHideImage={isHideImage} />
|
|
||||||
)
|
|
||||||
}
|
|
||||||
keyExtractor={(content, i) => `${get(content, 'permlink', '')}${i.toString()}`}
|
|
||||||
onEndReached={() => this._loadPosts()}
|
|
||||||
removeClippedSubviews
|
|
||||||
refreshing={refreshing}
|
|
||||||
onRefresh={() => this._handleOnRefreshPosts()}
|
|
||||||
onEndThreshold={0}
|
|
||||||
initialNumToRender={10}
|
|
||||||
ListFooterComponent={this._renderFooter}
|
|
||||||
onScrollEndDrag={this._handleOnScroll}
|
|
||||||
ListEmptyComponent={this._renderEmptyContent}
|
|
||||||
refreshControl={
|
|
||||||
<ThemeContainer>
|
|
||||||
{({ isDarkTheme }) => (
|
|
||||||
<RefreshControl
|
|
||||||
refreshing={refreshing}
|
|
||||||
onRefresh={this._handleOnRefreshPosts}
|
|
||||||
progressBackgroundColor="#357CE6"
|
|
||||||
tintColor={!isDarkTheme ? '#357ce6' : '#96c0ff'}
|
|
||||||
titleColor="#fff"
|
|
||||||
colors={['#fff']}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</ThemeContainer>
|
|
||||||
}
|
|
||||||
ref={ref => {
|
|
||||||
this.flatList = ref;
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default withNavigation(injectIntl(PostsView));
|
|
||||||
|
@ -15,7 +15,7 @@ import { TabBar } from '../tabBar';
|
|||||||
import { Wallet } from '../wallet';
|
import { Wallet } from '../wallet';
|
||||||
|
|
||||||
// Constants
|
// Constants
|
||||||
import { PROFILE_FILTERS } from '../../constants/options/filters';
|
import { PROFILE_FILTERS, PROFILE_FILTERS_VALUE } from '../../constants/options/filters';
|
||||||
|
|
||||||
// Utils
|
// Utils
|
||||||
import { getFormatedCreatedDate } from '../../utils/time';
|
import { getFormatedCreatedDate } from '../../utils/time';
|
||||||
@ -38,13 +38,17 @@ class ProfileView extends PureComponent {
|
|||||||
_handleOnScroll = () => {
|
_handleOnScroll = () => {
|
||||||
const { isSummaryOpen } = this.state;
|
const { isSummaryOpen } = this.state;
|
||||||
|
|
||||||
if (isSummaryOpen) this.setState({ isSummaryOpen: false });
|
if (isSummaryOpen) {
|
||||||
|
this.setState({ isSummaryOpen: false });
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleOnSummaryExpanded = () => {
|
_handleOnSummaryExpanded = () => {
|
||||||
const { isSummaryOpen } = this.state;
|
const { isSummaryOpen } = this.state;
|
||||||
|
|
||||||
if (!isSummaryOpen) this.setState({ isSummaryOpen: true });
|
if (!isSummaryOpen) {
|
||||||
|
this.setState({ isSummaryOpen: true });
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_handleUIChange = height => {
|
_handleUIChange = height => {
|
||||||
@ -156,7 +160,9 @@ class ProfileView extends PureComponent {
|
|||||||
estimatedWalletValue: 0,
|
estimatedWalletValue: 0,
|
||||||
oldEstimatedWalletValue: estimatedWalletValue,
|
oldEstimatedWalletValue: estimatedWalletValue,
|
||||||
});
|
});
|
||||||
} else this.setState({ estimatedWalletValue: oldEstimatedWalletValue });
|
} else {
|
||||||
|
this.setState({ estimatedWalletValue: oldEstimatedWalletValue });
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<View
|
<View
|
||||||
@ -167,6 +173,7 @@ class ProfileView extends PureComponent {
|
|||||||
>
|
>
|
||||||
<Posts
|
<Posts
|
||||||
filterOptions={PROFILE_FILTERS}
|
filterOptions={PROFILE_FILTERS}
|
||||||
|
filterOptionsValue={PROFILE_FILTERS_VALUE}
|
||||||
selectedOptionIndex={0}
|
selectedOptionIndex={0}
|
||||||
pageType="profiles"
|
pageType="profiles"
|
||||||
getFor="blog"
|
getFor="blog"
|
||||||
|
@ -4,6 +4,7 @@ import { injectIntl } from 'react-intl';
|
|||||||
import LinearGradient from 'react-native-linear-gradient';
|
import LinearGradient from 'react-native-linear-gradient';
|
||||||
import ActionSheet from 'react-native-actionsheet';
|
import ActionSheet from 'react-native-actionsheet';
|
||||||
import VersionNumber from 'react-native-version-number';
|
import VersionNumber from 'react-native-version-number';
|
||||||
|
import { getStorageType } from '../../../realm/realm';
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import { IconButton } from '../../iconButton';
|
import { IconButton } from '../../iconButton';
|
||||||
@ -30,10 +31,16 @@ class SideMenuView extends Component {
|
|||||||
this.state = {
|
this.state = {
|
||||||
menuItems: props.isLoggedIn ? MENU.AUTH_MENU_ITEMS : MENU.NO_AUTH_MENU_ITEMS,
|
menuItems: props.isLoggedIn ? MENU.AUTH_MENU_ITEMS : MENU.NO_AUTH_MENU_ITEMS,
|
||||||
isAddAccountIconActive: false,
|
isAddAccountIconActive: false,
|
||||||
|
storageT: 'R',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Component Life Cycles
|
// Component Life Cycles
|
||||||
|
componentDidMount() {
|
||||||
|
getStorageType().then(item => {
|
||||||
|
this.setState({ storageT: item });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
UNSAFE_componentWillReceiveProps(nextProps) {
|
||||||
const { isLoggedIn, accounts } = this.props;
|
const { isLoggedIn, accounts } = this.props;
|
||||||
@ -86,7 +93,7 @@ class SideMenuView extends Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { currentAccount, isLoggedIn, intl, handleLogout } = this.props;
|
const { currentAccount, isLoggedIn, intl, handleLogout } = this.props;
|
||||||
const { menuItems, isAddAccountIconActive } = this.state;
|
const { menuItems, isAddAccountIconActive, storageT } = this.state;
|
||||||
const { buildVersion, appVersion } = VersionNumber;
|
const { buildVersion, appVersion } = VersionNumber;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -164,7 +171,7 @@ class SideMenuView extends Component {
|
|||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
<Text style={styles.versionText}>{`v${appVersion}, ${buildVersion}`}</Text>
|
<Text style={styles.versionText}>{`v${appVersion}, ${buildVersion}${storageT}`}</Text>
|
||||||
<ActionSheet
|
<ActionSheet
|
||||||
ref={o => (this.ActionSheet = o)}
|
ref={o => (this.ActionSheet = o)}
|
||||||
options={[
|
options={[
|
||||||
|
@ -15,5 +15,6 @@ export default EStyleSheet.create({
|
|||||||
input: {
|
input: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
minHeight: 50,
|
minHeight: 50,
|
||||||
|
backgroundColor: '$primaryWhiteLightBackground',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -58,12 +58,12 @@ class WalletView extends PureComponent {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollView
|
<ThemeContainer>
|
||||||
onScroll={handleOnScroll && handleOnScroll}
|
{isDarkTheme => (
|
||||||
style={styles.scrollView}
|
<ScrollView
|
||||||
refreshControl={
|
onScroll={handleOnScroll && handleOnScroll}
|
||||||
<ThemeContainer>
|
style={styles.scrollView}
|
||||||
{isDarkTheme => (
|
refreshControl={
|
||||||
<RefreshControl
|
<RefreshControl
|
||||||
refreshing={isRefreshing}
|
refreshing={isRefreshing}
|
||||||
onRefresh={handleOnWalletRefresh}
|
onRefresh={handleOnWalletRefresh}
|
||||||
@ -72,62 +72,62 @@ class WalletView extends PureComponent {
|
|||||||
titleColor="#fff"
|
titleColor="#fff"
|
||||||
colors={['#fff']}
|
colors={['#fff']}
|
||||||
/>
|
/>
|
||||||
)}
|
}
|
||||||
</ThemeContainer>
|
>
|
||||||
}
|
{!walletData ? (
|
||||||
>
|
<Fragment>
|
||||||
{!walletData ? (
|
<WalletDetailsPlaceHolder />
|
||||||
<Fragment>
|
</Fragment>
|
||||||
<WalletDetailsPlaceHolder />
|
) : (
|
||||||
</Fragment>
|
<Fragment>
|
||||||
) : (
|
{walletData.hasUnclaimedRewards && (
|
||||||
<Fragment>
|
<CollapsibleCard
|
||||||
{walletData.hasUnclaimedRewards && (
|
titleColor="#788187"
|
||||||
<CollapsibleCard
|
isBoldTitle
|
||||||
titleColor="#788187"
|
defaultTitle={intl.formatMessage({
|
||||||
isBoldTitle
|
id: 'profile.unclaimed_rewards',
|
||||||
defaultTitle={intl.formatMessage({
|
})}
|
||||||
id: 'profile.unclaimed_rewards',
|
expanded
|
||||||
})}
|
|
||||||
expanded
|
|
||||||
>
|
|
||||||
{currentAccountUsername === selectedUsername ? (
|
|
||||||
<MainButton
|
|
||||||
isLoading={isClaiming}
|
|
||||||
isDisable={isClaiming}
|
|
||||||
style={styles.mainButton}
|
|
||||||
height={50}
|
|
||||||
onPress={() => claimRewardBalance()}
|
|
||||||
>
|
>
|
||||||
<View style={styles.mainButtonWrapper}>
|
{currentAccountUsername === selectedUsername ? (
|
||||||
{this._getUnclaimedText(walletData)}
|
<MainButton
|
||||||
<View style={styles.mainIconWrapper}>
|
isLoading={isClaiming}
|
||||||
<Icon name="add" iconType="MaterialIcons" color="#357ce6" size={23} />
|
isDisable={isClaiming}
|
||||||
</View>
|
style={styles.mainButton}
|
||||||
</View>
|
height={50}
|
||||||
</MainButton>
|
onPress={() => claimRewardBalance()}
|
||||||
) : (
|
>
|
||||||
this._getUnclaimedText(walletData, true)
|
<View style={styles.mainButtonWrapper}>
|
||||||
|
{this._getUnclaimedText(walletData)}
|
||||||
|
<View style={styles.mainIconWrapper}>
|
||||||
|
<Icon name="add" iconType="MaterialIcons" color="#357ce6" size={23} />
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</MainButton>
|
||||||
|
) : (
|
||||||
|
this._getUnclaimedText(walletData, true)
|
||||||
|
)}
|
||||||
|
</CollapsibleCard>
|
||||||
)}
|
)}
|
||||||
</CollapsibleCard>
|
<CollapsibleCard
|
||||||
|
titleColor="#788187"
|
||||||
|
title={intl.formatMessage({
|
||||||
|
id: 'profile.wallet_details',
|
||||||
|
})}
|
||||||
|
expanded
|
||||||
|
>
|
||||||
|
<WalletDetails
|
||||||
|
intl={intl}
|
||||||
|
walletData={walletData}
|
||||||
|
isShowDropdowns={currentAccountUsername === selectedUsername}
|
||||||
|
/>
|
||||||
|
</CollapsibleCard>
|
||||||
|
<Transaction walletData={walletData} />
|
||||||
|
</Fragment>
|
||||||
)}
|
)}
|
||||||
<CollapsibleCard
|
</ScrollView>
|
||||||
titleColor="#788187"
|
|
||||||
title={intl.formatMessage({
|
|
||||||
id: 'profile.wallet_details',
|
|
||||||
})}
|
|
||||||
expanded
|
|
||||||
>
|
|
||||||
<WalletDetails
|
|
||||||
intl={intl}
|
|
||||||
walletData={walletData}
|
|
||||||
isShowDropdowns={currentAccountUsername === selectedUsername}
|
|
||||||
/>
|
|
||||||
</CollapsibleCard>
|
|
||||||
<Transaction walletData={walletData} />
|
|
||||||
</Fragment>
|
|
||||||
)}
|
)}
|
||||||
</ScrollView>
|
</ThemeContainer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
export const POPULAR_FILTERS = [
|
export const POPULAR_FILTERS = ['TRENDING', 'NEW', 'PROMOTED'];
|
||||||
'TRENDING',
|
export const POPULAR_FILTERS_VALUE = ['trending', 'created', 'promoted'];
|
||||||
'HOT',
|
|
||||||
'CREATED',
|
|
||||||
'ACTIVE',
|
|
||||||
'PROMOTED',
|
|
||||||
'VOTES',
|
|
||||||
'CHILDREN',
|
|
||||||
];
|
|
||||||
export const PROFILE_FILTERS = ['BLOG', 'FEED'];
|
export const PROFILE_FILTERS = ['BLOG', 'FEED'];
|
||||||
|
export const PROFILE_FILTERS_VALUE = ['blog', 'feed'];
|
||||||
|
|
||||||
|
// 'TRENDING',
|
||||||
|
// 'HOT',
|
||||||
|
// 'CREATED',
|
||||||
|
// 'ACTIVE',
|
||||||
|
// 'PROMOTED',
|
||||||
|
// 'VOTES',
|
||||||
|
// 'CHILDREN',
|
||||||
|
@ -11,7 +11,7 @@ export default {
|
|||||||
EDITOR: `Editor${SCREEN_SUFFIX}`,
|
EDITOR: `Editor${SCREEN_SUFFIX}`,
|
||||||
FOLLOWS: `Follows${SCREEN_SUFFIX}`,
|
FOLLOWS: `Follows${SCREEN_SUFFIX}`,
|
||||||
SPIN_GAME: `SpinGame${SCREEN_SUFFIX}`,
|
SPIN_GAME: `SpinGame${SCREEN_SUFFIX}`,
|
||||||
HOME: `Home${SCREEN_SUFFIX}`,
|
FEED: `Feed${SCREEN_SUFFIX}`,
|
||||||
LOGIN: `Login${SCREEN_SUFFIX}`,
|
LOGIN: `Login${SCREEN_SUFFIX}`,
|
||||||
PINCODE: `PinCode${SCREEN_SUFFIX}`,
|
PINCODE: `PinCode${SCREEN_SUFFIX}`,
|
||||||
POST: `Post${SCREEN_SUFFIX}`,
|
POST: `Post${SCREEN_SUFFIX}`,
|
||||||
@ -29,7 +29,7 @@ export default {
|
|||||||
MAIN: `Main${DRAWER_SUFFIX}`,
|
MAIN: `Main${DRAWER_SUFFIX}`,
|
||||||
},
|
},
|
||||||
TABBAR: {
|
TABBAR: {
|
||||||
HOME: `Home${TABBAR_SUFFIX}`,
|
FEED: `Feed${TABBAR_SUFFIX}`,
|
||||||
NOTIFICATION: `Notification${TABBAR_SUFFIX}`,
|
NOTIFICATION: `Notification${TABBAR_SUFFIX}`,
|
||||||
POINTS: `Points${TABBAR_SUFFIX}`,
|
POINTS: `Points${TABBAR_SUFFIX}`,
|
||||||
POST_BUTTON: `PostButton${TABBAR_SUFFIX}`,
|
POST_BUTTON: `PostButton${TABBAR_SUFFIX}`,
|
||||||
|
33
src/containers/accountContainer.js
Normal file
33
src/containers/accountContainer.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* eslint-disable no-unused-vars */
|
||||||
|
import React from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
const AccountContainer = ({
|
||||||
|
accounts,
|
||||||
|
children,
|
||||||
|
currentAccount,
|
||||||
|
isLoggedIn,
|
||||||
|
isLoginDone,
|
||||||
|
username,
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
children &&
|
||||||
|
children({
|
||||||
|
accounts,
|
||||||
|
currentAccount,
|
||||||
|
isLoggedIn,
|
||||||
|
isLoginDone,
|
||||||
|
username,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const mapStateToProps = state => ({
|
||||||
|
accounts: state.account.otherAccounts,
|
||||||
|
currentAccount: state.account.currentAccount,
|
||||||
|
isLoggedIn: state.application.isLoggedIn,
|
||||||
|
isLoginDone: state.application.isLoginDone,
|
||||||
|
username: state.account.currentAccount.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(mapStateToProps)(AccountContainer);
|
@ -1,3 +1,4 @@
|
|||||||
|
import AccountContainer from './accountContainer';
|
||||||
import InAppPurchaseContainer from './inAppPurchaseContainer';
|
import InAppPurchaseContainer from './inAppPurchaseContainer';
|
||||||
import PointsContainer from './pointsContainer';
|
import PointsContainer from './pointsContainer';
|
||||||
import ProfileContainer from './profileContainer';
|
import ProfileContainer from './profileContainer';
|
||||||
@ -8,6 +9,7 @@ import TransferContainer from './transferContainer';
|
|||||||
import ThemeContainer from './themeContainer';
|
import ThemeContainer from './themeContainer';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
AccountContainer,
|
||||||
InAppPurchaseContainer,
|
InAppPurchaseContainer,
|
||||||
PointsContainer,
|
PointsContainer,
|
||||||
ProfileContainer,
|
ProfileContainer,
|
||||||
|
@ -107,7 +107,7 @@ class TransferContainer extends Component {
|
|||||||
return validUsers;
|
return validUsers;
|
||||||
};
|
};
|
||||||
|
|
||||||
_transferToAccount = (from, destination, amount, memo) => {
|
_transferToAccount = async (from, destination, amount, memo) => {
|
||||||
const { pinCode, navigation, dispatch, intl } = this.props;
|
const { pinCode, navigation, dispatch, intl } = this.props;
|
||||||
let { currentAccount } = this.props;
|
let { currentAccount } = this.props;
|
||||||
const { selectedAccount } = this.state;
|
const { selectedAccount } = this.state;
|
||||||
@ -160,7 +160,7 @@ class TransferContainer extends Component {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!currentAccount.local) {
|
if (!currentAccount.local) {
|
||||||
const realmData = getUserDataWithUsername(currentAccount.name);
|
const realmData = await getUserDataWithUsername(currentAccount.name);
|
||||||
currentAccount.local = realmData[0];
|
currentAccount.local = realmData[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,13 +6,13 @@ import ROUTES from '../constants/routeNames';
|
|||||||
|
|
||||||
// Components
|
// Components
|
||||||
import { Icon, IconContainer } from '../components/icon';
|
import { Icon, IconContainer } from '../components/icon';
|
||||||
import { Home, Notification, Profile, Points } from '../screens';
|
import { Feed, Notification, Profile, Points } from '../screens';
|
||||||
import { PostButton, BottomTabBar } from '../components';
|
import { PostButton, BottomTabBar } from '../components';
|
||||||
|
|
||||||
const BaseNavigator = createBottomTabNavigator(
|
const BaseNavigator = createBottomTabNavigator(
|
||||||
{
|
{
|
||||||
[ROUTES.TABBAR.HOME]: {
|
[ROUTES.TABBAR.FEED]: {
|
||||||
screen: Home,
|
screen: Feed,
|
||||||
navigationOptions: () => ({
|
navigationOptions: () => ({
|
||||||
tabBarIcon: ({ tintColor }) => (
|
tabBarIcon: ({ tintColor }) => (
|
||||||
<Icon iconType="MaterialIcons" name="view-day" color={tintColor} size={26} />
|
<Icon iconType="MaterialIcons" name="view-day" color={tintColor} size={26} />
|
||||||
|
@ -31,7 +31,7 @@ import { SideMenu } from '../components';
|
|||||||
|
|
||||||
const mainNavigation = createDrawerNavigator(
|
const mainNavigation = createDrawerNavigator(
|
||||||
{
|
{
|
||||||
[ROUTES.SCREENS.HOME]: {
|
[ROUTES.SCREENS.FEED]: {
|
||||||
screen: BaseNavigator,
|
screen: BaseNavigator,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -357,7 +357,13 @@ export const getSCAccessToken = code =>
|
|||||||
api.post('/sc-token-refresh', { code }).then(resp => resolve(resp.data));
|
api.post('/sc-token-refresh', { code }).then(resp => resolve(resp.data));
|
||||||
});
|
});
|
||||||
|
|
||||||
export const getPromotePosts = () => api.get('/promoted-posts').then(resp => resp.data);
|
export const getPromotePosts = () => {
|
||||||
|
try {
|
||||||
|
return api.get('/promoted-posts').then(resp => resp.data);
|
||||||
|
} catch (error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const purchaseOrder = data => api.post('/purchase-order', data).then(resp => resp.data);
|
export const purchaseOrder = data => api.post('/purchase-order', data).then(resp => resp.data);
|
||||||
|
|
||||||
|
@ -29,18 +29,22 @@ export const login = async (username, password, isPinCodeOpen) => {
|
|||||||
let authType = '';
|
let authType = '';
|
||||||
// Get user account data from STEEM Blockchain
|
// Get user account data from STEEM Blockchain
|
||||||
const account = await getUser(username);
|
const account = await getUser(username);
|
||||||
|
const isUserLoggedIn = await isLoggedInUser(username);
|
||||||
|
|
||||||
if (!account) {
|
if (!account) {
|
||||||
return Promise.reject(new Error('auth.invalid_username'));
|
return Promise.reject(new Error('auth.invalid_username'));
|
||||||
}
|
}
|
||||||
if (isLoggedInUser(username)) {
|
|
||||||
|
if (isUserLoggedIn) {
|
||||||
return Promise.reject(new Error('auth.already_logged'));
|
return Promise.reject(new Error('auth.already_logged'));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public keys of user
|
// Public keys of user
|
||||||
const publicKeys = {
|
const publicKeys = {
|
||||||
activeKey: account.active.key_auths.map(x => x[0])[0],
|
activeKey: get(account, 'active.key_auths', []).map(x => x[0])[0],
|
||||||
memoKey: account.memo_key,
|
memoKey: get(account, 'memo_key', ''),
|
||||||
ownerKey: account.owner.key_auths.map(x => x[0])[0],
|
ownerKey: get(account, 'owner.key_auths', []).map(x => x[0])[0],
|
||||||
postingKey: account.posting.key_auths.map(x => x[0])[0],
|
postingKey: get(account, 'posting.key_auths', []).map(x => x[0])[0],
|
||||||
};
|
};
|
||||||
|
|
||||||
// // Set private keys of user
|
// // Set private keys of user
|
||||||
@ -50,8 +54,11 @@ export const login = async (username, password, isPinCodeOpen) => {
|
|||||||
Object.keys(publicKeys).map(pubKey => {
|
Object.keys(publicKeys).map(pubKey => {
|
||||||
if (publicKeys[pubKey] === privateKeys[pubKey].createPublic().toString()) {
|
if (publicKeys[pubKey] === privateKeys[pubKey].createPublic().toString()) {
|
||||||
loginFlag = true;
|
loginFlag = true;
|
||||||
if (privateKeys.isMasterKey) authType = AUTH_TYPE.MASTER_KEY;
|
if (privateKeys.isMasterKey) {
|
||||||
else authType = pubKey;
|
authType = AUTH_TYPE.MASTER_KEY;
|
||||||
|
} else {
|
||||||
|
authType = pubKey;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -105,7 +112,7 @@ export const login = async (username, password, isPinCodeOpen) => {
|
|||||||
|
|
||||||
export const loginWithSC2 = async (code, isPinCodeOpen) => {
|
export const loginWithSC2 = async (code, isPinCodeOpen) => {
|
||||||
const scTokens = await getSCAccessToken(code);
|
const scTokens = await getSCAccessToken(code);
|
||||||
await steemConnect.setAccessToken(scTokens.access_token);
|
await steemConnect.setAccessToken(get(scTokens, 'access_token', ''));
|
||||||
const scAccount = await steemConnect.me();
|
const scAccount = await steemConnect.me();
|
||||||
const account = await getUser(scAccount.account.name);
|
const account = await getUser(scAccount.account.name);
|
||||||
let avatar = '';
|
let avatar = '';
|
||||||
@ -130,13 +137,14 @@ export const loginWithSC2 = async (code, isPinCodeOpen) => {
|
|||||||
memoKey: '',
|
memoKey: '',
|
||||||
accessToken: '',
|
accessToken: '',
|
||||||
};
|
};
|
||||||
|
const isUserLoggedIn = await isLoggedInUser(account.name);
|
||||||
|
|
||||||
if (isPinCodeOpen) {
|
if (isPinCodeOpen) {
|
||||||
account.local = userData;
|
account.local = userData;
|
||||||
} else {
|
} else {
|
||||||
const resData = {
|
const resData = {
|
||||||
pinCode: Config.DEFAULT_PIN,
|
pinCode: Config.DEFAULT_PIN,
|
||||||
accessToken: scTokens.access_token,
|
accessToken: get(scTokens, 'access_token', ''),
|
||||||
};
|
};
|
||||||
const updatedUserData = await getUpdatedUserData(userData, resData);
|
const updatedUserData = await getUpdatedUserData(userData, resData);
|
||||||
|
|
||||||
@ -144,7 +152,7 @@ export const loginWithSC2 = async (code, isPinCodeOpen) => {
|
|||||||
account.local.avatar = avatar;
|
account.local.avatar = avatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLoggedInUser(account.name)) {
|
if (isUserLoggedIn) {
|
||||||
reject(new Error('auth.already_logged'));
|
reject(new Error('auth.already_logged'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +165,7 @@ export const loginWithSC2 = async (code, isPinCodeOpen) => {
|
|||||||
};
|
};
|
||||||
await setAuthStatus(authData);
|
await setAuthStatus(authData);
|
||||||
await setSCAccount(scTokens);
|
await setSCAccount(scTokens);
|
||||||
resolve({ ...account, accessToken: scTokens.access_token });
|
resolve({ ...account, accessToken: get(scTokens, 'access_token', '') });
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
reject(new Error('auth.unknow_error'));
|
reject(new Error('auth.unknow_error'));
|
||||||
@ -167,7 +175,7 @@ export const loginWithSC2 = async (code, isPinCodeOpen) => {
|
|||||||
|
|
||||||
export const setUserDataWithPinCode = async data => {
|
export const setUserDataWithPinCode = async data => {
|
||||||
try {
|
try {
|
||||||
const result = getUserDataWithUsername(data.username);
|
const result = await getUserDataWithUsername(data.username);
|
||||||
const userData = result[0];
|
const userData = result[0];
|
||||||
|
|
||||||
if (!data.password) {
|
if (!data.password) {
|
||||||
@ -178,13 +186,13 @@ export const setUserDataWithPinCode = async data => {
|
|||||||
get(userData, 'postingKey');
|
get(userData, 'postingKey');
|
||||||
|
|
||||||
if (publicKey) {
|
if (publicKey) {
|
||||||
data.password = decryptKey(publicKey, data.pinCode);
|
data.password = decryptKey(publicKey, get(data, 'pinCode'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const updatedUserData = getUpdatedUserData(userData, data);
|
const updatedUserData = getUpdatedUserData(userData, data);
|
||||||
|
|
||||||
await setPinCode(data.pinCode);
|
await setPinCode(get(data, 'pinCode'));
|
||||||
await updateUserData(updatedUserData);
|
await updateUserData(updatedUserData);
|
||||||
|
|
||||||
return updatedUserData;
|
return updatedUserData;
|
||||||
@ -197,15 +205,15 @@ export const updatePinCode = data =>
|
|||||||
new Promise((resolve, reject) => {
|
new Promise((resolve, reject) => {
|
||||||
let currentUser = null;
|
let currentUser = null;
|
||||||
try {
|
try {
|
||||||
setPinCode(data.pinCode);
|
setPinCode(get(data, 'pinCode'));
|
||||||
getUserData().then(async users => {
|
getUserData().then(async users => {
|
||||||
if (users && users.length > 0) {
|
if (users && users.length > 0) {
|
||||||
await users.forEach(userData => {
|
await users.forEach(userData => {
|
||||||
if (
|
if (
|
||||||
userData.authType === AUTH_TYPE.MASTER_KEY ||
|
get(userData, 'authType', '') === AUTH_TYPE.MASTER_KEY ||
|
||||||
userData.authType === AUTH_TYPE.ACTIVE_KEY ||
|
get(userData, 'authType', '') === AUTH_TYPE.ACTIVE_KEY ||
|
||||||
userData.authType === AUTH_TYPE.MEMO_KEY ||
|
get(userData, 'authType', '') === AUTH_TYPE.MEMO_KEY ||
|
||||||
userData.authType === AUTH_TYPE.POSTING_KEY
|
get(userData, 'authType', '') === AUTH_TYPE.POSTING_KEY
|
||||||
) {
|
) {
|
||||||
const publicKey =
|
const publicKey =
|
||||||
get(userData, 'masterKey') ||
|
get(userData, 'masterKey') ||
|
||||||
@ -213,9 +221,12 @@ export const updatePinCode = data =>
|
|||||||
get(userData, 'memoKey') ||
|
get(userData, 'memoKey') ||
|
||||||
get(userData, 'postingKey');
|
get(userData, 'postingKey');
|
||||||
|
|
||||||
data.password = decryptKey(publicKey, data.oldPinCode);
|
data.password = decryptKey(publicKey, get(data, 'oldPinCode', ''));
|
||||||
} else if (userData.authType === AUTH_TYPE.STEEM_CONNECT) {
|
} else if (get(userData, 'authType', '') === AUTH_TYPE.STEEM_CONNECT) {
|
||||||
data.accessToken = decryptKey(userData.accessToken, data.oldPinCode);
|
data.accessToken = decryptKey(
|
||||||
|
get(userData, 'accessToken'),
|
||||||
|
get(data, 'oldPinCode', ''),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
const updatedUserData = getUpdatedUserData(userData, data);
|
const updatedUserData = getUpdatedUserData(userData, data);
|
||||||
updateUserData(updatedUserData);
|
updateUserData(updatedUserData);
|
||||||
@ -234,30 +245,30 @@ export const updatePinCode = data =>
|
|||||||
export const verifyPinCode = async data => {
|
export const verifyPinCode = async data => {
|
||||||
const pinHash = await getPinCode();
|
const pinHash = await getPinCode();
|
||||||
|
|
||||||
const result = getUserDataWithUsername(data.username);
|
const result = await getUserDataWithUsername(data.username);
|
||||||
const userData = result[0];
|
const userData = result[0];
|
||||||
|
|
||||||
// This is migration for new pin structure, it will remove v2.2
|
// This is migration for new pin structure, it will remove v2.2
|
||||||
if (!pinHash) {
|
if (!pinHash) {
|
||||||
try {
|
try {
|
||||||
if (userData.authType === AUTH_TYPE.STEEM_CONNECT) {
|
if (get(userData, 'authType', '') === AUTH_TYPE.STEEM_CONNECT) {
|
||||||
decryptKey(userData.accessToken, data.pinCode);
|
decryptKey(get(userData, 'accessToken'), get(data, 'pinCode'));
|
||||||
} else {
|
} else {
|
||||||
decryptKey(userData.masterKey, data.pinCode);
|
decryptKey(userData.masterKey, get(data, 'pinCode'));
|
||||||
}
|
}
|
||||||
await setPinCode(data.pinCode);
|
await setPinCode(get(data, 'pinCode'));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return Promise.reject(new Error('Invalid pin code, please check and try again'));
|
return Promise.reject(new Error('Invalid pin code, please check and try again'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sha256(data.pinCode).toString() !== pinHash) {
|
if (sha256(get(data, 'pinCode')).toString() !== pinHash) {
|
||||||
return Promise.reject(new Error('auth.invalid_pin'));
|
return Promise.reject(new Error('auth.invalid_pin'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.length > 0) {
|
if (result.length > 0) {
|
||||||
if (userData.authType === AUTH_TYPE.STEEM_CONNECT) {
|
if (get(userData, 'authType', '') === AUTH_TYPE.STEEM_CONNECT) {
|
||||||
await refreshSCToken(userData, data.pinCode);
|
await refreshSCToken(userData, get(data, 'pinCode'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -313,33 +324,39 @@ const getPrivateKeys = (username, password) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getUpdatedUserData = (userData, data) => {
|
export const getUpdatedUserData = (userData, data) => {
|
||||||
const privateKeys = getPrivateKeys(userData.username, data.password);
|
const privateKeys = getPrivateKeys(get(userData, 'username', ''), get(data, 'password'));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
username: userData.username,
|
username: get(userData, 'username', ''),
|
||||||
authType: userData.authType,
|
authType: get(userData, 'authType', ''),
|
||||||
accessToken:
|
accessToken:
|
||||||
userData.authType === AUTH_TYPE.STEEM_CONNECT
|
get(userData, 'authType', '') === AUTH_TYPE.STEEM_CONNECT
|
||||||
? encryptKey(data.accessToken, data.pinCode)
|
? encryptKey(data.accessToken, get(data, 'pinCode'))
|
||||||
: '',
|
: '',
|
||||||
masterKey:
|
masterKey:
|
||||||
userData.authType === AUTH_TYPE.MASTER_KEY ? encryptKey(data.password, data.pinCode) : '',
|
get(userData, 'authType', '') === AUTH_TYPE.MASTER_KEY
|
||||||
|
? encryptKey(data.password, get(data, 'pinCode'))
|
||||||
|
: '',
|
||||||
postingKey:
|
postingKey:
|
||||||
userData.authType === AUTH_TYPE.MASTER_KEY || userData.authType === AUTH_TYPE.POSTING_KEY
|
get(userData, 'authType', '') === AUTH_TYPE.MASTER_KEY ||
|
||||||
? encryptKey(privateKeys.postingKey.toString(), data.pinCode)
|
get(userData, 'authType', '') === AUTH_TYPE.POSTING_KEY
|
||||||
|
? encryptKey(get(privateKeys, 'postingKey', '').toString(), get(data, 'pinCode'))
|
||||||
: '',
|
: '',
|
||||||
activeKey:
|
activeKey:
|
||||||
userData.authType === AUTH_TYPE.MASTER_KEY || userData.authType === AUTH_TYPE.ACTIVE_KEY
|
get(userData, 'authType', '') === AUTH_TYPE.MASTER_KEY ||
|
||||||
? encryptKey(privateKeys.activeKey.toString(), data.pinCode)
|
get(userData, 'authType', '') === AUTH_TYPE.ACTIVE_KEY
|
||||||
|
? encryptKey(get(privateKeys, 'activeKey', '').toString(), get(data, 'pinCode'))
|
||||||
: '',
|
: '',
|
||||||
memoKey:
|
memoKey:
|
||||||
userData.authType === AUTH_TYPE.MASTER_KEY || userData.authType === AUTH_TYPE.MEMO_KEY
|
get(userData, 'authType', '') === AUTH_TYPE.MASTER_KEY ||
|
||||||
? encryptKey(privateKeys.memoKey.toString(), data.pinCode)
|
get(userData, 'authType', '') === AUTH_TYPE.MEMO_KEY
|
||||||
|
? encryptKey(get(privateKeys, 'memoKey', '').toString(), get(data, 'pinCode'))
|
||||||
: '',
|
: '',
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const isLoggedInUser = username => {
|
const isLoggedInUser = async username => {
|
||||||
const result = getUserDataWithUsername(username);
|
const result = await getUserDataWithUsername(username);
|
||||||
if (result.length > 0) {
|
if (result.length > 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import Realm from 'realm';
|
|
||||||
import sha256 from 'crypto-js/sha256';
|
import sha256 from 'crypto-js/sha256';
|
||||||
import { AsyncStorage } from 'react-native';
|
import { AsyncStorage } from 'react-native';
|
||||||
|
|
||||||
@ -9,117 +8,7 @@ const AUTH_SCHEMA = 'auth';
|
|||||||
const DRAFT_SCHEMA = 'draft';
|
const DRAFT_SCHEMA = 'draft';
|
||||||
const SETTINGS_SCHEMA = 'settings';
|
const SETTINGS_SCHEMA = 'settings';
|
||||||
const APPLICATION_SCHEMA = 'application';
|
const APPLICATION_SCHEMA = 'application';
|
||||||
|
const STORAGE_SCHEMA = 'storage';
|
||||||
const userSchema = {
|
|
||||||
name: USER_SCHEMA,
|
|
||||||
properties: {
|
|
||||||
username: { type: 'string' },
|
|
||||||
avatar: { type: 'string' },
|
|
||||||
authType: { type: 'string' },
|
|
||||||
postingKey: { type: 'string' },
|
|
||||||
activeKey: { type: 'string' },
|
|
||||||
memoKey: { type: 'string' },
|
|
||||||
masterKey: { type: 'string' },
|
|
||||||
accessToken: { type: 'string' },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const scAccounts = {
|
|
||||||
name: SC_ACCOUNTS,
|
|
||||||
properties: {
|
|
||||||
username: { type: 'string', default: null },
|
|
||||||
refreshToken: { type: 'string', default: null },
|
|
||||||
expireDate: { type: 'string', default: null },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const draftSchema = {
|
|
||||||
name: DRAFT_SCHEMA,
|
|
||||||
properties: {
|
|
||||||
title: { type: 'string' },
|
|
||||||
tags: { type: 'string' },
|
|
||||||
body: { type: 'string' },
|
|
||||||
username: { type: 'string' },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const settingsSchema = {
|
|
||||||
name: SETTINGS_SCHEMA,
|
|
||||||
properties: {
|
|
||||||
currency: { type: 'string', default: null },
|
|
||||||
isDarkTheme: { type: 'bool', default: false },
|
|
||||||
isPinCodeOpen: { type: 'bool', default: true },
|
|
||||||
isDefaultFooter: { type: 'bool', default: true },
|
|
||||||
language: { type: 'string', default: null },
|
|
||||||
notification: { type: 'bool', default: true },
|
|
||||||
nsfw: { type: 'string', default: null },
|
|
||||||
server: { type: 'string', default: null },
|
|
||||||
upvotePercent: { type: 'string', default: null },
|
|
||||||
followNotification: { type: 'bool', default: true },
|
|
||||||
voteNotification: { type: 'bool', default: true },
|
|
||||||
commentNotification: { type: 'bool', default: true },
|
|
||||||
mentionNotification: { type: 'bool', default: true },
|
|
||||||
reblogNotification: { type: 'bool', default: true },
|
|
||||||
transfersNotification: { type: 'bool', default: true },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const applicationSchema = {
|
|
||||||
name: APPLICATION_SCHEMA,
|
|
||||||
properties: {
|
|
||||||
isPushTokenSaved: { type: 'bool', default: false },
|
|
||||||
isExistUser: { type: 'bool', default: false },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const authSchema = {
|
|
||||||
name: AUTH_SCHEMA,
|
|
||||||
properties: {
|
|
||||||
isLoggedIn: { type: 'bool', default: false },
|
|
||||||
pinCode: { type: 'string' },
|
|
||||||
currentUsername: { type: 'string' },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const realm = new Realm({
|
|
||||||
path: 'esteem.realm',
|
|
||||||
schema: [userSchema, authSchema, draftSchema, settingsSchema, applicationSchema, scAccounts],
|
|
||||||
schemaVersion: 3,
|
|
||||||
migration: (oldRealm, newRealm) => {
|
|
||||||
if (oldRealm.schemaVersion < 3 && newRealm.schemaVersion > 2) {
|
|
||||||
const newObjects = newRealm.objects(SETTINGS_SCHEMA);
|
|
||||||
newObjects[0].isPinCodeOpen = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const settings = realm.objects(SETTINGS_SCHEMA);
|
|
||||||
|
|
||||||
if (Array.from(settings).length <= 0) {
|
|
||||||
realm.write(() => {
|
|
||||||
realm.create(SETTINGS_SCHEMA, {
|
|
||||||
language: '',
|
|
||||||
isDarkTheme: false,
|
|
||||||
currency: '',
|
|
||||||
notification: true,
|
|
||||||
server: '',
|
|
||||||
upvotePercent: '1',
|
|
||||||
nsfw: '0',
|
|
||||||
followNotification: true,
|
|
||||||
voteNotification: true,
|
|
||||||
commentNotification: true,
|
|
||||||
mentionNotification: true,
|
|
||||||
reblogNotification: true,
|
|
||||||
transfersNotification: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export const convertToArray = realmObjectsArray => {
|
|
||||||
const copyOfJsonArray = Array.from(realmObjectsArray);
|
|
||||||
const jsonArray = JSON.parse(JSON.stringify(copyOfJsonArray));
|
|
||||||
return jsonArray;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getItemFromStorage = async key => {
|
export const getItemFromStorage = async key => {
|
||||||
const data = await AsyncStorage.getItem(key);
|
const data = await AsyncStorage.getItem(key);
|
||||||
@ -138,52 +27,6 @@ export const setItemToStorage = async (key, data) => {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getAllData = async () => {
|
|
||||||
try {
|
|
||||||
const keys = await AsyncStorage.getAllKeys();
|
|
||||||
|
|
||||||
const isMigrated = [
|
|
||||||
USER_SCHEMA,
|
|
||||||
SC_ACCOUNTS,
|
|
||||||
AUTH_SCHEMA,
|
|
||||||
DRAFT_SCHEMA,
|
|
||||||
SETTINGS_SCHEMA,
|
|
||||||
APPLICATION_SCHEMA,
|
|
||||||
].some(el => keys.includes(el));
|
|
||||||
if (!isMigrated) {
|
|
||||||
const users = convertToArray(realm.objects(USER_SCHEMA));
|
|
||||||
const scAccount = convertToArray(realm.objects(SC_ACCOUNTS));
|
|
||||||
const draft = convertToArray(realm.objects(DRAFT_SCHEMA));
|
|
||||||
const auth =
|
|
||||||
convertToArray(realm.objects(AUTH_SCHEMA)).length === 1
|
|
||||||
? convertToArray(realm.objects(AUTH_SCHEMA))[0]
|
|
||||||
: convertToArray(realm.objects(AUTH_SCHEMA));
|
|
||||||
const setting =
|
|
||||||
convertToArray(realm.objects(SETTINGS_SCHEMA)).length === 1
|
|
||||||
? convertToArray(realm.objects(SETTINGS_SCHEMA))[0]
|
|
||||||
: convertToArray(realm.objects(SETTINGS_SCHEMA));
|
|
||||||
const application =
|
|
||||||
convertToArray(realm.objects(APPLICATION_SCHEMA)).length === 1
|
|
||||||
? convertToArray(realm.objects(APPLICATION_SCHEMA))[0]
|
|
||||||
: convertToArray(realm.objects(APPLICATION_SCHEMA));
|
|
||||||
|
|
||||||
const data = [
|
|
||||||
[USER_SCHEMA, JSON.stringify(users)],
|
|
||||||
[SC_ACCOUNTS, JSON.stringify(scAccount)],
|
|
||||||
[AUTH_SCHEMA, JSON.stringify(auth)],
|
|
||||||
[DRAFT_SCHEMA, JSON.stringify(draft)],
|
|
||||||
[SETTINGS_SCHEMA, JSON.stringify(setting)],
|
|
||||||
[APPLICATION_SCHEMA, JSON.stringify(application)],
|
|
||||||
];
|
|
||||||
AsyncStorage.multiSet(data);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
getAllData();
|
|
||||||
|
|
||||||
// TODO: This is getting ALL user data, we should change this method with getUserDataWithUsername
|
// TODO: This is getting ALL user data, we should change this method with getUserDataWithUsername
|
||||||
export const getUserData = async () => {
|
export const getUserData = async () => {
|
||||||
try {
|
try {
|
||||||
@ -197,8 +40,11 @@ export const getUserData = async () => {
|
|||||||
export const getUserDataWithUsername = async username => {
|
export const getUserDataWithUsername = async username => {
|
||||||
try {
|
try {
|
||||||
const user = await getItemFromStorage(USER_SCHEMA);
|
const user = await getItemFromStorage(USER_SCHEMA);
|
||||||
const userObj = user.filter(u => u.username === username);
|
if (user) {
|
||||||
return userObj;
|
const userObj = user.filter(u => u.username === username);
|
||||||
|
return userObj;
|
||||||
|
}
|
||||||
|
return [];
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -207,7 +53,7 @@ export const getUserDataWithUsername = async username => {
|
|||||||
export const setUserData = async userData => {
|
export const setUserData = async userData => {
|
||||||
try {
|
try {
|
||||||
const account = await getUserDataWithUsername(userData.username);
|
const account = await getUserDataWithUsername(userData.username);
|
||||||
const user = await getItemFromStorage(USER_SCHEMA);
|
const user = (await getItemFromStorage(USER_SCHEMA)) || [];
|
||||||
|
|
||||||
if (account.length === 0) {
|
if (account.length === 0) {
|
||||||
user.push(userData);
|
user.push(userData);
|
||||||
@ -388,8 +234,8 @@ export const getPinCode = async () => {
|
|||||||
export const getPinCodeOpen = async () => {
|
export const getPinCodeOpen = async () => {
|
||||||
try {
|
try {
|
||||||
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
||||||
if (setting[0]) {
|
if (setting) {
|
||||||
return setting[0].isPinCodeOpen;
|
return setting.isPinCodeOpen;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -426,8 +272,8 @@ export const setTheme = async isDarkTheme => {
|
|||||||
export const getTheme = async () => {
|
export const getTheme = async () => {
|
||||||
try {
|
try {
|
||||||
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
||||||
if (setting[0]) {
|
if (setting) {
|
||||||
return setting[0].isDarkTheme;
|
return setting.isDarkTheme;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -464,8 +310,8 @@ export const setUpvotePercent = async percent => {
|
|||||||
export const getUpvotePercent = async () => {
|
export const getUpvotePercent = async () => {
|
||||||
try {
|
try {
|
||||||
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
||||||
if (setting[0]) {
|
if (setting) {
|
||||||
return setting[0].upvotePercent;
|
return setting.upvotePercent;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -476,8 +322,8 @@ export const getUpvotePercent = async () => {
|
|||||||
export const getNsfw = async () => {
|
export const getNsfw = async () => {
|
||||||
try {
|
try {
|
||||||
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
||||||
if (setting[0]) {
|
if (setting) {
|
||||||
return setting[0].nsfw;
|
return setting.nsfw;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -577,8 +423,8 @@ export const setCurrency = async currencyProps => {
|
|||||||
export const getLanguage = async () => {
|
export const getLanguage = async () => {
|
||||||
try {
|
try {
|
||||||
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
||||||
if (setting[0]) {
|
if (setting) {
|
||||||
return setting[0].language;
|
return setting.language;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -589,8 +435,8 @@ export const getLanguage = async () => {
|
|||||||
export const getServer = async () => {
|
export const getServer = async () => {
|
||||||
try {
|
try {
|
||||||
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
const setting = await getItemFromStorage(SETTINGS_SCHEMA);
|
||||||
if (setting[0]) {
|
if (setting) {
|
||||||
return setting[0].server;
|
return setting.server;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -605,7 +451,23 @@ export const getSettings = async () => {
|
|||||||
if (setting) {
|
if (setting) {
|
||||||
return setting;
|
return setting;
|
||||||
}
|
}
|
||||||
return false;
|
const settingData = {
|
||||||
|
language: '',
|
||||||
|
isDarkTheme: false,
|
||||||
|
currency: '',
|
||||||
|
notification: true,
|
||||||
|
server: '',
|
||||||
|
upvotePercent: '1',
|
||||||
|
nsfw: '0',
|
||||||
|
followNotification: true,
|
||||||
|
voteNotification: true,
|
||||||
|
commentNotification: true,
|
||||||
|
mentionNotification: true,
|
||||||
|
reblogNotification: true,
|
||||||
|
transfersNotification: true,
|
||||||
|
};
|
||||||
|
await setItemToStorage(SETTINGS_SCHEMA, settingData);
|
||||||
|
return settingData;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -710,7 +572,7 @@ export const getSCAccount = async username => {
|
|||||||
try {
|
try {
|
||||||
const scAccountStr = await getItemFromStorage(SC_ACCOUNTS);
|
const scAccountStr = await getItemFromStorage(SC_ACCOUNTS);
|
||||||
const scAccount = scAccountStr.filter(u => u.username === username);
|
const scAccount = scAccountStr.filter(u => u.username === username);
|
||||||
if (convertToArray(scAccount).length > 0) {
|
if (scAccount.length > 0) {
|
||||||
return scAccount[0];
|
return scAccount[0];
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -735,3 +597,15 @@ export const removeSCAccount = async username => {
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getStorageType = async () => {
|
||||||
|
try {
|
||||||
|
const storageType = await AsyncStorage.getItem(STORAGE_SCHEMA);
|
||||||
|
if (storageType !== null) {
|
||||||
|
return storageType;
|
||||||
|
}
|
||||||
|
return 'R';
|
||||||
|
} catch (error) {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
@ -634,7 +634,7 @@ class ApplicationContainer extends Component {
|
|||||||
|
|
||||||
const accountData = await switchAccount(targetAccountUsername);
|
const accountData = await switchAccount(targetAccountUsername);
|
||||||
|
|
||||||
const realmData = getUserDataWithUsername(targetAccountUsername);
|
const realmData = await getUserDataWithUsername(targetAccountUsername);
|
||||||
const _currentAccount = accountData;
|
const _currentAccount = accountData;
|
||||||
_currentAccount.username = accountData.name;
|
_currentAccount.username = accountData.name;
|
||||||
[_currentAccount.local] = realmData;
|
[_currentAccount.local] = realmData;
|
||||||
|
4
src/screens/feed/index.js
Normal file
4
src/screens/feed/index.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import Feed from './screen/feedScreen';
|
||||||
|
|
||||||
|
export { Feed };
|
||||||
|
export default Feed;
|
43
src/screens/feed/screen/feedScreen.js
Normal file
43
src/screens/feed/screen/feedScreen.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import React, { Fragment } from 'react';
|
||||||
|
import { SafeAreaView } from 'react-native';
|
||||||
|
import get from 'lodash/get';
|
||||||
|
|
||||||
|
// Components
|
||||||
|
import { Posts, Header } from '../../../components';
|
||||||
|
|
||||||
|
// Container
|
||||||
|
import { AccountContainer } from '../../../containers';
|
||||||
|
|
||||||
|
// Styles
|
||||||
|
import styles from './feedStyles';
|
||||||
|
|
||||||
|
import {
|
||||||
|
POPULAR_FILTERS,
|
||||||
|
PROFILE_FILTERS,
|
||||||
|
PROFILE_FILTERS_VALUE,
|
||||||
|
POPULAR_FILTERS_VALUE,
|
||||||
|
} from '../../../constants/options/filters';
|
||||||
|
|
||||||
|
const FeedScreen = () => {
|
||||||
|
return (
|
||||||
|
<AccountContainer>
|
||||||
|
{({ currentAccount, isLoggedIn }) => (
|
||||||
|
<Fragment>
|
||||||
|
<Header />
|
||||||
|
<SafeAreaView style={styles.container}>
|
||||||
|
<Posts
|
||||||
|
filterOptions={[...PROFILE_FILTERS, ...POPULAR_FILTERS]}
|
||||||
|
filterOptionsValue={[...PROFILE_FILTERS_VALUE, ...POPULAR_FILTERS_VALUE]}
|
||||||
|
getFor={isLoggedIn ? 'feed' : 'trending'}
|
||||||
|
selectedOptionIndex={isLoggedIn ? 1 : 2}
|
||||||
|
tag={get(currentAccount, 'name')}
|
||||||
|
customOption="HOT"
|
||||||
|
/>
|
||||||
|
</SafeAreaView>
|
||||||
|
</Fragment>
|
||||||
|
)}
|
||||||
|
</AccountContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FeedScreen;
|
@ -1,38 +0,0 @@
|
|||||||
import React, { PureComponent } from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
// Component
|
|
||||||
import HomeScreen from '../screen/homeScreen';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Props Name Description Value
|
|
||||||
*@props --> props name here description here Value Type Here
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
class HomeContainer extends PureComponent {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { isLoggedIn, isLoginDone, currentAccount } = this.props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<HomeScreen
|
|
||||||
isLoggedIn={isLoggedIn}
|
|
||||||
isLoginDone={isLoginDone}
|
|
||||||
currentAccount={currentAccount}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
|
||||||
isLoggedIn: state.application.isLoggedIn,
|
|
||||||
isLoginDone: state.application.isLoginDone,
|
|
||||||
currentAccount: state.account.currentAccount,
|
|
||||||
});
|
|
||||||
|
|
||||||
export default connect(mapStateToProps)(HomeContainer);
|
|
@ -1,5 +0,0 @@
|
|||||||
import HomeScreen from './screen/homeScreen';
|
|
||||||
import Home from './container/homeContainer';
|
|
||||||
|
|
||||||
export { HomeScreen, Home };
|
|
||||||
export default Home;
|
|
@ -1,73 +0,0 @@
|
|||||||
import React, { PureComponent, Fragment } from 'react';
|
|
||||||
import { View, SafeAreaView } from 'react-native';
|
|
||||||
import ScrollableTabView from 'react-native-scrollable-tab-view';
|
|
||||||
import { injectIntl } from 'react-intl';
|
|
||||||
|
|
||||||
// Components
|
|
||||||
import { TabBar, Posts, Header } from '../../../components';
|
|
||||||
|
|
||||||
// Styles
|
|
||||||
import styles from './homeStyles';
|
|
||||||
import globalStyles from '../../../globalStyles';
|
|
||||||
|
|
||||||
import { POPULAR_FILTERS, PROFILE_FILTERS } from '../../../constants/options/filters';
|
|
||||||
|
|
||||||
class HomeScreen extends PureComponent {
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { currentAccount, intl, isLoggedIn } = this.props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Fragment>
|
|
||||||
<Header />
|
|
||||||
<SafeAreaView style={styles.container}>
|
|
||||||
<ScrollableTabView
|
|
||||||
style={globalStyles.tabView}
|
|
||||||
activeTab={!isLoggedIn ? 1 : 0}
|
|
||||||
renderTabBar={() => (
|
|
||||||
<TabBar
|
|
||||||
style={styles.tabbar}
|
|
||||||
tabUnderlineDefaultWidth={80}
|
|
||||||
tabUnderlineScaleX={2}
|
|
||||||
tabBarPosition="overlayTop"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<View
|
|
||||||
tabLabel={intl.formatMessage({
|
|
||||||
id: 'home.feed',
|
|
||||||
})}
|
|
||||||
style={styles.tabbarItem}
|
|
||||||
>
|
|
||||||
<Posts
|
|
||||||
filterOptions={PROFILE_FILTERS}
|
|
||||||
getFor={PROFILE_FILTERS[1].toLowerCase()}
|
|
||||||
tag={currentAccount.name}
|
|
||||||
selectedOptionIndex={1}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
<View
|
|
||||||
tabLabel={intl.formatMessage({
|
|
||||||
id: 'home.popular',
|
|
||||||
})}
|
|
||||||
style={styles.tabbarItem}
|
|
||||||
>
|
|
||||||
<Posts
|
|
||||||
filterOptions={POPULAR_FILTERS}
|
|
||||||
getFor={POPULAR_FILTERS[0].toLowerCase()}
|
|
||||||
selectedOptionIndex={0}
|
|
||||||
pageType="posts"
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
</ScrollableTabView>
|
|
||||||
</SafeAreaView>
|
|
||||||
</Fragment>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default injectIntl(HomeScreen);
|
|
@ -2,7 +2,7 @@ import { Bookmarks } from './bookmarks';
|
|||||||
import { Drafts } from './drafts';
|
import { Drafts } from './drafts';
|
||||||
import { Editor } from './editor';
|
import { Editor } from './editor';
|
||||||
import { Follows } from './follows';
|
import { Follows } from './follows';
|
||||||
import { Home } from './home';
|
import { Feed } from './feed';
|
||||||
import { Launch } from './launch';
|
import { Launch } from './launch';
|
||||||
import { Login } from './login';
|
import { Login } from './login';
|
||||||
import { Notification } from './notification';
|
import { Notification } from './notification';
|
||||||
@ -27,7 +27,7 @@ export {
|
|||||||
Drafts,
|
Drafts,
|
||||||
Editor,
|
Editor,
|
||||||
Follows,
|
Follows,
|
||||||
Home,
|
Feed,
|
||||||
Launch,
|
Launch,
|
||||||
Login,
|
Login,
|
||||||
Notification,
|
Notification,
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { View } from 'react-native';
|
import { View } from 'react-native';
|
||||||
import LottieView from 'lottie-react-native';
|
import LottieView from 'lottie-react-native';
|
||||||
|
import { initialMode as nativeThemeInitialMode } from 'react-native-dark-mode';
|
||||||
import styles from './launchStyles';
|
import styles from './launchStyles';
|
||||||
|
|
||||||
const LaunchScreen = () => (
|
const LaunchScreen = () => (
|
||||||
<View style={styles.container}>
|
<View style={nativeThemeInitialMode !== 'dark' ? styles.container : styles.darkContainer}>
|
||||||
<LottieView source={require('./animation.json')} autoPlay loop={false} />
|
<LottieView source={require('./animation.json')} autoPlay loop={false} />
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
@ -5,5 +5,12 @@ export default EStyleSheet.create({
|
|||||||
flex: 1,
|
flex: 1,
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
|
backgroundColor: '$pureWhite',
|
||||||
|
},
|
||||||
|
darkContainer: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: '#1e2835',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -108,7 +108,9 @@ class PinCodeContainer extends Component {
|
|||||||
dispatch(updateCurrentAccount({ ..._currentAccount }));
|
dispatch(updateCurrentAccount({ ..._currentAccount }));
|
||||||
this._savePinCode(pin);
|
this._savePinCode(pin);
|
||||||
|
|
||||||
if (callback) callback(pin, oldPinCode);
|
if (callback) {
|
||||||
|
callback(pin, oldPinCode);
|
||||||
|
}
|
||||||
dispatch(closePinCodeModal());
|
dispatch(closePinCodeModal());
|
||||||
if (navigateTo) {
|
if (navigateTo) {
|
||||||
NavigationService.navigate({
|
NavigationService.navigate({
|
||||||
@ -169,7 +171,9 @@ class PinCodeContainer extends Component {
|
|||||||
|
|
||||||
setExistUser(true).then(() => {
|
setExistUser(true).then(() => {
|
||||||
this._savePinCode(pin);
|
this._savePinCode(pin);
|
||||||
if (callback) callback(pin, oldPinCode);
|
if (callback) {
|
||||||
|
callback(pin, oldPinCode);
|
||||||
|
}
|
||||||
dispatch(closePinCodeModal());
|
dispatch(closePinCodeModal());
|
||||||
if (navigateTo) {
|
if (navigateTo) {
|
||||||
NavigationService.navigate({
|
NavigationService.navigate({
|
||||||
@ -193,7 +197,7 @@ class PinCodeContainer extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
const { oldPinCode } = this.state;
|
const { oldPinCode } = this.state;
|
||||||
|
|
||||||
// If the user is exist, we are just checking to pin and navigating to home screen
|
// If the user is exist, we are just checking to pin and navigating to feed screen
|
||||||
const pinData = {
|
const pinData = {
|
||||||
pinCode: pin,
|
pinCode: pin,
|
||||||
password: currentAccount ? currentAccount.password : '',
|
password: currentAccount ? currentAccount.password : '',
|
||||||
@ -203,19 +207,20 @@ class PinCodeContainer extends Component {
|
|||||||
verifyPinCode(pinData)
|
verifyPinCode(pinData)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this._savePinCode(pin);
|
this._savePinCode(pin);
|
||||||
const realmData = getUserDataWithUsername(currentAccount.name);
|
getUserDataWithUsername(currentAccount.name).then(realmData => {
|
||||||
const _currentAccount = currentAccount;
|
const _currentAccount = currentAccount;
|
||||||
_currentAccount.username = _currentAccount.name;
|
_currentAccount.username = _currentAccount.name;
|
||||||
[_currentAccount.local] = realmData;
|
[_currentAccount.local] = realmData;
|
||||||
dispatch(updateCurrentAccount({ ..._currentAccount }));
|
dispatch(updateCurrentAccount({ ..._currentAccount }));
|
||||||
dispatch(closePinCodeModal());
|
dispatch(closePinCodeModal());
|
||||||
if (callback) callback(pin, oldPinCode);
|
if (callback) callback(pin, oldPinCode);
|
||||||
if (navigateTo) {
|
if (navigateTo) {
|
||||||
NavigationService.navigate({
|
NavigationService.navigate({
|
||||||
routeName: navigateTo,
|
routeName: navigateTo,
|
||||||
params: navigateParams,
|
params: navigateParams,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
});
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
Alert.alert(
|
Alert.alert(
|
||||||
@ -240,7 +245,7 @@ class PinCodeContainer extends Component {
|
|||||||
const { intl, currentAccount, applicationPinCode } = this.props;
|
const { intl, currentAccount, applicationPinCode } = this.props;
|
||||||
const { isExistUser, pinCode } = this.state;
|
const { isExistUser, pinCode } = this.state;
|
||||||
|
|
||||||
const realmData = getUserDataWithUsername(currentAccount.name);
|
const realmData = await getUserDataWithUsername(currentAccount.name);
|
||||||
const userData = realmData[0];
|
const userData = realmData[0];
|
||||||
|
|
||||||
// For exist users
|
// For exist users
|
||||||
|
@ -10,6 +10,13 @@ import { SearchInput, Posts, TabBar } from '../../../components';
|
|||||||
import styles from './searchResultStyles';
|
import styles from './searchResultStyles';
|
||||||
import globalStyles from '../../../globalStyles';
|
import globalStyles from '../../../globalStyles';
|
||||||
|
|
||||||
|
import {
|
||||||
|
POPULAR_FILTERS,
|
||||||
|
PROFILE_FILTERS,
|
||||||
|
PROFILE_FILTERS_VALUE,
|
||||||
|
POPULAR_FILTERS_VALUE,
|
||||||
|
} from '../../../constants/options/filters';
|
||||||
|
|
||||||
class SearchResultScreen extends PureComponent {
|
class SearchResultScreen extends PureComponent {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
@ -46,7 +53,12 @@ class SearchResultScreen extends PureComponent {
|
|||||||
})}
|
})}
|
||||||
style={styles.tabbarItem}
|
style={styles.tabbarItem}
|
||||||
>
|
>
|
||||||
<Posts pageType="posts" tag={tag} />
|
<Posts
|
||||||
|
key={tag}
|
||||||
|
filterOptions={POPULAR_FILTERS}
|
||||||
|
filterOptionsValue={POPULAR_FILTERS_VALUE}
|
||||||
|
tag={tag}
|
||||||
|
/>
|
||||||
</View>
|
</View>
|
||||||
</ScrollableTabView>
|
</ScrollableTabView>
|
||||||
</View>
|
</View>
|
||||||
|
379
yarn.lock
379
yarn.lock
@ -1890,20 +1890,6 @@ arr-union@^3.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
|
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
|
||||||
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
|
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
|
||||||
|
|
||||||
array-back@^1.0.3, array-back@^1.0.4:
|
|
||||||
version "1.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"
|
|
||||||
integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=
|
|
||||||
dependencies:
|
|
||||||
typical "^2.6.0"
|
|
||||||
|
|
||||||
array-back@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022"
|
|
||||||
integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==
|
|
||||||
dependencies:
|
|
||||||
typical "^2.6.1"
|
|
||||||
|
|
||||||
array-equal@^1.0.0:
|
array-equal@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
||||||
@ -2273,14 +2259,6 @@ bip66@^1.1.5:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
|
|
||||||
bl@^1.0.0:
|
|
||||||
version "1.2.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
|
||||||
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
|
|
||||||
dependencies:
|
|
||||||
readable-stream "^2.3.5"
|
|
||||||
safe-buffer "^5.1.1"
|
|
||||||
|
|
||||||
bn.js@^4.11.8, bn.js@^4.4.0:
|
bn.js@^4.11.8, bn.js@^4.4.0:
|
||||||
version "4.11.8"
|
version "4.11.8"
|
||||||
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
|
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
|
||||||
@ -2367,29 +2345,11 @@ bser@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
node-int64 "^0.4.0"
|
node-int64 "^0.4.0"
|
||||||
|
|
||||||
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"
|
|
||||||
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
|
||||||
|
|
||||||
buffer-alloc@^1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
|
||||||
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
|
||||||
dependencies:
|
|
||||||
buffer-alloc-unsafe "^1.1.0"
|
|
||||||
buffer-fill "^1.0.0"
|
|
||||||
|
|
||||||
buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
|
buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
|
||||||
version "0.2.13"
|
version "0.2.13"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||||
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
|
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
|
||||||
|
|
||||||
buffer-fill@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
|
||||||
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
|
||||||
|
|
||||||
buffer-from@^1.0.0:
|
buffer-from@^1.0.0:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||||
@ -2511,11 +2471,6 @@ capture-exit@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
rsvp "^4.8.4"
|
rsvp "^4.8.4"
|
||||||
|
|
||||||
caseless@~0.11.0:
|
|
||||||
version "0.11.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
|
|
||||||
integrity sha1-cVuW6phBWTzDMGeSP17GDr2k99c=
|
|
||||||
|
|
||||||
caseless@~0.12.0:
|
caseless@~0.12.0:
|
||||||
version "0.12.0"
|
version "0.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||||
@ -2707,15 +2662,6 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
|
|||||||
dependencies:
|
dependencies:
|
||||||
delayed-stream "~1.0.0"
|
delayed-stream "~1.0.0"
|
||||||
|
|
||||||
command-line-args@^4.0.6:
|
|
||||||
version "4.0.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-4.0.7.tgz#f8d1916ecb90e9e121eda6428e41300bfb64cc46"
|
|
||||||
integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==
|
|
||||||
dependencies:
|
|
||||||
array-back "^2.0.0"
|
|
||||||
find-replace "^1.0.3"
|
|
||||||
typical "^2.6.1"
|
|
||||||
|
|
||||||
commander@2.20.0:
|
commander@2.20.0:
|
||||||
version "2.20.0"
|
version "2.20.0"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
||||||
@ -2736,13 +2682,6 @@ commander@~2.13.0:
|
|||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
|
||||||
integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==
|
integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==
|
||||||
|
|
||||||
commander@~2.8.1:
|
|
||||||
version "2.8.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
|
|
||||||
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
|
|
||||||
dependencies:
|
|
||||||
graceful-readlink ">= 1.0.0"
|
|
||||||
|
|
||||||
common-tags@^1.4.0:
|
common-tags@^1.4.0:
|
||||||
version "1.8.0"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
|
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
|
||||||
@ -2783,7 +2722,7 @@ concat-map@0.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||||
|
|
||||||
concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.6.0:
|
concat-stream@^1.4.7, concat-stream@^1.6.0:
|
||||||
version "1.6.2"
|
version "1.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
|
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
|
||||||
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
|
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
|
||||||
@ -3053,59 +2992,6 @@ decode-uri-component@^0.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
|
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
|
||||||
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
|
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
|
||||||
|
|
||||||
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
|
|
||||||
version "4.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
|
|
||||||
integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
|
|
||||||
dependencies:
|
|
||||||
file-type "^5.2.0"
|
|
||||||
is-stream "^1.1.0"
|
|
||||||
tar-stream "^1.5.2"
|
|
||||||
|
|
||||||
decompress-tarbz2@^4.0.0:
|
|
||||||
version "4.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
|
|
||||||
integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
|
|
||||||
dependencies:
|
|
||||||
decompress-tar "^4.1.0"
|
|
||||||
file-type "^6.1.0"
|
|
||||||
is-stream "^1.1.0"
|
|
||||||
seek-bzip "^1.0.5"
|
|
||||||
unbzip2-stream "^1.0.9"
|
|
||||||
|
|
||||||
decompress-targz@^4.0.0:
|
|
||||||
version "4.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
|
|
||||||
integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
|
|
||||||
dependencies:
|
|
||||||
decompress-tar "^4.1.1"
|
|
||||||
file-type "^5.2.0"
|
|
||||||
is-stream "^1.1.0"
|
|
||||||
|
|
||||||
decompress-unzip@^4.0.1:
|
|
||||||
version "4.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
|
|
||||||
integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
|
|
||||||
dependencies:
|
|
||||||
file-type "^3.8.0"
|
|
||||||
get-stream "^2.2.0"
|
|
||||||
pify "^2.3.0"
|
|
||||||
yauzl "^2.4.2"
|
|
||||||
|
|
||||||
decompress@^4.2.0:
|
|
||||||
version "4.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
|
|
||||||
integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
|
|
||||||
dependencies:
|
|
||||||
decompress-tar "^4.0.0"
|
|
||||||
decompress-tarbz2 "^4.0.0"
|
|
||||||
decompress-targz "^4.0.0"
|
|
||||||
decompress-unzip "^4.0.1"
|
|
||||||
graceful-fs "^4.1.10"
|
|
||||||
make-dir "^1.0.0"
|
|
||||||
pify "^2.3.0"
|
|
||||||
strip-dirs "^2.0.0"
|
|
||||||
|
|
||||||
dedent@^0.6.0:
|
dedent@^0.6.0:
|
||||||
version "0.6.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb"
|
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb"
|
||||||
@ -3131,11 +3017,6 @@ deep-is@~0.1.3:
|
|||||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
||||||
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
|
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
|
||||||
|
|
||||||
deepmerge@2.1.0:
|
|
||||||
version "2.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.0.tgz#511a54fff405fc346f0240bb270a3e9533a31102"
|
|
||||||
integrity sha512-Q89Z26KAfA3lpPGhbF6XMfYAm3jIV3avViy6KOJ2JLzFbeWHOvPQUu5aSJIWXap3gDZC2y1eF5HXEPI2wGqgvw==
|
|
||||||
|
|
||||||
deepmerge@^3.2.0:
|
deepmerge@^3.2.0:
|
||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7"
|
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7"
|
||||||
@ -3402,7 +3283,7 @@ encoding@^0.1.11:
|
|||||||
dependencies:
|
dependencies:
|
||||||
iconv-lite "~0.4.13"
|
iconv-lite "~0.4.13"
|
||||||
|
|
||||||
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
|
end-of-stream@^1.1.0:
|
||||||
version "1.4.4"
|
version "1.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
||||||
@ -4132,13 +4013,6 @@ fbjs@^0.8.4, fbjs@^0.8.9:
|
|||||||
setimmediate "^1.0.5"
|
setimmediate "^1.0.5"
|
||||||
ua-parser-js "^0.7.18"
|
ua-parser-js "^0.7.18"
|
||||||
|
|
||||||
fd-slicer@~1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
|
||||||
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
|
|
||||||
dependencies:
|
|
||||||
pend "~1.2.0"
|
|
||||||
|
|
||||||
figures@^1.3.5, figures@^1.7.0:
|
figures@^1.3.5, figures@^1.7.0:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
|
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
|
||||||
@ -4169,21 +4043,6 @@ file-entry-cache@^5.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
flat-cache "^2.0.1"
|
flat-cache "^2.0.1"
|
||||||
|
|
||||||
file-type@^3.8.0:
|
|
||||||
version "3.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
|
||||||
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
|
|
||||||
|
|
||||||
file-type@^5.2.0:
|
|
||||||
version "5.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
|
|
||||||
integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
|
|
||||||
|
|
||||||
file-type@^6.1.0:
|
|
||||||
version "6.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
|
|
||||||
integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
|
|
||||||
|
|
||||||
file-uri-to-path@1, file-uri-to-path@1.0.0:
|
file-uri-to-path@1, file-uri-to-path@1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
||||||
@ -4226,14 +4085,6 @@ find-parent-dir@^0.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
|
resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
|
||||||
integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=
|
integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=
|
||||||
|
|
||||||
find-replace@^1.0.3:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0"
|
|
||||||
integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=
|
|
||||||
dependencies:
|
|
||||||
array-back "^1.0.4"
|
|
||||||
test-value "^2.1.0"
|
|
||||||
|
|
||||||
find-up@^2.0.0, find-up@^2.1.0:
|
find-up@^2.0.0, find-up@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
|
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
|
||||||
@ -4331,11 +4182,6 @@ fresh@0.5.2:
|
|||||||
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
||||||
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
||||||
|
|
||||||
fs-constants@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
|
||||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
|
||||||
|
|
||||||
fs-extra@^1.0.0:
|
fs-extra@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
|
||||||
@ -4345,15 +4191,6 @@ fs-extra@^1.0.0:
|
|||||||
jsonfile "^2.1.0"
|
jsonfile "^2.1.0"
|
||||||
klaw "^1.0.0"
|
klaw "^1.0.0"
|
||||||
|
|
||||||
fs-extra@^4.0.3:
|
|
||||||
version "4.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
|
|
||||||
integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
|
|
||||||
dependencies:
|
|
||||||
graceful-fs "^4.1.2"
|
|
||||||
jsonfile "^4.0.0"
|
|
||||||
universalify "^0.1.0"
|
|
||||||
|
|
||||||
fs-extra@^7.0.1:
|
fs-extra@^7.0.1:
|
||||||
version "7.0.1"
|
version "7.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
|
||||||
@ -4435,14 +4272,6 @@ get-stdin@^6.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
|
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
|
||||||
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
|
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
|
||||||
|
|
||||||
get-stream@^2.2.0:
|
|
||||||
version "2.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
|
||||||
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
|
|
||||||
dependencies:
|
|
||||||
object-assign "^4.0.1"
|
|
||||||
pinkie-promise "^2.0.0"
|
|
||||||
|
|
||||||
get-stream@^3.0.0:
|
get-stream@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
||||||
@ -4514,16 +4343,11 @@ globals@^11.0.1, globals@^11.1.0, globals@^11.7.0:
|
|||||||
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
|
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
|
||||||
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
|
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
|
||||||
|
|
||||||
graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
|
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
|
||||||
version "4.2.2"
|
version "4.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
|
||||||
integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
|
integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
|
||||||
|
|
||||||
"graceful-readlink@>= 1.0.0":
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
|
||||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
|
||||||
|
|
||||||
growly@^1.3.0:
|
growly@^1.3.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
|
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
|
||||||
@ -4703,15 +4527,6 @@ htmlparser2@^3.10.0, htmlparser2@^3.10.1:
|
|||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
readable-stream "^3.1.1"
|
readable-stream "^3.1.1"
|
||||||
|
|
||||||
http-basic@^2.5.1:
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-2.5.1.tgz#8ce447bdb5b6c577f8a63e3fa78056ec4bb4dbfb"
|
|
||||||
integrity sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=
|
|
||||||
dependencies:
|
|
||||||
caseless "~0.11.0"
|
|
||||||
concat-stream "^1.4.6"
|
|
||||||
http-response-object "^1.0.0"
|
|
||||||
|
|
||||||
http-errors@1.7.3, http-errors@~1.7.2:
|
http-errors@1.7.3, http-errors@~1.7.2:
|
||||||
version "1.7.3"
|
version "1.7.3"
|
||||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
|
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
|
||||||
@ -4731,11 +4546,6 @@ http-proxy-agent@^2.1.0:
|
|||||||
agent-base "4"
|
agent-base "4"
|
||||||
debug "3.1.0"
|
debug "3.1.0"
|
||||||
|
|
||||||
http-response-object@^1.0.0, http-response-object@^1.0.1, http-response-object@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-1.1.0.tgz#a7c4e75aae82f3bb4904e4f43f615673b4d518c3"
|
|
||||||
integrity sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=
|
|
||||||
|
|
||||||
http-signature@~1.2.0:
|
http-signature@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
||||||
@ -4844,7 +4654,7 @@ inherits@2.0.3:
|
|||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
||||||
|
|
||||||
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
|
ini@^1.3.4, ini@~1.3.0:
|
||||||
version "1.3.5"
|
version "1.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
|
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
|
||||||
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
|
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
|
||||||
@ -5082,11 +4892,6 @@ is-glob@^4.0.0, is-glob@^4.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-extglob "^2.1.1"
|
is-extglob "^2.1.1"
|
||||||
|
|
||||||
is-natural-number@^4.0.1:
|
|
||||||
version "4.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
|
|
||||||
integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
|
|
||||||
|
|
||||||
is-number@^3.0.0:
|
is-number@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
|
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
|
||||||
@ -6154,13 +5959,6 @@ lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5:
|
|||||||
pseudomap "^1.0.2"
|
pseudomap "^1.0.2"
|
||||||
yallist "^2.1.2"
|
yallist "^2.1.2"
|
||||||
|
|
||||||
make-dir@^1.0.0:
|
|
||||||
version "1.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
|
|
||||||
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
|
|
||||||
dependencies:
|
|
||||||
pify "^3.0.0"
|
|
||||||
|
|
||||||
make-dir@^2.0.0, make-dir@^2.1.0:
|
make-dir@^2.0.0, make-dir@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
|
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
|
||||||
@ -6700,7 +6498,7 @@ node-fetch@2.6.0, node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
||||||
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
||||||
|
|
||||||
node-fetch@^1.0.1, node-fetch@^1.7.3:
|
node-fetch@^1.0.1:
|
||||||
version "1.7.3"
|
version "1.7.3"
|
||||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
|
||||||
integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
|
integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
|
||||||
@ -6713,11 +6511,6 @@ node-int64@^0.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
|
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
|
||||||
integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
|
integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
|
||||||
|
|
||||||
node-machine-id@^1.1.10:
|
|
||||||
version "1.1.12"
|
|
||||||
resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267"
|
|
||||||
integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==
|
|
||||||
|
|
||||||
node-modules-regexp@^1.0.0:
|
node-modules-regexp@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
|
resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
|
||||||
@ -6750,22 +6543,6 @@ node-pre-gyp@^0.12.0:
|
|||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
tar "^4"
|
tar "^4"
|
||||||
|
|
||||||
node-pre-gyp@^0.13.0:
|
|
||||||
version "0.13.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42"
|
|
||||||
integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==
|
|
||||||
dependencies:
|
|
||||||
detect-libc "^1.0.2"
|
|
||||||
mkdirp "^0.5.1"
|
|
||||||
needle "^2.2.1"
|
|
||||||
nopt "^4.0.1"
|
|
||||||
npm-packlist "^1.1.6"
|
|
||||||
npmlog "^4.0.2"
|
|
||||||
rc "^1.2.7"
|
|
||||||
rimraf "^2.6.1"
|
|
||||||
semver "^5.3.0"
|
|
||||||
tar "^4"
|
|
||||||
|
|
||||||
nopt@^4.0.1, nopt@~4.0.1:
|
nopt@^4.0.1, nopt@~4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
|
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
|
||||||
@ -7288,17 +7065,12 @@ pegjs@^0.10.0:
|
|||||||
resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd"
|
resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd"
|
||||||
integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=
|
integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=
|
||||||
|
|
||||||
pend@~1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
|
||||||
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
|
|
||||||
|
|
||||||
performance-now@^2.1.0:
|
performance-now@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||||
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||||
|
|
||||||
pify@^2.0.0, pify@^2.3.0:
|
pify@^2.0.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||||
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
||||||
@ -7480,7 +7252,7 @@ process@^0.11.1:
|
|||||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||||
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
||||||
|
|
||||||
progress@^2.0.0, progress@^2.0.3:
|
progress@^2.0.0:
|
||||||
version "2.0.3"
|
version "2.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||||
@ -7579,7 +7351,7 @@ q@^1.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
|
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
|
||||||
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
|
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
|
||||||
|
|
||||||
qs@^6.1.0, qs@^6.5.1:
|
qs@^6.5.1:
|
||||||
version "6.9.0"
|
version "6.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409"
|
||||||
integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==
|
integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==
|
||||||
@ -7603,11 +7375,6 @@ querystring@0.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||||
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
||||||
|
|
||||||
querystringify@^2.1.1:
|
|
||||||
version "2.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
|
|
||||||
integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
|
|
||||||
|
|
||||||
range-parser@~1.2.1:
|
range-parser@~1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
||||||
@ -8086,7 +7853,7 @@ readable-stream@3, readable-stream@^3.1.1:
|
|||||||
string_decoder "^1.1.1"
|
string_decoder "^1.1.1"
|
||||||
util-deprecate "^1.0.1"
|
util-deprecate "^1.0.1"
|
||||||
|
|
||||||
readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
|
readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6:
|
||||||
version "2.3.6"
|
version "2.3.6"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||||
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
|
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
|
||||||
@ -8099,28 +7866,6 @@ readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable
|
|||||||
string_decoder "~1.1.1"
|
string_decoder "~1.1.1"
|
||||||
util-deprecate "~1.0.1"
|
util-deprecate "~1.0.1"
|
||||||
|
|
||||||
realm@^3.2.0:
|
|
||||||
version "3.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/realm/-/realm-3.2.0.tgz#32aa87c98d9db5f0c289f4d235bd35813620a903"
|
|
||||||
integrity sha512-bAS16v0jVmmH2/o4kEdBETf+ywhIy9Bq4rXKBpGZ9egSBdlYBIOfO/dhDqeMaR+toEGrfMgvobDSiQYUgGiBBw==
|
|
||||||
dependencies:
|
|
||||||
command-line-args "^4.0.6"
|
|
||||||
decompress "^4.2.0"
|
|
||||||
deepmerge "2.1.0"
|
|
||||||
fs-extra "^4.0.3"
|
|
||||||
https-proxy-agent "^2.2.1"
|
|
||||||
ini "^1.3.5"
|
|
||||||
nan "^2.12.1"
|
|
||||||
node-fetch "^1.7.3"
|
|
||||||
node-machine-id "^1.1.10"
|
|
||||||
node-pre-gyp "^0.13.0"
|
|
||||||
progress "^2.0.3"
|
|
||||||
prop-types "^15.6.2"
|
|
||||||
request "^2.88.0"
|
|
||||||
stream-counter "^1.0.0"
|
|
||||||
sync-request "^3.0.1"
|
|
||||||
url-parse "^1.4.4"
|
|
||||||
|
|
||||||
realpath-native@^1.1.0:
|
realpath-native@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
|
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
|
||||||
@ -8288,7 +8033,7 @@ request-promise-native@^1.0.5:
|
|||||||
stealthy-require "^1.1.1"
|
stealthy-require "^1.1.1"
|
||||||
tough-cookie "^2.3.3"
|
tough-cookie "^2.3.3"
|
||||||
|
|
||||||
request@^2.87.0, request@^2.88.0:
|
request@^2.87.0:
|
||||||
version "2.88.0"
|
version "2.88.0"
|
||||||
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
|
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
|
||||||
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
|
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
|
||||||
@ -8342,11 +8087,6 @@ require-uncached@^1.0.3:
|
|||||||
caller-path "^0.1.0"
|
caller-path "^0.1.0"
|
||||||
resolve-from "^1.0.0"
|
resolve-from "^1.0.0"
|
||||||
|
|
||||||
requires-port@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
|
||||||
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
|
|
||||||
|
|
||||||
resolve-cwd@^2.0.0:
|
resolve-cwd@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
|
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
|
||||||
@ -8569,13 +8309,6 @@ secp256k1@^3.5.2:
|
|||||||
nan "^2.14.0"
|
nan "^2.14.0"
|
||||||
safe-buffer "^5.1.2"
|
safe-buffer "^5.1.2"
|
||||||
|
|
||||||
seek-bzip@^1.0.5:
|
|
||||||
version "1.0.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
|
|
||||||
integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
|
|
||||||
dependencies:
|
|
||||||
commander "~2.8.1"
|
|
||||||
|
|
||||||
semver-compare@^1.0.0:
|
semver-compare@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
|
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
|
||||||
@ -9002,11 +8735,6 @@ stream-buffers@~2.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
|
resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
|
||||||
integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=
|
integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=
|
||||||
|
|
||||||
stream-counter@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-1.0.0.tgz#91cf2569ce4dc5061febcd7acb26394a5a114751"
|
|
||||||
integrity sha1-kc8lac5NxQYf6816yyY5SloRR1E=
|
|
||||||
|
|
||||||
strict-uri-encode@^2.0.0:
|
strict-uri-encode@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
|
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
|
||||||
@ -9121,13 +8849,6 @@ strip-bom@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
|
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
|
||||||
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
|
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
|
||||||
|
|
||||||
strip-dirs@^2.0.0:
|
|
||||||
version "2.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
|
|
||||||
integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
|
|
||||||
dependencies:
|
|
||||||
is-natural-number "^4.0.1"
|
|
||||||
|
|
||||||
strip-eof@^1.0.0:
|
strip-eof@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||||
@ -9201,15 +8922,6 @@ symbol-tree@^3.2.2:
|
|||||||
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
||||||
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
|
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
|
||||||
|
|
||||||
sync-request@^3.0.1:
|
|
||||||
version "3.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-3.0.1.tgz#caa1235aaf889ba501076a1834c436830a82fb73"
|
|
||||||
integrity sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=
|
|
||||||
dependencies:
|
|
||||||
concat-stream "^1.4.7"
|
|
||||||
http-response-object "^1.0.1"
|
|
||||||
then-request "^2.0.1"
|
|
||||||
|
|
||||||
table@4.0.2:
|
table@4.0.2:
|
||||||
version "4.0.2"
|
version "4.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
|
resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
|
||||||
@ -9232,19 +8944,6 @@ table@^5.2.3:
|
|||||||
slice-ansi "^2.1.0"
|
slice-ansi "^2.1.0"
|
||||||
string-width "^3.0.0"
|
string-width "^3.0.0"
|
||||||
|
|
||||||
tar-stream@^1.5.2:
|
|
||||||
version "1.6.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
|
||||||
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
|
|
||||||
dependencies:
|
|
||||||
bl "^1.0.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.1"
|
|
||||||
xtend "^4.0.0"
|
|
||||||
|
|
||||||
tar@^4:
|
tar@^4:
|
||||||
version "4.4.13"
|
version "4.4.13"
|
||||||
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
|
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
|
||||||
@ -9276,31 +8975,11 @@ test-exclude@^5.2.3:
|
|||||||
read-pkg-up "^4.0.0"
|
read-pkg-up "^4.0.0"
|
||||||
require-main-filename "^2.0.0"
|
require-main-filename "^2.0.0"
|
||||||
|
|
||||||
test-value@^2.1.0:
|
|
||||||
version "2.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291"
|
|
||||||
integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=
|
|
||||||
dependencies:
|
|
||||||
array-back "^1.0.3"
|
|
||||||
typical "^2.6.0"
|
|
||||||
|
|
||||||
text-table@^0.2.0, text-table@~0.2.0:
|
text-table@^0.2.0, text-table@~0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||||
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
|
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
|
||||||
|
|
||||||
then-request@^2.0.1:
|
|
||||||
version "2.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/then-request/-/then-request-2.2.0.tgz#6678b32fa0ca218fe569981bbd8871b594060d81"
|
|
||||||
integrity sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=
|
|
||||||
dependencies:
|
|
||||||
caseless "~0.11.0"
|
|
||||||
concat-stream "^1.4.7"
|
|
||||||
http-basic "^2.5.1"
|
|
||||||
http-response-object "^1.1.0"
|
|
||||||
promise "^7.1.1"
|
|
||||||
qs "^6.1.0"
|
|
||||||
|
|
||||||
throat@^4.0.0, throat@^4.1.0:
|
throat@^4.0.0, throat@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
|
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
|
||||||
@ -9314,7 +8993,7 @@ through2@^2.0.0, through2@^2.0.1:
|
|||||||
readable-stream "~2.3.6"
|
readable-stream "~2.3.6"
|
||||||
xtend "~4.0.1"
|
xtend "~4.0.1"
|
||||||
|
|
||||||
through@^2.3.6, through@^2.3.8:
|
through@^2.3.6:
|
||||||
version "2.3.8"
|
version "2.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||||
@ -9348,11 +9027,6 @@ tmpl@1.0.x:
|
|||||||
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
|
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
|
||||||
integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
|
integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
|
||||||
|
|
||||||
to-buffer@^1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
|
||||||
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
|
|
||||||
|
|
||||||
to-fast-properties@^2.0.0:
|
to-fast-properties@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
|
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
|
||||||
@ -9475,11 +9149,6 @@ typescript@^2.5.1:
|
|||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
|
||||||
integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==
|
integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==
|
||||||
|
|
||||||
typical@^2.6.0, typical@^2.6.1:
|
|
||||||
version "2.6.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d"
|
|
||||||
integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=
|
|
||||||
|
|
||||||
ua-parser-js@^0.7.18:
|
ua-parser-js@^0.7.18:
|
||||||
version "0.7.20"
|
version "0.7.20"
|
||||||
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098"
|
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098"
|
||||||
@ -9511,14 +9180,6 @@ ultron@~1.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
|
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
|
||||||
integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
|
integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
|
||||||
|
|
||||||
unbzip2-stream@^1.0.9:
|
|
||||||
version "1.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a"
|
|
||||||
integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==
|
|
||||||
dependencies:
|
|
||||||
buffer "^5.2.1"
|
|
||||||
through "^2.3.8"
|
|
||||||
|
|
||||||
underscore.string@^3.3.5:
|
underscore.string@^3.3.5:
|
||||||
version "3.3.5"
|
version "3.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
|
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
|
||||||
@ -9590,14 +9251,6 @@ urix@^0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
||||||
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
|
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
|
||||||
|
|
||||||
url-parse@^1.4.4:
|
|
||||||
version "1.4.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
|
|
||||||
integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==
|
|
||||||
dependencies:
|
|
||||||
querystringify "^2.1.1"
|
|
||||||
requires-port "^1.0.0"
|
|
||||||
|
|
||||||
url@^0.11.0:
|
url@^0.11.0:
|
||||||
version "0.11.0"
|
version "0.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
|
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
|
||||||
@ -9927,7 +9580,7 @@ xregexp@2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
|
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
|
||||||
integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
|
integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
|
||||||
|
|
||||||
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
|
xtend@^4.0.1, xtend@~4.0.1:
|
||||||
version "4.0.2"
|
version "4.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
|
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
|
||||||
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
|
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
|
||||||
@ -10028,14 +9681,6 @@ yargs@^9.0.0:
|
|||||||
y18n "^3.2.1"
|
y18n "^3.2.1"
|
||||||
yargs-parser "^7.0.0"
|
yargs-parser "^7.0.0"
|
||||||
|
|
||||||
yauzl@^2.4.2:
|
|
||||||
version "2.10.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
|
||||||
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
|
|
||||||
dependencies:
|
|
||||||
buffer-crc32 "~0.2.3"
|
|
||||||
fd-slicer "~1.1.0"
|
|
||||||
|
|
||||||
yazl@^2.4.1:
|
yazl@^2.4.1:
|
||||||
version "2.5.1"
|
version "2.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
|
resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
|
||||||
|
Loading…
Reference in New Issue
Block a user