UNPKG

@sanity/visual-editing

Version:

[![npm stat](https://img.shields.io/npm/dm/@sanity/visual-editing.svg?style=flat-square)](https://npm-stat.com/charts.html?package=@sanity/visual-editing) [![npm version](https://img.shields.io/npm/v/@sanity/visual-editing.svg?style=flat-square)](https://

161 lines (160 loc) 4.62 kB
import { actor, emptyActor, isEmptyActor, listeners, setActor } from "../_chunks-es/context.js"; import { documentMutatorMachine, createSharedListener } from "@sanity/mutate/_unstable_machine"; import { fromPromise, enqueueActions, setup, assign, stopChild, emit, assertEvent } from "xstate"; import { SanityEncoder } from "@sanity/mutate"; const createDocumentMutator = (comlink) => { const fetchSnapshot = fromPromise(async ({ input, signal }) => { const { id } = input, { snapshot } = await comlink.fetch("visual-editing/fetch-snapshot", { documentId: id }, { signal }); return snapshot; }), submitMutations = fromPromise(async ({ input }) => { const { transactions } = input; for (const transaction of transactions) { const data = SanityEncoder.encodeTransaction(transaction); return comlink.post("visual-editing/mutate", data); } }); return documentMutatorMachine.provide({ actions: { "send sync event to parent": enqueueActions(({ enqueue }) => { enqueue.sendParent(({ context }) => ({ type: "sync", id: context.id, document: context.remote })), enqueue.emit(({ context }) => ({ type: "ready", snapshot: context.local })); }) }, actors: { "fetch remote snapshot": fetchSnapshot, "submit mutations as transactions": submitMutations } }); }, datasetMutatorMachine = setup({ types: {}, actions: { "emit sync event": emit(({ event }) => (assertEvent(event, "sync"), event)), "emit mutation event": emit(({ event }) => (assertEvent(event, "mutation"), event)), "emit rebased event": emit(({ event }) => (assertEvent(event, ["rebased.local", "rebased.remote"]), event)), "emit pristine event": emit(({ event }) => (assertEvent(event, ["pristine"]), event)), "add document actor": assign({ documents: ({ context, event, spawn }) => { assertEvent(event, "observe"); const id = event.documentId; return context.documents[id] ? context.documents : { ...context.documents, [id]: spawn("documentMutatorMachine", { input: { id, client: context.client, sharedListener: context.sharedListener || createSharedListener(context.client) }, id }) }; } }), "stop remote snapshot": stopChild(({ context, event }) => (assertEvent(event, "unobserve"), context.documents[event.documentId])), "remove remote snapshot from context": assign({ documents: ({ context, event }) => { if (assertEvent(event, "unobserve"), !context.documents[event.documentId]) return context.documents; const { [event.documentId]: _, ...documents } = context.documents; return documents; } }) }, actors: { documentMutatorMachine } }).createMachine({ /** @xstate-layout N4IgpgJg5mDOIC5QBsD2BjAhsgIhgrgLZgB2ALgMTICWsZpA2gAwC6ioADqrNWdaiXYgAHogC0ADgBMAOgkA2ACyKArBICcTdfKXSANCACeiFQHYZpgMxWV800yYqp6gIyn5AXw8G0WXAWJyCnwSGjpGViEuHj4BIVEEKUt5OSlFU1smFwkFW0sDY0T1GRUXRXkXKVN7HSYJJkUvHwxsPHQiUjIZDgAnWj4SMApCfDJMemY2JBBo3n5BaYSXeVlbKRUsiXdFSxcXfKNERSqZTbr1zVMJNyaQX1aAzpkIah6yQwp0VEJCXkmo7hzOKLRDLFwyFxaSzXKTOKQudSKCQFRDOczqCSWJjwjbHCQqRFebwgEioCBwIT3fztQJkAExebxcQuFEIZaWGRIrF7dSXKTyFSNYlUtodcjdPp0aiDelAhagBLpVmWAmc46mNwSZTyLQuFS3EWPcUvN6FTiA2LykSoq6c6wbCqVUzparKioyRFVfkq1zqNSWIkeIA */ id: "dataset-mutator", context: ({ input }) => ({ documents: {}, client: input.client, sharedListener: input.sharedListener }), on: { sync: { actions: ["emit sync event"] }, mutation: { actions: ["emit mutation event"] }, "rebased.*": { actions: ["emit rebased event"] }, pristine: { actions: ["emit pristine event"] }, observe: { actions: ["add document actor"] }, unobserve: { actions: ["stop remote snapshot", "remove remote snapshot from context"] } }, initial: "pristine", states: { pristine: {} } }), createDatasetMutator = (comlink) => datasetMutatorMachine.provide({ actors: { documentMutatorMachine: createDocumentMutator(comlink) } }); export { actor, createDatasetMutator, createDocumentMutator, emptyActor, isEmptyActor, listeners, setActor }; //# sourceMappingURL=index.js.map