![Oracle Drags Its Feet in the JavaScript Trademark Dispute](https://cdn.sanity.io/images/cgdhsj6q/production/919c3b22c24f93884c548d60cbb338e819ff2435-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
react-localstorage-ts
Advanced tools
A small library to wrap browser's localstorage in a functional fashion.
A small layer over the browser's localstorage, fallbacks to an in-memory store if localstorage is not supported by the browser.
Built with fp-ts
in mind, react-localstorage-ts
gives you a standard way to access objects stored locally.
yarn add react-localstorage-ts
npm install -S react-localstorage-ts
First create the hooks to read/write the values you just defined:
// localHooks.ts
import * as t from "io-ts"
import { makeHooksFromStorage, createLocalStorage } from "react-localstorage-ts"
import { ThemeFlavourCodec, AuthTokenCodec } from "./codecs"
export const localStorage = createLocalStorage(
{
themeFlavour: ThemeFlavourCodec,
authToken: AuthTokenCodec,
},
{ defaultValues: { themeFlavour: "light" } },
)
export const hooks = makeHooksFromStorage(storage)
then you use them in your react components:
// App.tsx
import * as React from "react"
import * as LV from "react-localstorage-ts/LocalValue"
import LightThemeApp from "./components/LightThemeApp"
import DarkThemeApp from "./components/DarkThemeApp"
import { useThemeFlavour } from "./localHooks"
const App: React.FC = () => {
const [themeFlavour, setThemeFlavour] = hooks.useThemeFlavour()
return pipe(
theme,
LV.fold2(
() => {
console.error("wrong value stored in localStorage!")
},
(themeFlavour) => {
switch (themeFlavour) {
case "light": {
return <LightThemeApp />
}
case "dark": {
return <DarkThemeApp />
}
}
},
),
)
}
export default App
A new data structure is defined for items stored in localstorage, LocalValue
. When dealing with a value stored in your localstorage there are three possibilities:
LocalValue introduces a sum type that represents the optionality/correctness dicotomy:
export interface Absent {
readonly _tag: "Absent"
}
export interface Invalid<E> {
readonly _tag: "Invalid"
readonly errors: E
}
export interface Valid<A> {
readonly _tag: "Valid"
readonly value: A
}
export type LocalValue<E, A> = Absent | Invalid<E> | Valid<A>
It also has instances for some of the most common fp-ts
type-classes, so that you can use it in the same way you usually use other fp-ts
abstractions:
// LoginLayout.tsx
import * as LV from "react-localstorage-ts/LocalValue"
import { useAccessToken } from "./localHooks"
import { goToLoginPage } from "./router"
import App from "./App"
const LoginLayout: React.FC = ({ children }) => {
const [token] = useAccessToken()
React.useEffect(() => {
if (!LV.isValid) {
goToLoginPage()
}
}, [])
return pipe(
token,
LV.fold(
() => "no token in storage",
() => "malformed token in storage",
() => <>{children}</>,
), // N.B. when you want to treat the "absent" and "incorrect" case in the same way, you can use fold2 and only define two handling funcitons
)
}
// LoginPage.tsx
import * as LV from "react-localstorage-ts/LocalValue"
import { goToHomePage } from "./router"
import { useAccessToken } from "./localHooks"
const LoginPage: React.FC = ({ children }) => {
const [token, setToken] = useAccessToken()
React.useEffect(() => {
if (LV.isValid(token)) {
goToHomePage()
}
}, [])
return (
<Form
onSubmit={(formValues) =>
api.getToken(formValues).then((t) => setToken(t))
}
/>
)
}
Given that browsers only allows you to store serialized data in string format, codecs must conform to the shape Codec<E, string, B>
, where E
is the type of the decoding error, string
is the type of the data before decoding and B
is the type of the runtime value.
If you use io-ts
you can simply create a layer to convert io-ts
codecs to Codec
compliant instances:
import { pipe } from "fp-ts/lib/function"
import * as t from "io-ts"
import * as E from "fp-ts/Either"
import { Json, JsonFromString } from "io-ts-types"
import * as LV from "react-localstorage-ts/LocalValue"
import { Codec } from "react-localstorage-ts/Codec"
const adaptIoTsCodec = <A, B>(C: t.Type<B, A>): Codec<t.Errors, A, B> => {
return {
encode: C.encode,
decode: (u: unknown) => LV.fromEither(C.decode(u)),
}
}
export const fromIoTsCodec = <A, B extends Json>(C: t.Type<A, B>) => {
const stringCodec = new t.Type<A, string>(
C.name,
C.is,
(u, c) => {
return pipe(
t.string.validate(u, c),
E.chain((jsonString) => JsonFromString.validate(jsonString, c)),
E.chain((json) => C.validate(json, c)),
)
},
(v) => {
return pipe(v, C.encode, JsonFromString.encode)
},
)
return adaptIoTsCodec(stringCodec)
}
If you want to update your localstorage from outside of a react component while still having your components "react" to the change,
you can use the utilities getLocalValue
, setLocalElement
and removeLocalElement
.
to commit to this repository there are a few rules:
commit-msg
hook).here you can find an explanation of the release flow.
FAQs
A small library to wrap browser's localstorage in a functional fashion.
The npm package react-localstorage-ts receives a total of 369 weekly downloads. As such, react-localstorage-ts popularity was classified as not popular.
We found that react-localstorage-ts demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.