mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
refactor: remove sync storage (#2269)
This commit is contained in:
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* @vitest-environment happy-dom
|
||||
*/
|
||||
import { atomWithSyncStorage } from '@affine/jotai';
|
||||
import { createStore } from 'jotai';
|
||||
import { afterEach, describe, expect, test } from 'vitest';
|
||||
|
||||
afterEach(() => {
|
||||
localStorage.clear();
|
||||
});
|
||||
|
||||
describe('atomWithSyncStorage', () => {
|
||||
test('basic', () => {
|
||||
const store = createStore();
|
||||
{
|
||||
[0, '0', false, null, undefined, NaN].forEach(value => {
|
||||
const atom = atomWithSyncStorage('test', value);
|
||||
expect(store.get(atom)).toBe(value);
|
||||
});
|
||||
}
|
||||
});
|
||||
test('mutate', () => {
|
||||
{
|
||||
const store = createStore();
|
||||
const atom = atomWithSyncStorage('test', 0);
|
||||
expect(store.get(atom)).toBe(0);
|
||||
store.set(atom, 1);
|
||||
expect(store.get(atom)).toBe(1);
|
||||
}
|
||||
{
|
||||
const store = createStore();
|
||||
const atom = atomWithSyncStorage('test', 0);
|
||||
expect(store.get(atom)).toBe(1);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -1,50 +1 @@
|
||||
import { createJSONStorage, RESET } from 'jotai/utils';
|
||||
import { atom } from 'jotai/vanilla';
|
||||
|
||||
const storage = createJSONStorage<any>(() =>
|
||||
typeof window !== 'undefined'
|
||||
? window.localStorage
|
||||
: (undefined as unknown as Storage)
|
||||
);
|
||||
|
||||
type SetStateActionWithReset<Value> =
|
||||
| Value
|
||||
| typeof RESET
|
||||
| ((prev: Value) => Value | typeof RESET);
|
||||
|
||||
// similar to atomWithStorage, but will not trigger twice on init
|
||||
// https://github.com/pmndrs/jotai/discussions/1737
|
||||
export function atomWithSyncStorage<Value>(key: string, initialValue: Value) {
|
||||
const storedValue = storage.getItem(key, initialValue) as Value;
|
||||
const _value =
|
||||
typeof storedValue === 'symbol'
|
||||
? initialValue
|
||||
: (storage.getItem(key, initialValue) as Value);
|
||||
const baseAtom = atom(_value);
|
||||
|
||||
baseAtom.onMount = setAtom => {
|
||||
if (storage.subscribe) {
|
||||
return storage.subscribe(key, setAtom, initialValue);
|
||||
}
|
||||
};
|
||||
|
||||
const anAtom = atom(
|
||||
get => get(baseAtom),
|
||||
(get, set, update: SetStateActionWithReset<Value>) => {
|
||||
const nextValue =
|
||||
typeof update === 'function'
|
||||
? (update as (prev: Value) => Value | typeof RESET)(get(baseAtom))
|
||||
: update;
|
||||
if (nextValue === RESET) {
|
||||
set(baseAtom, initialValue);
|
||||
return storage.removeItem(key);
|
||||
}
|
||||
set(baseAtom, nextValue);
|
||||
return storage.setItem(key, nextValue);
|
||||
}
|
||||
);
|
||||
|
||||
return anAtom;
|
||||
}
|
||||
|
||||
export * from './resource';
|
||||
|
||||
Reference in New Issue
Block a user