Skip to content

Commit

Permalink
Refactor Storage
Browse files Browse the repository at this point in the history
  • Loading branch information
hnordt committed Sep 24, 2016
1 parent 02a56ac commit f1e397a
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 99 deletions.
22 changes: 21 additions & 1 deletion src/LocalStorage.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
import React from 'react'
import Storage from './Storage'

function getItem(key) {
try {
const value = localStorage.getItem(key)
const parsedValue = JSON.parse(value)
return Promise.resolve(parsedValue)
} catch (error) {
return Promise.reject(error)
}
}

function setItem(key, value) {
try {
const stringifiedValue = JSON.stringify(value)
localStorage.setItem(key, stringifiedValue)
return Promise.resolve(value)
} catch (error) {
return Promise.reject(error)
}
}

export default function LocalStorage(props) {
return <Storage {...props} driver={localStorage} />
return <Storage {...props} driver={{ getItem, setItem }} />
}

LocalStorage.propTypes = {
Expand Down
20 changes: 10 additions & 10 deletions src/MemoryStorage.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import React from 'react'
import Storage from './Storage'

const memoryStorage = {
store: {},
getItem(key) {
return this.store[key]
},
setItem(key, value) {
this.store[key] = value
return value
}
const store = {}

function getItem(key) {
return Promise.resolve(store[key])
}

function setItem(key, value) {
store[key] = value
return Promise.resolve(value)
}

export default function MemoryStorage(props) {
return <Storage {...props} driver={memoryStorage} />
return <Storage {...props} driver={{ getItem, setItem }} />
}

MemoryStorage.propTypes = {
Expand Down
22 changes: 21 additions & 1 deletion src/SessionStorage.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
import React from 'react'
import Storage from './Storage'

function getItem(key) {
try {
const value = sessionStorage.getItem(key)
const parsedValue = JSON.parse(value)
return Promise.resolve(parsedValue)
} catch (error) {
return Promise.reject(error)
}
}

function setItem(key, value) {
try {
const stringifiedValue = JSON.stringify(value)
sessionStorage.setItem(key, stringifiedValue)
return Promise.resolve(value)
} catch (error) {
return Promise.reject(error)
}
}

export default function SessionStorage(props) {
return <Storage {...props} driver={sessionStorage} />
return <Storage {...props} driver={{ getItem, setItem }} />
}

SessionStorage.propTypes = {
Expand Down
59 changes: 46 additions & 13 deletions src/Storage.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Component, PropTypes } from 'react'
import isNil from 'lodash/isNil'
import isEqual from 'lodash/isEqual'
import Evee from 'evee'

Expand All @@ -19,15 +20,23 @@ export default class Storage extends Component {

static defaultProps = { initialValues: {} }

state = this.getSubscribedKeys().reduce((result, key) => ({
...result,
[key]: this.props.driver.getItem(key) || this.props.initialValues[key] || null
}), {})
state = {}

subscriptions = this.getSubscribedKeys().map(key => (
evee.on(key, event => !this.willUnmount && this.setState({ [key]: event.data }))
))

componentDidMount() {
this.subscriptions = this.getSubscribedKeys().map(key => (
evee.on(key, event => !this.willUnmount && this.setState({ [key]: event.data }))
))
Promise.all([
this.getInitialValues(),
this.getCurrentValues()
]).then(([initialValues, currentValues]) => {
const nextValues = this.getSubscribedKeys().reduce((result, key) => ({
...result,
[key]: currentValues[key] || initialValues[key]
}), {})
return this.setItems(nextValues)
})
}

componentWillUnmount() {
Expand All @@ -45,18 +54,42 @@ export default class Storage extends Component {
return this.props.subscribe
}

getCurrentValues() {
const subscribedKeys = this.getSubscribedKeys()
const promises = subscribedKeys.map(this.props.driver.getItem)
return Promise.all(promises).then(values => {
return subscribedKeys.reduce((result, key, index) => ({
...result,
[key]: isNil(values[index]) ? null : values[index]
}), {})
})
}

getInitialValues() {
const subscribedKeys = this.getSubscribedKeys()
const promises = subscribedKeys.map(this.props.driver.getItem)
return Promise.all(promises).then(values => {
return subscribedKeys.reduce((result, key) => ({
...result,
[key]: isNil(this.props.initialValues[key]) ? null : this.props.initialValues[key]
}), {})
})
}

setItem = (key, value) => {
if (isEqual(this.props.driver.getItem(key), value)) {
const currentValue = this.state[key]
if (isEqual(currentValue, value)) {
return value
}
this.props.driver.setItem(key, value)
evee.emit(key, value)
return value
return this.props.driver.setItem(key, value).then(value => {
evee.emit(key, value)
return value
})
}

setItems = items => {
Object.keys(items).forEach(key => this.setItem(key, items[key]))
return items
const promises = Object.keys(items).map(key => this.setItem(key, items[key]))
return Promise.all(promises).then(() => items)
}

render() {
Expand Down
74 changes: 0 additions & 74 deletions src/experimental/AsyncStorage.js

This file was deleted.

0 comments on commit f1e397a

Please sign in to comment.