Skip to content

Commit

Permalink
fix: rerender remounted components
Browse files Browse the repository at this point in the history
  • Loading branch information
ph-fritsche committed Jan 21, 2021
1 parent 05944e0 commit 6287ea3
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
15 changes: 12 additions & 3 deletions src/shared/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,26 @@ export function removeListener(
cache: reactCache,
id: string,
keys?: (keyof reactCache)[],
): void {
(keys ?? Object.keys(cache)).forEach(key => {
delProperty(cache, [key, 'listeners', id])
): (keyof reactCache)[] {
const removedKeys: (keyof reactCache)[] = []
const traverseKeys = (keys ?? Object.keys(cache))

traverseKeys.forEach(key => {
if (cache[key]?.listeners?.[id]) {
delProperty(cache, [key, 'listeners', id])
removedKeys.push(key)
}
})

return removedKeys
}

export function dispatch(
cache: reactCache,
keys: (keyof reactCache)[],
): void {
const listeners: reactCacheEntry['listeners'] = {}

keys.forEach(key => {
Object.entries(cache[key]?.listeners ?? {}).forEach(([id, listener]) => {
listeners[id] = listener
Expand Down
13 changes: 8 additions & 5 deletions src/useCached.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useContext, useEffect, useMemo, useRef, useState } from 'react'
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'
import { createStore } from 'idb-keyval'
import { reactCache, removeListener } from './shared'
import { addListener, reactCache, removeListener } from './shared'
import { createApi } from './methods'
import { CacheContext } from './context'

Expand All @@ -24,16 +24,19 @@ export function useCached({dbName = 'Cached', storeName = 'keyval', context = tr
}
const cache = context ? contextCache[dbName][storeName] : componentCache

const subscribedKeys = useRef<string[]>([])
const id = useRef(Math.random().toString(36)).current
const [, setState] = useState({})
const [, _setState] = useState({})
const rerender = useCallback(() => _setState({}), [_setState])

useEffect(() => {
addListener(cache, subscribedKeys.current, id, rerender)
return () => {
removeListener(cache, id)
subscribedKeys.current = removeListener(cache, id)
}
})

const api = useMemo(() => createApi(cache, store, id, () => setState({})), [cache, store, id, setState])
const api = useMemo(() => createApi(cache, store, id, rerender), [cache, store, id, rerender])

return api
}
4 changes: 2 additions & 2 deletions test/shared/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ it('remove listeners', () => {
},
}

removeListener(cache, 'listenerTestA', ['foo', 'baz'])
removeListener(cache, 'listenerTestB')
expect(removeListener(cache, 'listenerTestA', ['foo', 'baz'])).toEqual(['foo'])
expect(removeListener(cache, 'listenerTestB')).toEqual(['bar'])

expect(cache).toEqual({
bar: {
Expand Down

0 comments on commit 6287ea3

Please sign in to comment.