|
| 1 | +import { render } from 'react-nil'; |
| 2 | +import React from 'react'; |
| 3 | +import { writable, get, readable, readonly } from 'svelte/store'; |
| 4 | + |
| 5 | +export function removeEvents(props) { |
| 6 | + return Object.fromEntries( |
| 7 | + Object.entries(props ?? {}).filter(([prop]) => !/^on[A-Z]/.test(prop)) |
| 8 | + ); |
| 9 | +} |
| 10 | + |
| 11 | +function getEvents(props) { |
| 12 | + const events = Object.entries(props) |
| 13 | + .filter(([prop]) => /^on[A-Z]/.test(prop)) |
| 14 | + .map(([event, handler]) => [event.slice(2).toLowerCase(), ev(handler)]); |
| 15 | + |
| 16 | + return events; |
| 17 | +} |
| 18 | + |
| 19 | +function ev(fn) { |
| 20 | + if (!fn) return fn; |
| 21 | + |
| 22 | + return e => { |
| 23 | + e.nativeEvent = e; |
| 24 | + return fn(e); |
| 25 | + }; |
| 26 | +} |
| 27 | + |
| 28 | +export function setupEvents(node, obj) { |
| 29 | + const events = getEvents(obj); |
| 30 | + |
| 31 | + for (const [name, handler] of events) { |
| 32 | + node.addEventListener(name, handler); |
| 33 | + } |
| 34 | + |
| 35 | + return { |
| 36 | + destroy() { |
| 37 | + for (const [name, handler] of events) { |
| 38 | + node.removeEventListener(name, handler); |
| 39 | + } |
| 40 | + }, |
| 41 | + }; |
| 42 | +} |
| 43 | + |
| 44 | +function createReactApp(hook, args, store) { |
| 45 | + return function ReactApp() { |
| 46 | + // const [statefulArgs, setStatefulArgs] = React.useState(_ => get(args)); |
| 47 | + const _state = hook(...(get(args) as any)); |
| 48 | + |
| 49 | + console.log('doing'); |
| 50 | + React.useEffect(() => { |
| 51 | + store.set(_state); |
| 52 | + }, [_state]); |
| 53 | + |
| 54 | + // React.useEffect(() => { |
| 55 | + // const unsub = args.subscribe(setStatefulArgs); |
| 56 | + |
| 57 | + // return () => unsub(); |
| 58 | + // }, []); |
| 59 | + |
| 60 | + store.set(_state); |
| 61 | + }; |
| 62 | +} |
| 63 | + |
| 64 | +export function useHook(hook, args = [], ctxs = []) { |
| 65 | + let store = writable(null); |
| 66 | + let ReactApp = createReactApp( |
| 67 | + hook, |
| 68 | + (args as any).subscribe ? args : readable(args), |
| 69 | + store |
| 70 | + ); |
| 71 | + |
| 72 | + console.log('starting'); |
| 73 | + render( |
| 74 | + (ctxs as any).reduceRight((acc, [Comp, props = {}]) => { |
| 75 | + return React.createElement(Comp, props, acc); |
| 76 | + }, React.createElement(ReactApp as any)) |
| 77 | + ); |
| 78 | + console.log('end'); |
| 79 | + |
| 80 | + return readonly(store); |
| 81 | +} |
0 commit comments