1- import React from 'react'
1+ import React , { useState , useCallback } from 'react'
22import styled from 'styled-components'
33import { Router } from '@reach/router'
44import { HEADER_ALLOWANCE } from './utils/constants'
@@ -7,14 +7,21 @@ import {
77 media ,
88 StyledFloatingBtn ,
99 StyledContentContainer ,
10+ StyledInfoContainer ,
11+ Header as StyledHeader ,
1012 H1 ,
1113 Columns ,
1214 Column ,
1315 Box ,
1416 CTAContainer
1517} from './content/StyledContent'
16- import GithubLogo from './assets/github_logo.svg'
1718import Button from './Button'
19+ import { NOTES } from './constants/displayBoxNotes'
20+ import { INFO } from './constants/patternInfo'
21+
22+ import GithubLogo from './assets/github_logo.svg'
23+ import InfoIllustration from './assets/light_bulb.svg'
24+ import { useAnimatedBulb } from './content/AnimatedBulb'
1825
1926const StyledAppBody = styled . div `
2027 background: #191921;
@@ -37,51 +44,85 @@ const patterns = [
3744 'state-reducers'
3845]
3946
40- const notes = {
41- '1' : 'Animated via an HOC' ,
42- '2' : 'Animated via a hook 💪'
43- }
44-
4547const PR_ROOT =
4648 'https://github.com/ohansemmanuel/advanced-react-patterns-ultrasimplified/pull'
4749const PR_IDs = [ 1 , 16 , 17 , 19 , 6 , 7 , 8 , 9 , 10 , 12 ]
4850const PRs = PR_IDs . map ( id => `${ PR_ROOT } /${ id } ` )
4951
50- const RouteComponent = ( { pattern, index, isMediumOrLarger } ) => {
52+ const Header = ( { title, patternNumber } ) => {
53+ // animated el
54+ const [ lightBulbEl , setlightBulbEl ] = useState ( null )
55+
56+ const setLightBulbElRef = useCallback ( node => {
57+ if ( node !== null ) {
58+ setlightBulbEl ( node )
59+ }
60+ } , [ ] )
61+
62+ const animatedBulbTimeline = useAnimatedBulb ( {
63+ el : lightBulbEl
64+ } )
65+
66+ // toggle info display
67+ const [ isInfoShown , setInfoShown ] = useState ( false )
68+
69+ const toggleInfo = ( ) => {
70+ setInfoShown ( isInfoShown => ! isInfoShown )
71+ animatedBulbTimeline . replay ( )
72+ }
73+
74+ return (
75+ < StyledHeader >
76+ { isInfoShown && (
77+ < StyledInfoContainer > { INFO [ patternNumber ] } </ StyledInfoContainer >
78+ ) }
79+ < H1 > { title } </ H1 >
80+ < div ref = { setLightBulbElRef } >
81+ < InfoIllustration
82+ style = { { width : '30px' , marginLeft : '5px' , cursor : 'pointer' } }
83+ onClick = { toggleInfo }
84+ />
85+ </ div >
86+ </ StyledHeader >
87+ )
88+ }
89+
90+ const RouteComponent = ( { pattern, patternNumber, isMediumOrLarger } ) => {
5191 const firstLetterCap = str => str . slice ( 0 , 1 ) . toUpperCase ( ) + str . slice ( 1 )
5292 const title = pattern
5393 . split ( '-' )
5494 . map ( firstLetterCap )
5595 . join ( ' ' )
5696
57- const transformIndex = i => ( i < 10 ? `0${ i } ` : i )
58- const indexes = [ index , index + 1 ] . map ( transformIndex )
97+ const indexToTwoDigits = i => ( i < 10 ? `0${ i } ` : i )
98+ const beforeAndAfterPatternNumbers = [ patternNumber , patternNumber + 1 ] . map (
99+ indexToTwoDigits
100+ )
59101
60102 // Demo to be shown in Display Boxes
61103 let Demo1 , Demo2
62104 try {
63- Demo1 = require ( `./patterns/${ indexes [ 0 ] } ` ) . default
105+ Demo1 = require ( `./patterns/${ beforeAndAfterPatternNumbers [ 0 ] } ` ) . default
64106 } catch ( error ) {
65107 Demo1 = ( ) => null
66108 }
67109 try {
68- Demo2 = require ( `./patterns/${ indexes [ 1 ] } ` ) . default
110+ Demo2 = require ( `./patterns/${ beforeAndAfterPatternNumbers [ 1 ] } ` ) . default
69111 } catch ( error ) {
70112 Demo2 = ( ) => null
71113 }
72114
73115 const goToCodeImplementatiomn = ( ) => {
74- const newWindow = window . open ( PRs [ index ] , 'blank' )
116+ const newWindow = window . open ( PRs [ patternNumber ] , 'blank' )
75117 newWindow . opener = null
76118 }
77119
78120 return (
79121 < StyledContentContainer >
80- < H1 > { title } </ H1 >
81-
122+ < Header title = { title } patternNumber = { patternNumber } />
82123 < Columns >
83124 < Column >
84- < Box isPrimary note = { notes [ index ] } >
125+ < Box isPrimary note = { NOTES [ patternNumber ] } >
85126 < Demo1 />
86127 </ Box >
87128 { isMediumOrLarger && (
@@ -91,7 +132,10 @@ const RouteComponent = ({ pattern, index, isMediumOrLarger }) => {
91132 ) }
92133 </ Column >
93134 < Column leftGap >
94- < Box note = { notes [ index + 1 ] } m = { ! isMediumOrLarger && '15px 0 0 0' } >
135+ < Box
136+ note = { NOTES [ patternNumber + 1 ] }
137+ m = { ! isMediumOrLarger && '15px 0 0 0' }
138+ >
95139 < Demo2 />
96140 </ Box >
97141 { ! isMediumOrLarger && (
@@ -111,7 +155,6 @@ const RouteComponent = ({ pattern, index, isMediumOrLarger }) => {
111155 </ StyledContentContainer >
112156 )
113157}
114-
115158const Body = ( { setShowSidebar, isMediumOrLarger } ) => {
116159 const toggleSidebar = ( ) => setShowSidebar ( val => ! val )
117160
@@ -121,10 +164,10 @@ const Body = ({ setShowSidebar, isMediumOrLarger }) => {
121164 < Home path = '/' />
122165 { patterns . map ( ( pattern , index ) => (
123166 < RouteComponent
124- pattern = { pattern }
125- index = { index + 1 }
126167 path = { pattern }
127168 key = { pattern }
169+ pattern = { pattern }
170+ patternNumber = { index + 1 }
128171 isMediumOrLarger = { isMediumOrLarger }
129172 />
130173 ) ) }
0 commit comments