machinate v1.1.3
๐ต๏ธโโ๏ธ machinate
โ ๏ธ Not yet ready for production use.
machinate (mackยทinยทeight) verb:
Practical, simple, and hassle-free state management.
A cutesy reverse portmanteau of "state machine".
To engage in plots and intrigues; scheme. (This is what your app does if you're not managing state properly, we'll help put an end to that.)
๐ Goals:
- ๐ Instantly launch your app in any given state.
- ๐ค Heavy emphasis on developer experience. Your time and sanity are respected.
- ๐ผ Baked in best practices. Guardrails for guidance.
- ๐ Dead simple. Plain javascript objects. Minimal boilerplate.
- ๐ High quality tooling.
Install
yarn add machinate
Use
Every app has states. 1) Define them. 2) Implement them. 3) Connect them.
1. define your app's states
// object where keys are a domain, values are the states of that domain.
const scheme = {
Auth: ["LoggedIn", "LoggedOut", "Unknown"]
};2. implement the states
import { Machinate, States } from "machinate";
const initialState = { Auth: "LoggedOut" };
const App = (
<Machinate
scheme={scheme}
initial={initialState}>
<States of="Auth"
LoggedIn={...}
LoggedOut={...}
Unknown={...}
/>
</Machinate>
);
ReactDOM.render(<App />, document.body)๐ก Tip!
If you forget to implement a state, machinate will warn you:
<States of="Auth"
LoggedIn={...}
LoggedOut={...}
// 'Unknown' prop left out intentionally
>web console:
Warning: Failed prop type: The prop `Unknown` is marked as required in `Auth[Domain]`, but its value is `undefined`.3. connecting states
Each state prop receives an object with the following parameters:
data: the data if any, associated with the statetransition(stateName, optionalData): move the machine tostateNameand set the data associated with the state todatago(stateName, optionalData): same astransition(), but wrapped in a function to delay execution; essentially a convenient helper for transitioning on callbacksupdate(stateName, updateFn): same astransition(), except the second parameter is a function that transforms the current data to new data
Here we use the go() function:
<States of="Auth"
LoggedIn={({data}) => <h1>Hi {data.user}</h1>}
LoggedOut={({ go }) => (
<button
onClick={ go("Auth.LoggedIn", {user: "bob"}) }
value="Login"
/>
)}
Unknown={() => null)}
/>Note: "Auth.LoggedIn" is shorthand notation, referring to the LoggedIn state of the Auth domain.
๐ Syntactic Shortcuts
The following are all equivalent:
const scheme = {
Auth: ["LoggedIn", "LoggedOut"]
};
const scheme = {
Auth: {
states: ["LoggedIn", "LoggedOut"],
deps: []
}
};const initialState = {
Auth: "LoggedOut"
};
const initialState = {
Auth: {
state: "LoggedOut",
data: null
}
};8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago