main.js (1678B)
1 const m = require("mithril"); 2 const y = require("yjs"); 3 const { WebrtcProvider } = require("y-webrtc"); 4 5 const store = require("./modules/store.js"); 6 const editView = require("./components/edit-view.js"); 7 const qrView = require("./components/qr-view.js"); 8 const navigation = require("./modules/navigation.js"); 9 10 store.subscribe(s => s, () => m.redraw()); 11 12 const main = () => { 13 let qrDelay = store().qr; 14 store.subscribe(s => s.qr, qrn => window.setTimeout( 15 () => { qrDelay = qrn; m.redraw(); }, 1000 16 )); 17 return { 18 view: () => m(".pagewrap", { 19 class: [ 20 store().qr? "" : "scroll-down", 21 qrDelay? "" : "scroll-down-finished", 22 ].join(" "), 23 }, 24 m(qrView), 25 m(editView), 26 ), 27 } 28 } 29 30 document.body.onclick = store().qrClose; 31 32 if (!window.crypto.subtle) { 33 console.log("no crypto :("); 34 } 35 36 store.subscribe(s => s.id, (id) => { 37 store().ydocSet(new y.Doc()); 38 let sp = navigation.splitId(id); 39 let provider = new WebrtcProvider(sp[0], store().ydoc, {password: sp[1]}); 40 provider.awareness.on("change", () => { 41 store.setState({users: provider.awareness.getStates().size }); 42 }); 43 /* useless edit. only important to propagate the info that a user joined */ 44 provider.awareness.setLocalStateField("user", { "update": 1 }); 45 }); 46 47 store.subscribe(s => s.users, (unew, uold) => { 48 if (unew == 2 && uold == 1) { 49 store().qrClose(); 50 } 51 }); 52 53 store.subscribe(s => s.id, id => m.route.set("/" + id)); 54 m.route(document.body, "/-", { 55 "/:id": { onmatch: (args) => { 56 store().idSet(args.id); 57 return main; 58 }}, 59 });