Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nbudin/react-blockly
A React component that embeds a Blockly visual programming editor.
https://github.com/nbudin/react-blockly
Last synced: 3 months ago
JSON representation
A React component that embeds a Blockly visual programming editor.
- Host: GitHub
- URL: https://github.com/nbudin/react-blockly
- Owner: nbudin
- License: mit
- Created: 2019-08-13T14:40:23.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2024-06-18T19:21:33.000Z (6 months ago)
- Last Synced: 2024-08-19T02:12:22.222Z (4 months ago)
- Language: TypeScript
- Homepage:
- Size: 4.28 MB
- Stars: 253
- Watchers: 11
- Forks: 70
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
# react-blockly
[![Built on Blockly](https://tinyurl.com/built-on-blockly)](https://github.com/google/blockly)
A React library for embedding [Blockly](https://developers.google.com/blockly/), the visual programming editor from Google.
This is a continuation of PatientsLikeMe's [react-blockly-component](https://github.com/patientslikeme/react-blockly-component) project. This new version utilizes Google's official Blockly npm packages in addition to other modernizations.
Features:
* Provides a hook as well as a function component for ease of use + flexibility
* Supports the JSON toolbox format
* Automatically propagates prop updates to Blockly
* Provides callbacks for workspace injection, disposal, changes, and XML import errors
* Automatically generates workspace XML, debounced for performance## VERSION 7 IS A COMPLETE REWRITE
This is the README for react-blockly version 7. If you're using the old class-based components, you will want to look at the version 6 readme instead: https://github.com/nbudin/react-blockly/blob/v6-stable/README.md
The breaking changes in react-blockly 7 are:
* All components except BlocklyWorkspace have been removed
* A hook for embedding Blockly in custom DOM has been added
* The custom JSON format for toolbox has been removed in favor of Blockly's official toolbox JSON format
* React 16.8 or higher is required
* immutable.js has been removed## Example usage
[FernandoVazZ](https://github.com/FernandoVazZ) has made an example React app that shows how to set up react-blockly as well as how to create custom blocks for use in it: https://github.com/FernandoVazZ/reactblockly-customblocks/
Thanks so much Fernando!
## Help wanted!
I wrote react-blockly for an internal tool when I worked at PatientsLikeMe, Inc. I no longer maintain this tool, and I don't even have access to it anymore. I also don't have any actual project that uses react-blockly anymore.
I'd love to find maintainers for this package who actually use it. In particular, some things I would love to have help with are:
* A test suite
* Better documentation
* More examplesIf you are interested in working on any of those things, please [let me know](mailto:[email protected])! Additionally, if you're interested in taking over maintainership of this package entirely, I'd be happy to talk to you about that.
## Installation
To add react-blockly to a React app that uses npm, run:
```bash
npm install --save react-blockly
```To add react-blockly to a React app that uses yarn, run:
```bash
yarn add react-blockly
```## How to use
You can use react-blockly as either a component or a hook. Embedding a component is often more
straightforward and plugs into your app easily. On the other hand, using the hook can give you
more control over exactly how Blockly is rendered.### Embedding a component
Write `import { BlocklyWorkspace } from 'react-blockly';` in your code and use BlocklyWorkspace as a component.
Example:
```jsx
import { BlocklyWorkspace } from 'react-blockly';function MyBlocklyEditor() {
const [xml, setXml] = useState();return (
)
}
```### Using the hook
Write `import { useBlocklyWorkspace } from 'react-blockly';` in your code and use this hook to inject a Blockly workspace into your rendered components.
Example:
```jsx
import { useBlocklyWorkspace } from 'react-blockly';function MyBlocklyHookEmbed() {
const blocklyRef = useRef(null);
const { workspace, xml } = useBlocklyWorkspace({
ref: blocklyRef,
toolboxConfiguration: MY_TOOLBOX, // this must be a JSON toolbox definition
initialXml: xml,
});return (
// Blockly will be injected here
)
}
```## API reference
### BlocklyWorkspace component props
All properties are optional.
* `initialXml`: The XML of the program to initially load in the editor.
* `workspaceConfiguration`: Any configuration options to be passed into `Blockly.inject` (except for `toolbox`, which is a separate prop).
* `toolboxConfiguration`: A JSON toolbox configuration (see [the Blockly documentation](https://developers.google.com/blockly/guides/configure/web/toolbox#json) for details on this format).
* `className`: The value for the `class` attribute to be used on the `` elements generated by this component. Typically you'll need to use this to set the height of the Blockly editor, using either an explicit `height` style, flexboxes, or some other means.
* `onWorkspaceChange`: A function called every time the content of the workspace changes. It should take a single argument, which is the Blockly workspace object. (You can call methods such as Blockly.JavaScript.workspaceToCode on this object.)
* `onXmlChange`: A function called every time the content of the workspace, debounced to be called at most once every 200 milliseconds. This function should take a single argument, which is the new XML generated from the workspace.
* `onImportXmlError`: A function called if `initialXml` can't be imported. This function takes a single argument, which is the error thrown during XML import.
* `onInject`: A function called after the Blockly workspace is injected. This function takes a single argument, which is the newly-injected Blockly workspace object. This is a good place to add Blockly plugins, if desired.
* `onDispose`: A function called after the Blockly workspace is disposed and removed from the page. This function takes a single argument, which is the just-disposed Blockly workspace object. Some Blockly plugins need to use this to dispose their own resources.### useBlocklyWorkspace
`useBlocklyWorkspace(options) -> { workspace, xml }`;
#### Options object
All properties are optional, except `ref`, which must be passed.
* `ref`: **REQUIRED** A React ref object (created via `useRef`) pointing at an HTML element where Blockly will be injected.
* `initialXml`: The XML of the program to initially load in the editor.
* `workspaceConfiguration`: Any configuration options to be passed into `Blockly.inject` (except for `toolbox`, which is a separate prop).
* `toolboxConfiguration`: A JSON toolbox configuration (see [the Blockly documentation](https://developers.google.com/blockly/guides/configure/web/toolbox#json) for details on this format).
* `onWorkspaceChange`: A function called every time the content of the workspace changes. It should take a single argument, which is the Blockly workspace object. (You can call methods such as Blockly.JavaScript.workspaceToCode on this object.)
* `onImportXmlError`: A function called if `initialXml` can't be imported. This function takes a single argument, which is the error thrown during XML import.
* `onInject`: A function called after the Blockly workspace is injected. This function takes a single argument, which is the newly-injected Blockly workspace object. This is a good place to add Blockly plugins, if desired.
* `onDispose`: A function called after the Blockly workspace is disposed and removed from the page. This function takes a single argument, which is the just-disposed Blockly workspace object. Some Blockly plugins need to use this to dispose their own resources.#### Hook return value
`useBlocklyWorkspace` returns an object containing:
* `workspace`: The Blockly workspace object
* `xml`: XML generated from the content of the Blockly workspace, debounced to update at most once every 200 milliseconds## Developer setup for working on this package
Clone this repository, and then inside it, do:
```bash
yarn install
yarn run start
```webpack-dev-server will start and will be serving a demo of react-blockly, which should automatically refresh if you change the code locally.
## Example usage
See `public/index.html` and `src/dev-index.jsx` for a fairly full-fledged demo that shows off most of the features of this component.
## Contributing
We accept pull requests and issues! You can file an issue on this project, or fork, modify, and file a pull request.
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
## Licensing
react-blockly is Copyright © 2019-2021 Nat Budin. Distributed under the terms and conditions of the MIT License.
react-blockly is based on react-blockly-component, which is Copyright © 2015 PatientsLikeMe, Inc. Distributed under the terms and conditions of the MIT License.