@wakastellar/ui 2.3.4 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/blocks/dashboard/index.d.ts +4 -1
  2. package/dist/blocks/empty-states/index.d.ts +4 -1
  3. package/dist/blocks/error-pages/index.d.ts +4 -1
  4. package/dist/blocks/index.d.ts +1 -1
  5. package/dist/blocks/landing/index.d.ts +4 -1
  6. package/dist/blocks/pricing/index.d.ts +5 -1
  7. package/dist/blocks/sidebar/index.d.ts +5 -1
  8. package/dist/index.cjs.js +130 -130
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.es.js +7905 -7856
  11. package/dist/stories/Button.d.ts +14 -0
  12. package/dist/stories/Button.stories.d.ts +8 -0
  13. package/dist/stories/Header.d.ts +11 -0
  14. package/dist/stories/Header.stories.d.ts +6 -0
  15. package/dist/stories/Page.d.ts +2 -0
  16. package/dist/stories/Page.stories.d.ts +6 -0
  17. package/dist/types/index.d.ts +1 -0
  18. package/dist/types/link.d.ts +23 -0
  19. package/package.json +11 -3
  20. package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
  21. package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
  22. package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
  23. package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
  24. package/src/blocks/chat/Chat.stories.tsx +466 -0
  25. package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
  26. package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
  27. package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
  28. package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
  29. package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
  30. package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
  31. package/src/blocks/dashboard/index.tsx +68 -27
  32. package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
  33. package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
  34. package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
  35. package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
  36. package/src/blocks/empty-states/index.tsx +26 -8
  37. package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
  38. package/src/blocks/error-pages/index.tsx +26 -8
  39. package/src/blocks/faq/FAQ.stories.tsx +416 -0
  40. package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
  41. package/src/blocks/footer/Footer.stories.tsx +328 -0
  42. package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
  43. package/src/blocks/header/WakaHeader.stories.tsx +455 -0
  44. package/src/blocks/headtab/Headtab.stories.tsx +369 -0
  45. package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
  46. package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
  47. package/src/blocks/index.ts +1 -1
  48. package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
  49. package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
  50. package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
  51. package/src/blocks/landing/index.tsx +125 -66
  52. package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
  53. package/src/blocks/layout/Layout.stories.tsx +373 -0
  54. package/src/blocks/login/Login.stories.tsx +443 -0
  55. package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
  56. package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
  57. package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
  58. package/src/blocks/pricing/index.tsx +38 -4
  59. package/src/blocks/profile/Profile.stories.tsx +371 -0
  60. package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
  61. package/src/blocks/settings/Settings.stories.tsx +520 -0
  62. package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
  63. package/src/blocks/sidebar/index.tsx +49 -20
  64. package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
  65. package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
  66. package/src/blocks/wizard/Wizard.stories.tsx +683 -0
  67. package/src/components/accordion/Accordion.stories.tsx +93 -0
  68. package/src/components/alert/Alert.stories.tsx +95 -0
  69. package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
  70. package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
  71. package/src/components/avatar/Avatar.stories.tsx +104 -0
  72. package/src/components/button/Button.stories.tsx +12 -1
  73. package/src/components/calendar/Calendar.stories.tsx +102 -0
  74. package/src/components/card/Card.stories.tsx +125 -0
  75. package/src/components/checkbox/Checkbox.stories.tsx +100 -0
  76. package/src/components/code/Code.stories.tsx +402 -0
  77. package/src/components/collapsible/Collapsible.stories.tsx +123 -0
  78. package/src/components/command/Command.stories.tsx +207 -0
  79. package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
  80. package/src/components/dialog/Dialog.stories.tsx +157 -0
  81. package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
  82. package/src/components/form/Form.stories.tsx +413 -0
  83. package/src/components/hover-card/HoverCard.stories.tsx +148 -0
  84. package/src/components/input-otp/InputOTP.stories.tsx +255 -0
  85. package/src/components/label/Label.stories.tsx +68 -0
  86. package/src/components/menubar/Menubar.stories.tsx +278 -0
  87. package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
  88. package/src/components/popover/Popover.stories.tsx +199 -0
  89. package/src/components/progress/Progress.stories.tsx +104 -0
  90. package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
  91. package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
  92. package/src/components/select/Select.stories.tsx +146 -0
  93. package/src/components/separator/Separator.stories.tsx +117 -0
  94. package/src/components/sheet/Sheet.stories.tsx +195 -0
  95. package/src/components/skeleton/Skeleton.stories.tsx +114 -0
  96. package/src/components/slider/Slider.stories.tsx +157 -0
  97. package/src/components/switch/Switch.stories.tsx +114 -0
  98. package/src/components/table/Table.stories.tsx +153 -0
  99. package/src/components/tabs/Tabs.stories.tsx +155 -0
  100. package/src/components/textarea/Textarea.stories.tsx +116 -0
  101. package/src/components/toast/Toast.stories.tsx +160 -0
  102. package/src/components/toggle/Toggle.stories.tsx +125 -0
  103. package/src/components/tooltip/Tooltip.stories.tsx +133 -0
  104. package/src/components/typography/Typography.stories.tsx +207 -0
  105. package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
  106. package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
  107. package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
  108. package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
  109. package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
  110. package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
  111. package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
  112. package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
  113. package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
  114. package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
  115. package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
  116. package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
  117. package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
  118. package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
  119. package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
  120. package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
  121. package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
  122. package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
  123. package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
  124. package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
  125. package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
  126. package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
  127. package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
  128. package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
  129. package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
  130. package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
  131. package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
  132. package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
  133. package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
  134. package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
  135. package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
  136. package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
  137. package/src/components/waka-image/WakaImage.stories.tsx +255 -0
  138. package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
  139. package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
  140. package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
  141. package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
  142. package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
  143. package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
  144. package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
  145. package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
  146. package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
  147. package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
  148. package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
  149. package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
  150. package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
  151. package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
  152. package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
  153. package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
  154. package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
  155. package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
  156. package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
  157. package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
  158. package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
  159. package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
  160. package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
  161. package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
  162. package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
  163. package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
  164. package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
  165. package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
  166. package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
  167. package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
  168. package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
  169. package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
  170. package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
  171. package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
  172. package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
  173. package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
  174. package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
  175. package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
  176. package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
  177. package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
  178. package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
  179. package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
  180. package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
  181. package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
  182. package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
  183. package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
  184. package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
  185. package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
  186. package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
  187. package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
  188. package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
  189. package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
  190. package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
  191. package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
  192. package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
  193. package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
  194. package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
