1
1
import { useCallback , useMemo } from 'react'
2
2
3
- import { HarmonyButton , HarmonyButtonType , IconArrow } from '@audius/stems'
3
+ import {
4
+ HarmonyButton ,
5
+ HarmonyButtonType ,
6
+ IconArrow ,
7
+ IconCaretRight
8
+ } from '@audius/stems'
4
9
import cn from 'classnames'
5
- import { Form , Formik } from 'formik'
10
+ import { Form , Formik , FormikProps , useField } from 'formik'
6
11
import moment from 'moment'
7
12
import * as Yup from 'yup'
8
13
14
+ import { ReactComponent as IconCaretLeft } from 'assets/img/iconCaretLeft.svg'
9
15
import layoutStyles from 'components/layout/layout.module.css'
16
+ import { Text } from 'components/typography'
10
17
import PreviewButton from 'components/upload/PreviewButton'
11
18
12
19
import { MultiTrackSidebar } from '../fields/MultiTrackSidebar'
@@ -21,7 +28,11 @@ import { TrackForUpload } from './types'
21
28
const messages = {
22
29
titleError : 'Your track must have a name' ,
23
30
artworkError : 'Artwork is required' ,
24
- genreError : 'Genre is required'
31
+ genreError : 'Genre is required' ,
32
+ multiTrackCount : ( index : number , total : number ) =>
33
+ `TRACK ${ index } of ${ total } ` ,
34
+ prev : 'Prev' ,
35
+ next : 'Next Track'
25
36
}
26
37
27
38
type EditPageProps = {
@@ -78,35 +89,96 @@ export const EditPageNew = (props: EditPageProps) => {
78
89
[ onContinue , setTracks , tracks ]
79
90
)
80
91
81
- const isMultiTrack = tracks . length > 1
82
-
83
92
return (
84
93
< Formik < TrackEditFormValues >
85
94
initialValues = { initialValues }
86
95
onSubmit = { onSubmit }
87
96
validationSchema = { EditTrackSchema }
88
97
>
89
- { ( ) => (
90
- < Form >
91
- < div className = { cn ( layoutStyles . row , layoutStyles . gap2 ) } >
92
- < div className = { styles . editForm } >
93
- < TrackMetadataFields playing = { false } />
94
- < TrackModalArray />
95
- < PreviewButton playing = { false } onClick = { ( ) => { } } />
96
- </ div >
97
- { isMultiTrack ? < MultiTrackSidebar tracks = { tracks } /> : null }
98
- </ div >
99
- < div className = { styles . continue } >
100
- < HarmonyButton
101
- variant = { HarmonyButtonType . PRIMARY }
102
- text = 'Continue'
103
- name = 'continue'
104
- iconRight = { IconArrow }
105
- className = { styles . continueButton }
106
- />
107
- </ div >
108
- </ Form >
109
- ) }
98
+ { TrackEditForm }
110
99
</ Formik >
111
100
)
112
101
}
102
+
103
+ const TrackEditForm = ( props : FormikProps < TrackEditFormValues > ) => {
104
+ const { values } = props
105
+ const isMultiTrack = values . trackMetadatas . length > 1
106
+
107
+ return (
108
+ < Form >
109
+ < div className = { cn ( layoutStyles . row , layoutStyles . gap2 ) } >
110
+ < div className = { styles . formContainer } >
111
+ { isMultiTrack ? < MultiTrackHeader /> : null }
112
+ < div className = { styles . trackEditForm } >
113
+ < TrackMetadataFields playing = { false } />
114
+ < TrackModalArray />
115
+ < PreviewButton playing = { false } onClick = { ( ) => { } } />
116
+ </ div >
117
+ { isMultiTrack ? < MultiTrackFooter /> : null }
118
+ </ div >
119
+ { isMultiTrack ? < MultiTrackSidebar /> : null }
120
+ </ div >
121
+ { ! isMultiTrack ? (
122
+ < div className = { styles . continue } >
123
+ < HarmonyButton
124
+ variant = { HarmonyButtonType . PRIMARY }
125
+ text = 'Continue'
126
+ name = 'continue'
127
+ iconRight = { IconArrow }
128
+ className = { styles . continueButton }
129
+ />
130
+ </ div >
131
+ ) : null }
132
+ </ Form >
133
+ )
134
+ }
135
+
136
+ const MultiTrackHeader = ( ) => {
137
+ const [ { value : index } ] = useField ( 'trackMetadatasIndex' )
138
+ const [ { value : trackMetadatas } ] = useField ( 'trackMetadatas' )
139
+
140
+ return (
141
+ < div className = { styles . multiTrackHeader } >
142
+ < Text variant = 'title' size = 'xSmall' >
143
+ { messages . multiTrackCount ( index + 1 , trackMetadatas . length ) }
144
+ </ Text >
145
+ </ div >
146
+ )
147
+ }
148
+
149
+ const MultiTrackFooter = ( ) => {
150
+ const [ { value : index } , , { setValue : setIndex } ] = useField (
151
+ 'trackMetadatasIndex'
152
+ )
153
+ const [ { value : trackMetadatas } ] = useField ( 'trackMetadatas' )
154
+
155
+ const goPrev = useCallback ( ( ) => {
156
+ setIndex ( Math . max ( index - 1 , 0 ) )
157
+ } , [ index , setIndex ] )
158
+ const goNext = useCallback ( ( ) => {
159
+ setIndex ( Math . min ( index + 1 , trackMetadatas . length - 1 ) )
160
+ } , [ index , setIndex , trackMetadatas . length ] )
161
+
162
+ const prevDisabled = index === 0
163
+ const nextDisabled = index === trackMetadatas . length - 1
164
+ return (
165
+ < div className = { cn ( styles . multiTrackFooter , layoutStyles . row ) } >
166
+ < HarmonyButton
167
+ className = { cn ( { [ styles . disabled ] : prevDisabled } ) }
168
+ variant = { HarmonyButtonType . PLAIN }
169
+ text = { messages . prev }
170
+ iconLeft = { IconCaretLeft }
171
+ onClick = { goPrev }
172
+ disabled = { prevDisabled }
173
+ />
174
+ < HarmonyButton
175
+ className = { cn ( { [ styles . disabled ] : nextDisabled } ) }
176
+ variant = { HarmonyButtonType . PLAIN }
177
+ text = { messages . next }
178
+ iconRight = { IconCaretRight }
179
+ onClick = { goNext }
180
+ disabled = { nextDisabled }
181
+ />
182
+ </ div >
183
+ )
184
+ }
0 commit comments