A few modifications were made while making this test:
- Change the "defaultMin/Max" to just be called "min/max", and pass the state through to make the inputs a controlled component. It is best to make form elements controlled since it makes it more clear how data flows.
- Force the passed in data to always be of type `number`, and transform it in the constructor to always be of type `string`, and change the onOk to transform it back to a number. With inputs, it is best to be very explicit about data types, and make it clear where you are using strings and where you are using numbers.
- Do not reset the state to `0` when the field is blank, that makes typing into it very hard (only applies after making it a controlled field)
- Use consistent booleans. Since the VM uses `isDiscrete`, change it so we do not use any opposite flags (like `decimal`) for clarity.
Writing tests for this really helped me understand the behavior. If you read through the test descriptions and see anything you did not intend, let me know.
Step Ids and step file names did not follow a consistent pattern. To make it easier to automate in the future, things were renamed in the following ways:
StepId: camel case, prefix with the short name that we usually use to refer to the tutorial, e.g. name, music, chaseGame. Followed by a name for the step, e.g. nameAddSprite, nameAddBackdrop. When there are two of a step, add ‘2’ to the end e.g. nameAddSprite2
file-naming: all step files should be in the steps directory. The name is the ‘kebab’ case of the stepId, followed by the language-code, then the file extension. For example the english version of the file for `nameAddSprite` would be `name-add-sprite.en.gif`, `chaseGameAddSprite2` would be `chase-game-add-sprite2.en.gif`
* thumbnails folder: thumbnail images for tutorials (multistep decks and videos). Images should not need translations (avoid text that would need translation in the image)
* steps folder: gif images associated with tutorial steps. Images can be translated. English (default) images have the extension `.en.gif`, other language images should replace the `.en` with the corresponding locale.
* renamed some of the steps files to be more consistent and a bit less redundant
* removed a couple of files that were no longer referenced
* revised webpack config to allow localized step files to be loaded from `/static` on www
Extracting the drawable art data is very expensive. We should delay
doing that work as long as possible. As such it should wait until a few
more branching return statements before we extract it.
Because the `onFrame` callback could do async work, it was possible for onDone to try to submit the costumes before the onFrame had produced any. This was subject to browsers different timing treatments of setTimeout vs. promise resolution. This makes the gif-decoder use the same style of progress API as the file uploader