@@ -0,0 +1,466 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaChat, defaultChatUser, defaultChatConversations, defaultChatMessages } from './index'
3
+ import type { ChatMessage, ChatConversation, ChatUser } from './index'
4
+ import * as React from 'react'
5
+
6
+ const meta: Meta<typeof WakaChat> = {
7
+ title: 'Blocks/Chat',
8
+ component: WakaChat,
9
+ parameters: {
10
+ layout: 'fullscreen',
11
+ docs: {
12
+ description: {
13
+ component:
14
+ 'A chat component with multiple layouts (full, embedded, floating, widget), conversation list, message history, status indicators, and real-time features.',
15
+ },
16
+ },
17
+ },
18
+ tags: ['autodocs'],
19
+ argTypes: {
20
+ layout: {
21
+ control: 'select',
22
+ options: ['full', 'embedded', 'floating', 'widget'],
23
+ },
24
+ showConversationList: {
25
+ control: 'boolean',
26
+ },
27
+ showHeader: {
28
+ control: 'boolean',
29
+ },
30
+ showMessageStatus: {
31
+ control: 'boolean',
32
+ },
33
+ showTimestamps: {
34
+ control: 'boolean',
35
+ },
36
+ showAttachments: {
37
+ control: 'boolean',
38
+ },
39
+ showEmoji: {
40
+ control: 'boolean',
41
+ },
42
+ showDateSeparators: {
43
+ control: 'boolean',
44
+ },
45
+ showInputHint: {
46
+ control: 'boolean',
47
+ },
48
+ sending: {
49
+ control: 'boolean',
50
+ },
51
+ loading: {
52
+ control: 'boolean',
53
+ },
54
+ },
55
+ }
56
+
57
+ export default meta
58
+ type Story = StoryObj<typeof WakaChat>
59
+
60
+ export const Default: Story = {
61
+ render: () => (
62
+ <WakaChat
63
+ messages={defaultChatMessages}
64
+ conversations={defaultChatConversations}
65
+ activeConversation={defaultChatConversations[0]}
66
+ currentUser={defaultChatUser}
67
+ onSendMessage={(content) => console.log('Send:', content)}
68
+ onConversationSelect={(conv) => console.log('Select:', conv)}
69
+ onAudioCall={() => console.log('Audio call')}
70
+ onVideoCall={() => console.log('Video call')}
71
+ />
72
+ ),
73
+ }
74
+
75
+ export const FullLayout: Story = {
76
+ render: () => (
77
+ <WakaChat
78
+ messages={defaultChatMessages}
79
+ conversations={defaultChatConversations}
80
+ activeConversation={defaultChatConversations[0]}
81
+ currentUser={defaultChatUser}
82
+ layout="full"
83
+ onSendMessage={(content) => console.log('Send:', content)}
84
+ onConversationSelect={(conv) => console.log('Select:', conv)}
85
+ />
86
+ ),
87
+ }
88
+
89
+ export const EmbeddedLayout: Story = {
90
+ render: () => (
91
+ <div className="p-6">
92
+ <WakaChat
93
+ messages={defaultChatMessages}
94
+ conversations={defaultChatConversations}
95
+ activeConversation={defaultChatConversations[0]}
96
+ currentUser={defaultChatUser}
97
+ layout="embedded"
98
+ onSendMessage={(content) => console.log('Send:', content)}
99
+ />
100
+ </div>
101
+ ),
102
+ }
103
+
104
+ export const FloatingLayout: Story = {
105
+ render: () => (
106
+ <div className="h-screen flex items-end justify-end p-4 bg-muted/30">
107
+ <WakaChat
108
+ messages={defaultChatMessages}
109
+ activeConversation={defaultChatConversations[0]}
110
+ currentUser={defaultChatUser}
111
+ layout="floating"
112
+ showConversationList={false}
113
+ headerTitle="Support Chat"
114
+ onSendMessage={(content) => console.log('Send:', content)}
115
+ onClose={() => console.log('Close')}
116
+ onMinimize={() => console.log('Minimize')}
117
+ />
118
+ </div>
119
+ ),
120
+ }
121
+
122
+ export const WidgetLayout: Story = {
123
+ render: () => (
124
+ <div className="h-screen flex items-end justify-end p-4 bg-muted/30">
125
+ <WakaChat
126
+ messages={defaultChatMessages}
127
+ activeConversation={defaultChatConversations[0]}
128
+ currentUser={defaultChatUser}
129
+ layout="widget"
130
+ showConversationList={false}
131
+ headerTitle="Chat"
132
+ onSendMessage={(content) => console.log('Send:', content)}
133
+ onClose={() => console.log('Close')}
134
+ onMinimize={() => console.log('Minimize')}
135
+ />
136
+ </div>
137
+ ),
138
+ }
139
+
140
+ export const WidgetMinimized: Story = {
141
+ render: () => (
142
+ <div className="h-screen flex items-end justify-end p-4 bg-muted/30">
143
+ <WakaChat
144
+ messages={defaultChatMessages}
145
+ conversations={defaultChatConversations}
146
+ currentUser={defaultChatUser}
147
+ layout="widget"
148
+ minimized
149
+ onMinimize={() => console.log('Toggle minimize')}
150
+ />
151
+ </div>
152
+ ),
153
+ }
154
+
155
+ export const NoConversationSelected: Story = {
156
+ render: () => (
157
+ <WakaChat
158
+ messages={[]}
159
+ conversations={defaultChatConversations}
160
+ currentUser={defaultChatUser}
161
+ onConversationSelect={(conv) => console.log('Select:', conv)}
162
+ />
163
+ ),
164
+ }
165
+
166
+ export const WithUnreadMessages: Story = {
167
+ render: () => {
168
+ const conversationsWithUnread: ChatConversation[] = [
169
+ {
170
+ ...defaultChatConversations[0],
171
+ unreadCount: 5,
172
+ },
173
+ {
174
+ ...defaultChatConversations[1],
175
+ unreadCount: 12,
176
+ },
177
+ ]
178
+
179
+ return (
180
+ <WakaChat
181
+ messages={defaultChatMessages}
182
+ conversations={conversationsWithUnread}
183
+ activeConversation={conversationsWithUnread[0]}
184
+ currentUser={defaultChatUser}
185
+ onConversationSelect={(conv) => console.log('Select:', conv)}
186
+ />
187
+ )
188
+ },
189
+ }
190
+
191
+ export const ManyMessages: Story = {
192
+ render: () => {
193
+ const manyMessages: ChatMessage[] = Array.from({ length: 50 }, (_, i) => ({
194
+ id: `msg-${i}`,
195
+ content: i % 2 === 0 ? `Message from other user ${i + 1}` : `My response ${i + 1}`,
196
+ sender: i % 2 === 0
197
+ ? { id: '2', name: 'Marie Dupont', status: 'online' as const }
198
+ : defaultChatUser,
199
+ timestamp: new Date(Date.now() - (50 - i) * 1000 * 60 * 5),
200
+ status: 'read' as const,
201
+ }))
202
+
203
+ return (
204
+ <WakaChat
205
+ messages={manyMessages}
206
+ conversations={defaultChatConversations}
207
+ activeConversation={defaultChatConversations[0]}
208
+ currentUser={defaultChatUser}
209
+ onSendMessage={(content) => console.log('Send:', content)}
210
+ />
211
+ )
212
+ },
213
+ }
214
+
215
+ export const WithAttachments: Story = {
216
+ render: () => {
217
+ const messagesWithAttachments: ChatMessage[] = [
218
+ {
219
+ id: '1',
220
+ content: 'Voici les fichiers que tu as demandé',
221
+ sender: { id: '2', name: 'Marie Dupont' },
222
+ timestamp: new Date(Date.now() - 1000 * 60 * 10),
223
+ attachments: [
224
+ { type: 'file', url: '#', name: 'document.pdf', size: 2456000 },
225
+ { type: 'file', url: '#', name: 'report.xlsx', size: 1234000 },
226
+ ],
227
+ },
228
+ {
229
+ id: '2',
230
+ content: 'Et une image aussi',
231
+ sender: { id: '2', name: 'Marie Dupont' },
232
+ timestamp: new Date(Date.now() - 1000 * 60 * 5),
233
+ attachments: [
234
+ { type: 'image', url: 'https://picsum.photos/300/200', name: 'screenshot.png' },
235
+ ],
236
+ },
237
+ {
238
+ id: '3',
239
+ content: 'Super, merci !',
240
+ sender: defaultChatUser,
241
+ timestamp: new Date(),
242
+ status: 'read',
243
+ },
244
+ ]
245
+
246
+ return (
247
+ <div className="p-6">
248
+ <WakaChat
249
+ messages={messagesWithAttachments}
250
+ activeConversation={defaultChatConversations[0]}
251
+ currentUser={defaultChatUser}
252
+ layout="embedded"
253
+ showConversationList={false}
254
+ onSendMessage={(content) => console.log('Send:', content)}
255
+ />
256
+ </div>
257
+ )
258
+ },
259
+ }
260
+
261
+ export const WithReply: Story = {
262
+ render: () => {
263
+ const messagesWithReply: ChatMessage[] = [
264
+ {
265
+ id: '1',
266
+ content: 'Tu as vu le nouveau design ?',
267
+ sender: { id: '2', name: 'Marie Dupont' },
268
+ timestamp: new Date(Date.now() - 1000 * 60 * 30),
269
+ },
270
+ {
271
+ id: '2',
272
+ content: 'Oui, il est génial !',
273
+ sender: defaultChatUser,
274
+ timestamp: new Date(Date.now() - 1000 * 60 * 25),
275
+ replyTo: {
276
+ id: '1',
277
+ content: 'Tu as vu le nouveau design ?',
278
+ sender: { id: '2', name: 'Marie Dupont' },
279
+ timestamp: new Date(Date.now() - 1000 * 60 * 30),
280
+ },
281
+ status: 'read',
282
+ },
283
+ ]
284
+
285
+ return (
286
+ <div className="p-6">
287
+ <WakaChat
288
+ messages={messagesWithReply}
289
+ activeConversation={defaultChatConversations[0]}
290
+ currentUser={defaultChatUser}
291
+ layout="embedded"
292
+ showConversationList={false}
293
+ onSendMessage={(content) => console.log('Send:', content)}
294
+ />
295
+ </div>
296
+ )
297
+ },
298
+ }
299
+
300
+ export const Loading: Story = {
301
+ render: () => (
302
+ <WakaChat
303
+ messages={[]}
304
+ conversations={defaultChatConversations}
305
+ activeConversation={defaultChatConversations[0]}
306
+ currentUser={defaultChatUser}
307
+ loading
308
+ />
309
+ ),
310
+ }
311
+
312
+ export const Sending: Story = {
313
+ render: () => (
314
+ <WakaChat
315
+ messages={defaultChatMessages}
316
+ conversations={defaultChatConversations}
317
+ activeConversation={defaultChatConversations[0]}
318
+ currentUser={defaultChatUser}
319
+ sending
320
+ onSendMessage={(content) => console.log('Send:', content)}
321
+ />
322
+ ),
323
+ }
324
+
325
+ export const WithCloseButton: Story = {
326
+ render: () => (
327
+ <div className="p-6">
328
+ <WakaChat
329
+ messages={defaultChatMessages}
330
+ activeConversation={defaultChatConversations[0]}
331
+ currentUser={defaultChatUser}
332
+ layout="embedded"
333
+ showConversationList={false}
334
+ showCloseButton
335
+ onCloseConversation={() => console.log('Close conversation')}
336
+ onSendMessage={(content) => console.log('Send:', content)}
337
+ />
338
+ </div>
339
+ ),
340
+ }
341
+
342
+ export const NoDateSeparators: Story = {
343
+ render: () => (
344
+ <div className="p-6">
345
+ <WakaChat
346
+ messages={defaultChatMessages}
347
+ activeConversation={defaultChatConversations[0]}
348
+ currentUser={defaultChatUser}
349
+ layout="embedded"
350
+ showConversationList={false}
351
+ showDateSeparators={false}
352
+ onSendMessage={(content) => console.log('Send:', content)}
353
+ />
354
+ </div>
355
+ ),
356
+ }
357
+
358
+ export const CustomPlaceholder: Story = {
359
+ render: () => (
360
+ <div className="p-6">
361
+ <WakaChat
362
+ messages={defaultChatMessages}
363
+ activeConversation={defaultChatConversations[0]}
364
+ currentUser={defaultChatUser}
365
+ layout="embedded"
366
+ showConversationList={false}
367
+ inputPlaceholder="Type your message here..."
368
+ inputHintText="Press Enter to send, Shift+Enter for new line"
369
+ onSendMessage={(content) => console.log('Send:', content)}
370
+ />
371
+ </div>
372
+ ),
373
+ }
374
+
375
+ export const Interactive: Story = {
376
+ render: () => {
377
+ const [messages, setMessages] = React.useState<ChatMessage[]>(defaultChatMessages)
378
+ const [activeConversation, setActiveConversation] = React.useState<ChatConversation>(defaultChatConversations[0])
379
+ const [sending, setSending] = React.useState(false)
380
+
381
+ const handleSend = async (content: string) => {
382
+ setSending(true)
383
+
384
+ // Simulate sending
385
+ await new Promise(r => setTimeout(r, 500))
386
+
387
+ const newMessage: ChatMessage = {
388
+ id: `msg-${Date.now()}`,
389
+ content,
390
+ sender: defaultChatUser,
391
+ timestamp: new Date(),
392
+ status: 'sent',
393
+ }
394
+
395
+ setMessages(prev => [...prev, newMessage])
396
+ setSending(false)
397
+
398
+ // Simulate response
399
+ setTimeout(() => {
400
+ const response: ChatMessage = {
401
+ id: `msg-${Date.now() + 1}`,
402
+ content: 'Merci pour votre message ! Je vous réponds dès que possible.',
403
+ sender: activeConversation.participants.find(p => p.id !== defaultChatUser.id) || { id: '2', name: 'Support' },
404
+ timestamp: new Date(),
405
+ }
406
+ setMessages(prev => [...prev, response])
407
+ }, 2000)
408
+ }
409
+
410
+ return (
411
+ <WakaChat
412
+ messages={messages}
413
+ conversations={defaultChatConversations}
414
+ activeConversation={activeConversation}
415
+ currentUser={defaultChatUser}
416
+ sending={sending}
417
+ onSendMessage={handleSend}
418
+ onConversationSelect={setActiveConversation}
419
+ onAudioCall={() => alert('Starting audio call...')}
420
+ onVideoCall={() => alert('Starting video call...')}
421
+ />
422
+ )
423
+ },
424
+ }
425
+
426
+ export const SupportChat: Story = {
427
+ render: () => {
428
+ const supportUser: ChatUser = {
429
+ id: 'support',
430
+ name: 'Support Team',
431
+ status: 'online',
432
+ }
433
+
434
+ const supportConversation: ChatConversation = {
435
+ id: 'support-conv',
436
+ participants: [defaultChatUser, supportUser],
437
+ }
438
+
439
+ const supportMessages: ChatMessage[] = [
440
+ {
441
+ id: '1',
442
+ content: 'Bonjour ! Comment puis-je vous aider aujourd\'hui ?',
443
+ sender: supportUser,
444
+ timestamp: new Date(Date.now() - 1000 * 60 * 5),
445
+ },
446
+ ]
447
+
448
+ return (
449
+ <div className="h-screen flex items-end justify-end p-4 bg-gradient-to-br from-blue-50 to-purple-50">
450
+ <WakaChat
451
+ messages={supportMessages}
452
+ activeConversation={supportConversation}
453
+ currentUser={defaultChatUser}
454
+ layout="floating"
455
+ showConversationList={false}
456
+ headerTitle="Support"
457
+ statusText="Généralement répond sous 5 minutes"
458
+ showInputHint={false}
459
+ onSendMessage={(content) => console.log('Send:', content)}
460
+ onClose={() => console.log('Close')}
461
+ onMinimize={() => console.log('Minimize')}
462
+ />
463
+ </div>
464
+ )
465
+ },
466
+ }