one
Version:
One is a React framework for web, iOS, and Android apps.
64 lines (61 loc) • 1.61 kB
JavaScript
import { getNativeSyncFactory } from "./syncNative.mjs";
const SYNC_STATE_ID_KEY = "__one_sync_state_id__";
const SYNC_STATE_BRAND = "__one_sync_state__";
function isSyncState(value) {
if (value == null || typeof value !== "object") return false;
const obj = value;
return obj["__one_sync_state__"] === true && typeof obj["__one_sync_state_id__"] === "number" && obj["__one_sync_state_id__"] !== 0;
}
function getSyncStateId(state) {
if (!state) return void 0;
return state[SYNC_STATE_ID_KEY];
}
function createSyncState(initial) {
const host = getNativeSyncFactory().create(initial);
let onChange = null;
const listeners = /* @__PURE__ */ new Set();
let published = host.get();
const state = {
get value() {
return host.get();
},
set value(next) {
state.set(next);
},
get() {
return host.get();
},
set(next) {
if (!Object.is(host.get(), next)) host.set(next);
if (Object.is(published, next)) return;
published = next;
for (const listener of [...listeners]) listener(next);
},
get onChange() {
return onChange;
},
set onChange(next) {
onChange = next ?? null;
host.setOnChange(onChange);
},
subscribe(listener) {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
},
release() {
listeners.clear();
onChange = null;
host.release();
},
getSnapshot() {
return host.get();
},
[SYNC_STATE_BRAND]: true,
[SYNC_STATE_ID_KEY]: host.id
};
return state;
}
export { SYNC_STATE_BRAND, SYNC_STATE_ID_KEY, createSyncState, getSyncStateId, isSyncState };
//# sourceMappingURL=syncStore.mjs.map