1
0
Fork 0
mirror of synced 2024-09-19 10:48:30 +12:00
budibase/packages/client/src/createApp.js

83 lines
2.6 KiB
JavaScript
Raw Normal View History

import {writable} from "svelte/store";
2019-09-23 17:08:06 +12:00
import { createCoreApi } from "./core";
import { getStateOrValue } from "./state/getState";
2019-10-10 18:18:02 +13:00
import { setState, setStateFromBinding } from "./state/setState";
import { trimSlash } from "./common/trimSlash";
2019-10-10 18:18:02 +13:00
import { isBound } from "./state/isState";
import { _initialiseChildren } from "./render/initialiseChildren";
import { createTreeNode } from "./render/renderComponent";
export const createApp = (document, componentLibraries, appDefinition, user, uiFunctions) => {
2019-09-23 17:08:06 +12:00
const coreApi = createCoreApi(appDefinition, user);
2019-10-19 05:32:03 +13:00
appDefinition.hierarchy = coreApi.templateApi.constructHierarchy(appDefinition.hierarchy);
2019-09-26 16:40:58 +12:00
const store = writable({
_bbuser: user
});
let globalState = null;
store.subscribe(s => {
globalState = s;
});
const relativeUrl = (url) =>
appDefinition.appRootPath
? appDefinition.appRootPath + "/" + trimSlash(url)
: url;
const apiCall = (method) => (url, body) =>
fetch(relativeUrl(url), {
method: method,
headers: {
'Content-Type': 'application/json',
},
body: body && JSON.stringify(body),
});
const api = {
post: apiCall("POST"),
get: apiCall("GET"),
patch: apiCall("PATCH"),
delete: apiCall("DELETE")
};
2019-10-07 18:03:41 +13:00
const safeCallEvent = (event, context) => {
const isFunction = (obj) =>
!!(obj && obj.constructor && obj.call && obj.apply);
if(isFunction(event)) event(context);
}
const initialiseChildrenParams = (hydrate, treeNode) => ({
bb, coreApi, store, document,
componentLibraries, appDefinition,
hydrate, uiFunctions, treeNode
});
const bb = (treeNode, componentProps) => ({
hydrateChildren: _initialiseChildren(initialiseChildrenParams(true, treeNode)),
appendChildren: _initialiseChildren(initialiseChildrenParams(false, treeNode)),
2020-01-29 00:00:44 +13:00
insertChildren: (props, htmlElement, anchor) =>
_initialiseChildren(initialiseChildrenParams(false, treeNode))
2020-01-29 00:00:44 +13:00
(props, htmlElement, anchor),
context: treeNode.context,
2020-01-29 00:00:44 +13:00
props: componentProps,
2019-10-07 18:03:41 +13:00
call:safeCallEvent,
2019-10-10 18:18:02 +13:00
setStateFromBinding: (binding, value) => setStateFromBinding(store, binding, value),
setState: (path, value) => setState(store, path, value),
getStateOrValue: (prop, currentContext) =>
2019-10-10 18:18:02 +13:00
getStateOrValue(globalState, prop, currentContext),
2020-01-29 00:00:44 +13:00
store,
relativeUrl,
api,
isBound,
parent
2019-10-01 17:57:45 +13:00
});
return bb(createTreeNode());
}