@shipfox/client-integrations 5.0.0 → 6.0.2

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 (187) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +84 -0
  3. package/dist/application/complete-integration-callback.d.ts +13 -0
  4. package/dist/application/complete-integration-callback.d.ts.map +1 -0
  5. package/dist/application/complete-integration-callback.js +26 -0
  6. package/dist/application/complete-integration-callback.js.map +1 -0
  7. package/dist/components/connection-picker.d.ts +2 -2
  8. package/dist/components/connection-picker.d.ts.map +1 -1
  9. package/dist/components/connection-picker.js +4 -4
  10. package/dist/components/connection-picker.js.map +1 -1
  11. package/dist/components/installed-integrations-section.d.ts +8 -6
  12. package/dist/components/installed-integrations-section.d.ts.map +1 -1
  13. package/dist/components/installed-integrations-section.js +22 -15
  14. package/dist/components/installed-integrations-section.js.map +1 -1
  15. package/dist/components/integration-gallery-for-workspace.d.ts +2 -2
  16. package/dist/components/integration-gallery-for-workspace.d.ts.map +1 -1
  17. package/dist/components/integration-gallery-for-workspace.js +14 -7
  18. package/dist/components/integration-gallery-for-workspace.js.map +1 -1
  19. package/dist/components/integration-gallery.d.ts +2 -2
  20. package/dist/components/integration-gallery.d.ts.map +1 -1
  21. package/dist/components/integration-gallery.js.map +1 -1
  22. package/dist/components/integration-usage-events.d.ts +1 -3
  23. package/dist/components/integration-usage-events.d.ts.map +1 -1
  24. package/dist/components/integration-usage-events.js +1 -125
  25. package/dist/components/integration-usage-events.js.map +1 -1
  26. package/dist/components/integration-usage-modal.d.ts +2 -2
  27. package/dist/components/integration-usage-modal.d.ts.map +1 -1
  28. package/dist/components/integration-usage-modal.js +2 -2
  29. package/dist/components/integration-usage-modal.js.map +1 -1
  30. package/dist/components/provider-grid.d.ts +7 -4
  31. package/dist/components/provider-grid.d.ts.map +1 -1
  32. package/dist/components/provider-grid.js +15 -10
  33. package/dist/components/provider-grid.js.map +1 -1
  34. package/dist/components/redirect-install-page.d.ts +2 -3
  35. package/dist/components/redirect-install-page.d.ts.map +1 -1
  36. package/dist/components/redirect-install-page.js +1 -1
  37. package/dist/components/redirect-install-page.js.map +1 -1
  38. package/dist/components/repository-picker.d.ts +2 -2
  39. package/dist/components/repository-picker.d.ts.map +1 -1
  40. package/dist/components/repository-picker.js +4 -4
  41. package/dist/components/repository-picker.js.map +1 -1
  42. package/dist/components/webhook/webhook-create-modal.d.ts +2 -2
  43. package/dist/components/webhook/webhook-create-modal.d.ts.map +1 -1
  44. package/dist/components/webhook/webhook-create-modal.js +8 -8
  45. package/dist/components/webhook/webhook-create-modal.js.map +1 -1
  46. package/dist/components/webhook/webhook-modals.stories.d.ts.map +1 -1
  47. package/dist/components/webhook/webhook-modals.stories.js +7 -7
  48. package/dist/components/webhook/webhook-modals.stories.js.map +1 -1
  49. package/dist/components/webhook/webhook-usage-details.d.ts.map +1 -1
  50. package/dist/components/webhook/webhook-usage-details.js +2 -2
  51. package/dist/components/webhook/webhook-usage-details.js.map +1 -1
  52. package/dist/connection-status-badge.d.ts +2 -2
  53. package/dist/connection-status-badge.d.ts.map +1 -1
  54. package/dist/connection-status-badge.js +11 -15
  55. package/dist/connection-status-badge.js.map +1 -1
  56. package/dist/core/models.d.ts +66 -0
  57. package/dist/core/models.d.ts.map +1 -0
  58. package/dist/core/models.js +156 -0
  59. package/dist/core/models.js.map +1 -0
  60. package/dist/feature.d.ts +7 -0
  61. package/dist/feature.d.ts.map +1 -1
  62. package/dist/feature.js +10 -9
  63. package/dist/feature.js.map +1 -1
  64. package/dist/hooks/api/integration-mapper.d.ts +11 -0
  65. package/dist/hooks/api/integration-mapper.d.ts.map +1 -0
  66. package/dist/hooks/api/integration-mapper.js +54 -0
  67. package/dist/hooks/api/integration-mapper.js.map +1 -0
  68. package/dist/hooks/api/integrations.d.ts +45 -240
  69. package/dist/hooks/api/integrations.d.ts.map +1 -1
  70. package/dist/hooks/api/integrations.js +78 -31
  71. package/dist/hooks/api/integrations.js.map +1 -1
  72. package/dist/hooks/api/webhook-connections.d.ts +12 -64
  73. package/dist/hooks/api/webhook-connections.d.ts.map +1 -1
  74. package/dist/hooks/api/webhook-connections.js +17 -9
  75. package/dist/hooks/api/webhook-connections.js.map +1 -1
  76. package/dist/index.d.ts +2 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +2 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/linear-callback.d.ts +2 -1
  81. package/dist/linear-callback.d.ts.map +1 -1
  82. package/dist/linear-callback.js +17 -15
  83. package/dist/linear-callback.js.map +1 -1
  84. package/dist/pages/gitea-install-page.d.ts.map +1 -1
  85. package/dist/pages/gitea-install-page.js +1 -10
  86. package/dist/pages/gitea-install-page.js.map +1 -1
  87. package/dist/pages/linear-callback-page.d.ts.map +1 -1
  88. package/dist/pages/linear-callback-page.js +19 -32
  89. package/dist/pages/linear-callback-page.js.map +1 -1
  90. package/dist/pages/linear-install-page.d.ts.map +1 -1
  91. package/dist/pages/linear-install-page.js +2 -1
  92. package/dist/pages/linear-install-page.js.map +1 -1
  93. package/dist/pages/sentry-callback-page.d.ts.map +1 -1
  94. package/dist/pages/sentry-callback-page.js +22 -25
  95. package/dist/pages/sentry-callback-page.js.map +1 -1
  96. package/dist/pages/sentry-install-page.d.ts.map +1 -1
  97. package/dist/pages/sentry-install-page.js +2 -1
  98. package/dist/pages/sentry-install-page.js.map +1 -1
  99. package/dist/pages/slack-callback-page.d.ts.map +1 -1
  100. package/dist/pages/slack-callback-page.js +21 -28
  101. package/dist/pages/slack-callback-page.js.map +1 -1
  102. package/dist/pages/slack-install-page.d.ts.map +1 -1
  103. package/dist/pages/slack-install-page.js +2 -1
  104. package/dist/pages/slack-install-page.js.map +1 -1
  105. package/dist/pages/source-control-onboarding-page.d.ts.map +1 -1
  106. package/dist/pages/source-control-onboarding-page.js +5 -1
  107. package/dist/pages/source-control-onboarding-page.js.map +1 -1
  108. package/dist/provider-catalog.d.ts.map +1 -1
  109. package/dist/provider-catalog.js +7 -6
  110. package/dist/provider-catalog.js.map +1 -1
  111. package/dist/routes/github-callback.d.ts +16 -0
  112. package/dist/routes/github-callback.d.ts.map +1 -1
  113. package/dist/routes/github-callback.js +43 -21
  114. package/dist/routes/github-callback.js.map +1 -1
  115. package/dist/routes/linear-callback.d.ts +2 -0
  116. package/dist/routes/linear-callback.d.ts.map +1 -1
  117. package/dist/routes/linear-callback.js +2 -0
  118. package/dist/routes/linear-callback.js.map +1 -1
  119. package/dist/routes/sentry-callback.d.ts +2 -0
  120. package/dist/routes/sentry-callback.d.ts.map +1 -1
  121. package/dist/routes/sentry-callback.js +2 -0
  122. package/dist/routes/sentry-callback.js.map +1 -1
  123. package/dist/routes/slack-callback.d.ts +2 -0
  124. package/dist/routes/slack-callback.d.ts.map +1 -1
  125. package/dist/routes/slack-callback.js +2 -0
  126. package/dist/routes/slack-callback.js.map +1 -1
  127. package/dist/sentry-callback.d.ts +2 -1
  128. package/dist/sentry-callback.d.ts.map +1 -1
  129. package/dist/sentry-callback.js +18 -19
  130. package/dist/sentry-callback.js.map +1 -1
  131. package/dist/slack-callback.d.ts +2 -1
  132. package/dist/slack-callback.d.ts.map +1 -1
  133. package/dist/slack-callback.js +17 -15
  134. package/dist/slack-callback.js.map +1 -1
  135. package/dist/tsconfig.test.tsbuildinfo +1 -1
  136. package/package.json +17 -17
  137. package/src/application/complete-integration-callback.test.ts +41 -0
  138. package/src/application/complete-integration-callback.ts +39 -0
  139. package/src/components/connection-picker.tsx +7 -7
  140. package/src/components/installed-integrations-section.tsx +29 -24
  141. package/src/components/integration-gallery-for-workspace.tsx +23 -16
  142. package/src/components/integration-gallery.tsx +3 -3
  143. package/src/components/integration-usage-events.ts +1 -116
  144. package/src/components/integration-usage-modal.tsx +4 -4
  145. package/src/components/provider-grid.tsx +30 -18
  146. package/src/components/redirect-install-page.test.tsx +2 -6
  147. package/src/components/redirect-install-page.tsx +3 -2
  148. package/src/components/repository-picker.tsx +6 -6
  149. package/src/components/webhook/webhook-create-modal.tsx +12 -11
  150. package/src/components/webhook/webhook-modals.stories.tsx +10 -10
  151. package/src/components/webhook/webhook-usage-details.tsx +2 -4
  152. package/src/connection-status-badge.tsx +8 -14
  153. package/src/core/models.ts +200 -0
  154. package/src/feature.ts +12 -10
  155. package/src/hooks/api/integration-mapper.ts +64 -0
  156. package/src/hooks/api/integrations.test.ts +44 -22
  157. package/src/hooks/api/integrations.ts +229 -84
  158. package/src/hooks/api/webhook-connections.ts +58 -17
  159. package/src/index.ts +2 -1
  160. package/src/linear-callback.ts +24 -16
  161. package/src/pages/gitea-install-page.tsx +1 -10
  162. package/src/pages/linear-callback-page.tsx +18 -30
  163. package/src/pages/linear-install-page.tsx +2 -1
  164. package/src/pages/sentry-callback-page.test.tsx +5 -1
  165. package/src/pages/sentry-callback-page.tsx +28 -25
  166. package/src/pages/sentry-install-page.tsx +2 -1
  167. package/src/pages/slack-callback-page.tsx +20 -26
  168. package/src/pages/slack-install-page.tsx +2 -1
  169. package/src/pages/source-control-onboarding-page.tsx +5 -1
  170. package/src/provider-catalog.ts +7 -6
  171. package/src/routes/github-callback.test.ts +35 -1
  172. package/src/routes/github-callback.tsx +47 -21
  173. package/src/routes/linear-callback.tsx +5 -1
  174. package/src/routes/sentry-callback.tsx +5 -1
  175. package/src/routes/slack-callback.tsx +6 -1
  176. package/src/sentry-callback.test.ts +2 -1
  177. package/src/sentry-callback.ts +30 -20
  178. package/src/slack-callback.ts +24 -16
  179. package/tsconfig.build.tsbuildinfo +1 -1
  180. package/vercel.json +5 -0
  181. package/dist/integration-icon.d.ts +0 -17
  182. package/dist/integration-icon.d.ts.map +0 -1
  183. package/dist/integration-icon.js +0 -22
  184. package/dist/integration-icon.js.map +0 -1
  185. package/src/integration-icon.react.test.tsx +0 -40
  186. package/src/integration-icon.test.ts +0 -19
  187. package/src/integration-icon.tsx +0 -26
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/integration-gallery.tsx"],"sourcesContent":["import type {IntegrationCapabilityDto} from '@shipfox/api-integration-core-dto';\nimport {useActiveWorkspace} from '@shipfox/client-auth';\nimport {IntegrationGalleryForWorkspace} from './integration-gallery-for-workspace.js';\n\nexport interface IntegrationGalleryProps {\n capability?: IntegrationCapabilityDto;\n emptyProvidersMessage?: string;\n workspaceId?: string;\n}\n\nexport function IntegrationGallery({\n capability,\n emptyProvidersMessage = 'Enable at least one provider in the application settings.',\n workspaceId,\n}: IntegrationGalleryProps) {\n if (workspaceId) {\n return (\n <IntegrationGalleryForWorkspace\n workspaceId={workspaceId}\n capability={capability}\n emptyProvidersMessage={emptyProvidersMessage}\n />\n );\n }\n\n return (\n <RoutedIntegrationGallery\n capability={capability}\n emptyProvidersMessage={emptyProvidersMessage}\n />\n );\n}\n\nfunction RoutedIntegrationGallery({\n capability,\n emptyProvidersMessage,\n}: {\n capability: IntegrationCapabilityDto | undefined;\n emptyProvidersMessage: string;\n}) {\n const workspace = useActiveWorkspace();\n return (\n <IntegrationGalleryForWorkspace\n workspaceId={workspace.id}\n capability={capability}\n emptyProvidersMessage={emptyProvidersMessage}\n />\n );\n}\n"],"names":["useActiveWorkspace","IntegrationGalleryForWorkspace","IntegrationGallery","capability","emptyProvidersMessage","workspaceId","RoutedIntegrationGallery","workspace","id"],"mappings":";AACA,SAAQA,kBAAkB,QAAO,uBAAuB;AACxD,SAAQC,8BAA8B,QAAO,yCAAyC;AAQtF,OAAO,SAASC,mBAAmB,EACjCC,UAAU,EACVC,wBAAwB,2DAA2D,EACnFC,WAAW,EACa;IACxB,IAAIA,aAAa;QACf,qBACE,KAACJ;YACCI,aAAaA;YACbF,YAAYA;YACZC,uBAAuBA;;IAG7B;IAEA,qBACE,KAACE;QACCH,YAAYA;QACZC,uBAAuBA;;AAG7B;AAEA,SAASE,yBAAyB,EAChCH,UAAU,EACVC,qBAAqB,EAItB;IACC,MAAMG,YAAYP;IAClB,qBACE,KAACC;QACCI,aAAaE,UAAUC,EAAE;QACzBL,YAAYA;QACZC,uBAAuBA;;AAG7B"}
1
+ {"version":3,"sources":["../../src/components/integration-gallery.tsx"],"sourcesContent":["import {useActiveWorkspace} from '@shipfox/client-auth';\nimport type {IntegrationCapability} from '#core/models.js';\nimport {IntegrationGalleryForWorkspace} from './integration-gallery-for-workspace.js';\n\nexport interface IntegrationGalleryProps {\n capability?: IntegrationCapability;\n emptyProvidersMessage?: string;\n workspaceId?: string;\n}\n\nexport function IntegrationGallery({\n capability,\n emptyProvidersMessage = 'Enable at least one provider in the application settings.',\n workspaceId,\n}: IntegrationGalleryProps) {\n if (workspaceId) {\n return (\n <IntegrationGalleryForWorkspace\n workspaceId={workspaceId}\n capability={capability}\n emptyProvidersMessage={emptyProvidersMessage}\n />\n );\n }\n\n return (\n <RoutedIntegrationGallery\n capability={capability}\n emptyProvidersMessage={emptyProvidersMessage}\n />\n );\n}\n\nfunction RoutedIntegrationGallery({\n capability,\n emptyProvidersMessage,\n}: {\n capability: IntegrationCapability | undefined;\n emptyProvidersMessage: string;\n}) {\n const workspace = useActiveWorkspace();\n return (\n <IntegrationGalleryForWorkspace\n workspaceId={workspace.id}\n capability={capability}\n emptyProvidersMessage={emptyProvidersMessage}\n />\n );\n}\n"],"names":["useActiveWorkspace","IntegrationGalleryForWorkspace","IntegrationGallery","capability","emptyProvidersMessage","workspaceId","RoutedIntegrationGallery","workspace","id"],"mappings":";AAAA,SAAQA,kBAAkB,QAAO,uBAAuB;AAExD,SAAQC,8BAA8B,QAAO,yCAAyC;AAQtF,OAAO,SAASC,mBAAmB,EACjCC,UAAU,EACVC,wBAAwB,2DAA2D,EACnFC,WAAW,EACa;IACxB,IAAIA,aAAa;QACf,qBACE,KAACJ;YACCI,aAAaA;YACbF,YAAYA;YACZC,uBAAuBA;;IAG7B;IAEA,qBACE,KAACE;QACCH,YAAYA;QACZC,uBAAuBA;;AAG7B;AAEA,SAASE,yBAAyB,EAChCH,UAAU,EACVC,qBAAqB,EAItB;IACC,MAAMG,YAAYP;IAClB,qBACE,KAACC;QACCI,aAAaE,UAAUC,EAAE;QACzBL,YAAYA;QACZC,uBAAuBA;;AAG7B"}
@@ -1,4 +1,2 @@
1
- import type { IntegrationConnectionDto } from '@shipfox/api-integration-core-dto';
2
- import type { IntegrationUsageEvent } from './integration-usage-modal.js';
3
- export declare function usageEventsForConnection(connection: IntegrationConnectionDto): IntegrationUsageEvent[];
1
+ export { usageEventsForConnection } from '#core/models.js';
4
2
  //# sourceMappingURL=integration-usage-events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"integration-usage-events.d.ts","sourceRoot":"","sources":["../../src/components/integration-usage-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAoB,MAAM,mCAAmC,CAAC;AAInG,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,8BAA8B,CAAC;AAgFxE,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,wBAAwB,GACnC,qBAAqB,EAAE,CAyBzB"}
