diff --git a/client/react-native/common/components/Screens/Chats/Add.js b/client/react-native/common/components/Screens/Chats/Add.js index 77c758e0de..65c93ea8e7 100644 --- a/client/react-native/common/components/Screens/Chats/Add.js +++ b/client/react-native/common/components/Screens/Chats/Add.js @@ -5,7 +5,7 @@ import { Pagination, RelayContext } from '../../../relay' import { Screen, Flex, Text, Header } from '../../Library' import { border, borderBottom, marginHorizontal } from '../../../styles' import { colors } from '../../../constants' -import { queries, fragments } from '../../../graphql' +import { fragments } from '../../../graphql' const Item = fragments.Contact( class Item extends PureComponent { @@ -138,6 +138,11 @@ export default class ListScreen extends Component { render () { const { contactsID } = this.state + const { + screenProps: { + context: { queries }, + }, + } = this.props return ( } @@ -195,7 +200,10 @@ export default class Detail extends PureComponent { backgroundColor: colors.white, }} > - + ) diff --git a/client/react-native/common/components/Screens/Settings/Devtools/Network/Peers.js b/client/react-native/common/components/Screens/Settings/Devtools/Network/Peers.js index 1dbc8bd4ec..45cc00cb41 100644 --- a/client/react-native/common/components/Screens/Settings/Devtools/Network/Peers.js +++ b/client/react-native/common/components/Screens/Settings/Devtools/Network/Peers.js @@ -69,13 +69,15 @@ export default class Peers extends Component { } componentWillMount () { - this.props.screenProps.context.subscriptions.monitorPeers.subscribe({ - iterator: undefined, - updater: (store, data) => { - const peer = data.MonitorPeers - this.addPeer(peer) - }, - }) + this.subscriber = this.props.screenProps.context.subscriptions.monitorPeers.subscribe( + { + iterator: undefined, + updater: (store, data) => { + const peer = data.MonitorPeers + this.addPeer(peer) + }, + } + ) } componentDidMount () { @@ -88,7 +90,7 @@ export default class Peers extends Component { } componentWillUnmount () { - this.props.screenProps.context.subscriptions.monitorPeers.dispose() + this.subscriber.unsubscribe() } fetchPeers = () => { @@ -109,9 +111,15 @@ export default class Peers extends Component { return ( {peer.connection === Connection.CONNECTED ? ( - {peer.id.slice(0, 30)}... + + {peer.id.slice(0, 30)} + ... + ) : ( - {peer.id.slice(0, 30)}... + + {peer.id.slice(0, 30)} + ... + )} ) diff --git a/client/react-native/common/graphql/mutations/ContactRemove.js b/client/react-native/common/graphql/mutations/ContactRemove.js index 2bb40cce81..a75a2d35a9 100644 --- a/client/react-native/common/graphql/mutations/ContactRemove.js +++ b/client/react-native/common/graphql/mutations/ContactRemove.js @@ -50,5 +50,7 @@ export default context => (input, configs) => ...contact.default, ...input, }, - configs + { + ...configs, + } ) diff --git a/client/react-native/common/graphql/mutations/ContactRequest.js b/client/react-native/common/graphql/mutations/ContactRequest.js index e9039445e3..9eca8dddab 100644 --- a/client/react-native/common/graphql/mutations/ContactRequest.js +++ b/client/react-native/common/graphql/mutations/ContactRequest.js @@ -32,6 +32,7 @@ const ContactRequestMutation = graphql` } } ` + export default context => (input, configs) => commit( context.environment, @@ -41,5 +42,5 @@ export default context => (input, configs) => ...contact.default, ...input, }, - configs, + configs ) diff --git a/client/react-native/common/graphql/mutations/ConversationAddMessage.js b/client/react-native/common/graphql/mutations/ConversationAddMessage.js index 019d46f7b5..4da80e0584 100644 --- a/client/react-native/common/graphql/mutations/ConversationAddMessage.js +++ b/client/react-native/common/graphql/mutations/ConversationAddMessage.js @@ -3,7 +3,7 @@ import { graphql } from 'react-relay' import { commit } from '../../relay' import { conversation } from '../../utils' import { merge } from '../../helpers' -import { updaters } from '..' +// import { updaters } from '..' const ConversationAddMessageMutation = graphql` mutation ConversationAddMessageMutation( @@ -39,17 +39,18 @@ export default context => (input, configs) => { conversation: conversation.default, message: { text: '' } }, input, ]), - { - updater: (store, data) => { - updaters.eventList[0](store, { - filter: { - conversationId: data.ConversationAddMessage.conversationId, - kind: data.ConversationAddMessage.kind, - }, - }) - .add('EventEdge', data.ConversationAddMessage.id) - .before() - }, - ...configs, - } + // { + // updater: (store, data) => { + // updaters.eventList[0](store, { + // filter: { + // conversationId: data.ConversationAddMessage.conversationId, + // kind: data.ConversationAddMessage.kind, + // }, + // }) + // .add('EventEdge', data.ConversationAddMessage.id) + // .before() + // }, + // ...configs, + // } + configs ) diff --git a/client/react-native/common/graphql/mutations/ConversationCreate.js b/client/react-native/common/graphql/mutations/ConversationCreate.js index ba60b67c54..8044d39107 100644 --- a/client/react-native/common/graphql/mutations/ConversationCreate.js +++ b/client/react-native/common/graphql/mutations/ConversationCreate.js @@ -1,7 +1,7 @@ import { graphql } from 'react-relay' import { commit } from '../../relay' -import { updaters } from '..' +// import { updaters } from '..' const ConversationCreateMutation = graphql` mutation ConversationCreateMutation( @@ -57,14 +57,15 @@ export default context => (input, configs) => ConversationCreateMutation, 'ConversationCreate', input, - { - updater: (store, data) => { - updaters.conversationList.forEach(updater => - updater(store) - .add('ConversationEdge', data.ConversationCreate.id) - .after() - ) - }, - ...configs, - } + // { + // updater: (store, data) => { + // updaters.conversationList.forEach(updater => + // updater(store) + // .add('ConversationEdge', data.ConversationCreate.id) + // .after() + // ) + // }, + // ...configs, + // } + configs ) diff --git a/client/react-native/common/graphql/mutations/ConversationInvite.js b/client/react-native/common/graphql/mutations/ConversationInvite.js index 6d504eba5f..567bf826bd 100644 --- a/client/react-native/common/graphql/mutations/ConversationInvite.js +++ b/client/react-native/common/graphql/mutations/ConversationInvite.js @@ -1,7 +1,7 @@ import { graphql } from 'react-relay' import { commit } from '../../relay' -import { updaters } from '..' +// import { updaters } from '..' const ConversationInviteMutation = graphql` mutation ConversationInviteMutation( @@ -56,14 +56,15 @@ export default context => (input, configs) => ConversationInviteMutation, 'ConversationInvite', input, - { - updater: (store, data) => { - updaters.conversationList.forEach(updater => - updater(store) - .add('ConversationEdge', data.ConversationInvite.id) - .after() - ) - }, - ...configs, - } + // { + // updater: (store, data) => { + // updaters.conversationList.forEach(updater => + // updater(store) + // .add('ConversationEdge', data.ConversationInvite.id) + // .after() + // ) + // }, + // ...configs, + // } + configs, ) diff --git a/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js b/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js index 5f3ae4e790..ec916bd89c 100644 --- a/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js +++ b/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js @@ -1,17 +1,15 @@ import EventStream from './EventStream' -export default conversation => ({ - ...EventStream, +export default context => ({ + ...EventStream(context), subscribe: ({ updater }) => - EventStream.subscribe({ - updater: (store, data) => { - console.log('RECEIVED_EVENT') - if ( - data.EventStream.kind === 302 && - data.EventStream.conversationId === conversation.id - ) { - return updater && updater(store, data.EventStream) - } - }, + EventStream(context).subscribe({ + updater: + updater && + ((store, data) => { + if (data.EventStream.kind === 302) { + return updater(store, data.EventStream) + } + }), }), }) diff --git a/client/react-native/common/relay/Pagination.js b/client/react-native/common/relay/Pagination.js index 85b7384b4e..5c155a75fe 100644 --- a/client/react-native/common/relay/Pagination.js +++ b/client/react-native/common/relay/Pagination.js @@ -50,13 +50,13 @@ const createPagination = ({ children, direction = 'forward', fragment, - connection, + alias, query, }) => Relay.createPaginationContainer(PaginationContainer, fragment, { direction, getConnectionFromProps: props => { - return props.data[connection] + return props.data[alias] }, getFragmentVariables: (prevVars, totalCount) => { return { @@ -107,7 +107,6 @@ export default class Pagination extends PureComponent { ) case state.success: - console.log(state) return case state.error: return null diff --git a/client/react-native/common/relay/environment.js b/client/react-native/common/relay/environment.js index 5285640354..1068229d9c 100644 --- a/client/react-native/common/relay/environment.js +++ b/client/react-native/common/relay/environment.js @@ -21,40 +21,20 @@ const logStyle = { // installRelayDevTools() // } -const setupSubscription = ({ getIp, getPort }) => async ( +const setupSubscription = ({ ip, port }) => ( config, variables, cacheConfig, observer ) => { - try { - const query = config.text - const subscriptionClient = new SubscriptionClient( - `ws://${await getIp()}:${await getPort()}/query`, - { - reconnect: true, - } - ) - - const onNext = result => { - observer.onNext(result) - } - - const onError = error => { - observer.onError(error) - } - - const onComplete = () => { - observer.onCompleted() - } + const query = config.text + const client = new SubscriptionClient(`ws://${ip}:${port}/query`, { + reconnect: true, + }) - subscriptionClient - .request({ query, variables }) - .subscribe(onNext, onError, onComplete) - } catch (err) { - console.error(err) - } - // client.unsubscribe() + const observable = client.request({ query, variables }) + observable.subscribe(observer.onNext, observer.onError, observer.onCompleted) + return observable } const perfLogger = (msg, req, res) => { @@ -104,7 +84,10 @@ const setupMiddlewares = async ({ getIp, getPort }) => [ export const setup = async ({ getIp, getPort }) => new Environment({ network: new RelayNetworkLayer(await setupMiddlewares({ getIp, getPort }), { - subscribeFn: await setupSubscription({ getIp, getPort }), + subscribeFn: setupSubscription({ + ip: await getIp(), + port: await getPort(), + }), }), store: new Store(new RecordSource()), }) diff --git a/client/react-native/common/relay/fragment-helper.js b/client/react-native/common/relay/fragment-helper.js index e1011c30ef..15eb76c785 100644 --- a/client/react-native/common/relay/fragment-helper.js +++ b/client/react-native/common/relay/fragment-helper.js @@ -2,7 +2,6 @@ import Relay from 'react-relay' export class ConnectionHelper { constructor (selection, metadata) { - console.log(metadata) Object.keys(selection).forEach(k => (this[k] = selection[k])) Object.keys(metadata).forEach(k => (this[k] = metadata[k])) } @@ -17,7 +16,6 @@ export class ConnectionHelper { _.concreteType get key () { - console.log('key') return this.name.replace(/^__/g, '').replace(/_connection$/g, '') } } @@ -37,7 +35,6 @@ export class FragmentHelper { getSelection = alias => this.selections.find(_ => _.alias === alias) getConnection = (alias, _) => { - console.log('getConnection') return alias == null ? this.getDefaultConnection() : (_ = this.getSelection(alias)) && @@ -49,7 +46,6 @@ export class FragmentHelper { } getDefaultConnection = _ => { - console.log('getDefaultConnection') return ( (_ = this.selections.find(_ => _.concreteType.match(/Connection$/g))) && new ConnectionHelper(_, this.metadata.connection[0]) diff --git a/client/react-native/common/relay/genericUpdater.js b/client/react-native/common/relay/genericUpdater.js index 8fe13d52d4..1261336b13 100644 --- a/client/react-native/common/relay/genericUpdater.js +++ b/client/react-native/common/relay/genericUpdater.js @@ -1,6 +1,11 @@ -import { FragmentHelper } from './fragment-helper' +import { atob } from 'b64-lite' +import Case from 'case' + import { ConnectionHandler } from 'relay-runtime' +import { FragmentHelper } from './fragment-helper' +import { merge } from '../helpers' + const deepFilterEqual = (a, b) => { if (!a) { return true @@ -13,9 +18,7 @@ const deepFilterEqual = (a, b) => { if (Array.isArray(a)) { return a.every(av => b.some(bv => deepFilterEqual(av, bv))) } - return Object.keys(a).every( - k => console.log(k) || deepFilterEqual(a[k], b[k]) - ) + return Object.keys(a).every(k => deepFilterEqual(a[k], b[k])) default: return a === b } @@ -27,18 +30,16 @@ const deepFilterEqual = (a, b) => { * The filter "args" need to have same field that the connection have in arguments */ export default (fragment, alias, args) => { - const helper = new FragmentHelper(fragment) - const connectionHelper = helper.getConnection(alias) - return (store, data) => { + const helper = new FragmentHelper(fragment) + const connectionHelper = helper.getConnection(alias) const root = store.getRoot() const connection = ConnectionHandler.getConnection( root, helper.getConnection(alias).key, args ) - - if (deepFilterEqual(args, { filter: data }) === false) { + if (deepFilterEqual(args, merge([args, { filter: data }])) === false) { // delete ConnectionHandler.deleteNode(connection, data.id) return @@ -48,15 +49,9 @@ export default (fragment, alias, args) => { const cursor = (args.orderBy && args.orderBy !== 'id') || (args.sortBy && args.sortBy !== 'id') - ? data[args.orderBy || args.sortBy] + ? data[Case.camel(args.orderBy || args.sortBy)] : atob(data.id).split(':')[1] - if ( - edges.length > 0 && - edges.some( - e => - console.log(e.getValue('cursor')) || e.getValue('cursor') === cursor - ) - ) { + if (edges.length > 0 && edges.some(e => e.getValue('cursor') === cursor)) { // update const node = store.get(data.id) Object.keys(data).forEach(k => node.setValue(data[k], k)) diff --git a/client/react-native/common/relay/subscriber.js b/client/react-native/common/relay/subscriber.js index 62f166515f..c3669fe0c4 100644 --- a/client/react-native/common/relay/subscriber.js +++ b/client/react-native/common/relay/subscriber.js @@ -2,36 +2,29 @@ import { requestSubscription } from 'react-relay' export default ({ environment, subscription, updaters = [] }) => { let _updaters = updaters - - let dispose = () => {} - - const start = () => { - dispose = requestSubscription(environment, { - subscription, - // onNext: response => _generators.forEach(generator => generator.next(response)), - onError: error => console.error(error), - // onCompleted: () => _generators.forEach(generator => generator.return()), - updater: (store, data) => - _updaters.forEach(updater => updater(store, data)), - }).dispose - } - - const subscribe = ({ updater }) => { - if (_updaters.length === 0 && updater) { - start() - } - updater && _updaters.push(updater) - return { - unsubscribe: () => { - _updaters = updater ? _updaters.filter(_ => _ !== updater) : _updaters - if (_updaters.length === 0) { - dispose() - } - }, - } - } + let _subscriber = null return { - subscribe, + subscribe: ({ updater }) => { + if (_updaters.length === 0 && updater) { + _subscriber = requestSubscription(environment, { + subscription, + onNext: () => {}, + onCompleted: () => {}, + onError: error => console.error(error), + updater: (store, data) => + _updaters.forEach(updater => updater(store, data)), + }) + } + updater && _updaters.push(updater) + return { + unsubscribe: () => { + _updaters = updater ? _updaters.filter(_ => _ !== updater) : _updaters + if (_updaters.length === 0) { + _subscriber.dispose() + } + }, + } + }, } } diff --git a/client/react-native/package.json b/client/react-native/package.json index 2a0b6a3530..938deb2821 100644 --- a/client/react-native/package.json +++ b/client/react-native/package.json @@ -14,6 +14,7 @@ "babel-plugin-relay": "^1.6.2", "babel-plugin-transform-export-extensions": "^6.22.0", "buffer": "^5.2.1", + "case": "^1.6.0", "concurrently": "^4.0.1", "deepmerge": "^2.2.1", "graphql": "^14.0.2", diff --git a/client/react-native/yarn.lock b/client/react-native/yarn.lock index f4da32e355..8a0658141d 100644 --- a/client/react-native/yarn.lock +++ b/client/react-native/yarn.lock @@ -1631,6 +1631,10 @@ capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" +case@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.0.tgz#d4f276c7f67b7a705afd3a39c9af9538f5f58364" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"