feat: gql codegen + caching + optimistic

This commit is contained in:
Andrew Bastin
2021-10-08 23:44:23 +05:30
committed by liyasthomas
parent 2325982801
commit d6324e6ba6
24 changed files with 1687 additions and 342 deletions

View File

@@ -1,7 +1,7 @@
import { KeyingConfig } from "@urql/exchange-graphcache";
import { KeyingConfig } from "@urql/exchange-graphcache"
export const keyDefs: KeyingConfig = {
User: (data) => (data as any).uid,
TeamMember: (data) => (data as any).membershipID,
Team: (data) => data.id as any,
}
}

View File

@@ -0,0 +1,14 @@
import { ResolverConfig } from "@urql/exchange-graphcache"
export const resolversDef: ResolverConfig = {
Query: {
team: (_parent, { teamID }, _cache, _info) => ({
__typename: "Team",
id: teamID as any,
}),
user: (_parent, { uid }, _cache, _info) => ({
__typename: "User",
uid: uid as any,
}),
},
}

View File

@@ -1,18 +1,12 @@
import { UpdatesConfig } from "@urql/exchange-graphcache"
import gql from "graphql-tag"
import { MyTeamsDocument } from "../graphql"
export const updatesDef: Partial<UpdatesConfig> = {
Mutation: {
deleteTeam: (_r, { teamID }, cache, _info) => {
cache.updateQuery(
{
query: gql`
query {
myTeams {
id
}
}
`,
query: MyTeamsDocument,
},
(data: any) => {
data.myTeams = (data as any).myTeams.filter(
@@ -31,13 +25,7 @@ export const updatesDef: Partial<UpdatesConfig> = {
leaveTeam: (_r, { teamID }, cache, _info) => {
cache.updateQuery(
{
query: gql`
query {
myTeams {
id
}
}
`,
query: MyTeamsDocument,
},
(data: any) => {
data.myTeams = (data as any).myTeams.filter(
@@ -56,13 +44,7 @@ export const updatesDef: Partial<UpdatesConfig> = {
createTeam: (result, _args, cache, _info) => {
cache.updateQuery(
{
query: gql`
{
myTeams {
id
}
}
`,
query: MyTeamsDocument,
},
(data: any) => {
data.myTeams.push(result.createTeam)
@@ -70,77 +52,25 @@ export const updatesDef: Partial<UpdatesConfig> = {
}
)
},
renameTeam: (_result, { teamID, newName }, cache, _info) => {
cache.updateQuery(
{
query: gql`
query GetTeam($teamID: ID!) {
team(teamID: $teamID) {
id
name
}
}
`,
variables: {
teamID,
removeTeamMember: (_result, { teamID, userUid }, cache) => {
const newMembers = (
cache.resolve(
{
__typename: "Team",
id: teamID as string,
},
},
(data: any) => {
data.team.name = newName
return data
}
"members"
) as string[]
)
},
removeTeamMember: (_result, { userUid, teamID }, cache) => {
cache.updateQuery(
{
query: gql`
query GetTeam($teamID: ID!) {
team(teamID: $teamID) {
members {
user {
uid
}
}
}
}
`,
variables: {
teamID,
},
},
(data: any) => {
data.team.members = data.team.members.filter(
(x: any) => x.user.uid !== userUid
)
return data
}
)
},
updateTeamMemberRole: (result, { userUid, teamID }, cache) => {
cache.updateQuery(
{
query: gql`
query GetTeam($teamID: ID!) {
team(teamID: $teamID) {
members {
user {
uid
}
}
}
}
`,
variables: {
teamID,
},
},
(data: any) => {
data.team.members = data.team.members.map((x: any) =>
x.user.uid !== userUid ? x : result
)
return data
}
.map((x) => [x, cache.resolve(x, "user") as string])
.map(([key, userKey]) => [key, cache.resolve(userKey, "uid") as string])
.filter(([_key, uid]) => uid !== userUid)
.map(([key]) => key)
cache.link(
{ __typename: "Team", id: teamID as string },
"members",
newMembers
)
},
},