diff --git a/client/react-native/common/components/Screens/Accounts/Current.js b/client/react-native/common/components/Screens/Accounts/Current.js index fb880e93a0..ad960c72a0 100644 --- a/client/react-native/common/components/Screens/Accounts/Current.js +++ b/client/react-native/common/components/Screens/Accounts/Current.js @@ -5,7 +5,7 @@ import React, { PureComponent } from 'react' import { Loader } from '../../Library' import { environment, RelayContext, contextValue } from '../../../relay' -import { queries, mutations, subscriptions } from '../../../graphql' +import { queries, mutations, subscriptions, updaters } from '../../../graphql' import Main from '../Main' const { CoreModule } = NativeModules @@ -51,6 +51,7 @@ export default class Current extends PureComponent { mutations, subscriptions, queries, + updaters, }), loading: false, }, @@ -65,7 +66,6 @@ export default class Current extends PureComponent { if (loading) { return } - console.log('test') return (
( } inverted style={{ paddingTop: 48 }} diff --git a/client/react-native/common/components/Screens/Chats/List.js b/client/react-native/common/components/Screens/Chats/List.js index 7b9c4a029c..a5ae1c7ad1 100644 --- a/client/react-native/common/components/Screens/Chats/List.js +++ b/client/react-native/common/components/Screens/Chats/List.js @@ -51,11 +51,12 @@ export default class ListScreen extends PureComponent { return ( } /> diff --git a/client/react-native/common/components/Screens/Contacts/Add/Request.js b/client/react-native/common/components/Screens/Contacts/Add/Request.js index c6fffdf28c..68cbe0461a 100644 --- a/client/react-native/common/components/Screens/Contacts/Add/Request.js +++ b/client/react-native/common/components/Screens/Contacts/Add/Request.js @@ -185,16 +185,12 @@ const Item = fragments.Contact( class Received extends PureComponent { render () { - const { - navigation, - screenProps: { - context: { queries }, - }, - } = this.props - + const { navigation, screenProps } = this.props + const { queries } = screenProps.context return ( } + alias='ContactList' + renderItem={props => ( + + )} /> ) @@ -229,7 +231,7 @@ class Sent extends PureComponent { { filter: { status: 3 } }, ])} fragment={fragments.ContactList} - connection='ContactList' + alias='ContactList' renderItem={props => } /> diff --git a/client/react-native/common/components/Screens/Contacts/List.js b/client/react-native/common/components/Screens/Contacts/List.js index 586e35c043..90420e8dfa 100644 --- a/client/react-native/common/components/Screens/Contacts/List.js +++ b/client/react-native/common/components/Screens/Contacts/List.js @@ -74,7 +74,7 @@ export default class ContactList extends PureComponent { render () { const { screenProps: { - context: { queries }, + context: { queries, subscriptions }, }, } = this.props return ( @@ -84,7 +84,8 @@ export default class ContactList extends PureComponent { query={queries.ContactList.graphql} variables={queries.ContactList.defaultVariables} fragment={fragments.ContactList} - connection='ContactList' + alias='ContactList' + subscriptions={[subscriptions.contactRequest]} renderItem={props => ( )} diff --git a/client/react-native/common/components/Screens/Settings/Devtools/EventList.js b/client/react-native/common/components/Screens/Settings/Devtools/EventList.js index 30805b8550..4652129bc7 100644 --- a/client/react-native/common/components/Screens/Settings/Devtools/EventList.js +++ b/client/react-native/common/components/Screens/Settings/Devtools/EventList.js @@ -153,13 +153,14 @@ export default class EventList extends PureComponent { return ( } /> diff --git a/client/react-native/common/graphql/fragments/ContactList.js b/client/react-native/common/graphql/fragments/ContactList.js index b24cdd7e50..06e196ef9b 100644 --- a/client/react-native/common/graphql/fragments/ContactList.js +++ b/client/react-native/common/graphql/fragments/ContactList.js @@ -1,55 +1,11 @@ import { graphql } from 'react-relay' -import { contact } from '../../utils' -import { merge } from '../../helpers' -import { updater as updaterHelper } from '../../relay' - -export const defaultArguments = { - default: { - filter: contact.default, - orderBy: '', - orderDesc: false, - }, - Received: { - filter: { - ...contact.default, - status: 4, - }, - orderBy: '', - orderDesc: false, - }, - Sent: { - filter: { - ...contact.default, - status: 3, - }, - orderBy: '', - orderDesc: false, - }, -} - -export const updater = { - default: (store, args = {}) => - updaterHelper(store).connection( - 'ContactList_ContactList', - merge([defaultArguments.Default, args]) - ), - Received: (store, args = {}) => - updaterHelper(store).connection( - 'ContactListReceived_ContactList', - merge([defaultArguments.Received, args]) - ), - Sent: (store, args = {}) => - updaterHelper(store).connection( - 'ContactListSent_ContactList', - merge([defaultArguments.Sent, args]) - ), -} - -export default graphql` +const fragment = graphql` fragment ContactList on Query @argumentDefinitions( filter: { type: BertyEntityContactInput } + orderBy: { type: "String!" } + orderDesc: { type: "Bool!" } count: { type: "Int32" } cursor: { type: "String" } ) { @@ -57,8 +13,8 @@ export default graphql` filter: $filter first: $count after: $cursor - orderBy: "" - orderDesc: false + orderBy: $orderBy + orderDesc: $orderDesc ) @connection(key: "ContactList_ContactList") { edges { cursor @@ -77,3 +33,6 @@ export default graphql` } } ` +console.log(fragment.data()) + +export default fragment diff --git a/client/react-native/common/graphql/fragments/ConversationList.js b/client/react-native/common/graphql/fragments/ConversationList.js index 1746a05e2f..46b790b28b 100644 --- a/client/react-native/common/graphql/fragments/ConversationList.js +++ b/client/react-native/common/graphql/fragments/ConversationList.js @@ -1,29 +1,11 @@ import { graphql } from 'react-relay' -import { conversation } from '../../utils' -import { merge } from '../../helpers' -import { updater as updaterHelper } from '../../relay' - -export const defaultArguments = { - default: { - filter: conversation.default, - orderBy: '', - orederDesc: false, - }, -} - -export const updater = { - default: (store, args = {}) => - updaterHelper(store).connection( - 'ConversationList_ConversationList', - merge([defaultArguments.default, args]) - ), -} - export default graphql` fragment ConversationList on Query @argumentDefinitions( filter: { type: BertyEntityConversationInput } + orderBy: { type: "String!" } + orderDesc: { type: "Bool!" } count: { type: "Int32" } cursor: { type: "String" } ) { @@ -31,8 +13,8 @@ export default graphql` filter: $filter first: $count after: $cursor - orderBy: "" - orderDesc: false + orderBy: $orderBy + orderDesc: $orderDesc ) @connection(key: "ConversationList_ConversationList") { edges { cursor diff --git a/client/react-native/common/graphql/fragments/EventList.js b/client/react-native/common/graphql/fragments/EventList.js index 2c729105a7..7a5599b821 100644 --- a/client/react-native/common/graphql/fragments/EventList.js +++ b/client/react-native/common/graphql/fragments/EventList.js @@ -1,40 +1,22 @@ import { graphql } from 'react-relay' -import { event } from '../../utils' -import { merge } from '../../helpers' -import { updater as updaterHelper } from '../../relay' - -export const defaultArguments = { - default: { - filter: event.default, - orderBy: 'created_at', - orderDesc: true, - }, -} - -export const updater = { - default: (store, args = {}) => - updaterHelper(store).connection( - 'EventList_EventList', - merge([defaultArguments.default, args]) - ), -} - export default graphql` fragment EventList on Query @argumentDefinitions( filter: { type: BertyP2pEventInput } + orderBy: { type: "String!" } + orderDesc: { type: "Bool!" } count: { type: "Int32" } cursor: { type: "String" } onlyWithoutAckedAt: { type: "Enum" } ) { EventList( filter: $filter + orderBy: $orderBy + orderDesc: $orderDesc first: $count after: $cursor onlyWithoutAckedAt: $onlyWithoutAckedAt - orderBy: "created_at" - orderDesc: true ) @connection(key: "EventList_EventList") { edges { cursor diff --git a/client/react-native/common/graphql/index.js b/client/react-native/common/graphql/index.js index cc820431b5..a96a4581ec 100644 --- a/client/react-native/common/graphql/index.js +++ b/client/react-native/common/graphql/index.js @@ -3,3 +3,4 @@ export * as queries from './queries' export * as subscriptions from './subscriptions' export * as fragments from './fragments' export * as enums from './enums.gen' +export * as updaters from './updaters' diff --git a/client/react-native/common/graphql/mutations/ContactAcceptRequest.js b/client/react-native/common/graphql/mutations/ContactAcceptRequest.js index e1e503468f..7befaa3a5d 100644 --- a/client/react-native/common/graphql/mutations/ContactAcceptRequest.js +++ b/client/react-native/common/graphql/mutations/ContactAcceptRequest.js @@ -1,9 +1,9 @@ import { graphql } from 'react-relay' -import { contact } from '../../utils' -import { fragments } from '../../graphql' import { commit } from '../../relay' +import { contact } from '../../utils' import { merge } from '../../helpers' +import { updaters } from '..' const ContactAcceptRequestMutation = graphql` mutation ContactAcceptRequestMutation( @@ -52,9 +52,11 @@ export default context => (input, configs) => merge([contact.default, input]), { updater: (store, data) => - fragments.ContactList.updater - .Received(store) - .delete(data.ContactAcceptRequest.id), + updaters.contactList.forEach(updater => + updater(store) + .add('ContactEdge', data.ContactAcceptRequest.id) + .after() + ), ...configs, } ) diff --git a/client/react-native/common/graphql/mutations/ContactRemove.js b/client/react-native/common/graphql/mutations/ContactRemove.js index 894979b4a9..839b2de09d 100644 --- a/client/react-native/common/graphql/mutations/ContactRemove.js +++ b/client/react-native/common/graphql/mutations/ContactRemove.js @@ -1,7 +1,7 @@ import { graphql } from 'react-relay' import { commit } from '../../relay' import { contact } from '../../utils' -import { fragments } from '../../graphql' +import { updaters } from '../../graphql' const ContactRemoveMutation = graphql` mutation ContactRemoveMutation( @@ -53,10 +53,9 @@ export default context => (input, configs) => }, { updater: (store, data) => { - fragments.ContactList.updater - .Received(store) - .delete(data.ContactRemove.id) - fragments.ContactList.updater.Sent(store).delete(data.ContactRemove.id) + updaters.contactList.forEach(updater => + updater(store).delete(data.ContactRemove.id) + ) }, ...configs, } diff --git a/client/react-native/common/graphql/mutations/ContactRequest.js b/client/react-native/common/graphql/mutations/ContactRequest.js index 129b2d8ca0..f4b28d8a55 100644 --- a/client/react-native/common/graphql/mutations/ContactRequest.js +++ b/client/react-native/common/graphql/mutations/ContactRequest.js @@ -1,6 +1,8 @@ import { graphql } from 'react-relay' + import { commit } from '../../relay' import { contact } from '../../utils' +import { updaters } from '..' const ContactRequestMutation = graphql` mutation ContactRequestMutation( @@ -40,5 +42,11 @@ export default context => (input, configs) => ...contact.default, ...input, }, - configs + { + updater: (store, data) => + updaters.contactList.forEach(updater => + updater(store).add('ContactEdge', data.ContactRequest.id).after() + ), + ...configs, + } ) diff --git a/client/react-native/common/graphql/mutations/ConversationAddMessage.js b/client/react-native/common/graphql/mutations/ConversationAddMessage.js index ac1e7b06b1..019d46f7b5 100644 --- a/client/react-native/common/graphql/mutations/ConversationAddMessage.js +++ b/client/react-native/common/graphql/mutations/ConversationAddMessage.js @@ -2,8 +2,8 @@ import { graphql } from 'react-relay' import { commit } from '../../relay' import { conversation } from '../../utils' -import { fragments } from '../../graphql' import { merge } from '../../helpers' +import { updaters } from '..' const ConversationAddMessageMutation = graphql` mutation ConversationAddMessageMutation( @@ -41,13 +41,12 @@ export default context => (input, configs) => ]), { updater: (store, data) => { - fragments.EventList.updater - .default(store, { - filter: { - conversationId: data.ConversationAddMessage.conversationId, - kind: data.ConversationAddMessage.kind, - }, - }) + updaters.eventList[0](store, { + filter: { + conversationId: data.ConversationAddMessage.conversationId, + kind: data.ConversationAddMessage.kind, + }, + }) .add('EventEdge', data.ConversationAddMessage.id) .before() }, diff --git a/client/react-native/common/graphql/mutations/ConversationCreate.js b/client/react-native/common/graphql/mutations/ConversationCreate.js index 2354d8ceb1..ba60b67c54 100644 --- a/client/react-native/common/graphql/mutations/ConversationCreate.js +++ b/client/react-native/common/graphql/mutations/ConversationCreate.js @@ -1,5 +1,7 @@ import { graphql } from 'react-relay' + import { commit } from '../../relay' +import { updaters } from '..' const ConversationCreateMutation = graphql` mutation ConversationCreateMutation( @@ -55,5 +57,14 @@ export default context => (input, configs) => ConversationCreateMutation, 'ConversationCreate', input, - configs + { + updater: (store, data) => { + updaters.conversationList.forEach(updater => + updater(store) + .add('ConversationEdge', data.ConversationCreate.id) + .after() + ) + }, + ...configs, + } ) diff --git a/client/react-native/common/graphql/mutations/ConversationInvite.js b/client/react-native/common/graphql/mutations/ConversationInvite.js index 765f47b1a5..6d504eba5f 100644 --- a/client/react-native/common/graphql/mutations/ConversationInvite.js +++ b/client/react-native/common/graphql/mutations/ConversationInvite.js @@ -1,5 +1,7 @@ import { graphql } from 'react-relay' + import { commit } from '../../relay' +import { updaters } from '..' const ConversationInviteMutation = graphql` mutation ConversationInviteMutation( @@ -54,5 +56,14 @@ export default context => (input, configs) => ConversationInviteMutation, 'ConversationInvite', input, - configs + { + updater: (store, data) => { + updaters.conversationList.forEach(updater => + updater(store) + .add('ConversationEdge', data.ConversationInvite.id) + .after() + ) + }, + ...configs, + } ) diff --git a/client/react-native/common/graphql/queries/ContactList.js b/client/react-native/common/graphql/queries/ContactList.js index e3be872528..606029eab2 100644 --- a/client/react-native/common/graphql/queries/ContactList.js +++ b/client/react-native/common/graphql/queries/ContactList.js @@ -6,15 +6,25 @@ import { merge } from '../../helpers' const query = graphql` query ContactListQuery( $filter: BertyEntityContactInput + $orderBy: String! + $orderDesc: Bool! $count: Int32 $cursor: String ) { - ...ContactList @arguments(filter: $filter, count: $count, cursor: $cursor) + ...ContactList + @arguments( + filter: $filter + orderBy: $orderBy + orderDesc: $orderDesc + count: $count + cursor: $cursor + ) } ` - const defaultVariables = { filter: contact.default, + orderBy: '', + orderDesc: false, count: 10, cursor: '', } diff --git a/client/react-native/common/graphql/queries/ConversationList.js b/client/react-native/common/graphql/queries/ConversationList.js index f223d2ca18..90c246add9 100644 --- a/client/react-native/common/graphql/queries/ConversationList.js +++ b/client/react-native/common/graphql/queries/ConversationList.js @@ -5,16 +5,26 @@ import { merge } from '../../helpers' const query = graphql` query ConversationListQuery( $filter: BertyEntityConversationInput + $orderBy: String! + $orderDesc: Bool! $count: Int32 $cursor: String ) { ...ConversationList - @arguments(filter: $filter, count: $count, cursor: $cursor) + @arguments( + filter: $filter + orderBy: $orderBy + orderDesc: $orderDesc + count: $count + cursor: $cursor + ) } ` const defaultVariables = { filter: null, + orderBy: '', + orderDesc: false, count: 50, cursor: '', } diff --git a/client/react-native/common/graphql/queries/EventList.js b/client/react-native/common/graphql/queries/EventList.js index e9be51da52..1486fdfc8d 100644 --- a/client/react-native/common/graphql/queries/EventList.js +++ b/client/react-native/common/graphql/queries/EventList.js @@ -6,6 +6,8 @@ import { merge } from '../../helpers' const query = graphql` query EventListQuery( $filter: BertyP2pEventInput + $orderBy: String! + $orderDesc: Bool! $count: Int32 $cursor: String $onlyWithoutAckedAt: Enum @@ -13,6 +15,8 @@ const query = graphql` ...EventList @arguments( filter: $filter + orderBy: $orderBy + orderDesc: $orderDesc count: $count cursor: $cursor onlyWithoutAckedAt: $onlyWithoutAckedAt @@ -22,8 +26,11 @@ const query = graphql` const defaultVariables = { filter: event.default, + orderBy: 'created_at', + orderDesc: true, count: 5, cursor: new Date(Date.now()).toISOString(), + onlyWithoutAckedAt: 0, } export default context => ({ diff --git a/client/react-native/common/graphql/subscriptions/ContactRequest.js b/client/react-native/common/graphql/subscriptions/ContactRequest.js index c69a6e328d..34d36bdbb3 100644 --- a/client/react-native/common/graphql/subscriptions/ContactRequest.js +++ b/client/react-native/common/graphql/subscriptions/ContactRequest.js @@ -2,28 +2,13 @@ import EventStream from './EventStream' export default context => ({ ...EventStream(context), - subscribe: ({ iterator, updater }) => + subscribe: ({ updater }) => EventStream(context).subscribe({ - iterator: - iterator && - function * () { - try { - while (true) { - const response = yield - if (response.EventStream.kind === 201) { - iterator.next(response.EventStream) - } - } - } catch (error) { - iterator.error(error) - } - iterator.return() - }, updater: updater && ((store, data) => { if (data.EventStream.kind === 201) { - return updater(store, data.EventStream) + return updater && updater(store, data.EventStream.attributes.me) } }), }), diff --git a/client/react-native/common/graphql/subscriptions/ContactRequestAccepted.js b/client/react-native/common/graphql/subscriptions/ContactRequestAccepted.js index b291ab55d8..57f6c10666 100644 --- a/client/react-native/common/graphql/subscriptions/ContactRequestAccepted.js +++ b/client/react-native/common/graphql/subscriptions/ContactRequestAccepted.js @@ -2,13 +2,13 @@ import EventStream from './EventStream' export default context => ({ ...EventStream(context), - subscribe: ({ iterator, updater }) => + subscribe: ({ updater }) => EventStream(context).subscribe({ updater: updater && ((store, data) => { if (data.EventStream.kind === 202) { - return updater(store, data.EventStream) + return updater() } }), }), diff --git a/client/react-native/common/graphql/subscriptions/ConversationInvite.js b/client/react-native/common/graphql/subscriptions/ConversationInvite.js index 8735fde53d..30256f2881 100644 --- a/client/react-native/common/graphql/subscriptions/ConversationInvite.js +++ b/client/react-native/common/graphql/subscriptions/ConversationInvite.js @@ -8,7 +8,7 @@ export default context => ({ updater && ((store, data) => { if (data.EventStream.kind === 301) { - return updater(store, data.EventStream) + return updater && updater(store, data.EventStream) } }), }), diff --git a/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js b/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js index 9c96830a87..5f3ae4e790 100644 --- a/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js +++ b/client/react-native/common/graphql/subscriptions/ConversationNewMessage.js @@ -1,9 +1,8 @@ -import { fragments } from '..' import EventStream from './EventStream' export default conversation => ({ ...EventStream, - subscribe: () => + subscribe: ({ updater }) => EventStream.subscribe({ updater: (store, data) => { console.log('RECEIVED_EVENT') @@ -11,14 +10,7 @@ export default conversation => ({ data.EventStream.kind === 302 && data.EventStream.conversationId === conversation.id ) { - fragments.EventList.updater(store, { - filter: { - conversationId: data.EventStream.conversationId, - kind: data.EventStream.kind, - }, - }) - .add('EventEdge', data.EventStream.id) - .before(data.EventStream.createdAt) + return updater && updater(store, data.EventStream) } }, }), diff --git a/client/react-native/common/graphql/updaters/contactList.js b/client/react-native/common/graphql/updaters/contactList.js new file mode 100644 index 0000000000..7ee3f098d7 --- /dev/null +++ b/client/react-native/common/graphql/updaters/contactList.js @@ -0,0 +1,15 @@ +import { contact } from '../../utils' +import { merge } from '../../helpers' +import { updater as updaterHelper } from '../../relay' + +export const defaultArguments = { + filter: contact.default, + orderBy: '', + orderDesc: false, +} + +export default (store, args) => + updaterHelper(store).connection( + 'ContactList_ContactList', + merge([defaultArguments, args]) + ) diff --git a/client/react-native/common/graphql/updaters/conversationList.js b/client/react-native/common/graphql/updaters/conversationList.js new file mode 100644 index 0000000000..7c4ae4d892 --- /dev/null +++ b/client/react-native/common/graphql/updaters/conversationList.js @@ -0,0 +1,14 @@ +import { conversation } from '../../utils' +import { updater } from '../../relay' + +export const defaultArguments = { + filter: conversation.default, + orderBy: '', + orederDesc: false, +} + +export default store => + updater(store).connection( + 'ConversationList_ConversationList', + defaultArguments + ) diff --git a/client/react-native/common/graphql/updaters/eventList.js b/client/react-native/common/graphql/updaters/eventList.js new file mode 100644 index 0000000000..9403edb7f2 --- /dev/null +++ b/client/react-native/common/graphql/updaters/eventList.js @@ -0,0 +1,15 @@ +import { event } from '../../utils' +import { merge } from '../../helpers' +import { updater } from '../../relay' + +export const defaultArguments = { + filter: event.default, + orderBy: 'created_at', + orderDesc: true, +} + +export default (store, args) => + updater(store).connection( + 'EventList_EventList', + merge([defaultArguments, args]) + ) diff --git a/client/react-native/common/graphql/updaters/index.js b/client/react-native/common/graphql/updaters/index.js new file mode 100644 index 0000000000..6a5cba88a1 --- /dev/null +++ b/client/react-native/common/graphql/updaters/index.js @@ -0,0 +1,3 @@ +export conversationList from './conversationList' +export contactList from './contactList' +export eventList from './eventList' diff --git a/client/react-native/common/relay/Pagination.js b/client/react-native/common/relay/Pagination.js index f6f83ea320..85b7384b4e 100644 --- a/client/react-native/common/relay/Pagination.js +++ b/client/react-native/common/relay/Pagination.js @@ -4,17 +4,9 @@ import Relay from 'react-relay' import { Flex } from '../components/Library' import { QueryReducer } from '.' +import genericUpdater from './genericUpdater' class PaginationContainer extends PureComponent { - componentDidMount () { - this.props.subscribers && this.props.subscribers.forEach(s => s.subscribe()) - } - - componentWillUnmount () { - this.props.subscribers && - this.props.subscribers.forEach(s => s.unsubscribe()) - } - onEndReached = () => { if (!this.props.relay.hasMore() || this.props.relay.isLoading()) { return @@ -38,14 +30,10 @@ class PaginationContainer extends PureComponent { renderItem = ({ item: { node } }) => this.props.renderItem({ data: node }) render () { - const { data, connection, relay, renderItem, inverted, style } = this.props + const { data, alias, relay, renderItem, inverted, style } = this.props return ( s.subscribe()) + const { subscriptions = [], fragment, alias, variables } = this.props + this.subscribers = subscriptions.map(s => + s.subscribe({ + updater: genericUpdater(fragment, alias, { + ...variables, + count: undefined, + cursor: undefined, + }), + }) + ) } componentWillUnmount () { @@ -111,6 +107,7 @@ 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/RelayContext.js b/client/react-native/common/relay/RelayContext.js index 00b531858f..b28415d994 100644 --- a/client/react-native/common/relay/RelayContext.js +++ b/client/react-native/common/relay/RelayContext.js @@ -5,6 +5,7 @@ export const contextValue = ({ mutations, subscriptions, queries, + updaters, }) => ({ environment, mutations: Object.keys(mutations).reduce((a, k) => { @@ -19,6 +20,10 @@ export const contextValue = ({ a[k] = queries[k]({ environment }) return a }, {}), + updaters: Object.keys(updaters).reduce((a, k) => { + a[k] = updaters[k] + return a + }, {}), }) export default React.createContext() diff --git a/client/react-native/common/relay/fragment-helper.js b/client/react-native/common/relay/fragment-helper.js new file mode 100644 index 0000000000..802ab73669 --- /dev/null +++ b/client/react-native/common/relay/fragment-helper.js @@ -0,0 +1,54 @@ +import Relay from 'react-relay' + +export class ConnectionHelper { + constructor (selection) { + console.log('new ConnectionHelper') + Object.keys(selection).forEach(k => (this[k] = selection[k])) + } + + getEdgeType = _ => + console.log('EdgeType') || + ((_ = this.selections.find(_ => _.concreteType.match(/Edge$/))) && + _.concreteType) + + getMetadata = metadata => metadata.find(_ => _.alias === this.alias) + + get key () { + console.log('key') + return this.name.replace(/^__/g, '').replace(/_connection$/g, '') + } +} + +export class FragmentHelper { + constructor (schema) { + const { selections, metadata } = schema.data() + + this.schema = schema + this.selections = selections + this.metadata = metadata + } + + createContainer = component => + Relay.createFragmentContainer(component, this.schema) + + getSelection = alias => this.selections.find(_ => _.alias === alias) + + getConnection = (alias, _) => { + console.log('getConnection') + return alias == null + ? this.getDefaultConnection() + : (_ = this.getSelection(alias)) && + _.concreteType.match(/Connection$/g) && + new ConnectionHelper(_) + } + + getDefaultConnection = _ => { + console.log('getDefaultConnection') + return ( + (_ = this.selections.find(_ => _.concreteType.match(/Connection$/g))) && + new ConnectionHelper(_) + ) + } +} + +export default FragmentHelper diff --git a/client/react-native/common/relay/genericUpdater.js b/client/react-native/common/relay/genericUpdater.js new file mode 100644 index 0000000000..5acbd12045 --- /dev/null +++ b/client/react-native/common/relay/genericUpdater.js @@ -0,0 +1,59 @@ +import { FragmentHelper } from './fragment-helper' +import { ConnectionHandler } from 'relay-runtime' + +const deepFilterEqual = (a, b) => { + if (typeof a !== typeof b) { + return false + } + switch (typeof a) { + case 'object': + if (Array.isArray(a)) { + return a.every(av => b.some(bv => deepFilterEqual(av, bv))) + } + return Object.keys(a).every(k => deepFilterEqual(a[k], b[k])) + default: + return a === b + } +} + +/* + * This function will create a generic relay updater for pagination connection + * based on fragment information + * 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 root = store.getRoot() + const connection = ConnectionHandler.getConnection( + root, + helper.getConnection(alias).key, + args + ) + + if (deepFilterEqual(args, { filter: data }) === false) { + // delete + ConnectionHandler.deleteNode(connection, data.id) + return + } + // add + const cursor = data[args.orderBy || args.sortBy || 'id'] + const node = store.get(data.id) + const edge = ConnectionHandler.createEdge( + store, + connection, + node, + helper.getConnection(alias).getEdgeType + ) + if ( + connectionHelper().getMetadata().direction === 'forward' && + args.orderDesc === false + ) { + ConnectionHandler.insertEdgeAfter(connection, edge, cursor) + return + } + ConnectionHandler.insertEdgeBefore(connection, edge, cursor) + } +} diff --git a/client/react-native/common/relay/index.js b/client/react-native/common/relay/index.js index d4524bff07..2f4edc24ba 100644 --- a/client/react-native/common/relay/index.js +++ b/client/react-native/common/relay/index.js @@ -5,3 +5,5 @@ export subscriber from './subscriber' export updater from './updater' export Pagination from './Pagination' export RelayContext, { contextValue } from './RelayContext' +export genericUpdater from './genericUpdater' +export FragmentHelper from './fragment-helper' diff --git a/client/react-native/common/relay/subscriber.js b/client/react-native/common/relay/subscriber.js index ffedaefdb7..62f166515f 100644 --- a/client/react-native/common/relay/subscriber.js +++ b/client/react-native/common/relay/subscriber.js @@ -1,12 +1,6 @@ import { requestSubscription } from 'react-relay' -export default ({ - environment, - subscription, - iterators = [], - updaters = [], -}) => { - let _generators = iterators +export default ({ environment, subscription, updaters = [] }) => { let _updaters = updaters let dispose = () => {} @@ -20,27 +14,24 @@ export default ({ updater: (store, data) => _updaters.forEach(updater => updater(store, data)), }).dispose - return { dispose } } - const subscribe = ({ updater, iterator }) => { - const generator = iterator && iterator() - iterator && _generators.push(generator) + const subscribe = ({ updater }) => { + if (_updaters.length === 0 && updater) { + start() + } updater && _updaters.push(updater) - generator && generator.next() return { unsubscribe: () => { - _generators = iterator - ? _generators.filter(_ => _ !== iterator) - : _generators _updaters = updater ? _updaters.filter(_ => _ !== updater) : _updaters + if (_updaters.length === 0) { + dispose() + } }, } } return { - start, - dispose, subscribe, } } diff --git a/core/api/p2p/event.proto b/core/api/p2p/event.proto index dbba53cd6c..8564454744 100644 --- a/core/api/p2p/event.proto +++ b/core/api/p2p/event.proto @@ -16,7 +16,7 @@ message Event { // Sender is the ID of the sender. // this field is a member of the composite primary key to avoid id collisions. - string sender_id = 2 [(gogoproto.moretags) = "gorm:\"primary_key\"", (gogoproto.customname) = "SenderID"]; + string sender_id = 2 [gql.graphql_id = true, (gogoproto.moretags) = "gorm:\"primary_key\"", (gogoproto.customname) = "SenderID"]; // CreatedAt is set to current date when initializing a new Event object. // This field is required by gorm. diff --git a/core/node/p2pclient.go b/core/node/p2pclient.go index 490d6531ef..e78e60ca30 100644 --- a/core/node/p2pclient.go +++ b/core/node/p2pclient.go @@ -32,7 +32,7 @@ func (n *Node) EnqueueOutgoingEvent(event *p2p.Event) error { func (n *Node) contactShareMe(to *entity.Contact) error { event := n.NewContactEvent(to, p2p.Kind_ContactShareMe) - if err := event.SetAttrs(&p2p.ContactShareAttrs{Contact: n.config.Myself.Filtered()}); err != nil { + if err := event.SetAttrs(&p2p.ContactShareMeAttrs{Me: n.config.Myself.Filtered()}); err != nil { return err } if err := n.EnqueueOutgoingEvent(event); err != nil {