From b7e9dd2c7acebe5aa4e24a582c672b2d44b50093 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Thu, 27 Jan 2022 19:13:08 -0600 Subject: [PATCH 01/19] Add Exercise 4 for the Save Component --- INSTRUCTIONS.md | 19 +++++++++++++++++++ js/src/save.exercise.js | 29 +++++++++++++++++++++++++++++ js/src/save.final.js | 29 +++++++++++++++++++++++++++++ js/src/save.js | 28 +++------------------------- 4 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 INSTRUCTIONS.md create mode 100644 js/src/save.exercise.js create mode 100644 js/src/save.final.js diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md new file mode 100644 index 0000000..0ce445c --- /dev/null +++ b/INSTRUCTIONS.md @@ -0,0 +1,19 @@ +# Save Component + +This component controls what is saved to the database. + +And it mainly controls what is displayed on the front-end (not in the editor). + +[Dynamic blocks](https://developer.wordpress.org/block-editor/how-to-guides/block-tutorial/creating-dynamic-blocks/) are different, but this block isn't a dynamic block. + +WordPress blocks are usually saved as both: + +1. HTML +2. Block attributes as JSON in HTML comments + +The `Save` component usually determines what the block is saved as, and how it looks on the front-end. + +## Exercise + +### Files +- `js/src/save.exercise.js` diff --git a/js/src/save.exercise.js b/js/src/save.exercise.js new file mode 100644 index 0000000..10ae054 --- /dev/null +++ b/js/src/save.exercise.js @@ -0,0 +1,29 @@ +/** + * External dependencies + */ +import * as React from 'react'; + +/** + * WordPress dependencies + */ +// @ts-ignore The declaration file is outdated. +// 🚧 Import useBlockProps from '@wordpress/block-editor' + +/** + * Internal dependencies + */ +// 🚧 Import ProgressIndicator + +/** + * The component to save the markup. + * + * @param {{attributes: import('./index').Attributes}} props + * @return {React.ReactElement} The component. + */ +export default function Save( { attributes } ) { + // 🚧 Assign to a const the block props by calling useBlockProps.save() + + return
+ { /* 🚧 Render ProgressIndicator, and pass it the prop it expects */ } +
; +} diff --git a/js/src/save.final.js b/js/src/save.final.js new file mode 100644 index 0000000..410cda4 --- /dev/null +++ b/js/src/save.final.js @@ -0,0 +1,29 @@ +/** + * External dependencies + */ +import * as React from 'react'; + +/** + * WordPress dependencies + */ +// @ts-ignore The declaration file is outdated. +import { useBlockProps } from '@wordpress/block-editor'; + +/** + * Internal dependencies + */ +import ProgressIndicator from './progress-indicator'; + +/** + * The component to save the markup. + * + * @param {{attributes: import('./index').Attributes}} props + * @return {React.ReactElement} The component. + */ +export default function Save( { attributes } ) { + const blockProps = useBlockProps.save(); + + return
+ +
; +} diff --git a/js/src/save.js b/js/src/save.js index 410cda4..0154ba3 100644 --- a/js/src/save.js +++ b/js/src/save.js @@ -1,29 +1,7 @@ -/** - * External dependencies - */ -import * as React from 'react'; - -/** - * WordPress dependencies - */ -// @ts-ignore The declaration file is outdated. -import { useBlockProps } from '@wordpress/block-editor'; - /** * Internal dependencies */ -import ProgressIndicator from './progress-indicator'; - -/** - * The component to save the markup. - * - * @param {{attributes: import('./index').Attributes}} props - * @return {React.ReactElement} The component. - */ -export default function Save( { attributes } ) { - const blockProps = useBlockProps.save(); +import Save from './save.exercise'; +// import Save from './save.final'; - return
- -
; -} +export default Save; From 8c25170c2f0f19d187c63e87f14a2e68a4fa39b4 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:38:55 -0600 Subject: [PATCH 02/19] Add to the Save component INSTRUCTIONS.md --- INSTRUCTIONS.md | 35 ++++++++++++++++++++++++++++------- js/src/save.exercise.js | 6 ++++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 0ce445c..7ea7735 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -1,19 +1,40 @@ # Save Component -This component controls what is saved to the database. +This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#save) determines what is saved to the database. -And it mainly controls what is displayed on the front-end (not in the editor). +And what's saved to the database is what displays on the front-end. + +The `Save` component will return markup, and WordPress saves that markup to the database. + +Unlike the Edit component, this component isn't interactive. + +Its only job is to return markup. + +So you won't see `useState()` or REST API calls in `Save`. [Dynamic blocks](https://developer.wordpress.org/block-editor/how-to-guides/block-tutorial/creating-dynamic-blocks/) are different, but this block isn't a dynamic block. -WordPress blocks are usually saved as both: +The wrapping element of `Save` [should have](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#block-wrapper-props-1) `useBlockProps.save()` spread into it: +```jsx +export default function Save( { attributes } ) { + const blockProps = useBlockProps.save(); -1. HTML -2. Block attributes as JSON in HTML comments + return
+``` -The `Save` component usually determines what the block is saved as, and how it looks on the front-end. +This will class(es) to it and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: +```html +
+``` ## Exercise +Edit the `Save` component, which will finish this block. + +You'll see a lot of [block validation](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#validation) notices. + +This is normal when editing the `Save` component. + +Click 'Attempt Block Recovery' and continue developing. ### Files -- `js/src/save.exercise.js` +- [js/src/save.exercise.js](https://github.com/kienstra/progress-indicator/blob/exercise/4-save-component/js/src/save.exercise.js) diff --git a/js/src/save.exercise.js b/js/src/save.exercise.js index 10ae054..5ce5de4 100644 --- a/js/src/save.exercise.js +++ b/js/src/save.exercise.js @@ -8,6 +8,7 @@ import * as React from 'react'; */ // @ts-ignore The declaration file is outdated. // 🚧 Import useBlockProps from '@wordpress/block-editor' +// See if it needs to have brackets or not, like import { useBlockProps } /** * Internal dependencies @@ -21,9 +22,10 @@ import * as React from 'react'; * @return {React.ReactElement} The component. */ export default function Save( { attributes } ) { - // 🚧 Assign to a const the block props by calling useBlockProps.save() + // 🚧 Store a const here + // Its value should be useBlockProps.save() - return
+ return
{ /* 🚧 Render ProgressIndicator, and pass it the prop it expects */ }
; } From 7daaade21936a7b7e655bda953b4e91bb79977f6 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:40:27 -0600 Subject: [PATCH 03/19] Add dots inside code example --- INSTRUCTIONS.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 7ea7735..abf37f7 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -4,22 +4,19 @@ This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d And what's saved to the database is what displays on the front-end. -The `Save` component will return markup, and WordPress saves that markup to the database. - Unlike the Edit component, this component isn't interactive. Its only job is to return markup. So you won't see `useState()` or REST API calls in `Save`. -[Dynamic blocks](https://developer.wordpress.org/block-editor/how-to-guides/block-tutorial/creating-dynamic-blocks/) are different, but this block isn't a dynamic block. - The wrapping element of `Save` [should have](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#block-wrapper-props-1) `useBlockProps.save()` spread into it: ```jsx export default function Save( { attributes } ) { const blockProps = useBlockProps.save(); return
+ ... ``` This will class(es) to it and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: From b99c4e23b22e8551fc5ed586b2235765b7bb287d Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:40:54 -0600 Subject: [PATCH 04/19] Correct a typo --- INSTRUCTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index abf37f7..1d18f4b 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -19,7 +19,7 @@ export default function Save( { attributes } ) { ... ``` -This will class(es) to it and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: +This adds class(es) and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: ```html
``` From df7a335fbdca6645d8ef74b05e1613b64c5c74f8 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:41:24 -0600 Subject: [PATCH 05/19] Change spaces to tabs --- INSTRUCTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 1d18f4b..8ec1470 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -16,7 +16,7 @@ export default function Save( { attributes } ) { const blockProps = useBlockProps.save(); return
- ... + ... ``` This adds class(es) and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: From b9dd32d89de61a85972761ee332f9109c369767c Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:41:55 -0600 Subject: [PATCH 06/19] Remove ... as they're confusing --- INSTRUCTIONS.md | 1 - 1 file changed, 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 8ec1470..81760a1 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -16,7 +16,6 @@ export default function Save( { attributes } ) { const blockProps = useBlockProps.save(); return
- ... ``` This adds class(es) and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: From c5b57d84a33490211f281d8f1f68279e580bdf09 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:44:00 -0600 Subject: [PATCH 07/19] Clarify the Exercise section --- INSTRUCTIONS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 81760a1..52e83ce 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -24,7 +24,9 @@ This adds class(es) and attributes from the [Block Supports](https://github.com/ ``` ## Exercise -Edit the `Save` component, which will finish this block. +Once you finish this `Save` component, this block will be done. + +It'll display on the front-end. You'll see a lot of [block validation](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#validation) notices. From 601f7accb16255b8ebff10cf703b84758d1b4b48 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 16:47:54 -0600 Subject: [PATCH 08/19] Make the File heading singular --- INSTRUCTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 52e83ce..807f4d9 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -34,5 +34,5 @@ This is normal when editing the `Save` component. Click 'Attempt Block Recovery' and continue developing. -### Files +### File - [js/src/save.exercise.js](https://github.com/kienstra/progress-indicator/blob/exercise/4-save-component/js/src/save.exercise.js) From 0426fbb6e566c40a1dcfedace5e8c3a1ce02ae4e Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 18:28:42 -0600 Subject: [PATCH 09/19] Remove the (es), and add 'sometimes' --- INSTRUCTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 807f4d9..2c7846d 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -18,7 +18,7 @@ export default function Save( { attributes } ) { return
``` -This adds class(es) and attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: +This adds classes, and sometimes attributes from the [Block Supports](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-supports.md#supports) API: ```html
``` From a3e6e3ca88b04dceb409e38960cd7f2600f68deb Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 18:29:43 -0600 Subject: [PATCH 10/19] Change the order of sentences --- INSTRUCTIONS.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 2c7846d..87397f0 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -24,15 +24,15 @@ This adds classes, and sometimes attributes from the [Block Supports](https://gi ``` ## Exercise -Once you finish this `Save` component, this block will be done. - -It'll display on the front-end. - You'll see a lot of [block validation](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#validation) notices. This is normal when editing the `Save` component. Click 'Attempt Block Recovery' and continue developing. +Once you finish this `Save` component, this block will be done. + +It'll display on the front-end. + ### File -- [js/src/save.exercise.js](https://github.com/kienstra/progress-indicator/blob/exercise/4-save-component/js/src/save.exercise.js) +- [js/src/save.exercise.js](js/src/save.exercise.js) From 268ad09737c9b9ea10f95bf893b6ea5e11668473 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 18:31:36 -0600 Subject: [PATCH 11/19] Remove comment about possible brackets --- js/src/save.exercise.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/src/save.exercise.js b/js/src/save.exercise.js index 5ce5de4..8f4fe65 100644 --- a/js/src/save.exercise.js +++ b/js/src/save.exercise.js @@ -8,7 +8,6 @@ import * as React from 'react'; */ // @ts-ignore The declaration file is outdated. // 🚧 Import useBlockProps from '@wordpress/block-editor' -// See if it needs to have brackets or not, like import { useBlockProps } /** * Internal dependencies From 03dd7f0f71a14b275a76207bd569118c0646c4f2 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 18:35:39 -0600 Subject: [PATCH 12/19] Change to 'Declare a const here' --- js/src/save.exercise.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/src/save.exercise.js b/js/src/save.exercise.js index 8f4fe65..92950cf 100644 --- a/js/src/save.exercise.js +++ b/js/src/save.exercise.js @@ -21,8 +21,7 @@ import * as React from 'react'; * @return {React.ReactElement} The component. */ export default function Save( { attributes } ) { - // 🚧 Store a const here - // Its value should be useBlockProps.save() + // 🚧 Declare a const here and give it the value of useBlockProps.save() return
{ /* 🚧 Render ProgressIndicator, and pass it the prop it expects */ } From 17948e5546dbbe72e287889b52fdedd5e389c077 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 18:36:10 -0600 Subject: [PATCH 13/19] Simplify the ... instructions --- js/src/save.exercise.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/save.exercise.js b/js/src/save.exercise.js index 92950cf..b2d3818 100644 --- a/js/src/save.exercise.js +++ b/js/src/save.exercise.js @@ -23,7 +23,7 @@ import * as React from 'react'; export default function Save( { attributes } ) { // 🚧 Declare a const here and give it the value of useBlockProps.save() - return
+ return
{ /* 🚧 Render ProgressIndicator, and pass it the prop it expects */ }
; } From 6e8e67f645ff6e5ff29ef99afc4133fae0a84f72 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 28 Jan 2022 18:51:27 -0600 Subject: [PATCH 14/19] Add an ' --- INSTRUCTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 87397f0..62ff800 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -1,6 +1,6 @@ # Save Component -This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#save) determines what is saved to the database. +This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#save) determines what's saved to the database. And what's saved to the database is what displays on the front-end. From fd9eacb4f985ef815fd515bf6a7877581a3b42f4 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Wed, 2 Feb 2022 17:37:57 -0600 Subject: [PATCH 15/19] Add an example to the INSTRUCTIONS.md --- INSTRUCTIONS.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 62ff800..1202505 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -2,11 +2,20 @@ This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#save) determines what's saved to the database. -And what's saved to the database is what displays on the front-end. +Its only job is to return markup. -Unlike the Edit component, this component isn't interactive. +The returned markup is saved to the database as HTML, with attributes stored in comments. -Its only job is to return markup. +Here's an example: + +```html + +
+``` + +And that saved markup is what displays on the front-end. + +Unlike the `Edit` component, this component isn't interactive. So you won't see `useState()` or REST API calls in `Save`. From 2c753230f7b56f1d280f76592d3da47921a18690 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Wed, 2 Feb 2022 17:53:14 -0600 Subject: [PATCH 16/19] Remove a needless line --- INSTRUCTIONS.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 1202505..9a0d48a 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -4,9 +4,7 @@ This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d Its only job is to return markup. -The returned markup is saved to the database as HTML, with attributes stored in comments. - -Here's an example: +The returned markup is saved to the database as HTML, with attributes stored in comments: ```html From a18e3b2f9397e1a4d1d876921bc6a0e57356ceb5 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Wed, 2 Feb 2022 17:59:13 -0600 Subject: [PATCH 17/19] Add a .gif of the unexpected content notice --- INSTRUCTIONS.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 9a0d48a..747fa6d 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -31,11 +31,15 @@ This adds classes, and sometimes attributes from the [Block Supports](https://gi ``` ## Exercise -You'll see a lot of [block validation](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#validation) notices. +You'll see a lot of [block validation](https://github.com/WordPress/gutenberg/blob/57da3c91a166d917a2a9de98177be9c3dfe07ee5/docs/reference-guides/block-api/block-edit-save.md#validation) notices like: + +>This block contains unexpected or invalid content. This is normal when editing the `Save` component. -Click 'Attempt Block Recovery' and continue developing. +Click 'Attempt Block Recovery' and continue developing: + +![unexpected-invalid-content](https://user-images.githubusercontent.com/4063887/152257716-0477a0dc-d666-4249-a5e4-65c96a1e7817.gif) Once you finish this `Save` component, this block will be done. From e0fb2bef1d40e41c8113ee8152dd5dcca8f9f773 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Fri, 4 Feb 2022 13:34:32 -0600 Subject: [PATCH 18/19] Make comments singular --- INSTRUCTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 747fa6d..d10b126 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -4,7 +4,7 @@ This React [component](https://github.com/WordPress/gutenberg/blob/57da3c91a166d Its only job is to return markup. -The returned markup is saved to the database as HTML, with attributes stored in comments: +The returned markup is saved to the database as HTML, with attributes stored in a comment: ```html From d96a7bc4faaa0e4efd767be9def471045e882254 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Wed, 9 Feb 2022 22:36:59 -0600 Subject: [PATCH 19/19] Add a link to the solution video --- INSTRUCTIONS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index d10b126..3b31011 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -47,3 +47,5 @@ It'll display on the front-end. ### File - [js/src/save.exercise.js](js/src/save.exercise.js) + +[Solution video](https://bit.ly/34tiHr2)