Skip to content

Commit

Permalink
fix(ui): fix GraphQL cache management
Browse files Browse the repository at this point in the history
  • Loading branch information
ncarlier committed Jun 29, 2020
1 parent 1568aa7 commit 92fd6e6
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 101 deletions.
41 changes: 11 additions & 30 deletions ui/src/categories/cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,47 +7,28 @@ export const updateCacheAfterCreate = (
proxy: DataProxy,
mutationResult: { data?: CreateOrUpdateCategoryResponse | null }
) => {
const previousData = proxy.readQuery<GetCategoriesResponse>({
query: GetCategories,
})
if (previousData && mutationResult && mutationResult.data) {
previousData.categories.entries.unshift(mutationResult.data.createOrUpdateCategory)
}
proxy.writeQuery({ data: previousData, query: GetCategories })
}
/*
export const updateCacheAfterUpdate = (
proxy: DataProxy,
mutationResult: { data?: CreateOrUpdateCategoryResponse | null }
) => {
if (!mutationResult || !mutationResult.data) {
if (!mutationResult.data) {
return
}
const updated = mutationResult.data.createOrUpdateCategory
const created = mutationResult.data.createOrUpdateCategory
created.unread = 0
const previousData = proxy.readQuery<GetCategoriesResponse>({
query: GetCategories
query: GetCategories,
})
if (previousData) {
const categories = previousData.entries.map(cat => {
return cat.id === updated.id ? updated : cat
})
proxy.writeQuery({ data: { categories }, query: GetCategories })
const { categories } = previousData
categories.entries = [created, ...categories.entries]
proxy.writeQuery<GetCategoriesResponse>({ data: { categories }, query: GetCategories })
}
proxy.writeQuery({
data: {
category: updated
},
query: GetCategory,
variables: { id: updated.id }
})
}*/
}

export const updateCacheAfterDelete = (ids: number[]) => (proxy: DataProxy) => {
const previousData = proxy.readQuery<GetCategoriesResponse>({
query: GetCategories,
})
if (previousData) {
const categories = previousData.categories.entries.filter((category) => category.id && !ids.includes(category.id))
proxy.writeQuery({ data: { categories }, query: GetCategories })
const { categories } = previousData
categories.entries = categories.entries.filter((category) => category.id && !ids.includes(category.id))
proxy.writeQuery<GetCategoriesResponse>({ data: { categories }, query: GetCategories })
}
}
2 changes: 0 additions & 2 deletions ui/src/settings/api-keys/EditApiKeyForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import FormInputField from '../../components/FormInputField'
import { MessageContext } from '../../context/MessageContext'
import ErrorPanel from '../../error/ErrorPanel'
import { getGQLError, isValidForm } from '../../helpers'
import { updateCacheAfterUpdate } from './cache'
import { ApiKey, CreateOrUpdateApiKeyRequest, CreateOrUpdateApiKeyResponse } from './models'
import { CreateOrUpdateApiKey } from './queries'

