import { createState, createMemo, onCleanup } from "solid-js"; import { req, on, off } from '../websocket'; import { c } from '../util'; export default function() { const [state, setState] = createState({ count: 0, users: [], get authenticated() { return this.users.filter(user => user.logged_in).length } }) function onAuthenticated(how, data, why) { switch(why) { case 'register': setState('users', state.users.length, data); break; case 'unregister': setState('users', state.users.filter(user => user.user_id !== data)); break; default: setState('users', state.users.findIndex(user => user.user_id === data), 'logged_in', how === 'add'); } } on('user/authenticated', onAuthenticated); function onCount(how) { switch(how) { case 'add': setState('count', state.count + 1); break; case 'remove': setState('count', state.count - 1); break; } } on('user/count', onCount); onCleanup(() => { off('user/authenticated', onAuthenticated); off('user/count', onCount); }); req('list_users').then(setState); return <> <div>Number of visitors now: {state.count}</div> <div>Number of signed in users now: {state.authenticated}</div> <table> <thead> <tr> <th>id</th> <th>email</th> <th>god</th> <th>logged in</th> </tr> </thead> <tbody> <For each={state.users}>{user => <tr> <td><a href={user.user_id} onClick={c}>{user.user_id}</a></td> <td>{user.email}</td> <td><input type="checkbox" checked={user.god}/></td> <td>{user.logged_in ? 'yes' : 'no'}</td> <td><button type="button">delete</button></td> </tr>}</For> </tbody> </table> </> }