Reef.debug(true); // force a re-render app.addSetter("render", (data) => { appComponent.render(); }); app.addSetter("loader.show", (data) => { data.loading++; }); app.addSetter("loader.hide", (data) => { data.loading--; }); app.addSetter("load.boards", async (data) => { store.do("loader.show"); let res = await fetch("/api/boards"); data.boards = await res.json(); data.initialized = true; store.do("loader.hide"); }); // handle update events window.addEventListener("broadcast", async (e) => { let data = store.data; if ( e.detail.updateBoard ){ console.log("updating board"); let boardId = e.detail.updateBoard; store.do("load.boards"); // if we are currently viewing this board, reload the pins if ( data.board && boardId && boardId == data.board.id ){ store.do("load.board", true); } } else if ( e.detail.deleteBoard ) { console.log("deleting board"); let boardId = e.detail.deleteBoard; // reload the boards store.do("load.boards"); // we're currently looking at this board... alert and error if ( data.board && boardId == data.board.id ){ window.alert("this board has been deleted on another device"); window.location.hash = "#"; } } }); app.addSetter('load.board', async (data, force) => { store.do("loader.show"); if ( data.hash.board ){ if ( force || !data.board || data.board.id != data.hash.board ){ let res = await fetch("/api/boards/" + data.hash.board); data.board = await res.json(); } } store.do("loader.hide"); }); app.addSetter('load.user', async (data) => { store.do("loader.show"); let res = await fetch("/api/whoami"); data.user = await res.json(); window.uid = data.user.id; dispatchSocketConnect(); store.do("loader.hide"); }); app.addSetter("hash.update", (data) => { data.hash = parseQueryString(window.location.hash.substr(1)); if ( data.hash.board ){ store.do('load.board'); } else { data.board = null; data.pinZoomModal.active = false; data.addPinModal.active = false; data.aboutModal.active = false; } }); function dispatchSocketConnect(){ window.dispatchEvent(new CustomEvent("socket-connect")); } let store = new Reef.Store({ data: { hash: { board: null }, initialized: false, menuOpen: false, loading: 0, user: null, showHiddenBoards: window.localStorage.showHiddenBoards == "true" || false, boards: [], board: null, addPinModal: { pinId: null, active: false, boardId: "", newBoardName: null, imageUrl: "", previewImageUrl: null, siteUrl: "", description: "", saveInProgress: false }, pinZoomModal: { active: false, pin: null, fullDescriptionOpen: false }, aboutModal: { active: false }, editBoardModal: { active: false, name: "", hidden: 0 }, editPinModal: { active: false, pin: null, newBoardName: null, saveInProgress: false } }, getters: app.getGetters(), setters: app.getSetters() }); app.freeze(); // init the app component const appComponent = new Reef("#app", { store: store, template: (data) => { return /*html*/`