Skip to content

Commit

Permalink
fix(ux): deeplink broken with share contact
Browse files Browse the repository at this point in the history
Signed-off-by: Godefroy Ponsinet <godefroy.ponsinet@outlook.com>
  • Loading branch information
90dy committed Sep 4, 2019
1 parent 3c4bccb commit c49a3e2
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 88 deletions.
1 change: 0 additions & 1 deletion client/ios/Berty.xcodeproj/project.pbxproj
Expand Up @@ -5,7 +5,6 @@
};
objectVersion = 46;
objects = {

/* Begin PBXBuildFile section */
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
Expand Down
110 changes: 40 additions & 70 deletions client/packages/common/helpers/withDeepLinkHandler.js
@@ -1,83 +1,53 @@
import { Linking } from 'react-native'
import React from 'react'
import hoistNonReactStatics from 'hoist-non-react-statics'

import { BASE_WEBSITE_URL } from '../constants'
import { parse as parseUrl } from './url'

export const withDeepLinkHandler = Component => {
class DeepLinkHandler extends Component {
initialState = {
routeName: 'switch/main',
params: {},
}

state = this.initialState

handleOpenURL = event => {
let url = parseUrl(
event.url.replace('berty://berty.chat/', `${BASE_WEBSITE_URL}/`)
)
switch (url.pathname) {
case '/chats/detail':
if (url.hashParts['id']) {
// TODO: remove that part when we'll have get rid of graphql/relay
url.hashParts['id'] = btoa(`conversation:${url.hashParts['id']}`)
import { withHOC } from './views'
import { withNavigation } from 'react-navigation'

export const withDeepLinkHandler = Component =>
withHOC(
withNavigation(
class WithDeepLinkHandler extends React.PureComponent {
handleOpenURL = event => {
let url = parseUrl(
event.url.replace('berty://berty.chat/', `${BASE_WEBSITE_URL}/`)
)
switch (url.pathname) {
case '/chats/detail':
this.props.navigation.navigate('chats/detail', url.hashParts)
break
case '/id':
this.props.navigation.navigate('modal/contacts/card', {
id: url.hashParts.key,
displayName: url.hashParts.name,
})
break
default:
console.warn(`Unhandled deep link, URL: ${event.url}`)
break
}
this.setState({
routeName: 'chats/detail',
params: url.hashParts,
})
break
case '/id':
this.setState({
routeName: 'modal/contacts/card',
params: url.hashParts,
})
break
default:
console.warn(`Unhandled deep link, URL: ${event.url}`)
break
}
}

clearDeepLink = () => {
this.setState(this.initialState)
}
}

setDeepLink = deepLink => this.setState(deepLink)
componentDidMount() {
Linking.addEventListener('url', this.handleOpenURL)

componentDidMount() {
Linking.addEventListener('url', this.handleOpenURL)
Linking.getInitialURL()
.then(url => url != null && this.handleOpenURL({ url }))
.catch(console.error)
}

Linking.getInitialURL()
.then(url => {
if (url !== null) {
this.handleOpenURL({ url })
}
})
.catch(() => {})
}

componentWillUnmount() {
Linking.removeEventListener('url', this.handleOpenURL)
}
componentWillUnmount() {
Linking.removeEventListener('url', this.handleOpenURL)
}

render() {
return (
<Component
{...this.props}
deepLinkHandler={{
deepLink: this.state,
setDeepLink: deepLink => this.setDeepLink(deepLink),
clearDeepLink: () => this.clearDeepLink(),
}}
/>
)
}
}

return hoistNonReactStatics(DeepLinkHandler, Component)
}
render() {
return <Component {...this.props} />
}
}
)
)(Component)

export default withDeepLinkHandler
3 changes: 2 additions & 1 deletion client/packages/navigation/AppNavigator.js
Expand Up @@ -5,13 +5,14 @@ import { Picker } from '@berty/screen/Picker'
import Auth from '@berty/screen/Accounts/Auth'
import MainNavigator from './MainNavigator'
import OnboardingNavigator from './OnboardingNavigator'
import { withDeepLinkHandler } from '@berty/common/helpers/withDeepLinkHandler'

const AppNavigator = createSwitchNavigator(
{
'accounts/auth': Auth,
'switch/picker': Picker,
'switch/onboarding': OnboardingNavigator,
'switch/main': MainNavigator,
'switch/main': withDeepLinkHandler(MainNavigator),
},
{
initialRouteName: 'accounts/auth',
Expand Down
12 changes: 0 additions & 12 deletions client/packages/screen/Accounts/Auth.js
Expand Up @@ -9,13 +9,11 @@ import { defaultUsername } from '@berty/common/helpers/contacts'
// import { getAvailableUpdate } from '@berty/update'
import NavigationService from '@berty/common/helpers/NavigationService'
import sleep from '@berty/common/helpers/sleep'
import withDeepLinkHandler from '@berty/common/helpers/withDeepLinkHandler'
import { withUpdateContext } from '@berty/update/context'
import { withBridgeContext } from '@berty/bridge/Context'
import { rpc, service, middleware } from '@berty/bridge'
import { getAvailableUpdate } from '@berty/update'

@withDeepLinkHandler
@withBridgeContext
@withUpdateContext
@withNamespaces()
Expand Down Expand Up @@ -53,14 +51,6 @@ class Auth extends PureComponent {
}
}

openDeepLink = () => {
const {
deepLinkHandler: { deepLink },
navigation,
} = this.props
navigation.navigate(deepLink)
}

init = async config => {
const { t, bridge } = this.props

Expand Down Expand Up @@ -136,10 +126,8 @@ class Auth extends PureComponent {

this.props.bridge.setContext(bridge)

this.openDeepLink()
this.props.navigation.navigate('switch/picker', {
firstLaunch,
deepLink: this.props.deepLinkHandler.deepLink,
})
}

Expand Down
4 changes: 2 additions & 2 deletions client/packages/screen/Contacts/ContactCardModal.js
Expand Up @@ -21,10 +21,10 @@ class ContactCardModal extends React.Component {
const { context, navigation } = this.props
const navigationData = {
id: navigation.getParam('id'),
displayName: navigation.getParam('displayName'),
displayName:
navigation.getParam('displayName') || navigation.getParam('name'),
status: navigation.getParam('status'),
}

return (
<Store.Entity.Contact id={navigationData.id}>
{(data = navigationData) => (
Expand Down
2 changes: 1 addition & 1 deletion client/packages/screen/Picker.js
Expand Up @@ -13,7 +13,7 @@ export class Picker extends React.Component {
this.props.navigation.getParam('firstLaunch', false) &&
!isIntegrationMode
? 'switch/onboarding'
: this.props.navigation.getParam('deepLink')
: 'switch/main'
)
}

Expand Down
2 changes: 1 addition & 1 deletion core/go.mod
Expand Up @@ -8,11 +8,11 @@ require (
cloud.google.com/go v0.34.0 // indirect
github.com/0xAX/notificator v0.0.0-20181105090803-d81462e38c21
github.com/akavel/rsrc v0.0.0-20170831122431-f6a15ece2cfd // indirect
github.com/asticode/go-astiamqp v1.0.0 // indirect
github.com/asticode/go-astilectron v0.8.1-0.20190415090856-5d5f14367434
github.com/asticode/go-astilectron-bootstrap v0.0.0-20180616141213-b3211646d205
github.com/asticode/go-astilectron-bundler v0.0.0-20190426172205-155c2a10bbb1 // indirect
github.com/asticode/go-astilog v1.0.0
github.com/asticode/go-astitools v1.0.0 // indirect
github.com/asticode/go-bindata v0.0.0-20151023091102-a0ff2567cfb7 // indirect
github.com/brianvoe/gofakeit v3.17.0+incompatible
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect
Expand Down

0 comments on commit c49a3e2

Please sign in to comment.