removed custom context system

This commit is contained in:
Jean Jacques Avril 2022-03-08 16:14:23 +01:00
parent 6e3419019b
commit 68501897e4
13 changed files with 89 additions and 186 deletions

1
size-plugin.json Normal file
View File

@ -0,0 +1 @@
[{"timestamp":1646751614979,"files":[{"filename":"bundle.2a54a.css","previous":0,"size":1709,"diff":1709},{"filename":"bundle.*****.esm.js","previous":0,"size":9856,"diff":9856},{"filename":"polyfills.*****.esm.js","previous":0,"size":2187,"diff":2187},{"filename":"sw.js","previous":0,"size":10599,"diff":10599},{"filename":"sw-esm.js","previous":0,"size":10603,"diff":10603},{"filename":"bundle.1a7a6.js","previous":0,"size":11947,"diff":11947},{"filename":"polyfills.058fb.js","previous":0,"size":2288,"diff":2288},{"filename":"index.html","previous":0,"size":536,"diff":536},{"filename":"200.html","previous":0,"size":536,"diff":536}]}]

View File

@ -1,70 +1,45 @@
import { Component, h } from "preact"; import { h } from "preact";
import { Router, route } from "preact-router"; import { Router, route } from "preact-router";
import Header from "./header"; import {Header, Menu} from "./";
import Menu from "./menu"; import { menuReducer, sessionReducer } from "../store/reducers";
import { useCallback, useReducer, useState } from "preact/hooks"; import { useReducer } from "preact/hooks";
import { AppData, AppDataProvider } from '../utils';
import { Home, Users, Profile, Login, Logout } from "../route"; import { Home, Users, Profile, Login, Logout } from "../route";
import { AppStateProvider } from "../store/AppState"; import { AppStateProvider } from "../store/AppState";
class App extends Component { function App() {
// useReducer // useReducer
appdata = AppData(); const menu = useReducer(menuReducer, false);
session = this.appdata.get("Session"); const session = useReducer(sessionReducer, {active: true});
menutoggle = this.appdata.get("menutoggle"); this.menu_items = [
toggleMenu = () => {
const [visible, setValue] = useState(false);
const toggle = useCallback(() => {
setValue(!visible);
return !visible;
}, [visible]);
return { visible, toggle };
}
componentWillUnmount() {
//this.sub();
}
menu_items = [
{ text: "Übersicht", path: "/" }, { text: "Übersicht", path: "/" },
{ text: "Benutzer", path: "/users" }, { text: "Benutzer", path: "/users" },
{ text: "System", path: "/system" }, { text: "System", path: "/system" },
{ text: "Profil", path: "/profile" }, { text: "Profil", path: "/profile" },
{ text: "Abmelden", path: "/logout" } { text: "Abmelden", path: "/logout" }
] ]
handleRoute = async e => { this.handleRoute = async e => {
const isAuthed = this.session.actions.isAuth();
switch (e.url) { switch (e.url) {
default: default:
if (!isAuthed) route('/login', true); if (!session[0].active) route('/login', true);
break; break;
} }
}; };
render() {
let menu = this.toggleMenu();
const [menu_shown, toggle_menu] = useReducer(menuReducer,false);
this.menutoggle.data = menu;
let session = this.session;
session.addAction("isAuth", () => { return session.data && session.data.username !== '' })
console.log(session.actions);
session.sub(this);
return ( return (
<AppDataProvider> <AppStateProvider value={{ menu, session}} >
<AppStateProvider value={{menu_shown, toggle_menu}} >
<div id="wrapper"> <div id="wrapper">
<Header menu={menu} /> <Header />
<div class="page"> <div class="page">
<Menu menu={menu} items={this.menu_items} /> <Menu items={this.menu_items} />
{!menu.visible && {!menu[0] &&
<Router onChange={this.handleRoute}> <Router onChange={this.handleRoute}>
<Home path="/" user="me" /> <Home path="/" user="me" />
<Login path="login" /> <Login path="login" />
<Profile path="/profile/:user" /> <Profile path="/profile" />
<Logout path="/logout" /> <Logout path="/logout" />
<Users path="/users" /> <Users path="/users" />
<div class="container" default>Error 404</div> <div class="container" default>Error 404</div>
</Router> </Router>
} }
</div> </div>
<footer> <footer>
@ -75,11 +50,7 @@ class App extends Component {
</footer> </footer>
</div> </div>
</AppStateProvider> </AppStateProvider>
</AppDataProvider>
); );
}
} }

View File

@ -1,11 +1,15 @@
const Header = (props, ctx) => { import { useContext } from 'preact/hooks';
const session = ctx.get('Session'); import AppState from '../../store/AppState';
const Header = () => {
let { menu, session } = useContext(AppState);
let [menu_shown, toggle_menu] = menu;
let [sessiondata] = session;
return ( return (
<header className='header'> <header className='header'>
<div className="container"> <div className="container">
<h1>Login</h1> <h1>Login</h1>
{session.actions.isAuth() && (<div id="hamburger-button" className={`hamburger ${props.menu.visible && 'hamburger-active'}`} { sessiondata.active &&(<div id="hamburger-button" className={`hamburger ${menu_shown && 'hamburger-active'}`}
onClick={() => props.menu.toggle()}> onClick={() => toggle_menu('toggle')}>
<hr /> <hr />
<hr /> <hr />
<hr /> <hr />

View File

@ -1,8 +1,10 @@
import { Component, h } from 'preact'; import { h } from 'preact';
import { Link } from 'preact-router'; import { Link } from 'preact-router';
class Menu extends Component { import { useContext } from 'preact/hooks';
import AppState from '../../store/AppState';
menu_items = [ function Menu({items}) {
let [ menu_shown, toggle_menu ] = useContext(AppState).menu;
let menu_items = [
{ text: "Übersicht", path: "/" }, { text: "Übersicht", path: "/" },
{ text: "Benutzer", path: "/users" }, { text: "Benutzer", path: "/users" },
{ text: "System", path: "/system" }, { text: "System", path: "/system" },
@ -10,27 +12,25 @@ class Menu extends Component {
{ text: "Abmelden", path: "/logout" } { text: "Abmelden", path: "/logout" }
] ]
getAlert() {
alert("getAlert from Child"); const onClick = (e) => {
}
onClick = (e) => {
e.preventDefault(); e.preventDefault();
this.props.menu.toggle(); toggle_menu('hide');
} }
render(props) {
if(props.items) if (items)
this.menu_items = props.items; menu_items = items;
if (props.menu.visible) if (menu_shown)
return ( return (
<div class="container" > <div class="container" >
<nav className='menu' > <nav className='menu' >
<ul> <ul>
{this.menu_items.map((element, i) => (<li key={i}><Link href={element.path} onClick={this.onClick} >{element.text}</Link></li>))} {menu_items.map((element, i) => (<li key={i}><Link href={element.path} onClick={onClick} >{element.text}</Link></li>))}
</ul> </ul>
</nav> </nav>
</div>) </div>)
}
} }
export default Menu; export default Menu;

View File

@ -1,8 +0,0 @@
export const menuReducer=(state,action)=>{
switch(action){
case 'show': return true;
case 'hide': return false;
case 'toggle': return !state;
default: throw new Error("menustate unknown to reducer");
}
}

View File

@ -1,19 +1,25 @@
import { h } from 'preact'; import { h } from 'preact';
import { useState } from 'preact/hooks';
import { route } from 'preact-router'; import { route } from 'preact-router';
import { useContext,useState } from 'preact/hooks';
import AppState from '../../store/AppState';
import Breadcrumbs from '../../components/breadcrumbs'; import Breadcrumbs from '../../components/breadcrumbs';
function Login(props, ctx) { function Login() {
let [sessiondata, setsession]= useContext(AppState).session;
const [val, set] = useState({ username: '', password: '', error: null }); const [val, set] = useState({ username: '', password: '', error: null });
const navigation = ["Login"]; const navigation = ["Login"];
const session = ctx.get('Session'); if(sessiondata.active)
route('/', true);
function onSubmit(e) { function onSubmit(e) {
e.preventDefault(); e.preventDefault();
//sucess //sucess
if (val.username === 'admin') { if (val.username === 'admin') {
session.data = val; let newsession = {
route('/', true); type: 'start',
username: 'affe',
token: 'dsf4w3qr'
}
setsession(newsession);
} }
else { else {
set({ ...val, error: "user" }); set({ ...val, error: "user" });

View File

@ -1,19 +1,21 @@
import { h } from 'preact'; import { h } from 'preact';
import { Link } from 'preact-router'; import { Link } from 'preact-router';
import { useContext } from 'preact/hooks';
import AppState from '../../store/AppState';
import { Breadcrumbs } from '../../components'; import { Breadcrumbs } from '../../components';
function Logout (props, ctx) { function Logout() {
const navigation = ["Logout"]; const navigation = ["Logout"];
const session = ctx.get('Session'); let [sessiondata, setsession] = useContext(AppState).session;
this.shouldComponentUpdate = function(){ this.shouldComponentUpdate = function () {
console.log('functional component vs closures'); console.log('functional component vs closures');
} }
if (session.actions.isAuth()) { if (sessiondata.active) {
session.data = { username: '', password: '' }; setsession({ type: 'end' })
} }
return ( return (
<div class="container"> <div class="container">
<Breadcrumbs items={navigation} /> <Breadcrumbs items={navigation} />

16
src/store/reducers.js Normal file
View File

@ -0,0 +1,16 @@
export const menuReducer = (state, action) => {
switch (action) {
case 'show': return true;
case 'hide': return false;
case 'toggle': return !state;
default: throw new Error("menustate unknown to reducer");
}
}
export const sessionReducer = (state, action) => {
switch (action.type) {
case 'start': return {active: true, token: action.token, username: action.username}
case 'end': return {active: false, token: null, username: null, exiry: null}
default: throw new Error("action type unknown to session reducer");
}
}

View File

@ -1,11 +0,0 @@
function Consumer(props, ctx){
this.componentWillMount=()=>{
console.log("Component mounted");
}
if(props.datapath!==undefined)
ctx = ctx.get(props.datapath);
ctx.sub(this);
return props.children(ctx);
}
export default Consumer;

View File

@ -1,45 +0,0 @@
function subscribe (c) {
this.observers.push(c);
return () => { this.observers.splice(this.observers.indexOf(c), 1) }
}
function getStore(path){
let path_slices = path.split("/");
let current=this;
for(let s of path_slices){
if(!(s in current.tree))
current.tree[s] = new ObservableData();
current = current.tree[s];
}
return current;
}
function addAction(name, f){
this._actions[name] = f.bind(this._data);
}
function ObservableData() {
this.observers = [];
this.tree = {};
this._data = {};
this._actions = {};
const dispatchChange = () => {
this.observers.map(c=>c.forceUpdate());
}
return {
tree:this.tree,
addAction: addAction.bind(this),
sub: subscribe.bind(this),
get: getStore.bind(this),
get data() {
return this._data;
},
set data(val) {
this._data = val;
dispatchChange();
},
actions: this._actions,
}
}
export default ObservableData;

View File

@ -1,14 +0,0 @@
function Provider(props) {
if (this.root !== undefined) props.appdata = this.root;
if (!this.getChildContext && props.appdata !== undefined) {
this.getChildContext = () => props.appdata;
this.shouldComponentUpdate = function (_props) {
if (this.props.appdata !== _props.appdata) {
return true;
}
}
}
return props.children;
}
export default Provider;

View File

@ -1,15 +0,0 @@
import ObservableData from './ObservableData'
import Provider from './Provider'
let root = null;
function AppData() {
if(root===null){
console.log("New AppData created")
root = new ObservableData();
root.get("affe1234/123");
}
return root;
}
export const AppDataProvider = (props)=><Provider {...props} appdata={AppData()} />
export default AppData;

View File

@ -1,4 +0,0 @@
import AppData, {AppDataProvider} from './appdata'
import Provider from './appdata/Provider';
import Consumer from './appdata/Consumer';
export {AppData, AppDataProvider, Provider, Consumer}