budibase/packages/client/src/stores/builder.js

88 lines
2.1 KiB
JavaScript
Raw Normal View History

import { writable, get } from "svelte/store"
import { API } from "api"
2022-02-24 16:36:21 +01:00
import { devToolsStore } from "./devTools.js"
const dispatchEvent = (type, data = {}) => {
window.parent.postMessage({ type, data })
}
const createBuilderStore = () => {
const initialState = {
inBuilder: false,
screen: null,
selectedComponentId: null,
editMode: false,
previewId: null,
previewType: null,
selectedPath: [],
theme: null,
customTheme: null,
previewDevice: "desktop",
isDragging: false,
navigation: null,
// Legacy - allow the builder to specify a layout
layout: null,
}
const store = writable(initialState)
const actions = {
2021-05-04 12:32:22 +02:00
selectComponent: id => {
if (id === get(store).selectedComponentId) {
return
}
store.update(state => ({
...state,
editMode: false,
selectedComponentId: id,
}))
2022-02-24 16:36:21 +01:00
devToolsStore.actions.setAllowSelection(false)
dispatchEvent("select-component", { id })
},
updateProp: (prop, value) => {
dispatchEvent("update-prop", { prop, value })
},
deleteComponent: id => {
dispatchEvent("delete-component", { id })
},
2022-03-07 15:05:26 +01:00
duplicateComponent: id => {
dispatchEvent("duplicate-component", { id })
},
notifyLoaded: () => {
dispatchEvent("preview-loaded")
},
pingEndUser: async () => {
try {
await API.pingEndUser()
} catch (error) {
// Do nothing
}
2021-09-30 16:03:57 +02:00
},
moveComponent: (componentId, destinationComponentId, mode) => {
dispatchEvent("move-component", {
componentId,
destinationComponentId,
mode,
})
},
setDragging: dragging => {
if (dragging === get(store).isDragging) {
return
}
store.update(state => ({ ...state, isDragging: dragging }))
},
setEditMode: enabled => {
if (enabled === get(store).editMode) {
return
}
store.update(state => ({ ...state, editMode: enabled }))
},
}
return {
...store,
set: state => store.set({ ...initialState, ...state }),
actions,
}
}
export const builderStore = createBuilderStore()