Evaluation of signal-libraries and their integration in frontend-frameworks with nested objects using js proxies.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

152 lines
4.9 KiB

import React from "react";
import useShape from "../../ng-mock/js-land/frontendAdapters/react/useShape";
import flattenObject from "../utils/flattenObject";
import { TestObjectShapeType } from "src/shapes/ldo/testShape.shapeTypes";
export function HelloWorldReact() {
const state = useShape(TestObjectShapeType);
// @ts-expect-error
window.reactState = state;
if (!state) return <>Loading state</>;
// Create a table from the state object: One column for keys, one for values, one with an input to change the value.
return (
<div>
<p>Rendered in React</p>
<button
onClick={() => {
state.boolValue = !state.boolValue;
state.numValue += 2;
}}
>
click me to change multiple props
</button>
<table border={1} cellPadding={5}>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Edit</th>
</tr>
</thead>
<tbody>
{(() => {
const setNestedValue = (obj: any, path: string, value: any) => {
const keys = path.split(".");
let current = obj;
for (let i = 0; i < keys.length - 1; i++) {
current = current[keys[i]];
}
current[keys[keys.length - 1]] = value;
};
const getNestedValue = (obj: any, path: string) => {
return path
.split(".")
.reduce((current, key) => current[key], obj);
};
return flattenObject(state).map(([key, value]) => (
<tr key={key}>
<td>{key}</td>
<td>
{value instanceof Set
? Array.from(value).join(", ")
: Array.isArray(value)
? `[${value.join(", ")}]`
: JSON.stringify(value)}
</td>
<td>
{typeof value === "string" ? (
<input
type="text"
value={value}
onChange={(e) => {
setNestedValue(state, key, e.target.value);
}}
/>
) : typeof value === "number" ? (
<input
type="number"
value={value}
onChange={(e) => {
setNestedValue(state, key, Number(e.target.value));
}}
/>
) : typeof value === "boolean" ? (
<input
type="checkbox"
checked={value}
onChange={(e) => {
setNestedValue(state, key, e.target.checked);
}}
/>
) : Array.isArray(value) ? (
<div>
<button
onClick={() => {
const currentArray = getNestedValue(state, key);
setNestedValue(state, key, [
...currentArray,
currentArray.length + 1,
]);
}}
>
Add
</button>
<button
onClick={() => {
const currentArray = getNestedValue(state, key);
if (currentArray.length > 0) {
setNestedValue(
state,
key,
currentArray.slice(0, -1)
);
}
}}
>
Remove
</button>
</div>
) : value instanceof Set ? (
<div>
<button
onClick={() => {
const currentSet = getNestedValue(state, key);
currentSet.add(`item${currentSet.size + 1}`);
}}
>
Add
</button>
<button
onClick={() => {
const currentSet = getNestedValue(state, key);
const lastItem = Array.from(currentSet).pop();
if (lastItem) {
currentSet.delete(lastItem);
}
}}
>
Remove
</button>
</div>
) : (
"N/A"
)}
</td>
</tr>
));
})()}
</tbody>
</table>
</div>
);
}