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 {