11import React from "react"
22import { Static , Box } from "ink"
3- import { isCI } from "ci-info"
43import chalk from "chalk"
5- import Activity , { calcElapsedTime } from "./components/activity"
4+ import Spinner from "./components/spinner"
5+ import ProgressBar from "./components/progress-bar"
66import { Message } from "./components/messages"
7+ import isTTY from "../../../util/is-tty"
8+ import calcElapsedTime from "../../../util/calc-elapsed-time"
9+
10+ const showProgress = isTTY
11+
12+ const successTextGenerator = {
13+ spinner : activity => {
14+ let successText = `${ activity . id } - ${ calcElapsedTime (
15+ activity . startTime
16+ ) } s`
17+ if ( activity . status ) {
18+ successText += ` — ${ activity . status } `
19+ }
720
8- const showProgress = process . stdout . isTTY && ! isCI
9-
10- const generateActivityFinishedText = ( name , activity ) => {
11- let successText = `${ name } - ${ calcElapsedTime ( activity . startTime ) } s`
12- if ( activity . status ) {
13- successText += ` — ${ activity . status } `
14- }
15-
16- return successText
21+ return successText
22+ } ,
23+ progress : activity =>
24+ `${ activity . id } — ${ activity . current } /${ activity . total } - ${ calcElapsedTime (
25+ activity . startTime
26+ ) } s`,
1727}
1828
1929export default class GatsbyReporter extends React . Component {
@@ -26,44 +36,40 @@ export default class GatsbyReporter extends React.Component {
2636
2737 format = chalk
2838
29- createActivity = name => {
39+ createActivity = ( { id, ...options } ) => {
40+ this . setState ( state => {
41+ return {
42+ activities : {
43+ ...state . activities ,
44+ [ id ] : {
45+ id,
46+ ...options ,
47+ } ,
48+ } ,
49+ }
50+ } )
51+
3052 return {
31- start : ( ) => {
32- this . setState ( state => {
33- return {
34- activities : {
35- ...state . activities ,
36- [ name ] : {
37- status : `` ,
38- startTime : process . hrtime ( ) ,
39- } ,
40- } ,
41- }
42- } )
43- } ,
44- setStatus : status => {
53+ update : newState => {
4554 this . setState ( state => {
46- const activity = state . activities [ name ]
47-
4855 return {
4956 activities : {
5057 ...state . activities ,
51- [ name ] : {
52- ...activity ,
53- status : status ,
58+ [ id ] : {
59+ ...state . activities [ id ] ,
60+ ... newState ,
5461 } ,
5562 } ,
5663 }
5764 } )
5865 } ,
59- end : ( ) => {
60- const activity = this . state . activities [ name ]
61-
62- this . success ( generateActivityFinishedText ( name , activity ) )
66+ done : ( ) => {
67+ const activity = this . state . activities [ id ]
68+ this . success ( successTextGenerator [ activity . type ] ( { id, ...activity } ) )
6369
6470 this . setState ( state => {
6571 const activities = { ...state . activities }
66- delete activities [ name ]
72+ delete activities [ id ]
6773
6874 return {
6975 activities,
@@ -116,27 +122,48 @@ export default class GatsbyReporter extends React.Component {
116122 }
117123
118124 render ( ) {
125+ const { activities, messages, disableColors } = this . state
126+
127+ const spinners = [ ]
128+ const progressBars = [ ]
129+ if ( showProgress ) {
130+ Object . keys ( activities ) . forEach ( activityName => {
131+ const activity = activities [ activityName ]
132+ if ( activity . type === `spinner` ) {
133+ spinners . push ( activity )
134+ }
135+ if ( activity . type === `progress` && activity . startTime ) {
136+ progressBars . push ( activity )
137+ }
138+ } )
139+ }
140+
119141 return (
120142 < Box flexDirection = "column" >
121143 < Box flexDirection = "column" >
122144 < Static >
123- { this . state . messages . map ( ( msg , index ) => (
145+ { messages . map ( ( msg , index ) => (
124146 < Box textWrap = "wrap" key = { index } >
125- < Message type = { msg . type } hideColors = { this . state . disableColors } >
147+ < Message type = { msg . type } hideColors = { disableColors } >
126148 { msg . text }
127149 </ Message >
128150 </ Box >
129151 ) ) }
130152 </ Static >
131153
132- { showProgress &&
133- Object . keys ( this . state . activities ) . map ( activityName => (
134- < Activity
135- key = { activityName }
136- name = { activityName }
137- { ...this . state . activities [ activityName ] }
138- />
139- ) ) }
154+ { spinners . map ( activity => (
155+ < Spinner key = { activity . id } name = { activity . id } { ...activity } />
156+ ) ) }
157+
158+ { progressBars . map ( activity => (
159+ < ProgressBar
160+ key = { activity . id }
161+ message = { activity . id }
162+ total = { activity . total }
163+ current = { activity . current }
164+ startTime = { activity . startTime }
165+ />
166+ ) ) }
140167 </ Box >
141168 </ Box >
142169 )
0 commit comments