{"action":"created","comment":{"url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/comments/239132744","pull_request_review_id":181841421,"id":239132744,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzOTEzMjc0NA==","diff_hunk":"@@ -47,189 +47,241 @@ export default class SlideUpPanel extends PureComponent {\n     constructor(props) {\n         super(props);\n \n+        const {containerHeight, headerHeight, marginFromTop} = props;\n+\n+        this.masterRef = React.createRef();\n+        this.panRef = React.createRef();\n+        this.scrollRef = React.createRef();\n+        this.scrollViewRef = React.createRef();\n+        this.headerRef = React.createRef();\n+        this.backdropRef = React.createRef();\n+\n         const initialUsedSpace = Math.abs(props.initialPosition);\n         let initialPosition;\n         if (initialUsedSpace <= 1) {\n-            initialPosition = ((props.containerHeight - (props.headerHeight + BOTTOM_MARGIN)) * (1 - initialUsedSpace));\n+            initialPosition = ((containerHeight - (headerHeight + BOTTOM_MARGIN)) * (1 - initialUsedSpace));\n         } else {\n-            initialPosition = ((props.containerHeight - (props.headerHeight + BOTTOM_MARGIN)) - initialUsedSpace);\n+            initialPosition = ((containerHeight - (headerHeight + BOTTOM_MARGIN)) - initialUsedSpace);\n         }\n \n-        this.mainPanGesture = PanResponder.create({\n-            onMoveShouldSetPanResponderCapture: (evt, gestureState) => {\n-                if (this.props.alwaysCaptureContainerMove) {\n-                    return gestureState.dy !== 0;\n-                }\n-                const isGoingDown = gestureState.y0 < gestureState.dy;\n-                return this.isAValidMovement(gestureState.dx, gestureState.dy, isGoingDown);\n-            },\n-            onPanResponderMove: (evt, gestureState) => {\n-                const isGoingDown = gestureState.dy > 0;\n-                if (this.props.alwaysCaptureContainerMove &&\n-                    !this.isAValidMovement(gestureState.dx, gestureState.dy, isGoingDown)) {\n-                    return;\n-                }\n+        this.snapPoints = [marginFromTop, initialPosition, containerHeight];\n \n-                this.moveStart(gestureState);\n-            },\n-            onPanResponderRelease: (evt, gestureState) => {\n-                this.moveFinished(gestureState);\n-            },\n-        });\n+        this.state = {\n+            lastSnap: initialPosition,\n+        };\n \n-        this.secondaryPanGesture = PanResponder.create({\n-            onMoveShouldSetPanResponder: (evt, gestureState) => {\n-                const isGoingDown = gestureState.y0 < gestureState.dy;\n-                return this.isAValidMovement(gestureState.dx, gestureState.dy, isGoingDown, true);\n-            },\n-            onPanResponderMove: (evt, gestureState) => {\n-                this.moveStart(gestureState);\n-            },\n-            onPanResponderRelease: (evt, gestureState) => {\n-                this.moveFinished(gestureState);\n-            },\n+        this.lastScrollYValue = 0;\n+        this.lastScrollY = new Animated.Value(0);\n+        this.onRegisterLastScroll = Animated.event(\n+            [{\n+                nativeEvent: {\n+                    contentOffset: {\n+                        y: this.lastScrollY,\n+                    },\n+                },\n+            }],\n+            {useNativeDriver: true},\n+        );\n+        this.lastScrollY.addListener(({value}) => {\n+            this.lastScrollYValue = value;\n         });\n \n-        this.previousTop = initialPosition;\n-        this.canDrag = true;\n+        this.dragY = new Animated.Value(0);\n+        this.onGestureEvent = Animated.event(\n+            [{\n+                nativeEvent: {\n+                    translationY: this.dragY,\n+                },\n+            }],\n+            {useNativeDriver: true},\n+        );\n \n-        this.state = {\n-            position: new Animated.Value(props.containerHeight),\n-            initialPosition,\n-            finalPosition: props.marginFromTop,\n-            endPosition: 0,\n-        };\n+        this.reverseLastScrollY = Animated.multiply(\n+            new Animated.Value(-1),\n+            this.lastScrollY\n+        );\n+\n+        this.translateYOffset = new Animated.Value(containerHeight);\n+        this.translateY = Animated.add(\n+            this.translateYOffset,\n+            Animated.add(this.dragY, this.reverseLastScrollY)\n+        ).interpolate({\n+            inputRange: [marginFromTop, containerHeight],\n+            outputRange: [marginFromTop, containerHeight],\n+            extrapolate: 'clamp',\n+        });\n     }\n \n     componentDidMount() {\n-        this.startAnimation(this.props.containerHeight, this.state.initialPosition, false, true);\n+        Animated.timing(this.translateYOffset, {\n+            duration: 200,\n+            toValue: this.snapPoints[1],\n+            useNativeDriver: true,\n+        }).start();\n     }\n \n-    handleTouchEnd = () => {\n-        if (!this.isDragging) {\n-            this.startAnimation(this.state.endPosition, this.props.containerHeight, false, true);\n-        }\n-    };\n-\n-    isAValidMovement = (distanceX, distanceY, isGoingDown, forceCheck = false) => {\n-        const {endPosition, finalPosition} = this.state;\n-\n-        if (finalPosition !== endPosition || forceCheck || (isGoingDown && this.canDrag)) {\n-            const moveTravelledFarEnough = Math.abs(distanceY) > Math.abs(distanceX) && Math.abs(distanceY) > 2;\n-            return moveTravelledFarEnough;\n-        }\n-\n-        return false;\n-    };\n-\n-    moveStart = (gestureState) => {\n-        if (this.viewRef && this.backdrop) {\n-            const {endPosition} = this.state;\n-            const position = endPosition - (gestureState.y0 - gestureState.moveY);\n-            this.isDragging = true;\n-\n-            this.backdrop.setNativeProps({pointerEvents: 'none'});\n-            this.updatePosition(position);\n-        }\n+    closeWithAnimation = () => {\n+        Animated.timing(this.translateYOffset, {\n+            duration: 200,\n+            toValue: this.snapPoints[2],\n+            useNativeDriver: true,\n+        }).start(() => this.props.onRequestClose());\n     };\n \n-    moveFinished = (gestureState) => {\n-        if (this.viewRef) {\n-            const isGoingDown = gestureState.y0 < gestureState.moveY;\n-            let position = gestureState.moveY;\n-            if (this.previousTop !== position) {\n-                position = this.previousTop;\n-            }\n-\n-            this.startAnimation(gestureState.y0, position, isGoingDown);\n+    onHeaderHandlerStateChange = ({nativeEvent}) => {\n+        if (nativeEvent.oldState === GestureState.BEGAN) {\n+            this.lastScrollY.setValue(0);\n         }\n+        this.onHandlerStateChange({nativeEvent});\n     };\n \n-    setBackdropRef = (ref) => {\n-        this.backdrop = ref;\n-    };\n-\n-    setDrag = (val) => {\n-        this.canDrag = val;\n-    };\n-\n-    setViewRef = (ref) => {\n-        this.viewRef = ref;\n-    };\n-\n-    startAnimation = (initialY, positionY, isGoingDown, initial = false) => {\n-        const {allowStayMiddle, containerHeight, onRequestClose} = this.props;\n-        const {finalPosition, initialPosition} = this.state;\n-        const position = new Animated.Value(initial ? initialY : positionY);\n-        let endPosition = (!isGoingDown && !initial ? finalPosition : positionY);\n-\n-        position.removeAllListeners();\n-        if (isGoingDown) {\n-            if (positionY <= this.state.initialPosition && allowStayMiddle) {\n-                endPosition = initialPosition;\n+    onHandlerStateChange = ({nativeEvent}) => {\n+        if (nativeEvent.oldState === GestureState.ACTIVE) {\n+            const {translationY, velocityY} = nativeEvent;\n+            const {allowStayMiddle, containerHeight} = this.props;\n+            const {lastSnap} = this.state;\n+            const isGoingDown = translationY > 0;\n+            const translation = translationY - this.lastScrollYValue;\n+\n+            const endOffsetY = lastSnap + translation;\n+            let destSnapPoint = this.snapPoints[0];\n+\n+            if (Math.abs(translationY) < 50) {\n+                destSnapPoint = lastSnap;\n+            } else if (isGoingDown && !allowStayMiddle) {\n+                destSnapPoint = containerHeight;\n+            } else if (isGoingDown) {\n+                destSnapPoint = this.snapPoints.find((s) => s >= endOffsetY);\n             } else {\n-                endPosition = containerHeight;\n+                destSnapPoint = this.snapPoints.find((s) => s <= endOffsetY);\n             }\n-        }\n-\n-        Animated.timing(position, {\n-            toValue: endPosition,\n-            duration: initial ? 200 : 100,\n-            useNativeDriver: true,\n-        }).start(() => {\n-            if (this.viewRef && this.backdrop) {\n-                this.setState({endPosition});\n-                this.backdrop.setNativeProps({pointerEvents: 'box-only'});\n-                this.isDragging = false;\n \n-                if (endPosition === containerHeight) {\n-                    onRequestClose();\n+            if (destSnapPoint) {\n+                this.translateYOffset.extractOffset();\n+                this.translateYOffset.setValue(translationY);\n+                this.translateYOffset.flattenOffset();\n+                this.dragY.setValue(0);\n+\n+                if (destSnapPoint === containerHeight) {\n+                    this.closeWithAnimation();\n+                } else {\n+                    Animated.spring(this.translateYOffset, {\n+                        velocity: velocityY,\n+                        tension: 68,\n+                        friction: 12,\n+                        toValue: destSnapPoint,\n+                        useNativeDriver: true,\n+                    }).start(() => {\n+                        this.setState({lastSnap: destSnapPoint});\n+                    });\n                 }\n+            } else {\n+                Animated.spring(this.translateYOffset, {\n+                    velocity: velocityY,\n+                    tension: 68,\n+                    friction: 12,\n+                    toValue: lastSnap,\n+                    useNativeDriver: true,\n+                }).start();\n             }\n-        });\n+        }\n+    };\n \n-        position.addListener((pos) => {\n-            if (this.viewRef) {\n-                this.updatePosition(pos.value);\n-            }\n-        });\n+    onSingleTap = ({nativeEvent}) => {\n+        if (nativeEvent.state === GestureState.ACTIVE) {\n+            this.closeWithAnimation();\n+        }\n     };\n \n-    updatePosition = (newPosition) => {\n-        const {position} = this.state;\n-        this.previousTop = newPosition;\n-        position.setValue(newPosition);\n+    scrollToTop = () => {\n+        if (this.scrollViewRef?.current) {\n+            this.scrollViewRef.current._component.scrollTo({ //eslint-disable-line no-underscore-dangle\n+                x: 0,\n+                y: 0,\n+                animated: false,\n+            });\n+        }\n     };\n \n     render() {\n-        const {children} = this.props;\n-        const containerPosition = {\n-            top: this.state.position,\n+        const {children, header} = this.props;\n+        const {lastSnap} = this.state;\n+        const translateStyle = {\n+            transform: [{translateY: this.translateY}],\n         };\n \n         return (\n-            <View style={styles.viewport}>\n+            <TapGestureHandler\n+                maxDurationMs={100000}\n+                ref={this.masterRef}\n+                maxDeltaY={lastSnap - this.snapPoints[0]}\n+            >\n                 <View\n-                    ref={this.setBackdropRef}\n-                    style={styles.backdrop}\n-                    pointerEvents='box-only'\n-                    onTouchEnd={this.handleTouchEnd}\n-                    {...this.secondaryPanGesture.panHandlers}\n-                />\n-                <SlideUpPanelIndicator\n-                    containerPosition={containerPosition}\n-                    panHandlers={this.secondaryPanGesture.panHandlers}\n-                />\n-                <Animated.View\n-                    ref={this.setViewRef}\n-                    style={[containerPosition, styles.container]}\n-                    {...this.mainPanGesture.panHandlers}\n+                    style={StyleSheet.absoluteFillObject}\n+                    pointerEvents='box-none'\n                 >\n-                    <View style={{maxHeight: (this.props.containerHeight - this.props.headerHeight - CONTAINER_MARGIN)}}>\n-                        {children}\n-                    </View>\n-                </Animated.View>\n-            </View>\n+                    <TapGestureHandler\n+                        waitFor={this.backdropRef}\n+                        onHandlerStateChange={this.onSingleTap}\n+                    >\n+                        <Animated.View style={styles.viewport}>\n+                            <PanGestureHandler\n+                                simultaneousHandlers={[this.scrollRef, this.masterRef]}\n+                                waitFor={this.headerRef}\n+                                shouldCancelWhenOutside={false}\n+                                onGestureEvent={this.onGestureEvent}\n+                                onHandlerStateChange={this.onHandlerStateChange}\n+                                ref={this.backdropRef}\n+                            >\n+\n+                                <Animated.View\n+                                    style={styles.backdrop}\n+                                    pointerEvents='box-only'\n+                                />\n+                            </PanGestureHandler>\n+                        </Animated.View>\n+                    </TapGestureHandler>\n+                    <Animated.View style={[StyleSheet.absoluteFillObject, translateStyle]}>","path":"app/components/slide_up_panel/slide_up_panel.js","position":391,"original_position":391,"commit_id":"01b178c59c52401880db4db9d33166dbded984fa","original_commit_id":"01b178c59c52401880db4db9d33166dbded984fa","user":{"login":"enahum","id":6757047,"node_id":"MDQ6VXNlcjY3NTcwNDc=","avatar_url":"https://avatars1.githubusercontent.com/u/6757047?v=4","gravatar_id":"","url":"https://api.github.com/users/enahum","html_url":"https://github.com/enahum","followers_url":"https://api.github.com/users/enahum/followers","following_url":"https://api.github.com/users/enahum/following{/other_user}","gists_url":"https://api.github.com/users/enahum/gists{/gist_id}","starred_url":"https://api.github.com/users/enahum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enahum/subscriptions","organizations_url":"https://api.github.com/users/enahum/orgs","repos_url":"https://api.github.com/users/enahum/repos","events_url":"https://api.github.com/users/enahum/events{/privacy}","received_events_url":"https://api.github.com/users/enahum/received_events","type":"User","site_admin":false},"body":"is there a real difference between the two? I can change it no problem, but I really don't know the difference, care to share?","created_at":"2018-12-05T16:14:09Z","updated_at":"2018-12-05T16:14:09Z","html_url":"https://github.com/mattermost/mattermost-mobile/pull/2414#discussion_r239132744","pull_request_url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/comments/239132744"},"html":{"href":"https://github.com/mattermost/mattermost-mobile/pull/2414#discussion_r239132744"},"pull_request":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414"}},"in_reply_to_id":239096155},"pull_request":{"url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414","id":235131613,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM1MTMxNjEz","html_url":"https://github.com/mattermost/mattermost-mobile/pull/2414","diff_url":"https://github.com/mattermost/mattermost-mobile/pull/2414.diff","patch_url":"https://github.com/mattermost/mattermost-mobile/pull/2414.patch","issue_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/2414","number":2414,"state":"open","locked":false,"title":"post menu and file attachments","user":{"login":"enahum","id":6757047,"node_id":"MDQ6VXNlcjY3NTcwNDc=","avatar_url":"https://avatars1.githubusercontent.com/u/6757047?v=4","gravatar_id":"","url":"https://api.github.com/users/enahum","html_url":"https://github.com/enahum","followers_url":"https://api.github.com/users/enahum/followers","following_url":"https://api.github.com/users/enahum/following{/other_user}","gists_url":"https://api.github.com/users/enahum/gists{/gist_id}","starred_url":"https://api.github.com/users/enahum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enahum/subscriptions","organizations_url":"https://api.github.com/users/enahum/orgs","repos_url":"https://api.github.com/users/enahum/repos","events_url":"https://api.github.com/users/enahum/events{/privacy}","received_events_url":"https://api.github.com/users/enahum/received_events","type":"User","site_admin":false},"body":"#### Summary\r\nMake new Post Menu responsive on Android\r\n\r\nAlso made some unrelated improvements to FileAttachments\r\n\r\nVery involved PR\r\n\r\n#### Ticket\r\nhttps://mattermost.atlassian.net/browse/MM-13202","created_at":"2018-11-30T22:16:20Z","updated_at":"2018-12-05T16:14:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8c69035d825ff9fd5cb3953f4f213e45b3669b6e","assignee":null,"assignees":[],"requested_reviewers":[{"login":"sudheerDev","id":4973621,"node_id":"MDQ6VXNlcjQ5NzM2MjE=","avatar_url":"https://avatars0.githubusercontent.com/u/4973621?v=4","gravatar_id":"","url":"https://api.github.com/users/sudheerDev","html_url":"https://github.com/sudheerDev","followers_url":"https://api.github.com/users/sudheerDev/followers","following_url":"https://api.github.com/users/sudheerDev/following{/other_user}","gists_url":"https://api.github.com/users/sudheerDev/gists{/gist_id}","starred_url":"https://api.github.com/users/sudheerDev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sudheerDev/subscriptions","organizations_url":"https://api.github.com/users/sudheerDev/orgs","repos_url":"https://api.github.com/users/sudheerDev/repos","events_url":"https://api.github.com/users/sudheerDev/events{/privacy}","received_events_url":"https://api.github.com/users/sudheerDev/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":460355330,"node_id":"MDU6TGFiZWw0NjAzNTUzMzA=","url":"https://api.github.com/repos/mattermost/mattermost-mobile/labels/2:%20Dev%20Review","name":"2: Dev Review","color":"eb6420","default":false},{"id":1086366120,"node_id":"MDU6TGFiZWwxMDg2MzY2MTIw","url":"https://api.github.com/repos/mattermost/mattermost-mobile/labels/Build%20Apps%20for%20PR","name":"Build Apps for PR","color":"e5c7fc","default":false},{"id":1080236293,"node_id":"MDU6TGFiZWwxMDgwMjM2Mjkz","url":"https://api.github.com/repos/mattermost/mattermost-mobile/labels/CherryPickApproved","name":"CherryPickApproved","color":"47e827","default":false}],"milestone":{"url":"https://api.github.com/repos/mattermost/mattermost-mobile/milestones/15","html_url":"https://github.com/mattermost/mattermost-mobile/milestone/15","labels_url":"https://api.github.com/repos/mattermost/mattermost-mobile/milestones/15/labels","id":3696667,"node_id":"MDk6TWlsZXN0b25lMzY5NjY2Nw==","number":15,"title":"1.15","description":"","creator":{"login":"cpanato","id":4115580,"node_id":"MDQ6VXNlcjQxMTU1ODA=","avatar_url":"https://avatars2.githubusercontent.com/u/4115580?v=4","gravatar_id":"","url":"https://api.github.com/users/cpanato","html_url":"https://github.com/cpanato","followers_url":"https://api.github.com/users/cpanato/followers","following_url":"https://api.github.com/users/cpanato/following{/other_user}","gists_url":"https://api.github.com/users/cpanato/gists{/gist_id}","starred_url":"https://api.github.com/users/cpanato/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cpanato/subscriptions","organizations_url":"https://api.github.com/users/cpanato/orgs","repos_url":"https://api.github.com/users/cpanato/repos","events_url":"https://api.github.com/users/cpanato/events{/privacy}","received_events_url":"https://api.github.com/users/cpanato/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":66,"state":"open","created_at":"2018-09-28T13:49:30Z","updated_at":"2018-12-05T12:54:24Z","due_on":"2018-12-16T08:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414/commits","review_comments_url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414/comments","review_comment_url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/2414/comments","statuses_url":"https://api.github.com/repos/mattermost/mattermost-mobile/statuses/01b178c59c52401880db4db9d33166dbded984fa","head":{"label":"mattermost:menu","ref":"menu","sha":"01b178c59c52401880db4db9d33166dbded984fa","user":{"login":"mattermost","id":9828093,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk4MjgwOTM=","avatar_url":"https://avatars1.githubusercontent.com/u/9828093?v=4","gravatar_id":"","url":"https://api.github.com/users/mattermost","html_url":"https://github.com/mattermost","followers_url":"https://api.github.com/users/mattermost/followers","following_url":"https://api.github.com/users/mattermost/following{/other_user}","gists_url":"https://api.github.com/users/mattermost/gists{/gist_id}","starred_url":"https://api.github.com/users/mattermost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattermost/subscriptions","organizations_url":"https://api.github.com/users/mattermost/orgs","repos_url":"https://api.github.com/users/mattermost/repos","events_url":"https://api.github.com/users/mattermost/events{/privacy}","received_events_url":"https://api.github.com/users/mattermost/received_events","type":"Organization","site_admin":false},"repo":{"id":70265724,"node_id":"MDEwOlJlcG9zaXRvcnk3MDI2NTcyNA==","name":"mattermost-mobile","full_name":"mattermost/mattermost-mobile","private":false,"owner":{"login":"mattermost","id":9828093,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk4MjgwOTM=","avatar_url":"https://avatars1.githubusercontent.com/u/9828093?v=4","gravatar_id":"","url":"https://api.github.com/users/mattermost","html_url":"https://github.com/mattermost","followers_url":"https://api.github.com/users/mattermost/followers","following_url":"https://api.github.com/users/mattermost/following{/other_user}","gists_url":"https://api.github.com/users/mattermost/gists{/gist_id}","starred_url":"https://api.github.com/users/mattermost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattermost/subscriptions","organizations_url":"https://api.github.com/users/mattermost/orgs","repos_url":"https://api.github.com/users/mattermost/repos","events_url":"https://api.github.com/users/mattermost/events{/privacy}","received_events_url":"https://api.github.com/users/mattermost/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/mattermost/mattermost-mobile","description":"Next generation iOS and Android apps for Mattermost in React Native","fork":false,"url":"https://api.github.com/repos/mattermost/mattermost-mobile","forks_url":"https://api.github.com/repos/mattermost/mattermost-mobile/forks","keys_url":"https://api.github.com/repos/mattermost/mattermost-mobile/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mattermost/mattermost-mobile/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mattermost/mattermost-mobile/teams","hooks_url":"https://api.github.com/repos/mattermost/mattermost-mobile/hooks","issue_events_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/events{/number}","events_url":"https://api.github.com/repos/mattermost/mattermost-mobile/events","assignees_url":"https://api.github.com/repos/mattermost/mattermost-mobile/assignees{/user}","branches_url":"https://api.github.com/repos/mattermost/mattermost-mobile/branches{/branch}","tags_url":"https://api.github.com/repos/mattermost/mattermost-mobile/tags","blobs_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/refs{/sha}","trees_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mattermost/mattermost-mobile/statuses/{sha}","languages_url":"https://api.github.com/repos/mattermost/mattermost-mobile/languages","stargazers_url":"https://api.github.com/repos/mattermost/mattermost-mobile/stargazers","contributors_url":"https://api.github.com/repos/mattermost/mattermost-mobile/contributors","subscribers_url":"https://api.github.com/repos/mattermost/mattermost-mobile/subscribers","subscription_url":"https://api.github.com/repos/mattermost/mattermost-mobile/subscription","commits_url":"https://api.github.com/repos/mattermost/mattermost-mobile/commits{/sha}","git_commits_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/commits{/sha}","comments_url":"https://api.github.com/repos/mattermost/mattermost-mobile/comments{/number}","issue_comment_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/comments{/number}","contents_url":"https://api.github.com/repos/mattermost/mattermost-mobile/contents/{+path}","compare_url":"https://api.github.com/repos/mattermost/mattermost-mobile/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mattermost/mattermost-mobile/merges","archive_url":"https://api.github.com/repos/mattermost/mattermost-mobile/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mattermost/mattermost-mobile/downloads","issues_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues{/number}","pulls_url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls{/number}","milestones_url":"https://api.github.com/repos/mattermost/mattermost-mobile/milestones{/number}","notifications_url":"https://api.github.com/repos/mattermost/mattermost-mobile/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mattermost/mattermost-mobile/labels{/name}","releases_url":"https://api.github.com/repos/mattermost/mattermost-mobile/releases{/id}","deployments_url":"https://api.github.com/repos/mattermost/mattermost-mobile/deployments","created_at":"2016-10-07T16:52:32Z","updated_at":"2018-12-05T12:54:27Z","pushed_at":"2018-12-05T13:29:46Z","git_url":"git://github.com/mattermost/mattermost-mobile.git","ssh_url":"git@github.com:mattermost/mattermost-mobile.git","clone_url":"https://github.com/mattermost/mattermost-mobile.git","svn_url":"https://github.com/mattermost/mattermost-mobile","homepage":"https://about.mattermost.com/","size":30321,"stargazers_count":555,"watchers_count":555,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":278,"mirror_url":null,"archived":false,"open_issues_count":27,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":278,"open_issues":27,"watchers":555,"default_branch":"master"}},"base":{"label":"mattermost:master","ref":"master","sha":"18cf206f797f1ab2cb86ea7cf24c5b72c1ea6e22","user":{"login":"mattermost","id":9828093,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk4MjgwOTM=","avatar_url":"https://avatars1.githubusercontent.com/u/9828093?v=4","gravatar_id":"","url":"https://api.github.com/users/mattermost","html_url":"https://github.com/mattermost","followers_url":"https://api.github.com/users/mattermost/followers","following_url":"https://api.github.com/users/mattermost/following{/other_user}","gists_url":"https://api.github.com/users/mattermost/gists{/gist_id}","starred_url":"https://api.github.com/users/mattermost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattermost/subscriptions","organizations_url":"https://api.github.com/users/mattermost/orgs","repos_url":"https://api.github.com/users/mattermost/repos","events_url":"https://api.github.com/users/mattermost/events{/privacy}","received_events_url":"https://api.github.com/users/mattermost/received_events","type":"Organization","site_admin":false},"repo":{"id":70265724,"node_id":"MDEwOlJlcG9zaXRvcnk3MDI2NTcyNA==","name":"mattermost-mobile","full_name":"mattermost/mattermost-mobile","private":false,"owner":{"login":"mattermost","id":9828093,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk4MjgwOTM=","avatar_url":"https://avatars1.githubusercontent.com/u/9828093?v=4","gravatar_id":"","url":"https://api.github.com/users/mattermost","html_url":"https://github.com/mattermost","followers_url":"https://api.github.com/users/mattermost/followers","following_url":"https://api.github.com/users/mattermost/following{/other_user}","gists_url":"https://api.github.com/users/mattermost/gists{/gist_id}","starred_url":"https://api.github.com/users/mattermost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattermost/subscriptions","organizations_url":"https://api.github.com/users/mattermost/orgs","repos_url":"https://api.github.com/users/mattermost/repos","events_url":"https://api.github.com/users/mattermost/events{/privacy}","received_events_url":"https://api.github.com/users/mattermost/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/mattermost/mattermost-mobile","description":"Next generation iOS and Android apps for Mattermost in React Native","fork":false,"url":"https://api.github.com/repos/mattermost/mattermost-mobile","forks_url":"https://api.github.com/repos/mattermost/mattermost-mobile/forks","keys_url":"https://api.github.com/repos/mattermost/mattermost-mobile/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mattermost/mattermost-mobile/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mattermost/mattermost-mobile/teams","hooks_url":"https://api.github.com/repos/mattermost/mattermost-mobile/hooks","issue_events_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/events{/number}","events_url":"https://api.github.com/repos/mattermost/mattermost-mobile/events","assignees_url":"https://api.github.com/repos/mattermost/mattermost-mobile/assignees{/user}","branches_url":"https://api.github.com/repos/mattermost/mattermost-mobile/branches{/branch}","tags_url":"https://api.github.com/repos/mattermost/mattermost-mobile/tags","blobs_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/refs{/sha}","trees_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mattermost/mattermost-mobile/statuses/{sha}","languages_url":"https://api.github.com/repos/mattermost/mattermost-mobile/languages","stargazers_url":"https://api.github.com/repos/mattermost/mattermost-mobile/stargazers","contributors_url":"https://api.github.com/repos/mattermost/mattermost-mobile/contributors","subscribers_url":"https://api.github.com/repos/mattermost/mattermost-mobile/subscribers","subscription_url":"https://api.github.com/repos/mattermost/mattermost-mobile/subscription","commits_url":"https://api.github.com/repos/mattermost/mattermost-mobile/commits{/sha}","git_commits_url":"https://api.github.com/repos/mattermost/mattermost-mobile/git/commits{/sha}","comments_url":"https://api.github.com/repos/mattermost/mattermost-mobile/comments{/number}","issue_comment_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/comments{/number}","contents_url":"https://api.github.com/repos/mattermost/mattermost-mobile/contents/{+path}","compare_url":"https://api.github.com/repos/mattermost/mattermost-mobile/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mattermost/mattermost-mobile/merges","archive_url":"https://api.github.com/repos/mattermost/mattermost-mobile/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mattermost/mattermost-mobile/downloads","issues_url":"https://api.github.com/repos/mattermost/mattermost-mobile/issues{/number}","pulls_url":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls{/number}","milestones_url":"https://api.github.com/repos/mattermost/mattermost-mobile/milestones{/number}","notifications_url":"https://api.github.com/repos/mattermost/mattermost-mobile/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mattermost/mattermost-mobile/labels{/name}","releases_url":"https://api.github.com/repos/mattermost/mattermost-mobile/releases{/id}","deployments_url":"https://api.github.com/repos/mattermost/mattermost-mobile/deployments","created_at":"2016-10-07T16:52:32Z","updated_at":"2018-12-05T12:54:27Z","pushed_at":"2018-12-05T13:29:46Z","git_url":"git://github.com/mattermost/mattermost-mobile.git","ssh_url":"git@github.com:mattermost/mattermost-mobile.git","clone_url":"https://github.com/mattermost/mattermost-mobile.git","svn_url":"https://github.com/mattermost/mattermost-mobile","homepage":"https://about.mattermost.com/","size":30321,"stargazers_count":555,"watchers_count":555,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":278,"mirror_url":null,"archived":false,"open_issues_count":27,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":278,"open_issues":27,"watchers":555,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414"},"html":{"href":"https://github.com/mattermost/mattermost-mobile/pull/2414"},"issue":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/2414"},"comments":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/issues/2414/comments"},"review_comments":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414/comments"},"review_comment":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/pulls/2414/commits"},"statuses":{"href":"https://api.github.com/repos/mattermost/mattermost-mobile/statuses/01b178c59c52401880db4db9d33166dbded984fa"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"enahum"}}