Skip to content

Commit e793e39

Browse files
committed
feat: hook based approach at persistence
1 parent 8180ce6 commit e793e39

File tree

11 files changed

+41
-116
lines changed

11 files changed

+41
-116
lines changed

.eslintignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ cjs/
22
es/
33
umd/
44
coverage/
5-
examples/umd.js
5+
examples/assets/

examples/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
umd.js
1+
assets/

examples/components/Persistence.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
const { useState, useEffect } = React
22

3+
function makeStateHookFactory(prefix) {
4+
return function makeStateHook(key) {
5+
const id = [prefix, key].join('-')
6+
7+
return function useSessionStorageState(initializer) {
8+
const result = useState(
9+
JSON.parse(sessionStorage.getItem(id) || 'null') || initializer
10+
)
11+
12+
const [state] = result
13+
14+
useEffect(() => {
15+
sessionStorage.setItem(id, JSON.stringify(state))
16+
}, [state])
17+
18+
return result
19+
}
20+
}
21+
}
22+
323
function Persistence() {
424
const {
525
currentToken,
@@ -14,7 +34,7 @@ function Persistence() {
1434
defaultPageNumber: 1,
1535
defaultPageSize: 5,
1636
},
17-
useTokenPagination.sessionPersister('persistence')
37+
makeStateHookFactory('persistence')
1838
)
1939
const [data, setData] = useState()
2040

examples/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
88
<script src="https://unpkg.com/prop-types@15/prop-types.js"></script>
99
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
10-
<script src="umd.js"></script>
10+
<script src="assets/token-pagination-hooks.js"></script>
1111
<script type="text/babel" src="components/Output.js"></script>
1212
<script type="text/babel" src="components/Source.js"></script>
1313
<script

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"main": "cjs/index.js",
88
"module": "es/index.js",
99
"unpkg": "umd/index.js",
10+
"umd": "umd/index.js",
1011
"files": [
1112
"cjs/",
1213
"es/",

rollup.config.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ export default {
55
dir: 'cjs',
66
format: 'cjs',
77
exports: 'default',
8-
esModule: false,
98
},
109
{
1110
dir: 'es',
@@ -20,7 +19,7 @@ export default {
2019
},
2120
},
2221
{
23-
file: 'examples/umd.js',
22+
file: 'examples/assets/token-pagination-hooks.js',
2423
format: 'umd',
2524
name: 'useTokenPagination',
2625
globals: {

src/controlled.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import { useCallback, useEffect, useState, useMemo } from 'react'
2-
import { NULL_PERSISTER } from './persisters'
1+
import React, { useCallback, useEffect, useMemo } from 'react'
32
import { assertNumber } from './utils'
43

54
export default function useControlledTokenPagination(
65
pageNumber,
7-
persister = NULL_PERSISTER
6+
stateHookFactory = () => React.useState
87
) {
98
assertNumber('pageNumber', pageNumber)
109

11-
const [mapping, setMapping] = useState(() => {
12-
const { mapping } = persister.hydrate()
13-
return mapping || {}
14-
})
10+
const useState = stateHookFactory('controlled')
11+
12+
const [mapping, setMapping] = useState({})
1513

1614
const updateToken = useCallback(
1715
nextToken => {
@@ -30,10 +28,6 @@ export default function useControlledTokenPagination(
3028
[updateToken]
3129
)
3230

33-
useEffect(() => {
34-
persister.persist({ mapping })
35-
}, [persister, mapping])
36-
3731
return useMemo(
3832
() => ({
3933
currentToken: mapping[pageNumber],

src/index.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
import useControlledTokenPagination from './controlled'
22
import useUncontrolledTokenPagination from './uncontrolled'
3-
import * as persisters from './persisters'
43

54
const variants = {
65
number: useControlledTokenPagination,
76
object: useUncontrolledTokenPagination,
87
}
98

10-
export default function useTokenPagination(options, persister) {
9+
export default function useTokenPagination(options, stateHookFactory) {
1110
const variant = variants[typeof options]
1211

1312
if (!variant) {
1413
throw new Error(`Unsupported options ${options} of type ${typeof options}`)
1514
}
1615

17-
return variant(options, persister)
16+
return variant(options, stateHookFactory)
1817
}
19-
20-
Object.assign(useTokenPagination, persisters)

src/persisters.js

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/persisters.test.js

Lines changed: 0 additions & 54 deletions
This file was deleted.

src/uncontrolled.js

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { useCallback, useState, useMemo, useEffect } from 'react'
1+
import React, { useCallback, useMemo } from 'react'
2+
23
import useControlledTokenPagination from './controlled'
3-
import { NULL_PERSISTER } from './persisters'
44
import { assertNumber } from './utils'
55

66
const DEFAULTS = {
@@ -12,20 +12,18 @@ const changerTypes = ['function', 'number']
1212

1313
export default function useUncontrolledTokenPagination(
1414
options,
15-
persister = NULL_PERSISTER
15+
stateHookFactory = () => React.useState
1616
) {
1717
options = { ...DEFAULTS, ...options }
1818

1919
assertNumber('defaultPageNumber', options.defaultPageNumber)
2020
assertNumber('defaultPageSize', options.defaultPageSize)
2121

22-
const [{ pageNumber, pageSize }, setPagination] = useState(() => {
23-
const { pageNumber, pageSize } = persister.hydrate()
22+
const useState = stateHookFactory('uncontrolled')
2423

25-
return {
26-
pageNumber: pageNumber || options.defaultPageNumber,
27-
pageSize: pageSize || options.defaultPageSize,
28-
}
24+
const [{ pageNumber, pageSize }, setPagination] = useState({
25+
pageNumber: options.defaultPageNumber,
26+
pageSize: options.defaultPageSize,
2927
})
3028

3129
const change = useCallback(
@@ -59,11 +57,7 @@ export default function useUncontrolledTokenPagination(
5957
change,
6058
])
6159

62-
const controlled = useControlledTokenPagination(pageNumber, persister)
63-
64-
useEffect(() => {
65-
persister.persist({ pageNumber, pageSize })
66-
}, [persister, pageNumber, pageSize])
60+
const controlled = useControlledTokenPagination(pageNumber, stateHookFactory)
6761

6862
return useMemo(
6963
() => ({

0 commit comments

Comments
 (0)