@sanity/visual-editing
Version:
[](https://npm-stat.com/charts.html?package=@sanity/visual-editing) [](https://
161 lines (160 loc) • 4.62 kB
JavaScript
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