Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
react-gizmo
Advanced tools
UI Finite State Machine for React
yarn add react-gizmo
react-gizmo
uses new React Context API. React 16.3 is needed for this library to work.import { Machine, State } from "react-gizmo";
const state = {
initialState: { text: "Next" },
flow: {
initial: "start",
states: {
start: { on: { NEXT: "end" } },
end: { on: { PREV: "start" } }
}
}
};
const MachineApp = () => (
<Machine log state={state}>
<App />
</Machine>
);
ReactDOM.render(<MachineApp />, document.getElementById("root"));
App.js
class App extends Component {
render() {
return (
<React.Fragment>
<State on="start">
<ButtonStart />
</State>
<State on="end">
<ButtonEnd />
</State>
</React.Fragment>
);
}
}
ButtonStart.js
class ButtonNext extends Component {
handleOnClick = () => {
this.props.transition("NEXT", {
off: "start",
setState: { text: "Prev" }
});
};
render() {
return <button onClick={this.handleOnClick}>{this.props.text}</button>;
}
}
ButtonPrev.js
class ButtonPrev extends Component {
handleOnClick = () => {
this.props.transition("PREV", {
off: "end",
setState: { text: "Next" }
});
};
render() {
return <button onClick={this.handleOnClick}>{props.text}</button>;
}
}
The <Machine /> wraps your App and is responsible for passing down the props to the <State />. The <Machine /> should have only one children, similar to react-router
. The initialState
and flow
are passed to the machine through the state
prop.
Prop | Type | Description |
---|---|---|
graph | bool | Display realtime statechart visualization |
log | bool | If true logs state transitions |
state | object | The object containing the state machine and initial State: { initialState: any, flow: statechart } |
The <State /> represents the individual state of your flow. on
prop is what glues the state to a specific flow state, and the children
prop returns a function with the machine props. It's recommended to use class based component for the children
of the State so it can be referenced by the Machine.
...
states: {
start: { on: { NEXT: 'end' }},
end: { on: { PREV: 'start' }}
}
...
<State on="start">
<PageOne />
</State>
<State on="end">
<PageTwo />
</State>
Prop | Type | Description |
---|---|---|
on | string | Component that will be turned 'on' when flow transitions to a state with same name |
As the name suggests, this function is responsible for transitioning your app from one state to another. The first argument is the value of the state to be transitioned, and the second argument can receive a bunch of options. Like off
to hide other non-actives <State /> components, setState
to update your state
/initialState
, draftState
which temporarily stores your changes until it's publish
ed and condition
where you can pass xState Guards
Option | Type | Description |
---|---|---|
off | oneOfType(string, arrayOf(string)) | Component(s) that will be turned 'off' when transition is called |
setState | object | Mutates initialState keys with passed values |
draftState | object | Like setState , but changes take effect only after being published. Newer draftState s will replace unpublished ones. |
condition | any | Check xState Contitional Transitions (Guards) |
props.transition("NEXT", {
off: "end",
setState: {
text: "Will be updated"
},
draftState: {
text: "Will update again, but only after publish"
},
condition: { shouldTransition: this.text.length < 99 }
});
Publishes unpublished state aka. draftState
. Draft is merged into State and then draft is cleaned. This is usefull when you are not sure if you want to update your state, I.E if a user clicks a cancel button during an API request.
props.transition("NEXT", { draftState: { text: "Hello World" } });
console.log(this.props.text); // ''
props.publish();
console.log(this.props.text); // 'Hello World'
Your initialState/state, can be accessed directly via props.YOUR_STATE_KEY
.
console.log(this.props.text); // Hello
David the creator of xstate who made this library possible and Michele for inspiring me with react-automata. Even if you like react-gizmo
I recommend you to give them a try.
Also, a big thanks to Ryan Florence for giving a great talk about State Machine.
FAQs
React Gizmo - Finite State Machine for React
The npm package react-gizmo receives a total of 0 weekly downloads. As such, react-gizmo popularity was classified as not popular.
We found that react-gizmo demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.