1
+ {"version":3,"file":"integration-usage-events.d.ts","sourceRoot":"","sources":["../../src/components/integration-usage-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,iBAAiB,CAAC"}
@@ -1,127 +1,3 @@
1
- import { SENTRY_ISSUE_ACTIONS } from '@shipfox/api-integration-core-dto';
2
- import { linearWebhookEventNames } from '@shipfox/api-integration-linear-dto';
3
- import { WEBHOOK_RECEIVED_EVENT } from '@shipfox/api-integration-webhook-dto';
4
- const GITHUB_EVENTS = [
5
- 'push',
6
- 'branch_protection_configuration',
7
- 'branch_protection_rule',
8
- 'check_run',
9
- 'check_suite',
10
- 'code_scanning_alert',
11
- 'commit_comment',
12
- 'create',
13
- 'custom_property',
14
- 'custom_property_values',
15
- 'delete',
16
- 'dependabot_alert',
17
- 'deploy_key',
18
- 'deployment',
19
- 'deployment_protection_rule',
20
- 'deployment_review',
21
- 'deployment_status',
22
- 'discussion',
23
- 'discussion_comment',
24
- 'fork',
25
- 'github_app_authorization',
26
- 'gollum',
27
- 'installation',
28
- 'installation_repositories',
29
- 'installation_target',
30
- 'issue_comment',
31
- 'issue_dependencies',
32
- 'issues',
33
- 'label',
34
- 'marketplace_purchase',
35
- 'member',
36
- 'membership',
37
- 'merge_group',
38
- 'meta',
39
- 'milestone',
40
- 'org_block',
41
- 'organization',
42
- 'package',
43
- 'page_build',
44
- 'personal_access_token_request',
45
- 'ping',
46
- 'project',
47
- 'project_card',
48
- 'project_column',
49
- 'projects_v2',
50
- 'projects_v2_item',
51
- 'projects_v2_status_update',
52
- 'public',
53
- 'pull_request',
54
- 'pull_request_review',
55
- 'pull_request_review_comment',
56
- 'pull_request_review_thread',
57
- 'registry_package',
58
- 'release',
59
- 'repository',
60
- 'repository_advisory',
61
- 'repository_dispatch',
62
- 'repository_import',
63
- 'repository_ruleset',
64
- 'repository_vulnerability_alert',
65
- 'secret_scanning_alert',
66
- 'secret_scanning_alert_location',
67
- 'secret_scanning_scan',
68
- 'security_advisory',
69
- 'security_and_analysis',
70
- 'sponsorship',
71
- 'star',
72
- 'status',
73
- 'sub_issues',
74
- 'team',
75
- 'team_add',
76
- 'watch',
77
- 'workflow_dispatch',
78
- 'workflow_job',
79
- 'workflow_run'
80
- ];
81
- export function usageEventsForConnection(connection) {
82
- if (connection.provider === 'webhook') {
83
- return [
84
- {
85
- value: WEBHOOK_RECEIVED_EVENT,
86
- label: WEBHOOK_RECEIVED_EVENT
87
- }
88
- ];
89
- }
90
- if (connection.provider === 'github') {
91
- return GITHUB_EVENTS.map((event)=>({
92
- value: event,
93
- label: event
94
- }));
95
- }
96
- if (connection.provider === 'sentry') {
97
- return SENTRY_ISSUE_ACTIONS.map((action)=>({
98
- value: `issue.${action}`,
99
- label: sentryIssueEventLabel(action)
100
- }));
101
- }
102
- if (connection.provider === 'linear') {
103
- return linearWebhookEventNames.map((event)=>({
104
- value: event,
105
- label: event
106
- }));
107
- }
108
- if (connection.capabilities.includes('source_control')) {
109
- return [
110
- {
111
- value: 'push',
112
- label: 'push'
113
- }
114
- ];
115
- }
116
- return [
117
- {
118
- value: 'received',
119
- label: 'received'
120
- }
121
- ];
122
- }
123
- function sentryIssueEventLabel(action) {
124
- return `issue.${action}`;
125
- }
1
+ export { usageEventsForConnection } from '#core/models.js';
126
2
 
127
3
  //# sourceMappingURL=integration-usage-events.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/integration-usage-events.ts"],"sourcesContent":["import type {IntegrationConnectionDto, SentryIssueAction} from '@shipfox/api-integration-core-dto';\nimport {SENTRY_ISSUE_ACTIONS} from '@shipfox/api-integration-core-dto';\nimport {linearWebhookEventNames} from '@shipfox/api-integration-linear-dto';\nimport {WEBHOOK_RECEIVED_EVENT} from '@shipfox/api-integration-webhook-dto';\nimport type {IntegrationUsageEvent} from './integration-usage-modal.js';\n\nconst GITHUB_EVENTS = [\n 'push',\n 'branch_protection_configuration',\n 'branch_protection_rule',\n 'check_run',\n 'check_suite',\n 'code_scanning_alert',\n 'commit_comment',\n 'create',\n 'custom_property',\n 'custom_property_values',\n 'delete',\n 'dependabot_alert',\n 'deploy_key',\n 'deployment',\n 'deployment_protection_rule',\n 'deployment_review',\n 'deployment_status',\n 'discussion',\n 'discussion_comment',\n 'fork',\n 'github_app_authorization',\n 'gollum',\n 'installation',\n 'installation_repositories',\n 'installation_target',\n 'issue_comment',\n 'issue_dependencies',\n 'issues',\n 'label',\n 'marketplace_purchase',\n 'member',\n 'membership',\n 'merge_group',\n 'meta',\n 'milestone',\n 'org_block',\n 'organization',\n 'package',\n 'page_build',\n 'personal_access_token_request',\n 'ping',\n 'project',\n 'project_card',\n 'project_column',\n 'projects_v2',\n 'projects_v2_item',\n 'projects_v2_status_update',\n 'public',\n 'pull_request',\n 'pull_request_review',\n 'pull_request_review_comment',\n 'pull_request_review_thread',\n 'registry_package',\n 'release',\n 'repository',\n 'repository_advisory',\n 'repository_dispatch',\n 'repository_import',\n 'repository_ruleset',\n 'repository_vulnerability_alert',\n 'secret_scanning_alert',\n 'secret_scanning_alert_location',\n 'secret_scanning_scan',\n 'security_advisory',\n 'security_and_analysis',\n 'sponsorship',\n 'star',\n 'status',\n 'sub_issues',\n 'team',\n 'team_add',\n 'watch',\n 'workflow_dispatch',\n 'workflow_job',\n 'workflow_run',\n] as const;\n\nexport function usageEventsForConnection(\n connection: IntegrationConnectionDto,\n): IntegrationUsageEvent[] {\n if (connection.provider === 'webhook') {\n return [{value: WEBHOOK_RECEIVED_EVENT, label: WEBHOOK_RECEIVED_EVENT}];\n }\n\n if (connection.provider === 'github') {\n return GITHUB_EVENTS.map((event) => ({value: event, label: event}));\n }\n\n if (connection.provider === 'sentry') {\n return SENTRY_ISSUE_ACTIONS.map((action) => ({\n value: `issue.${action}`,\n label: sentryIssueEventLabel(action),\n }));\n }\n\n if (connection.provider === 'linear') {\n return linearWebhookEventNames.map((event) => ({value: event, label: event}));\n }\n\n if (connection.capabilities.includes('source_control')) {\n return [{value: 'push', label: 'push'}];\n }\n\n return [{value: 'received', label: 'received'}];\n}\n\nfunction sentryIssueEventLabel(action: SentryIssueAction): string {\n return `issue.${action}`;\n}\n"],"names":["SENTRY_ISSUE_ACTIONS","linearWebhookEventNames","WEBHOOK_RECEIVED_EVENT","GITHUB_EVENTS","usageEventsForConnection","connection","provider","value","label","map","event","action","sentryIssueEventLabel","capabilities","includes"],"mappings":"AACA,SAAQA,oBAAoB,QAAO,oCAAoC;AACvE,SAAQC,uBAAuB,QAAO,sCAAsC;AAC5E,SAAQC,sBAAsB,QAAO,uCAAuC;AAG5E,MAAMC,gBAAgB;IACpB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,OAAO,SAASC,yBACdC,UAAoC;IAEpC,IAAIA,WAAWC,QAAQ,KAAK,WAAW;QACrC,OAAO;YAAC;gBAACC,OAAOL;gBAAwBM,OAAON;YAAsB;SAAE;IACzE;IAEA,IAAIG,WAAWC,QAAQ,KAAK,UAAU;QACpC,OAAOH,cAAcM,GAAG,CAAC,CAACC,QAAW,CAAA;gBAACH,OAAOG;gBAAOF,OAAOE;YAAK,CAAA;IAClE;IAEA,IAAIL,WAAWC,QAAQ,KAAK,UAAU;QACpC,OAAON,qBAAqBS,GAAG,CAAC,CAACE,SAAY,CAAA;gBAC3CJ,OAAO,CAAC,MAAM,EAAEI,QAAQ;gBACxBH,OAAOI,sBAAsBD;YAC/B,CAAA;IACF;IAEA,IAAIN,WAAWC,QAAQ,KAAK,UAAU;QACpC,OAAOL,wBAAwBQ,GAAG,CAAC,CAACC,QAAW,CAAA;gBAACH,OAAOG;gBAAOF,OAAOE;YAAK,CAAA;IAC5E;IAEA,IAAIL,WAAWQ,YAAY,CAACC,QAAQ,CAAC,mBAAmB;QACtD,OAAO;YAAC;gBAACP,OAAO;gBAAQC,OAAO;YAAM;SAAE;IACzC;IAEA,OAAO;QAAC;YAACD,OAAO;YAAYC,OAAO;QAAU;KAAE;AACjD;AAEA,SAASI,sBAAsBD,MAAyB;IACtD,OAAO,CAAC,MAAM,EAAEA,QAAQ;AAC1B"}
1
+ {"version":3,"sources":["../../src/components/integration-usage-events.ts"],"sourcesContent":["export {usageEventsForConnection} from '#core/models.js';\n"],"names":["usageEventsForConnection"],"mappings":"AAAA,SAAQA,wBAAwB,QAAO,kBAAkB"}
@@ -1,11 +1,11 @@
1
- import type { IntegrationConnectionDto } from '@shipfox/api-integration-core-dto';
2
1
  import type { ReactNode } from 'react';
2
+ import type { IntegrationConnection } from '#core/models.js';
3
3
  export interface IntegrationUsageEvent {
4
4
  value: string;
5
5
  label: string;
6
6
  }
7
7
  interface IntegrationUsageModalProps {
8
- connection: IntegrationConnectionDto | null;
8
+ connection: IntegrationConnection | null;
9
9
  events: IntegrationUsageEvent[];
10
10
  open: boolean;
11
11
  onOpenChange: (open: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"integration-usage-modal.d.ts","sourceRoot":"","sources":["../../src/components/integration-usage-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAC;AA4BhF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAIrC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,0BAA0B;IAClC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAID,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,QAAQ,GACT,EAAE,0BAA0B,+BA+G5B"}
1
+ {"version":3,"file":"integration-usage-modal.d.ts","sourceRoot":"","sources":["../../src/components/integration-usage-modal.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAGrC,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,iBAAiB,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,0BAA0B;IAClC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAID,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,QAAQ,GACT,EAAE,0BAA0B,+BA+G5B"}
@@ -29,7 +29,7 @@ export function IntegrationUsageModal({ connection, events, open, onOpenChange,
29
29
  ], [
30
30
  workflowExample
31
31
  ]);
32
- const title = connection ? `Use ${connection.display_name}` : 'Use integration';
32
+ const title = connection ? `Use ${connection.displayName}` : 'Use integration';
33
33
  return /*#__PURE__*/ _jsx(Modal, {
34
34
  open: open && connection !== null,
35
35
  onOpenChange: onOpenChange,
@@ -55,7 +55,7 @@ export function IntegrationUsageModal({ connection, events, open, onOpenChange,
55
55
  children: title
56
56
  }),
57
57
  connection ? /*#__PURE__*/ _jsx(ConnectionStatusBadge, {
58
- status: connection.lifecycle_status,
58
+ status: connection.lifecycleStatus,
59
59
  className: "shrink-0"
60
60
  }) : null
61
61
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/integration-usage-modal.tsx"],"sourcesContent":["import type {IntegrationConnectionDto} from '@shipfox/api-integration-core-dto';\nimport {Button} from '@shipfox/react-ui/button';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@shipfox/react-ui/select';\nimport {Text} from '@shipfox/react-ui/typography';\nimport type {ReactNode} from 'react';\nimport {useEffect, useMemo, useState} from 'react';\nimport {ConnectionStatusBadge} from '#connection-status-badge.js';\n\nexport interface IntegrationUsageEvent {\n value: string;\n label: string;\n}\n\ninterface IntegrationUsageModalProps {\n connection: IntegrationConnectionDto | null;\n events: IntegrationUsageEvent[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children?: ReactNode;\n}\n\nconst WORKFLOW_FILENAME = '.shipfox/workflows/integration.yml';\n\nexport function IntegrationUsageModal({\n connection,\n events,\n open,\n onOpenChange,\n children,\n}: IntegrationUsageModalProps) {\n const [selectedEvent, setSelectedEvent] = useState('');\n const eventValuesKey = events.map((event) => event.value).join('\\u0000');\n\n useEffect(() => {\n const eventValues = eventValuesKey ? eventValuesKey.split('\\u0000') : [];\n setSelectedEvent((current) =>\n eventValues.includes(current) ? current : (eventValues[0] ?? ''),\n );\n }, [eventValuesKey]);\n\n const workflowExample = connection\n ? buildWorkflowExample({source: connection.slug, event: selectedEvent})\n : '';\n const data = useMemo(\n () => [{language: 'yaml', filename: WORKFLOW_FILENAME, code: workflowExample}],\n [workflowExample],\n );\n const title = connection ? `Use ${connection.display_name}` : 'Use integration';\n\n return (\n <Modal open={open && connection !== null} onOpenChange={onOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-h-[calc(100vh-32px)] max-w-[640px]\">\n <ModalTitle className=\"sr-only\">{title}</ModalTitle>\n <ModalHeader>\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex min-w-0 items-center gap-8\">\n <Text size=\"lg\" aria-hidden=\"true\" className=\"truncate\">\n {title}\n </Text>\n {connection ? (\n <ConnectionStatusBadge status={connection.lifecycle_status} className=\"shrink-0\" />\n ) : null}\n </div>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Reference this connection from a workflow trigger.\n </Text>\n </div>\n </ModalHeader>\n {connection ? (\n <>\n <ModalBody className=\"min-h-0 flex-1 gap-24 overflow-y-auto overflow-x-clip scrollbar\">\n <section className=\"flex w-full flex-col gap-12\">\n <Text size=\"md\" bold>\n Usage\n </Text>\n {events.length > 1 ? (\n <div className=\"flex flex-col gap-6\">\n <label\n htmlFor=\"integration-usage-event\"\n className=\"font-display text-sm font-medium text-foreground-neutral-base\"\n >\n Event\n </label>\n <Select value={selectedEvent} onValueChange={setSelectedEvent}>\n <SelectTrigger id=\"integration-usage-event\">\n <SelectValue placeholder=\"Select event\" />\n </SelectTrigger>\n <SelectContent>\n {events.map((event) => (\n <SelectItem key={event.value} value={event.value}>\n {event.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n <CodeBlock data={data} className=\"h-auto min-h-0 rounded-8\">\n <CodeBlockHeader>\n <CodeBlockFiles>\n {(item) => (\n <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>\n )}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody>\n {(item) => (\n <CodeBlockItem value={item.filename}>\n <CodeBlockContent\n language=\"yaml\"\n syntaxHighlighting\n highlightedLineRange={{startLine: 3, endLine: 4}}\n >\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n {children ? (\n <section className=\"flex w-full flex-col gap-12\">\n <Text size=\"md\" bold>\n Details\n </Text>\n {children}\n </section>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button type=\"button\" onClick={() => onOpenChange(false)}>\n Done\n </Button>\n </ModalFooter>\n </>\n ) : null}\n </ModalContent>\n </Modal>\n );\n}\n\nfunction buildWorkflowExample({source, event}: {source: string; event: string}) {\n return [\n 'triggers:',\n ' integration:',\n ` source: ${source}`,\n ` event: ${event}`,\n 'jobs:',\n ' handle-event:',\n ' steps:',\n ' - run: echo \"Received event\"',\n ].join('\\n');\n}\n"],"names":["Button","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Text","useEffect","useMemo","useState","ConnectionStatusBadge","WORKFLOW_FILENAME","IntegrationUsageModal","connection","events","open","onOpenChange","children","selectedEvent","setSelectedEvent","eventValuesKey","map","event","value","join","eventValues","split","current","includes","workflowExample","buildWorkflowExample","source","slug","data","language","filename","code","title","display_name","aria-describedby","undefined","className","div","size","aria-hidden","status","lifecycle_status","section","bold","length","label","htmlFor","onValueChange","id","placeholder","item","syntaxHighlighting","highlightedLineRange","startLine","endLine","type","onClick"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/integration-usage-modal.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {\n CodeBlock,\n CodeBlockBody,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockFilename,\n CodeBlockFiles,\n CodeBlockHeader,\n CodeBlockItem,\n} from '@shipfox/react-ui/code-block';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@shipfox/react-ui/select';\nimport {Text} from '@shipfox/react-ui/typography';\nimport type {ReactNode} from 'react';\nimport {useEffect, useMemo, useState} from 'react';\nimport {ConnectionStatusBadge} from '#connection-status-badge.js';\nimport type {IntegrationConnection} from '#core/models.js';\n\nexport interface IntegrationUsageEvent {\n value: string;\n label: string;\n}\n\ninterface IntegrationUsageModalProps {\n connection: IntegrationConnection | null;\n events: IntegrationUsageEvent[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children?: ReactNode;\n}\n\nconst WORKFLOW_FILENAME = '.shipfox/workflows/integration.yml';\n\nexport function IntegrationUsageModal({\n connection,\n events,\n open,\n onOpenChange,\n children,\n}: IntegrationUsageModalProps) {\n const [selectedEvent, setSelectedEvent] = useState('');\n const eventValuesKey = events.map((event) => event.value).join('\\u0000');\n\n useEffect(() => {\n const eventValues = eventValuesKey ? eventValuesKey.split('\\u0000') : [];\n setSelectedEvent((current) =>\n eventValues.includes(current) ? current : (eventValues[0] ?? ''),\n );\n }, [eventValuesKey]);\n\n const workflowExample = connection\n ? buildWorkflowExample({source: connection.slug, event: selectedEvent})\n : '';\n const data = useMemo(\n () => [{language: 'yaml', filename: WORKFLOW_FILENAME, code: workflowExample}],\n [workflowExample],\n );\n const title = connection ? `Use ${connection.displayName}` : 'Use integration';\n\n return (\n <Modal open={open && connection !== null} onOpenChange={onOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-h-[calc(100vh-32px)] max-w-[640px]\">\n <ModalTitle className=\"sr-only\">{title}</ModalTitle>\n <ModalHeader>\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex min-w-0 items-center gap-8\">\n <Text size=\"lg\" aria-hidden=\"true\" className=\"truncate\">\n {title}\n </Text>\n {connection ? (\n <ConnectionStatusBadge status={connection.lifecycleStatus} className=\"shrink-0\" />\n ) : null}\n </div>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Reference this connection from a workflow trigger.\n </Text>\n </div>\n </ModalHeader>\n {connection ? (\n <>\n <ModalBody className=\"min-h-0 flex-1 gap-24 overflow-y-auto overflow-x-clip scrollbar\">\n <section className=\"flex w-full flex-col gap-12\">\n <Text size=\"md\" bold>\n Usage\n </Text>\n {events.length > 1 ? (\n <div className=\"flex flex-col gap-6\">\n <label\n htmlFor=\"integration-usage-event\"\n className=\"font-display text-sm font-medium text-foreground-neutral-base\"\n >\n Event\n </label>\n <Select value={selectedEvent} onValueChange={setSelectedEvent}>\n <SelectTrigger id=\"integration-usage-event\">\n <SelectValue placeholder=\"Select event\" />\n </SelectTrigger>\n <SelectContent>\n {events.map((event) => (\n <SelectItem key={event.value} value={event.value}>\n {event.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n <CodeBlock data={data} className=\"h-auto min-h-0 rounded-8\">\n <CodeBlockHeader>\n <CodeBlockFiles>\n {(item) => (\n <CodeBlockFilename value={item.filename}>{item.filename}</CodeBlockFilename>\n )}\n </CodeBlockFiles>\n <CodeBlockCopyButton />\n </CodeBlockHeader>\n <CodeBlockBody>\n {(item) => (\n <CodeBlockItem value={item.filename}>\n <CodeBlockContent\n language=\"yaml\"\n syntaxHighlighting\n highlightedLineRange={{startLine: 3, endLine: 4}}\n >\n {item.code}\n </CodeBlockContent>\n </CodeBlockItem>\n )}\n </CodeBlockBody>\n </CodeBlock>\n </section>\n {children ? (\n <section className=\"flex w-full flex-col gap-12\">\n <Text size=\"md\" bold>\n Details\n </Text>\n {children}\n </section>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button type=\"button\" onClick={() => onOpenChange(false)}>\n Done\n </Button>\n </ModalFooter>\n </>\n ) : null}\n </ModalContent>\n </Modal>\n );\n}\n\nfunction buildWorkflowExample({source, event}: {source: string; event: string}) {\n return [\n 'triggers:',\n ' integration:',\n ` source: ${source}`,\n ` event: ${event}`,\n 'jobs:',\n ' handle-event:',\n ' steps:',\n ' - run: echo \"Received event\"',\n ].join('\\n');\n}\n"],"names":["Button","CodeBlock","CodeBlockBody","CodeBlockContent","CodeBlockCopyButton","CodeBlockFilename","CodeBlockFiles","CodeBlockHeader","CodeBlockItem","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Text","useEffect","useMemo","useState","ConnectionStatusBadge","WORKFLOW_FILENAME","IntegrationUsageModal","connection","events","open","onOpenChange","children","selectedEvent","setSelectedEvent","eventValuesKey","map","event","value","join","eventValues","split","current","includes","workflowExample","buildWorkflowExample","source","slug","data","language","filename","code","title","displayName","aria-describedby","undefined","className","div","size","aria-hidden","status","lifecycleStatus","section","bold","length","label","htmlFor","onValueChange","id","placeholder","item","syntaxHighlighting","highlightedLineRange","startLine","endLine","type","onClick"],"mappings":"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"}
@@ -1,7 +1,10 @@
1
- import type { ListIntegrationProvidersResponseDto } from '@shipfox/api-integration-core-dto';
2
- import type { UseQueryResult } from '@tanstack/react-query';
1
+ import type { IntegrationProvider } from '#core/models.js';
3
2
  export interface ProviderGridProps {
4
- providersQuery: UseQueryResult<ListIntegrationProvidersResponseDto, Error>;
3
+ providers: IntegrationProvider[];
4
+ isPending: boolean;
5
+ isFetching?: boolean;
6
+ error?: Error | null | undefined;
7
+ onRetry?: () => void;
5
8
  workspaceId: string;
6
9
  emptyMessage: string;
7
10
  loadingLabel?: string;
@@ -10,5 +13,5 @@ export interface ProviderGridProps {
10
13
  }
11
14
  export declare const PROVIDER_GRID_CLASS = "grid grid-cols-2 gap-12 max-[760px]:grid-cols-1";
12
15
  export declare const PROVIDER_SURFACE_CLASS = "overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base";
13
- export declare function ProviderGrid({ providersQuery, workspaceId, emptyMessage, loadingLabel, errorSubject, onOpenProvider, }: ProviderGridProps): import("react").JSX.Element;
16
+ export declare function ProviderGrid({ providers, isPending, isFetching, error, onRetry, workspaceId, emptyMessage, loadingLabel, errorSubject, onOpenProvider, }: ProviderGridProps): import("react").JSX.Element;
14
17
  //# sourceMappingURL=provider-grid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-grid.d.ts","sourceRoot":"","sources":["../../src/components/provider-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mCAAmC,EACpC,MAAM,mCAAmC,CAAC;AAQ3C,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAK1D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,cAAc,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC3D;AAED,eAAO,MAAM,mBAAmB,oDAAoD,CAAC;AAErF,eAAO,MAAM,sBAAsB,2FACuD,CAAC;AAE3F,wBAAgB,YAAY,CAAC,EAC3B,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAkC,EAClC,YAAuC,EACvC,cAAc,GACf,EAAE,iBAAiB,+BAuCnB"}
1
+ {"version":3,"file":"provider-grid.d.ts","sourceRoot":"","sources":["../../src/components/provider-grid.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AAGzD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC3D;AAED,eAAO,MAAM,mBAAmB,oDAAoD,CAAC;AAErF,eAAO,MAAM,sBAAsB,2FACuD,CAAC;AAE3F,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,SAAS,EACT,UAAkB,EAClB,KAAK,EACL,OAAO,EACP,WAAW,EACX,YAAY,EACZ,YAAkC,EAClC,YAAuC,EACvC,cAAc,GACf,EAAE,iBAAiB,+BA+CnB"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { QueryLoadError } from '@shipfox/client-ui';
3
+ import { IntegrationIcon } from '@shipfox/integration-icons';
3
4
  import { Card } from '@shipfox/react-ui/card';
4
5
  import { EmptyState } from '@shipfox/react-ui/empty-state';
5
6
  import { Icon } from '@shipfox/react-ui/icon';
@@ -7,26 +8,30 @@ import { Skeleton } from '@shipfox/react-ui/skeleton';
7
8
  import { Text } from '@shipfox/react-ui/typography';
8
9
  import { cn } from '@shipfox/react-ui/utils';
9
10
  import { Link } from '@tanstack/react-router';
10
- import { IntegrationIcon } from '#integration-icon.js';
11
11
  import { PROVIDER_CATALOG } from '#provider-catalog.js';
12
12
  export const PROVIDER_GRID_CLASS = 'grid grid-cols-2 gap-12 max-[760px]:grid-cols-1';
13
13
  export const PROVIDER_SURFACE_CLASS = 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';
14
- export function ProviderGrid({ providersQuery, workspaceId, emptyMessage, loadingLabel = 'Loading providers', errorSubject = 'available integrations', onOpenProvider }) {
15
- const providers = providersQuery.data?.providers ?? [];
14
+ export function ProviderGrid({ providers, isPending, isFetching = false, error, onRetry, workspaceId, emptyMessage, loadingLabel = 'Loading providers', errorSubject = 'available integrations', onOpenProvider }) {
16
15
  const installableProviders = providers.filter((provider)=>PROVIDER_CATALOG[provider.provider]);
17
- if (providersQuery.isPending) return /*#__PURE__*/ _jsx(ProviderGridSkeleton, {
16
+ if (isPending) return /*#__PURE__*/ _jsx(ProviderGridSkeleton, {
18
17
  label: loadingLabel
19
18
  });
20
- if (providersQuery.isError && providersQuery.data === undefined) {
19
+ if (error) {
21
20
  return /*#__PURE__*/ _jsx("div", {
22
21
  className: cn(PROVIDER_SURFACE_CLASS, 'px-16'),
23
22
  children: /*#__PURE__*/ _jsx(QueryLoadError, {
24
- query: providersQuery,
23
+ query: {
24
+ isError: true,
25
+ isFetching,
26
+ data: undefined,
27
+ error,
28
+ refetch: onRetry ?? (()=>undefined)
29
+ },
25
30
  subject: errorSubject
26
31
  })
27
32
  });
28
33
  }
29
- if (providersQuery.data !== undefined && installableProviders.length === 0) {
34
+ if (installableProviders.length === 0) {
30
35
  return /*#__PURE__*/ _jsx("div", {
31
36
  className: cn(PROVIDER_SURFACE_CLASS, 'px-16'),
32
37
  children: /*#__PURE__*/ _jsx(EmptyState, {
@@ -53,7 +58,7 @@ function ProviderCard({ provider, workspaceId, onOpenProvider }) {
53
58
  if (catalog.kind === 'modal-connect') {
54
59
  return /*#__PURE__*/ _jsx("button", {
55
60
  type: "button",
56
- "aria-label": `Add ${provider.display_name}`,
61
+ "aria-label": `Add ${provider.displayName}`,
57
62
  onClick: ()=>onOpenProvider?.(provider.provider),
58
63
  className: "group flex h-full w-full min-w-0 items-center justify-between gap-12 rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 text-left transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none",
59
64
  children: /*#__PURE__*/ _jsx(ProviderCardContent, {
@@ -67,7 +72,7 @@ function ProviderCard({ provider, workspaceId, onOpenProvider }) {
67
72
  params: {
68
73
  wid: workspaceId
69
74
  },
70
- "aria-label": `Install ${provider.display_name}`,
75
+ "aria-label": `Install ${provider.displayName}`,
71
76
  className: "group flex h-full min-w-0 items-center justify-between gap-12 rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none",
72
77
  children: /*#__PURE__*/ _jsx(ProviderCardContent, {
73
78
  provider: provider,
@@ -91,7 +96,7 @@ function ProviderCardContent({ provider, action }) {
91
96
  size: "md",
92
97
  bold: true,
93
98
  className: "truncate",
94
- children: provider.display_name
99
+ children: provider.displayName
95
100
  })
96
101
  ]
97
102
  }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/provider-grid.tsx"],"sourcesContent":["import type {\n IntegrationProviderDto,\n ListIntegrationProvidersResponseDto,\n} from '@shipfox/api-integration-core-dto';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Card} from '@shipfox/react-ui/card';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {UseQueryResult} from '@tanstack/react-query';\nimport {Link} from '@tanstack/react-router';\nimport {IntegrationIcon} from '#integration-icon.js';\nimport {PROVIDER_CATALOG} from '#provider-catalog.js';\n\nexport interface ProviderGridProps {\n providersQuery: UseQueryResult<ListIntegrationProvidersResponseDto, Error>;\n workspaceId: string;\n emptyMessage: string;\n loadingLabel?: string;\n errorSubject?: string;\n onOpenProvider?: ((provider: string) => void) | undefined;\n}\n\nexport const PROVIDER_GRID_CLASS = 'grid grid-cols-2 gap-12 max-[760px]:grid-cols-1';\n\nexport const PROVIDER_SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport function ProviderGrid({\n providersQuery,\n workspaceId,\n emptyMessage,\n loadingLabel = 'Loading providers',\n errorSubject = 'available integrations',\n onOpenProvider,\n}: ProviderGridProps) {\n const providers = providersQuery.data?.providers ?? [];\n const installableProviders = providers.filter((provider) => PROVIDER_CATALOG[provider.provider]);\n\n if (providersQuery.isPending) return <ProviderGridSkeleton label={loadingLabel} />;\n\n if (providersQuery.isError && providersQuery.data === undefined) {\n return (\n <div className={cn(PROVIDER_SURFACE_CLASS, 'px-16')}>\n <QueryLoadError query={providersQuery} subject={errorSubject} />\n </div>\n );\n }\n\n if (providersQuery.data !== undefined && installableProviders.length === 0) {\n return (\n <div className={cn(PROVIDER_SURFACE_CLASS, 'px-16')}>\n <EmptyState\n icon=\"componentLine\"\n title=\"No integrations available\"\n description={emptyMessage}\n />\n </div>\n );\n }\n\n return (\n <ul className={PROVIDER_GRID_CLASS}>\n {installableProviders.map((provider) => (\n <li key={provider.provider}>\n <ProviderCard\n provider={provider}\n workspaceId={workspaceId}\n onOpenProvider={onOpenProvider}\n />\n </li>\n ))}\n </ul>\n );\n}\n\nfunction ProviderCard({\n provider,\n workspaceId,\n onOpenProvider,\n}: {\n provider: IntegrationProviderDto;\n workspaceId: string;\n onOpenProvider?: ((provider: string) => void) | undefined;\n}) {\n const catalog = PROVIDER_CATALOG[provider.provider];\n if (!catalog) return null;\n\n if (catalog.kind === 'modal-connect') {\n return (\n <button\n type=\"button\"\n aria-label={`Add ${provider.display_name}`}\n onClick={() => onOpenProvider?.(provider.provider)}\n className=\"group flex h-full w-full min-w-0 items-center justify-between gap-12 rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 text-left transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none\"\n >\n <ProviderCardContent provider={provider} action=\"Add\" />\n </button>\n );\n }\n\n return (\n <Link\n to={catalog.setupPath}\n params={{wid: workspaceId}}\n aria-label={`Install ${provider.display_name}`}\n className=\"group flex h-full min-w-0 items-center justify-between gap-12 rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none\"\n >\n <ProviderCardContent provider={provider} action=\"Install\" />\n </Link>\n );\n}\n\nfunction ProviderCardContent({\n provider,\n action,\n}: {\n provider: IntegrationProviderDto;\n action: 'Add' | 'Install';\n}) {\n return (\n <>\n <span className=\"flex min-w-0 items-center gap-12\">\n <IntegrationIcon\n source={provider.provider}\n aria-hidden\n className=\"size-24 shrink-0 text-foreground-neutral-base\"\n />\n <Text as=\"span\" size=\"md\" bold className=\"truncate\">\n {provider.display_name}\n </Text>\n </span>\n <span className=\"flex shrink-0 items-center gap-4 text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive\">\n <Text as=\"span\" size=\"sm\">\n {action}\n </Text>\n <Icon name=\"chevronRight\" className=\"size-16\" />\n </span>\n </>\n );\n}\n\nfunction ProviderGridSkeleton({label}: {label: string}) {\n return (\n <ul role=\"status\" aria-label={label} className={PROVIDER_GRID_CLASS}>\n {[0, 1, 2, 3].map((tile) => (\n <li key={tile}>\n <Card className=\"h-full p-16\">\n <div className=\"flex items-center justify-between gap-12\">\n <div className=\"flex min-w-0 items-center gap-12\">\n <Skeleton className=\"size-24 shrink-0\" />\n <Skeleton className=\"h-16 w-100\" />\n </div>\n <Skeleton className=\"h-16 w-64 shrink-0\" />\n </div>\n </Card>\n </li>\n ))}\n </ul>\n );\n}\n"],"names":["QueryLoadError","Card","EmptyState","Icon","Skeleton","Text","cn","Link","IntegrationIcon","PROVIDER_CATALOG","PROVIDER_GRID_CLASS","PROVIDER_SURFACE_CLASS","ProviderGrid","providersQuery","workspaceId","emptyMessage","loadingLabel","errorSubject","onOpenProvider","providers","data","installableProviders","filter","provider","isPending","ProviderGridSkeleton","label","isError","undefined","div","className","query","subject","length","icon","title","description","ul","map","li","ProviderCard","catalog","kind","button","type","aria-label","display_name","onClick","ProviderCardContent","action","to","setupPath","params","wid","span","source","aria-hidden","as","size","bold","name","role","tile"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/provider-grid.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {IntegrationIcon} from '@shipfox/integration-icons';\nimport {Card} from '@shipfox/react-ui/card';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {Link} from '@tanstack/react-router';\nimport type {IntegrationProvider} from '#core/models.js';\nimport {PROVIDER_CATALOG} from '#provider-catalog.js';\n\nexport interface ProviderGridProps {\n providers: IntegrationProvider[];\n isPending: boolean;\n isFetching?: boolean;\n error?: Error | null | undefined;\n onRetry?: () => void;\n workspaceId: string;\n emptyMessage: string;\n loadingLabel?: string;\n errorSubject?: string;\n onOpenProvider?: ((provider: string) => void) | undefined;\n}\n\nexport const PROVIDER_GRID_CLASS = 'grid grid-cols-2 gap-12 max-[760px]:grid-cols-1';\n\nexport const PROVIDER_SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport function ProviderGrid({\n providers,\n isPending,\n isFetching = false,\n error,\n onRetry,\n workspaceId,\n emptyMessage,\n loadingLabel = 'Loading providers',\n errorSubject = 'available integrations',\n onOpenProvider,\n}: ProviderGridProps) {\n const installableProviders = providers.filter((provider) => PROVIDER_CATALOG[provider.provider]);\n\n if (isPending) return <ProviderGridSkeleton label={loadingLabel} />;\n\n if (error) {\n return (\n <div className={cn(PROVIDER_SURFACE_CLASS, 'px-16')}>\n <QueryLoadError\n query={{\n isError: true,\n isFetching,\n data: undefined,\n error,\n refetch: onRetry ?? (() => undefined),\n }}\n subject={errorSubject}\n />\n </div>\n );\n }\n\n if (installableProviders.length === 0) {\n return (\n <div className={cn(PROVIDER_SURFACE_CLASS, 'px-16')}>\n <EmptyState\n icon=\"componentLine\"\n title=\"No integrations available\"\n description={emptyMessage}\n />\n </div>\n );\n }\n\n return (\n <ul className={PROVIDER_GRID_CLASS}>\n {installableProviders.map((provider) => (\n <li key={provider.provider}>\n <ProviderCard\n provider={provider}\n workspaceId={workspaceId}\n onOpenProvider={onOpenProvider}\n />\n </li>\n ))}\n </ul>\n );\n}\n\nfunction ProviderCard({\n provider,\n workspaceId,\n onOpenProvider,\n}: {\n provider: IntegrationProvider;\n workspaceId: string;\n onOpenProvider?: ((provider: string) => void) | undefined;\n}) {\n const catalog = PROVIDER_CATALOG[provider.provider];\n if (!catalog) return null;\n\n if (catalog.kind === 'modal-connect') {\n return (\n <button\n type=\"button\"\n aria-label={`Add ${provider.displayName}`}\n onClick={() => onOpenProvider?.(provider.provider)}\n className=\"group flex h-full w-full min-w-0 items-center justify-between gap-12 rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 text-left transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none\"\n >\n <ProviderCardContent provider={provider} action=\"Add\" />\n </button>\n );\n }\n\n return (\n <Link\n to={catalog.setupPath}\n params={{wid: workspaceId}}\n aria-label={`Install ${provider.displayName}`}\n className=\"group flex h-full min-w-0 items-center justify-between gap-12 rounded-8 border border-border-neutral-base bg-background-neutral-base p-16 transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus focus-visible:outline-none\"\n >\n <ProviderCardContent provider={provider} action=\"Install\" />\n </Link>\n );\n}\n\nfunction ProviderCardContent({\n provider,\n action,\n}: {\n provider: IntegrationProvider;\n action: 'Add' | 'Install';\n}) {\n return (\n <>\n <span className=\"flex min-w-0 items-center gap-12\">\n <IntegrationIcon\n source={provider.provider}\n aria-hidden\n className=\"size-24 shrink-0 text-foreground-neutral-base\"\n />\n <Text as=\"span\" size=\"md\" bold className=\"truncate\">\n {provider.displayName}\n </Text>\n </span>\n <span className=\"flex shrink-0 items-center gap-4 text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive\">\n <Text as=\"span\" size=\"sm\">\n {action}\n </Text>\n <Icon name=\"chevronRight\" className=\"size-16\" />\n </span>\n </>\n );\n}\n\nfunction ProviderGridSkeleton({label}: {label: string}) {\n return (\n <ul role=\"status\" aria-label={label} className={PROVIDER_GRID_CLASS}>\n {[0, 1, 2, 3].map((tile) => (\n <li key={tile}>\n <Card className=\"h-full p-16\">\n <div className=\"flex items-center justify-between gap-12\">\n <div className=\"flex min-w-0 items-center gap-12\">\n <Skeleton className=\"size-24 shrink-0\" />\n <Skeleton className=\"h-16 w-100\" />\n </div>\n <Skeleton className=\"h-16 w-64 shrink-0\" />\n </div>\n </Card>\n </li>\n ))}\n </ul>\n );\n}\n"],"names":["QueryLoadError","IntegrationIcon","Card","EmptyState","Icon","Skeleton","Text","cn","Link","PROVIDER_CATALOG","PROVIDER_GRID_CLASS","PROVIDER_SURFACE_CLASS","ProviderGrid","providers","isPending","isFetching","error","onRetry","workspaceId","emptyMessage","loadingLabel","errorSubject","onOpenProvider","installableProviders","filter","provider","ProviderGridSkeleton","label","div","className","query","isError","data","undefined","refetch","subject","length","icon","title","description","ul","map","li","ProviderCard","catalog","kind","button","type","aria-label","displayName","onClick","ProviderCardContent","action","to","setupPath","params","wid","span","source","aria-hidden","as","size","bold","name","role","tile"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
+ import type { InstallRedirect } from '#core/models.js';
1
2
  interface RedirectInstallPageProps {
2
3
  installRequest: (body: {
3
4
  workspace_id: string;
4
- }) => Promise<{
5
- install_url: string;
6
- }>;
5
+ }) => Promise<InstallRedirect>;
7
6
  errorFallbackMessage: string;
8
7
  loadingLabel?: string;
9
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"redirect-install-page.d.ts","sourceRoot":"","sources":["../../src/components/redirect-install-page.tsx"],"names":[],"mappings":"AASA,UAAU,wBAAwB;IAChC,cAAc,EAAE,CAAC,IAAI,EAAE;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACjF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,uEAAuE;IACvE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,cAAc,EACd,oBAAoB,EACpB,YAAsC,EACtC,cAAc,EACd,cAAqD,GACtD,EAAE,wBAAwB,+BAwC1B"}
1
+ {"version":3,"file":"redirect-install-page.d.ts","sourceRoot":"","sources":["../../src/components/redirect-install-page.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAErD,UAAU,wBAAwB;IAChC,cAAc,EAAE,CAAC,IAAI,EAAE;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,uEAAuE;IACvE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,cAAc,EACd,oBAAoB,EACpB,YAAsC,EACtC,cAAc,EACd,cAAqD,GACtD,EAAE,wBAAwB,+BAwC1B"}
@@ -24,7 +24,7 @@ export function RedirectInstallPage({ installRequest, errorFallbackMessage, load
24
24
  installRequest({
25
25
  workspace_id: workspace.id
26
26
  }).then((response)=>{
27
- assignLocation(response.install_url);
27
+ assignLocation(response.installUrl);
28
28
  }).catch((error)=>{
29
29
  setErrorMessage(error instanceof ApiError ? error.message : errorFallbackMessage);
30
30
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/redirect-install-page.tsx"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\nimport {useActiveWorkspace} from '@shipfox/client-auth';\nimport {ButtonLink} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FullPageLoader} from '@shipfox/react-ui/loader';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\nimport {useEffect, useRef, useState} from 'react';\n\ninterface RedirectInstallPageProps {\n installRequest: (body: {workspace_id: string}) => Promise<{install_url: string}>;\n errorFallbackMessage: string;\n loadingLabel?: string;\n /**\n * Runs before leaving the app (e.g. to persist the workspace id for a\n * state-less provider callback). Must not throw — a failed side effect\n * should never block the redirect.\n */\n beforeRedirect?: (workspaceId: string) => void;\n /** Injectable for tests: jsdom's window.location cannot be stubbed. */\n assignLocation?: (url: string) => void;\n}\n\nexport function RedirectInstallPage({\n installRequest,\n errorFallbackMessage,\n loadingLabel = 'Starting installation',\n beforeRedirect,\n assignLocation = (url) => window.location.assign(url),\n}: RedirectInstallPageProps) {\n const workspace = useActiveWorkspace();\n const startedRef = useRef(false);\n const [errorMessage, setErrorMessage] = useState<string | undefined>();\n\n useEffect(() => {\n if (startedRef.current) return;\n startedRef.current = true;\n // The side effect is best-effort persistence; a throw here must never\n // block the install redirect, so swallow it and continue.\n try {\n beforeRedirect?.(workspace.id);\n } catch {\n // ignore\n }\n installRequest({workspace_id: workspace.id})\n .then((response) => {\n assignLocation(response.install_url);\n })\n .catch((error: unknown) => {\n setErrorMessage(error instanceof ApiError ? error.message : errorFallbackMessage);\n });\n }, [workspace, installRequest, beforeRedirect, errorFallbackMessage, assignLocation]);\n\n if (errorMessage) {\n return (\n <div className=\"mx-auto flex w-full max-w-[480px] flex-col gap-16\">\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{errorMessage}</Text>\n </Callout>\n <ButtonLink asChild variant=\"muted\" className=\"w-fit\">\n <Link to=\"/workspaces/$wid/integrations\" params={{wid: workspace.id}}>\n Back to integrations\n </Link>\n </ButtonLink>\n </div>\n );\n }\n\n return <FullPageLoader aria-label={loadingLabel} />;\n}\n"],"names":["ApiError","useActiveWorkspace","ButtonLink","Callout","FullPageLoader","Text","Link","useEffect","useRef","useState","RedirectInstallPage","installRequest","errorFallbackMessage","loadingLabel","beforeRedirect","assignLocation","url","window","location","assign","workspace","startedRef","errorMessage","setErrorMessage","current","id","workspace_id","then","response","install_url","catch","error","message","div","className","role","type","size","asChild","variant","to","params","wid","aria-label"],"mappings":";AAAA,SAAQA,QAAQ,QAAO,sBAAsB;AAC7C,SAAQC,kBAAkB,QAAO,uBAAuB;AACxD,SAAQC,UAAU,QAAO,2BAA2B;AACpD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,cAAc,QAAO,2BAA2B;AACxD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAO,QAAQ;AAgBlD,OAAO,SAASC,oBAAoB,EAClCC,cAAc,EACdC,oBAAoB,EACpBC,eAAe,uBAAuB,EACtCC,cAAc,EACdC,iBAAiB,CAACC,MAAQC,OAAOC,QAAQ,CAACC,MAAM,CAACH,IAAI,EAC5B;IACzB,MAAMI,YAAYnB;IAClB,MAAMoB,aAAab,OAAO;IAC1B,MAAM,CAACc,cAAcC,gBAAgB,GAAGd;IAExCF,UAAU;QACR,IAAIc,WAAWG,OAAO,EAAE;QACxBH,WAAWG,OAAO,GAAG;QACrB,sEAAsE;QACtE,0DAA0D;QAC1D,IAAI;YACFV,iBAAiBM,UAAUK,EAAE;QAC/B,EAAE,OAAM;QACN,SAAS;QACX;QACAd,eAAe;YAACe,cAAcN,UAAUK,EAAE;QAAA,GACvCE,IAAI,CAAC,CAACC;YACLb,eAAea,SAASC,WAAW;QACrC,GACCC,KAAK,CAAC,CAACC;YACNR,gBAAgBQ,iBAAiB/B,WAAW+B,MAAMC,OAAO,GAAGpB;QAC9D;IACJ,GAAG;QAACQ;QAAWT;QAAgBG;QAAgBF;QAAsBG;KAAe;IAEpF,IAAIO,cAAc;QAChB,qBACE,MAACW;YAAIC,WAAU;;8BACb,KAAC/B;oBAAQgC,MAAK;oBAAQC,MAAK;8BACzB,cAAA,KAAC/B;wBAAKgC,MAAK;kCAAMf;;;8BAEnB,KAACpB;oBAAWoC,OAAO;oBAACC,SAAQ;oBAAQL,WAAU;8BAC5C,cAAA,KAAC5B;wBAAKkC,IAAG;wBAAgCC,QAAQ;4BAACC,KAAKtB,UAAUK,EAAE;wBAAA;kCAAG;;;;;IAM9E;IAEA,qBAAO,KAACrB;QAAeuC,cAAY9B;;AACrC"}
1
+ {"version":3,"sources":["../../src/components/redirect-install-page.tsx"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\nimport {useActiveWorkspace} from '@shipfox/client-auth';\nimport {ButtonLink} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FullPageLoader} from '@shipfox/react-ui/loader';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {Link} from '@tanstack/react-router';\nimport {useEffect, useRef, useState} from 'react';\nimport type {InstallRedirect} from '#core/models.js';\n\ninterface RedirectInstallPageProps {\n installRequest: (body: {workspace_id: string}) => Promise<InstallRedirect>;\n errorFallbackMessage: string;\n loadingLabel?: string;\n /**\n * Runs before leaving the app (e.g. to persist the workspace id for a\n * state-less provider callback). Must not throw — a failed side effect\n * should never block the redirect.\n */\n beforeRedirect?: (workspaceId: string) => void;\n /** Injectable for tests: jsdom's window.location cannot be stubbed. */\n assignLocation?: (url: string) => void;\n}\n\nexport function RedirectInstallPage({\n installRequest,\n errorFallbackMessage,\n loadingLabel = 'Starting installation',\n beforeRedirect,\n assignLocation = (url) => window.location.assign(url),\n}: RedirectInstallPageProps) {\n const workspace = useActiveWorkspace();\n const startedRef = useRef(false);\n const [errorMessage, setErrorMessage] = useState<string | undefined>();\n\n useEffect(() => {\n if (startedRef.current) return;\n startedRef.current = true;\n // The side effect is best-effort persistence; a throw here must never\n // block the install redirect, so swallow it and continue.\n try {\n beforeRedirect?.(workspace.id);\n } catch {\n // ignore\n }\n installRequest({workspace_id: workspace.id})\n .then((response) => {\n assignLocation(response.installUrl);\n })\n .catch((error: unknown) => {\n setErrorMessage(error instanceof ApiError ? error.message : errorFallbackMessage);\n });\n }, [workspace, installRequest, beforeRedirect, errorFallbackMessage, assignLocation]);\n\n if (errorMessage) {\n return (\n <div className=\"mx-auto flex w-full max-w-[480px] flex-col gap-16\">\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{errorMessage}</Text>\n </Callout>\n <ButtonLink asChild variant=\"muted\" className=\"w-fit\">\n <Link to=\"/workspaces/$wid/integrations\" params={{wid: workspace.id}}>\n Back to integrations\n </Link>\n </ButtonLink>\n </div>\n );\n }\n\n return <FullPageLoader aria-label={loadingLabel} />;\n}\n"],"names":["ApiError","useActiveWorkspace","ButtonLink","Callout","FullPageLoader","Text","Link","useEffect","useRef","useState","RedirectInstallPage","installRequest","errorFallbackMessage","loadingLabel","beforeRedirect","assignLocation","url","window","location","assign","workspace","startedRef","errorMessage","setErrorMessage","current","id","workspace_id","then","response","installUrl","catch","error","message","div","className","role","type","size","asChild","variant","to","params","wid","aria-label"],"mappings":";AAAA,SAAQA,QAAQ,QAAO,sBAAsB;AAC7C,SAAQC,kBAAkB,QAAO,uBAAuB;AACxD,SAAQC,UAAU,QAAO,2BAA2B;AACpD,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,cAAc,QAAO,2BAA2B;AACxD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAO,QAAQ;AAiBlD,OAAO,SAASC,oBAAoB,EAClCC,cAAc,EACdC,oBAAoB,EACpBC,eAAe,uBAAuB,EACtCC,cAAc,EACdC,iBAAiB,CAACC,MAAQC,OAAOC,QAAQ,CAACC,MAAM,CAACH,IAAI,EAC5B;IACzB,MAAMI,YAAYnB;IAClB,MAAMoB,aAAab,OAAO;IAC1B,MAAM,CAACc,cAAcC,gBAAgB,GAAGd;IAExCF,UAAU;QACR,IAAIc,WAAWG,OAAO,EAAE;QACxBH,WAAWG,OAAO,GAAG;QACrB,sEAAsE;QACtE,0DAA0D;QAC1D,IAAI;YACFV,iBAAiBM,UAAUK,EAAE;QAC/B,EAAE,OAAM;QACN,SAAS;QACX;QACAd,eAAe;YAACe,cAAcN,UAAUK,EAAE;QAAA,GACvCE,IAAI,CAAC,CAACC;YACLb,eAAea,SAASC,UAAU;QACpC,GACCC,KAAK,CAAC,CAACC;YACNR,gBAAgBQ,iBAAiB/B,WAAW+B,MAAMC,OAAO,GAAGpB;QAC9D;IACJ,GAAG;QAACQ;QAAWT;QAAgBG;QAAgBF;QAAsBG;KAAe;IAEpF,IAAIO,cAAc;QAChB,qBACE,MAACW;YAAIC,WAAU;;8BACb,KAAC/B;oBAAQgC,MAAK;oBAAQC,MAAK;8BACzB,cAAA,KAAC/B;wBAAKgC,MAAK;kCAAMf;;;8BAEnB,KAACpB;oBAAWoC,OAAO;oBAACC,SAAQ;oBAAQL,WAAU;8BAC5C,cAAA,KAAC5B;wBAAKkC,IAAG;wBAAgCC,QAAQ;4BAACC,KAAKtB,UAAUK,EAAE;wBAAA;kCAAG;;;;;IAM9E;IAEA,qBAAO,KAACrB;QAAeuC,cAAY9B;;AACrC"}
@@ -1,6 +1,6 @@
1
- import type { RepositoryDto } from '@shipfox/api-integration-core-dto';
1
+ import type { Repository } from '#core/models.js';
2
2
  export declare function RepositoryPicker({ repositories, selectedRepositoryId, onSelect, isLoading, isFetchingNextPage, hasNextPage, onLoadMore, emptyMessage, searchValue, onSearchChange, searchDisabled, }: {
3
- repositories: RepositoryDto[];
3
+ repositories: Repository[];
4
4
  selectedRepositoryId: string | undefined;
5
5
  onSelect: (repositoryId: string) => void;
6
6
  isLoading: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-picker.d.ts","sourceRoot":"","sources":["../../src/components/repository-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,mCAAmC,CAAC;AASrE,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,YAAuC,EACvC,WAAW,EACX,cAAc,EACd,cAAc,GACf,EAAE;IACD,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,+BAoEA"}
1
+ {"version":3,"file":"repository-picker.d.ts","sourceRoot":"","sources":["../../src/components/repository-picker.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAEhD,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,YAAuC,EACvC,WAAW,EACX,cAAc,EACd,cAAc,GACf,EAAE;IACD,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,+BAoEA"}
@@ -41,7 +41,7 @@ export function RepositoryPicker({ repositories, selectedRepositoryId, onSelect,
41
41
  onValueChange: onSelect,
42
42
  className: "grid grid-cols-2 gap-8 min-[1200px]:grid-cols-3 max-[760px]:grid-cols-1",
43
43
  children: repositories.map((repository)=>/*#__PURE__*/ _jsx(RadioGroupItem, {
44
- value: repository.external_repository_id,
44
+ value: repository.externalRepositoryId,
45
45
  className: "p-12",
46
46
  children: /*#__PURE__*/ _jsxs("span", {
47
47
  className: "flex min-w-0 items-center justify-between gap-10",
@@ -51,17 +51,17 @@ export function RepositoryPicker({ repositories, selectedRepositoryId, onSelect,
51
51
  size: "sm",
52
52
  bold: true,
53
53
  className: "truncate",
54
- children: repository.full_name
54
+ children: repository.fullName
55
55
  }),
56
56
  /*#__PURE__*/ _jsx(Text, {
57
57
  as: "span",
58
58
  size: "xs",
59
59
  className: "shrink-0 text-foreground-neutral-muted",
60
- children: repository.default_branch
60
+ children: repository.defaultBranch
61
61
  })
62
62
  ]
63
63
  })
64
- }, repository.external_repository_id))
64
+ }, repository.externalRepositoryId))
65
65
  }) : null,
66
66
  hasNextPage && onLoadMore ? /*#__PURE__*/ _jsx(Button, {
67
67
  type: "button",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/repository-picker.tsx"],"sourcesContent":["import type {RepositoryDto} from '@shipfox/api-integration-core-dto';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Input} from '@shipfox/react-ui/input';\nimport {Label} from '@shipfox/react-ui/label';\nimport {RadioGroup, RadioGroupItem} from '@shipfox/react-ui/radio-group';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useId} from 'react';\n\nexport function RepositoryPicker({\n repositories,\n selectedRepositoryId,\n onSelect,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n onLoadMore,\n emptyMessage = 'No repositories found.',\n searchValue,\n onSearchChange,\n searchDisabled,\n}: {\n repositories: RepositoryDto[];\n selectedRepositoryId: string | undefined;\n onSelect: (repositoryId: string) => void;\n isLoading: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n onLoadMore?: () => void;\n emptyMessage?: string;\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchDisabled?: boolean;\n}) {\n const labelId = useId();\n const showSearch = onSearchChange !== undefined;\n\n return (\n <div className=\"flex flex-col gap-10\">\n <Label id={labelId} className=\"sr-only\">\n Repository\n </Label>\n\n {showSearch ? (\n <Input\n type=\"search\"\n placeholder=\"Search repositories…\"\n aria-label=\"Search repositories\"\n value={searchValue ?? ''}\n onChange={(event) => onSearchChange?.(event.target.value)}\n disabled={searchDisabled}\n />\n ) : null}\n\n {isLoading ? <Skeleton className=\"h-58 w-full\" /> : null}\n\n {!isLoading && repositories.length === 0 ? (\n <div className=\"rounded-8 border border-border-neutral-base bg-background-subtle-base p-14\">\n <Text size=\"sm\">{emptyMessage}</Text>\n </div>\n ) : null}\n\n {repositories.length > 0 ? (\n <RadioGroup\n aria-labelledby={labelId}\n value={selectedRepositoryId ?? ''}\n onValueChange={onSelect}\n className=\"grid grid-cols-2 gap-8 min-[1200px]:grid-cols-3 max-[760px]:grid-cols-1\"\n >\n {repositories.map((repository) => (\n <RadioGroupItem\n key={repository.external_repository_id}\n value={repository.external_repository_id}\n className=\"p-12\"\n >\n <span className=\"flex min-w-0 items-center justify-between gap-10\">\n <Text as=\"span\" size=\"sm\" bold className=\"truncate\">\n {repository.full_name}\n </Text>\n <Text as=\"span\" size=\"xs\" className=\"shrink-0 text-foreground-neutral-muted\">\n {repository.default_branch}\n </Text>\n </span>\n </RadioGroupItem>\n ))}\n </RadioGroup>\n ) : null}\n\n {hasNextPage && onLoadMore ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n isLoading={isFetchingNextPage ?? false}\n onClick={onLoadMore}\n >\n Load more\n </Button>\n ) : null}\n </div>\n );\n}\n"],"names":["Button","Input","Label","RadioGroup","RadioGroupItem","Skeleton","Text","useId","RepositoryPicker","repositories","selectedRepositoryId","onSelect","isLoading","isFetchingNextPage","hasNextPage","onLoadMore","emptyMessage","searchValue","onSearchChange","searchDisabled","labelId","showSearch","undefined","div","className","id","type","placeholder","aria-label","value","onChange","event","target","disabled","length","size","aria-labelledby","onValueChange","map","repository","external_repository_id","span","as","bold","full_name","default_branch","variant","onClick"],"mappings":";AACA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,QAAO,0BAA0B;AAC9C,SAAQC,KAAK,QAAO,0BAA0B;AAC9C,SAAQC,UAAU,EAAEC,cAAc,QAAO,gCAAgC;AACzE,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,KAAK,QAAO,QAAQ;AAE5B,OAAO,SAASC,iBAAiB,EAC/BC,YAAY,EACZC,oBAAoB,EACpBC,QAAQ,EACRC,SAAS,EACTC,kBAAkB,EAClBC,WAAW,EACXC,UAAU,EACVC,eAAe,wBAAwB,EACvCC,WAAW,EACXC,cAAc,EACdC,cAAc,EAaf;IACC,MAAMC,UAAUb;IAChB,MAAMc,aAAaH,mBAAmBI;IAEtC,qBACE,MAACC;QAAIC,WAAU;;0BACb,KAACtB;gBAAMuB,IAAIL;gBAASI,WAAU;0BAAU;;YAIvCH,2BACC,KAACpB;gBACCyB,MAAK;gBACLC,aAAY;gBACZC,cAAW;gBACXC,OAAOZ,eAAe;gBACtBa,UAAU,CAACC,QAAUb,iBAAiBa,MAAMC,MAAM,CAACH,KAAK;gBACxDI,UAAUd;iBAEV;YAEHP,0BAAY,KAACP;gBAASmB,WAAU;iBAAmB;YAEnD,CAACZ,aAAaH,aAAayB,MAAM,KAAK,kBACrC,KAACX;gBAAIC,WAAU;0BACb,cAAA,KAAClB;oBAAK6B,MAAK;8BAAMnB;;iBAEjB;YAEHP,aAAayB,MAAM,GAAG,kBACrB,KAAC/B;gBACCiC,mBAAiBhB;gBACjBS,OAAOnB,wBAAwB;gBAC/B2B,eAAe1B;gBACfa,WAAU;0BAETf,aAAa6B,GAAG,CAAC,CAACC,2BACjB,KAACnC;wBAECyB,OAAOU,WAAWC,sBAAsB;wBACxChB,WAAU;kCAEV,cAAA,MAACiB;4BAAKjB,WAAU;;8CACd,KAAClB;oCAAKoC,IAAG;oCAAOP,MAAK;oCAAKQ,IAAI;oCAACnB,WAAU;8CACtCe,WAAWK,SAAS;;8CAEvB,KAACtC;oCAAKoC,IAAG;oCAAOP,MAAK;oCAAKX,WAAU;8CACjCe,WAAWM,cAAc;;;;uBATzBN,WAAWC,sBAAsB;iBAe1C;YAEH1B,eAAeC,2BACd,KAACf;gBACC0B,MAAK;gBACLoB,SAAQ;gBACRX,MAAK;gBACLvB,WAAWC,sBAAsB;gBACjCkC,SAAShC;0BACV;iBAGC;;;AAGV"}
1
+ {"version":3,"sources":["../../src/components/repository-picker.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Input} from '@shipfox/react-ui/input';\nimport {Label} from '@shipfox/react-ui/label';\nimport {RadioGroup, RadioGroupItem} from '@shipfox/react-ui/radio-group';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useId} from 'react';\nimport type {Repository} from '#core/models.js';\n\nexport function RepositoryPicker({\n repositories,\n selectedRepositoryId,\n onSelect,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n onLoadMore,\n emptyMessage = 'No repositories found.',\n searchValue,\n onSearchChange,\n searchDisabled,\n}: {\n repositories: Repository[];\n selectedRepositoryId: string | undefined;\n onSelect: (repositoryId: string) => void;\n isLoading: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n onLoadMore?: () => void;\n emptyMessage?: string;\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n searchDisabled?: boolean;\n}) {\n const labelId = useId();\n const showSearch = onSearchChange !== undefined;\n\n return (\n <div className=\"flex flex-col gap-10\">\n <Label id={labelId} className=\"sr-only\">\n Repository\n </Label>\n\n {showSearch ? (\n <Input\n type=\"search\"\n placeholder=\"Search repositories…\"\n aria-label=\"Search repositories\"\n value={searchValue ?? ''}\n onChange={(event) => onSearchChange?.(event.target.value)}\n disabled={searchDisabled}\n />\n ) : null}\n\n {isLoading ? <Skeleton className=\"h-58 w-full\" /> : null}\n\n {!isLoading && repositories.length === 0 ? (\n <div className=\"rounded-8 border border-border-neutral-base bg-background-subtle-base p-14\">\n <Text size=\"sm\">{emptyMessage}</Text>\n </div>\n ) : null}\n\n {repositories.length > 0 ? (\n <RadioGroup\n aria-labelledby={labelId}\n value={selectedRepositoryId ?? ''}\n onValueChange={onSelect}\n className=\"grid grid-cols-2 gap-8 min-[1200px]:grid-cols-3 max-[760px]:grid-cols-1\"\n >\n {repositories.map((repository) => (\n <RadioGroupItem\n key={repository.externalRepositoryId}\n value={repository.externalRepositoryId}\n className=\"p-12\"\n >\n <span className=\"flex min-w-0 items-center justify-between gap-10\">\n <Text as=\"span\" size=\"sm\" bold className=\"truncate\">\n {repository.fullName}\n </Text>\n <Text as=\"span\" size=\"xs\" className=\"shrink-0 text-foreground-neutral-muted\">\n {repository.defaultBranch}\n </Text>\n </span>\n </RadioGroupItem>\n ))}\n </RadioGroup>\n ) : null}\n\n {hasNextPage && onLoadMore ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n isLoading={isFetchingNextPage ?? false}\n onClick={onLoadMore}\n >\n Load more\n </Button>\n ) : null}\n </div>\n );\n}\n"],"names":["Button","Input","Label","RadioGroup","RadioGroupItem","Skeleton","Text","useId","RepositoryPicker","repositories","selectedRepositoryId","onSelect","isLoading","isFetchingNextPage","hasNextPage","onLoadMore","emptyMessage","searchValue","onSearchChange","searchDisabled","labelId","showSearch","undefined","div","className","id","type","placeholder","aria-label","value","onChange","event","target","disabled","length","size","aria-labelledby","onValueChange","map","repository","externalRepositoryId","span","as","bold","fullName","defaultBranch","variant","onClick"],"mappings":";AAAA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,KAAK,QAAO,0BAA0B;AAC9C,SAAQC,KAAK,QAAO,0BAA0B;AAC9C,SAAQC,UAAU,EAAEC,cAAc,QAAO,gCAAgC;AACzE,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,IAAI,QAAO,+BAA+B;AAClD,SAAQC,KAAK,QAAO,QAAQ;AAG5B,OAAO,SAASC,iBAAiB,EAC/BC,YAAY,EACZC,oBAAoB,EACpBC,QAAQ,EACRC,SAAS,EACTC,kBAAkB,EAClBC,WAAW,EACXC,UAAU,EACVC,eAAe,wBAAwB,EACvCC,WAAW,EACXC,cAAc,EACdC,cAAc,EAaf;IACC,MAAMC,UAAUb;IAChB,MAAMc,aAAaH,mBAAmBI;IAEtC,qBACE,MAACC;QAAIC,WAAU;;0BACb,KAACtB;gBAAMuB,IAAIL;gBAASI,WAAU;0BAAU;;YAIvCH,2BACC,KAACpB;gBACCyB,MAAK;gBACLC,aAAY;gBACZC,cAAW;gBACXC,OAAOZ,eAAe;gBACtBa,UAAU,CAACC,QAAUb,iBAAiBa,MAAMC,MAAM,CAACH,KAAK;gBACxDI,UAAUd;iBAEV;YAEHP,0BAAY,KAACP;gBAASmB,WAAU;iBAAmB;YAEnD,CAACZ,aAAaH,aAAayB,MAAM,KAAK,kBACrC,KAACX;gBAAIC,WAAU;0BACb,cAAA,KAAClB;oBAAK6B,MAAK;8BAAMnB;;iBAEjB;YAEHP,aAAayB,MAAM,GAAG,kBACrB,KAAC/B;gBACCiC,mBAAiBhB;gBACjBS,OAAOnB,wBAAwB;gBAC/B2B,eAAe1B;gBACfa,WAAU;0BAETf,aAAa6B,GAAG,CAAC,CAACC,2BACjB,KAACnC;wBAECyB,OAAOU,WAAWC,oBAAoB;wBACtChB,WAAU;kCAEV,cAAA,MAACiB;4BAAKjB,WAAU;;8CACd,KAAClB;oCAAKoC,IAAG;oCAAOP,MAAK;oCAAKQ,IAAI;oCAACnB,WAAU;8CACtCe,WAAWK,QAAQ;;8CAEtB,KAACtC;oCAAKoC,IAAG;oCAAOP,MAAK;oCAAKX,WAAU;8CACjCe,WAAWM,aAAa;;;;uBATxBN,WAAWC,oBAAoB;iBAexC;YAEH1B,eAAeC,2BACd,KAACf;gBACC0B,MAAK;gBACLoB,SAAQ;gBACRX,MAAK;gBACLvB,WAAWC,sBAAsB;gBACjCkC,SAAShC;0BACV;iBAGC;;;AAGV"}
@@ -1,9 +1,9 @@
1
- import type { IntegrationConnectionDto } from '@shipfox/api-integration-core-dto';
1
+ import type { IntegrationConnection } from '#core/models.js';
2
2
  interface WebhookCreateModalProps {
3
3
  workspaceId: string;
4
4
  open: boolean;
5
5
  onOpenChange: (open: boolean) => void;
6
- onCreated: (connection: IntegrationConnectionDto) => void;
6
+ onCreated: (connection: IntegrationConnection) => void;
7
7
  }
8
8
  export declare function WebhookCreateModal({ workspaceId, open, onOpenChange, onCreated, }: WebhookCreateModalProps): import("react").JSX.Element;
9
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-create-modal.d.ts","sourceRoot":"","sources":["../../../src/components/webhook/webhook-create-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAC;AA0BhF,UAAU,uBAAuB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,UAAU,EAAE,wBAAwB,KAAK,IAAI,CAAC;CAC3D;AAED,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,IAAI,EACJ,YAAY,EACZ,SAAS,GACV,EAAE,uBAAuB,+BAmKzB"}
1
+ {"version":3,"file":"webhook-create-modal.d.ts","sourceRoot":"","sources":["../../../src/components/webhook/webhook-create-modal.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAC,qBAAqB,EAAoB,MAAM,iBAAiB,CAAC;AAI9E,UAAU,uBAAuB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,UAAU,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACxD;AAED,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,IAAI,EACJ,YAAY,EACZ,SAAS,GACV,EAAE,uBAAuB,+BAmKzB"}