Skip to content

Commit 5f09093

Browse files
committed
feat: refs and the dom step
1 parent 301a5c9 commit 5f09093

File tree

17 files changed

+137
-74
lines changed

17 files changed

+137
-74
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export const FilterFormChallenge = () => {
1+
export const FilterFormChallenge = ({ ref }) => {
22
// Add your code here
33
return <form></form>
44
}

src/challenges/step-06-forwarding-refs/FancyInputChallenge.js

-26
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { FilterFormChallenge } from '../step-03-uncontrolled-components/FilterFormChallenge.js'
2+
3+
// Initially this will trigger an error. We will fix it in this step by forwarding
4+
// refs.
5+
const FancyInput = props => {
6+
return (
7+
<input
8+
{...props}
9+
style={{
10+
padding: '16px',
11+
fontWeight: 'bold',
12+
border: '1px solid azure',
13+
fontSize: '24px'
14+
}}
15+
/>
16+
)
17+
}
18+
19+
export const FilterFormWithStyledInputChallenge = () => {
20+
// To get started copy and paste the code from step 3 and paste in here
21+
// and amend it to use our `FancyInput` instead of the plain input
22+
return <FilterFormChallenge />
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { FilterFormWithStyledInputChallenge } from '../step-06-forwarding-refs/FilterFormWithStyledInputChallenge'
2+
3+
export const FilterFormWithAutofocusChallenge = () => {
4+
// To get started copy and paste the code from step 6
5+
// and add autofocus functionality using React dom refs
6+
return <FilterFormWithStyledInputChallenge />
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { FilterFormWithAutofocusChallenge } from '../step-07-refs-and-the-dom/FilterFormAutofocusChallenge'
2+
3+
export const FilterFormFinalChallenge = () => {
4+
return <FilterFormWithAutofocusChallenge />
5+
}

src/pages/index.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { FilterFormChallenge } from '../challenges/step-03-uncontrolled-components/FilterFormChallenge'
21
import { useFilterStateChallenge } from '../challenges/step-02-context/useFilterStateChallenge.js'
32
import { useMovieQueryChallenge } from '../challenges/step-01-server-state/useMovieQueryChallenge.js'
43
import { FilterStateProviderChallenge } from '../challenges/step-02-context/FilterStateProviderChallenge'
54
import { ErrorBoundaryChallenge } from '../challenges/step-04-error-boundaries/ErrorBoundaryChallenge'
65
import { MovieList } from '../components/MovieList/MovieList.jsx'
76
import { FilterModalChallenge } from '../challenges/step-05-portals/FilterModalChallenge.js'
7+
import { FilterFormFinalChallenge } from '../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
88

99
const MovieListContainer = () => {
1010
const filterState = useFilterStateChallenge()
@@ -22,7 +22,7 @@ const MovieExplorerApp = () => {
2222
<ErrorBoundaryChallenge>
2323
<FilterStateProviderChallenge>
2424
<FilterModalChallenge>
25-
<FilterFormChallenge />
25+
<FilterFormFinalChallenge />
2626
</FilterModalChallenge>
2727
<MovieListContainer />
2828
</FilterStateProviderChallenge>

src/pages/solutions/step-01-server-state.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { FilterFormChallenge } from '../../challenges/step-03-uncontrolled-components/FilterFormChallenge'
21
import { FilterStateProviderChallenge } from '../../challenges/step-02-context/FilterStateProviderChallenge.js'
32
import { MovieList } from '../../components/MovieList/MovieList.jsx'
43
import { ErrorBoundaryChallenge } from '../../challenges/step-04-error-boundaries/ErrorBoundaryChallenge'
54
import { useFilterStateChallenge } from '../../challenges/step-02-context/useFilterStateChallenge.js'
65
import { useMovieQuerySolution } from '../../solutions/step-01-server-state/useMovieQuerySolution.js'
76
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
7+
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
88

99
const MovieListContainer = () => {
1010
const filterState = useFilterStateChallenge()
@@ -22,7 +22,7 @@ const Step01ServerState = () => {
2222
<ErrorBoundaryChallenge>
2323
<FilterStateProviderChallenge>
2424
<FilterModalChallenge>
25-
<FilterFormChallenge />
25+
<FilterFormFinalChallenge />
2626
</FilterModalChallenge>
2727
<MovieListContainer />
2828
</FilterStateProviderChallenge>

src/pages/solutions/step-02-context.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { FilterFormChallenge } from '../../challenges/step-03-uncontrolled-components/FilterFormChallenge'
21
import { useMovieQuerySolution } from '../../solutions/step-01-server-state/useMovieQuerySolution.js'
32
import {
43
FilterStateProviderSolution,
@@ -7,6 +6,7 @@ import {
76
import { MovieList } from '../../components/MovieList/MovieList.jsx'
87
import { ErrorBoundaryChallenge } from '../../challenges/step-04-error-boundaries/ErrorBoundaryChallenge'
98
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
9+
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge.js'
1010

1111
const MovieListContainer = () => {
1212
const filterState = useFilterStateSolution()
@@ -24,7 +24,7 @@ const Step02Context = () => {
2424
<ErrorBoundaryChallenge>
2525
<FilterStateProviderSolution>
2626
<FilterModalChallenge>
27-
<FilterFormChallenge />
27+
<FilterFormFinalChallenge />
2828
</FilterModalChallenge>
2929
<MovieListContainer />
3030
</FilterStateProviderSolution>

src/pages/solutions/step-04-error-boundaries.jsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import {
33
FilterStateProviderSolution,
44
useFilterStateSolution
55
} from '../../solutions/step-02-context/FilterStateContextSolution.jsx'
6-
import { FilterFormSolution } from '../../solutions/step-03-uncontrolled-components/FilterFormSolution'
76
import { MovieList } from '../../components/MovieList/MovieList'
87
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
98
import { useEffect } from 'react'
109
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
10+
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
1111

1212
const MovieListContainer = () => {
1313
const filterState = useFilterStateSolution()
@@ -29,7 +29,7 @@ const Step04ErrorBoundaries = () => {
2929
<ErrorBoundarySolution>
3030
<FilterStateProviderSolution>
3131
<FilterModalChallenge>
32-
<FilterFormSolution />
32+
<FilterFormFinalChallenge />
3333
</FilterModalChallenge>
3434
<MovieListContainer />
3535
</FilterStateProviderSolution>

src/pages/solutions/step-05-portals.jsx

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { MovieList } from '../../components/MovieList/MovieList'
88
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
99
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge'
1010
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
11+
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
1112

1213
const MovieListContainer = () => {
1314
const filterState = useFilterStateSolution()

src/pages/solutions/step-06-forwarding-refs.jsx

+2-8
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,15 @@ import {
33
FilterStateProviderSolution,
44
useFilterStateSolution
55
} from '../../solutions/step-02-context/FilterStateContextSolution.jsx'
6-
import { FilterFormSolution } from '../../solutions/step-03-uncontrolled-components/FilterFormSolution'
76
import { MovieList } from '../../components/MovieList/MovieList'
87
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
9-
import { useEffect } from 'react'
10-
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
118
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
9+
import { FilterFormWithStyledInputSolution } from '../../solutions/step-06-forwarding-refs/FilterFormWithStyledInputSolution'
1210

1311
const MovieListContainer = () => {
1412
const filterState = useFilterStateSolution()
1513
const movieQuery = useMovieQuerySolution(filterState)
1614

17-
useEffect(() => {
18-
throw new Error("I'm an error")
19-
}, [])
20-
2115
if (!movieQuery.data) {
2216
return null
2317
}
@@ -30,7 +24,7 @@ const StepO6ForwardingRefs = () => {
3024
<ErrorBoundarySolution>
3125
<FilterStateProviderSolution>
3226
<FilterModalSolution>
33-
<FilterFormSolution />
27+
<FilterFormWithStyledInputSolution />
3428
</FilterModalSolution>
3529
<MovieListContainer />
3630
</FilterStateProviderSolution>

src/pages/solutions/step-07-refs-and-the-dom.jsx

+5-10
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,15 @@ import {
33
FilterStateProviderSolution,
44
useFilterStateSolution
55
} from '../../solutions/step-02-context/FilterStateContextSolution.jsx'
6-
import { FilterFormSolution } from '../../solutions/step-03-uncontrolled-components/FilterFormSolution'
76
import { MovieList } from '../../components/MovieList/MovieList'
87
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
9-
import { useEffect } from 'react'
10-
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
8+
import { FilterFormWithAutofocusSolution } from '../../solutions/step-07-refs-and-the-dom/FilterFormWithAutofocusSolution.js'
9+
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
1110

1211
const MovieListContainer = () => {
1312
const filterState = useFilterStateSolution()
1413
const movieQuery = useMovieQuerySolution(filterState)
1514

16-
useEffect(() => {
17-
throw new Error("I'm an error")
18-
}, [])
19-
2015
if (!movieQuery.data) {
2116
return null
2217
}
@@ -28,9 +23,9 @@ const Step07RefsAndTheDom = () => {
2823
return (
2924
<ErrorBoundarySolution>
3025
<FilterStateProviderSolution>
31-
<FilterModalChallenge>
32-
<FilterFormSolution />
33-
</FilterModalChallenge>
26+
<FilterModalSolution>
27+
<FilterFormWithAutofocusSolution />
28+
</FilterModalSolution>
3429
<MovieListContainer />
3530
</FilterStateProviderSolution>
3631
</ErrorBoundarySolution>

src/solutions/step-03-uncontrolled-components/FilterFormSolution.jsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { useFilterStateSolution } from '../step-02-context/FilterStateContextSolution.jsx'
22
import { useRef } from 'react'
3-
import { FancyInputSolution } from '../step-06-forwarding-refs/FancyInputSolution'
43

54
export const FilterFormSolution = () => {
65
const filterState = useFilterStateSolution()
@@ -15,7 +14,7 @@ export const FilterFormSolution = () => {
1514
<form onSubmit={handleSubmit}>
1615
<label>
1716
Year:
18-
<FancyInputSolution type="text" ref={inputRef} />
17+
<input type="text" ref={inputRef} />
1918
</label>
2019
<input type="submit" value="Submit" />
2120
</form>

src/solutions/step-04-error-boundary/ErrorBoundarySolution.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class ErrorBoundary extends React.Component {
2020
render() {
2121
if (this.state.hasError) {
2222
// You can render any custom fallback UI
23-
return <h1>Something went wrong.</h1>
23+
return <h1>Something went wrong!!!</h1>
2424
}
2525

2626
return this.props.children

src/solutions/step-06-forwarding-refs/FancyInputSolution.js

-18
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { forwardRef, useRef } from 'react'
2+
import { useFilterStateSolution } from '../step-02-context/FilterStateContextSolution.jsx'
3+
4+
const FancyInput = forwardRef((props, ref) => {
5+
return (
6+
<input
7+
{...props}
8+
ref={ref}
9+
style={{
10+
padding: '16px',
11+
fontWeight: 'bold',
12+
border: '1px solid azure',
13+
fontSize: '24px'
14+
}}
15+
/>
16+
)
17+
})
18+
19+
FancyInput.displayName = 'FancyInput'
20+
21+
export const FilterFormWithStyledInputSolution = () => {
22+
const filterState = useFilterStateSolution()
23+
const inputRef = useRef()
24+
25+
const handleSubmit = event => {
26+
event.preventDefault()
27+
inputRef.current.value && filterState.setYear(inputRef.current.value)
28+
}
29+
30+
return (
31+
<form onSubmit={handleSubmit}>
32+
<label>
33+
Year:
34+
<FancyInput type="text" ref={inputRef} />
35+
</label>
36+
<input type="submit" value="Submit" />
37+
</form>
38+
)
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { forwardRef, useEffect, useRef } from 'react'
2+
import { useFilterStateSolution } from '../step-02-context/FilterStateContextSolution.jsx'
3+
4+
const FancyInput = forwardRef((props, ref) => {
5+
return (
6+
<input
7+
{...props}
8+
ref={ref}
9+
style={{
10+
padding: '16px',
11+
fontWeight: 'bold',
12+
border: '1px solid azure',
13+
fontSize: '24px'
14+
}}
15+
/>
16+
)
17+
})
18+
19+
FancyInput.displayName = 'FancyInput'
20+
21+
export const FilterFormWithAutofocusSolution = () => {
22+
const filterState = useFilterStateSolution()
23+
const inputRef = useRef()
24+
25+
const handleSubmit = event => {
26+
event.preventDefault()
27+
inputRef.current.value && filterState.setYear(inputRef.current.value)
28+
}
29+
30+
useEffect(() => {
31+
console.log(inputRef, 'input')
32+
inputRef.current?.focus()
33+
}, [])
34+
35+
return (
36+
<form onSubmit={handleSubmit}>
37+
<label>
38+
Year:
39+
<FancyInput type="text" ref={inputRef} />
40+
</label>
41+
<input type="submit" value="Submit" />
42+
</form>
43+
)
44+
}

0 commit comments

Comments
 (0)