Expand All @@ -35,7 +34,6 @@ export default ({ data, history }: Props) => {
try {
await editApiKeyMutation({
variables: apiKey,
update: updateCacheAfterUpdate,
})
showMessage(`API key edited: ${apiKey.alias}`)
history.goBack()
Expand Down
34 changes: 6 additions & 28 deletions ui/src/settings/api-keys/cache.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,23 @@
import { DataProxy } from 'apollo-cache'

import { CreateOrUpdateApiKeyResponse, GetApiKeysResponse } from './models'
import { GetApiKey, GetApiKeys } from './queries'
import { GetApiKeys } from './queries'

export const updateCacheAfterCreate = (
proxy: DataProxy,
mutationResult: { data?: CreateOrUpdateApiKeyResponse | null }
) => {
const previousData = proxy.readQuery<GetApiKeysResponse>({
query: GetApiKey,
})
if (previousData && mutationResult.data) {
previousData.apiKeys.unshift(mutationResult.data.createOrUpdateAPIKey)
proxy.writeQuery({ data: previousData, query: GetApiKeys })
}
}

export const updateCacheAfterUpdate = (
proxy: DataProxy,
mutationResult: { data?: CreateOrUpdateApiKeyResponse | null }
) => {
if (!mutationResult || !mutationResult.data) {
if (!mutationResult.data) {
return
}
const updated = mutationResult.data.createOrUpdateAPIKey
const created = mutationResult.data.createOrUpdateAPIKey
const previousData = proxy.readQuery<GetApiKeysResponse>({
query: GetApiKeys,
})
if (previousData) {
const apiKeys = previousData.apiKeys.map((apiKey) => {
return apiKey.id === updated.id ? updated : apiKey
})
proxy.writeQuery({ data: { apiKeys }, query: GetApiKeys })
const apiKeys = [created, ...previousData.apiKeys]
proxy.writeQuery<GetApiKeysResponse>({ data: { apiKeys }, query: GetApiKeys })
}
proxy.writeQuery({
data: {
apiKey: updated,
},
query: GetApiKey,
variables: { id: updated.id },
})
}

export const updateCacheAfterDelete = (ids: number[]) => (proxy: DataProxy) => {
Expand All @@ -48,6 +26,6 @@ export const updateCacheAfterDelete = (ids: number[]) => (proxy: DataProxy) => {
})
if (previousData) {
const apiKeys = previousData.apiKeys.filter((apiKey) => !ids.includes(apiKey.id))
proxy.writeQuery({ data: { apiKeys }, query: GetApiKeys })
proxy.writeQuery<GetApiKeysResponse>({ data: { apiKeys }, query: GetApiKeys })
}
}
2 changes: 0 additions & 2 deletions ui/src/settings/archive-services/EditArchiveServiceForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import FormSelectField from '../../components/FormSelectField'
import { MessageContext } from '../../context/MessageContext'
import ErrorPanel from '../../error/ErrorPanel'
import { getGQLError, isValidForm } from '../../helpers'
import { updateCacheAfterUpdate } from './cache'
import { ArchiveService, CreateOrUpdateArchiveServiceResponse } from './models'
import KeeperConfigForm from './providers/KeeperConfigForm'
import WebhookConfigForm from './providers/WebhookConfigForm'
Expand Down Expand Up @@ -48,7 +47,6 @@ export default ({ data, history }: Props) => {
try {
await editArchiveServiceMutation({
variables: service,
update: updateCacheAfterUpdate,
})
showMessage(`Archive service edited: ${service.alias}`)
history.goBack()
Expand Down
48 changes: 9 additions & 39 deletions ui/src/settings/archive-services/cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,28 @@
import { DataProxy } from 'apollo-cache'

import { CreateOrUpdateArchiveServiceResponse, GetArchiveServicesResponse } from './models'
import { GetArchiveService, GetArchiveServices } from './queries'
import { GetArchiveServices } from './queries'

export const updateCacheAfterCreate = (
proxy: DataProxy,
mutationResult: { data?: CreateOrUpdateArchiveServiceResponse | null }
) => {
if (!mutationResult || !mutationResult.data) {
if (!mutationResult.data) {
return
}
const created = mutationResult.data.createOrUpdateArchiver
const previousData = proxy.readQuery<GetArchiveServicesResponse>({
query: GetArchiveServices,
})

if (created.is_default && previousData) {
previousData.archivers = previousData.archivers.map((service) => {
return { ...service, is_default: false }
})
}
if (previousData) {
previousData.archivers.unshift(created)
}
proxy.writeQuery({ data: previousData, query: GetArchiveServices })
}

export const updateCacheAfterUpdate = (
proxy: DataProxy,
mutationResult: { data?: CreateOrUpdateArchiveServiceResponse | null }
) => {
if (!mutationResult || !mutationResult.data) {
return
}
const updated = mutationResult.data.createOrUpdateArchiver
const previousData = proxy.readQuery<GetArchiveServicesResponse>({
query: GetArchiveServices,
})
if (previousData) {
const archivers = previousData.archivers.map((service) => {
if (updated.is_default) {
service = { ...service, is_default: false }
}
return service.id === updated.id ? updated : service
})
proxy.writeQuery({ data: { archivers }, query: GetArchiveServices })
if (created.is_default) {
previousData.archivers = previousData.archivers.map((service) => {
return { ...service, is_default: false }
})
}
const archivers = [created, ...previousData.archivers]
proxy.writeQuery<GetArchiveServicesResponse>({ data: { archivers }, query: GetArchiveServices })
}
proxy.writeQuery({
data: {
archiver: updated,
},
query: GetArchiveService,
variables: { id: updated.id },
})
}

export const updateCacheAfterDelete = (ids: number[]) => (proxy: DataProxy) => {
Expand Down

0 comments on commit 92fd6e6

Please sign in to comment.