1
1
import type { Meta , StoryObj } from "@storybook/react" ;
2
+ import type { WorkspaceAppStatus } from "api/typesGenerated" ;
2
3
import {
3
4
MockWorkspace ,
4
5
MockWorkspaceAgent ,
5
6
MockWorkspaceApp ,
6
7
MockWorkspaceAppStatus ,
8
+ MockWorkspaceAppStatuses ,
9
+ createTimestamp ,
7
10
} from "testHelpers/entities" ;
8
11
import { withProxyProvider } from "testHelpers/storybook" ;
9
12
import { AppStatuses } from "./AppStatuses" ;
@@ -13,6 +16,8 @@ const meta: Meta<typeof AppStatuses> = {
13
16
component : AppStatuses ,
14
17
args : {
15
18
referenceDate : new Date ( "2024-03-26T15:15:00Z" ) ,
19
+ agent : mockAgent ( MockWorkspaceAppStatuses ) ,
20
+ workspace : MockWorkspace ,
16
21
} ,
17
22
decorators : [ withProxyProvider ( ) ] ,
18
23
} ;
@@ -21,163 +26,70 @@ export default meta;
21
26
22
27
type Story = StoryObj < typeof AppStatuses > ;
23
28
24
- export const Default : Story = {
29
+ export const Default : Story = { } ;
30
+
31
+ // Add a story with a "Working" status as the latest
32
+ export const WorkingState : Story = {
25
33
args : {
26
- workspace : MockWorkspace ,
27
- agent : {
28
- ...MockWorkspaceAgent ,
29
- apps : [
30
- {
31
- ...MockWorkspaceApp ,
32
- statuses : [
33
- {
34
- // This is the latest status chronologically (15:04:38)
35
- ...MockWorkspaceAppStatus ,
36
- id : "status-7" ,
37
- icon : "/emojis/1f4dd.png" , // 📝
38
- message : "Creating PR with gh CLI" ,
39
- created_at : createTimestamp ( 4 , 38 ) , // 15:04:38
40
- uri : "https://github.com/coder/coder/pull/5678" ,
41
- state : "complete" as const ,
42
- } ,
43
- {
44
- // (15:03:56)
45
- ...MockWorkspaceAppStatus ,
46
- id : "status-6" ,
47
- icon : "/emojis/1f680.png" , // 🚀
48
- message : "Pushing branch to remote" ,
49
- created_at : createTimestamp ( 3 , 56 ) , // 15:03:56
50
- uri : "" ,
51
- state : "complete" as const ,
52
- } ,
53
- {
54
- // (15:02:29)
55
- ...MockWorkspaceAppStatus ,
56
- id : "status-5" ,
57
- icon : "/emojis/1f527.png" , // 🔧
58
- message : "Configuring git identity" ,
59
- created_at : createTimestamp ( 2 , 29 ) , // 15:02:29
60
- uri : "" ,
61
- state : "complete" as const ,
62
- } ,
63
- {
64
- // (15:02:04)
65
- ...MockWorkspaceAppStatus ,
66
- id : "status-4" ,
67
- icon : "/emojis/1f4be.png" , // 💾
68
- message : "Committing changes" ,
69
- created_at : createTimestamp ( 2 , 4 ) , // 15:02:04
70
- uri : "" ,
71
- state : "complete" as const ,
72
- } ,
73
- {
74
- // (15:01:44)
75
- ...MockWorkspaceAppStatus ,
76
- id : "status-3" ,
77
- icon : "/emojis/2795.png" , // +
78
- message : "Adding files to staging" ,
79
- created_at : createTimestamp ( 1 , 44 ) , // 15:01:44
80
- uri : "" ,
81
- state : "complete" as const ,
82
- } ,
83
- {
84
- // (15:01:32)
85
- ...MockWorkspaceAppStatus ,
86
- id : "status-2" ,
87
- icon : "/emojis/1f33f.png" , // 🌿
88
- message : "Creating a new branch for PR" ,
89
- created_at : createTimestamp ( 1 , 32 ) , // 15:01:32
90
- uri : "" ,
91
- state : "complete" as const ,
92
- } ,
93
- {
94
- // (15:01:00) - Oldest
95
- ...MockWorkspaceAppStatus ,
96
- id : "status-1" ,
97
- icon : "/emojis/1f680.png" , // 🚀
98
- message : "Starting to create a PR" ,
99
- created_at : createTimestamp ( 1 , 0 ) , // 15:01:00
100
- uri : "" ,
101
- state : "complete" as const ,
102
- } ,
103
- ] . sort (
104
- ( a , b ) =>
105
- new Date ( b . created_at ) . getTime ( ) -
106
- new Date ( a . created_at ) . getTime ( ) ,
107
- ) , // Ensure sorted correctly for component input if needed
108
- } ,
109
- ] ,
110
- } ,
34
+ agent : mockAgent ( [
35
+ {
36
+ // This is now the latest (15:05:15) and is "working"
37
+ ...MockWorkspaceAppStatus ,
38
+ id : "status-8" ,
39
+ icon : "" , // Let the component handle the spinner icon
40
+ message : "Processing final checks..." ,
41
+ created_at : createTimestamp ( 5 , 15 ) , // 15:05:15 (after referenceDate)
42
+ uri : "" ,
43
+ state : "working" as const ,
44
+ } ,
45
+ ...MockWorkspaceAppStatuses ,
46
+ ] ) ,
47
+ } ,
48
+ } ;
111
49
112
- // Pass the reference date to the component for Storybook rendering
50
+ export const LongStatusText : Story = {
51
+ args : {
52
+ agent : mockAgent ( [
53
+ {
54
+ // This is now the latest (15:05:15) and is "working"
55
+ ...MockWorkspaceAppStatus ,
56
+ id : "status-8" ,
57
+ icon : "" , // Let the component handle the spinner icon
58
+ message :
59
+ "Processing final checks with a very long message that exceeds the usual length to test how the component handles overflow and truncation in the UI. This should be long enough to ensure it wraps correctly and doesn't break the layout." ,
60
+ created_at : createTimestamp ( 5 , 15 ) , // 15:05:15 (after referenceDate)
61
+ uri : "" ,
62
+ state : "complete" as const ,
63
+ } ,
64
+ ...MockWorkspaceAppStatuses ,
65
+ ] ) ,
113
66
} ,
114
67
} ;
115
68
116
- // Add a story with a "Working" status as the latest
117
- export const WorkingState : Story = {
69
+ export const SingleStatus : Story = {
118
70
args : {
119
- workspace : MockWorkspace ,
120
- agent : {
121
- ...MockWorkspaceAgent ,
122
- apps : [
123
- {
124
- ...MockWorkspaceApp ,
125
- statuses : [
126
- {
127
- // This is now the latest (15:05:15) and is "working"
128
- ...MockWorkspaceAppStatus ,
129
- id : "status-8" ,
130
- icon : "" , // Let the component handle the spinner icon
131
- message : "Processing final checks..." ,
132
- created_at : createTimestamp ( 5 , 15 ) , // 15:05:15 (after referenceDate)
133
- uri : "" ,
134
- state : "working" as const ,
135
- } ,
136
- {
137
- // Previous latest (15:04:38)
138
- ...MockWorkspaceAppStatus ,
139
- id : "status-7" ,
140
- icon : "/emojis/1f4dd.png" , // 📝
141
- message : "Creating PR with gh CLI" ,
142
- created_at : createTimestamp ( 4 , 38 ) , // 15:04:38
143
- uri : "https://github.com/coder/coder/pull/5678" ,
144
- state : "complete" as const ,
145
- } ,
146
- {
147
- // (15:03:56)
148
- ...MockWorkspaceAppStatus ,
149
- id : "status-6" ,
150
- icon : "/emojis/1f680.png" , // 🚀
151
- message : "Pushing branch to remote" ,
152
- created_at : createTimestamp ( 3 , 56 ) , // 15:03:56
153
- uri : "" ,
154
- state : "complete" as const ,
155
- } ,
156
- // ... include other older statuses if desired ...
157
- {
158
- // (15:01:00) - Oldest
159
- ...MockWorkspaceAppStatus ,
160
- id : "status-1" ,
161
- icon : "/emojis/1f680.png" , // 🚀
162
- message : "Starting to create a PR" ,
163
- created_at : createTimestamp ( 1 , 0 ) , // 15:01:00
164
- uri : "" ,
165
- state : "complete" as const ,
166
- } ,
167
- ] . sort (
168
- ( a , b ) =>
169
- new Date ( b . created_at ) . getTime ( ) -
170
- new Date ( a . created_at ) . getTime ( ) ,
171
- ) ,
172
- } ,
173
- ] ,
174
- } ,
71
+ agent : mockAgent ( [
72
+ {
73
+ ...MockWorkspaceAppStatus ,
74
+ id : "status-1" ,
75
+ icon : "" ,
76
+ message : "Initial setup complete." ,
77
+ created_at : createTimestamp ( 5 , 10 ) , // 15:05:10 (after referenceDate)
78
+ uri : "" ,
79
+ state : "complete" as const ,
80
+ } ,
81
+ ] ) ,
175
82
} ,
176
83
} ;
177
84
178
- function createTimestamp ( minuteOffset : number , secondOffset : number ) {
179
- const baseDate = new Date ( "2024-03-26T15:00:00Z" ) ;
180
- baseDate . setMinutes ( baseDate . getMinutes ( ) + minuteOffset ) ;
181
- baseDate . setSeconds ( baseDate . getSeconds ( ) + secondOffset ) ;
182
- return baseDate . toISOString ( ) ;
85
+ function mockAgent ( statuses : WorkspaceAppStatus [ ] ) {
86
+ return {
87
+ ...MockWorkspaceAgent ,
88
+ apps : [
89
+ {
90
+ ...MockWorkspaceApp ,
91
+ statuses,
92
+ } ,
93
+ ] ,
94
+ } ;
183
95
}
0 commit comments