@stoked-ui/github 0.0.0-a.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 (95) hide show
  1. package/CHANGELOG.md +15014 -0
  2. package/GithubCalendar/GithubCalendar.d.ts +7 -0
  3. package/GithubCalendar/GithubCalendar.js +330 -0
  4. package/GithubCalendar/index.d.ts +2 -0
  5. package/GithubCalendar/index.js +2 -0
  6. package/GithubCalendar/package.json +6 -0
  7. package/GithubEvents/EventTypes/CreateEvent.d.ts +7 -0
  8. package/GithubEvents/EventTypes/CreateEvent.js +72 -0
  9. package/GithubEvents/EventTypes/DeleteEvent.d.ts +7 -0
  10. package/GithubEvents/EventTypes/DeleteEvent.js +65 -0
  11. package/GithubEvents/EventTypes/ForkEvent.d.ts +7 -0
  12. package/GithubEvents/EventTypes/ForkEvent.js +77 -0
  13. package/GithubEvents/EventTypes/IssueCommentEvent.d.ts +7 -0
  14. package/GithubEvents/EventTypes/IssueCommentEvent.js +210 -0
  15. package/GithubEvents/EventTypes/IssuesEvent.d.ts +7 -0
  16. package/GithubEvents/EventTypes/IssuesEvent.js +97 -0
  17. package/GithubEvents/EventTypes/ProjectsV2ColumnEvent.d.ts +7 -0
  18. package/GithubEvents/EventTypes/ProjectsV2ColumnEvent.js +69 -0
  19. package/GithubEvents/EventTypes/ProjectsV2Event.d.ts +7 -0
  20. package/GithubEvents/EventTypes/ProjectsV2Event.js +74 -0
  21. package/GithubEvents/EventTypes/ProjectsV2FieldEvent.d.ts +7 -0
  22. package/GithubEvents/EventTypes/ProjectsV2FieldEvent.js +77 -0
  23. package/GithubEvents/EventTypes/ProjectsV2ItemEvent.d.ts +7 -0
  24. package/GithubEvents/EventTypes/ProjectsV2ItemEvent.js +79 -0
  25. package/GithubEvents/EventTypes/PullRequest/CommitsList.d.ts +17 -0
  26. package/GithubEvents/EventTypes/PullRequest/CommitsList.js +99 -0
  27. package/GithubEvents/EventTypes/PullRequest/FileChanges.d.ts +17 -0
  28. package/GithubEvents/EventTypes/PullRequest/FileChanges.js +182 -0
  29. package/GithubEvents/EventTypes/PullRequest/PullRequestEvent.d.ts +8 -0
  30. package/GithubEvents/EventTypes/PullRequest/PullRequestEvent.js +374 -0
  31. package/GithubEvents/EventTypes/PullRequest/PullRequestView.d.ts +29 -0
  32. package/GithubEvents/EventTypes/PullRequest/PullRequestView.js +132 -0
  33. package/GithubEvents/EventTypes/PushEvent.d.ts +7 -0
  34. package/GithubEvents/EventTypes/PushEvent.js +106 -0
  35. package/GithubEvents/GithubEvents.d.ts +49 -0
  36. package/GithubEvents/GithubEvents.js +1454 -0
  37. package/GithubEvents/index.d.ts +2 -0
  38. package/GithubEvents/index.js +2 -0
  39. package/GithubEvents/package.json +6 -0
  40. package/LICENSE +21 -0
  41. package/README.md +29 -0
  42. package/apiHandlers/getPullRequestDetails.d.ts +7 -0
  43. package/apiHandlers/getPullRequestDetails.js +120 -0
  44. package/apiHandlers/index.d.ts +1 -0
  45. package/apiHandlers/index.js +1 -0
  46. package/apiHandlers/package.json +6 -0
  47. package/index.d.ts +3 -0
  48. package/index.js +10 -0
  49. package/modern/GithubCalendar/GithubCalendar.js +330 -0
  50. package/modern/GithubCalendar/index.js +2 -0
  51. package/modern/GithubEvents/EventTypes/CreateEvent.js +72 -0
  52. package/modern/GithubEvents/EventTypes/DeleteEvent.js +65 -0
  53. package/modern/GithubEvents/EventTypes/ForkEvent.js +77 -0
  54. package/modern/GithubEvents/EventTypes/IssueCommentEvent.js +210 -0
  55. package/modern/GithubEvents/EventTypes/IssuesEvent.js +97 -0
  56. package/modern/GithubEvents/EventTypes/ProjectsV2ColumnEvent.js +69 -0
  57. package/modern/GithubEvents/EventTypes/ProjectsV2Event.js +74 -0
  58. package/modern/GithubEvents/EventTypes/ProjectsV2FieldEvent.js +77 -0
  59. package/modern/GithubEvents/EventTypes/ProjectsV2ItemEvent.js +79 -0
  60. package/modern/GithubEvents/EventTypes/PullRequest/CommitsList.js +99 -0
  61. package/modern/GithubEvents/EventTypes/PullRequest/FileChanges.js +182 -0
  62. package/modern/GithubEvents/EventTypes/PullRequest/PullRequestEvent.js +374 -0
  63. package/modern/GithubEvents/EventTypes/PullRequest/PullRequestView.js +132 -0
  64. package/modern/GithubEvents/EventTypes/PushEvent.js +106 -0
  65. package/modern/GithubEvents/GithubEvents.js +1454 -0
  66. package/modern/GithubEvents/index.js +2 -0
  67. package/modern/apiHandlers/getPullRequestDetails.js +120 -0
  68. package/modern/apiHandlers/index.js +1 -0
  69. package/modern/index.js +10 -0
  70. package/modern/types/github.js +1 -0
  71. package/node/GithubCalendar/GithubCalendar.js +337 -0
  72. package/node/GithubCalendar/index.js +9 -0
  73. package/node/GithubEvents/EventTypes/CreateEvent.js +80 -0
  74. package/node/GithubEvents/EventTypes/DeleteEvent.js +73 -0
  75. package/node/GithubEvents/EventTypes/ForkEvent.js +85 -0
  76. package/node/GithubEvents/EventTypes/IssueCommentEvent.js +218 -0
  77. package/node/GithubEvents/EventTypes/IssuesEvent.js +105 -0
  78. package/node/GithubEvents/EventTypes/ProjectsV2ColumnEvent.js +77 -0
  79. package/node/GithubEvents/EventTypes/ProjectsV2Event.js +82 -0
  80. package/node/GithubEvents/EventTypes/ProjectsV2FieldEvent.js +85 -0
  81. package/node/GithubEvents/EventTypes/ProjectsV2ItemEvent.js +87 -0
  82. package/node/GithubEvents/EventTypes/PullRequest/CommitsList.js +107 -0
  83. package/node/GithubEvents/EventTypes/PullRequest/FileChanges.js +188 -0
  84. package/node/GithubEvents/EventTypes/PullRequest/PullRequestEvent.js +381 -0
  85. package/node/GithubEvents/EventTypes/PullRequest/PullRequestView.js +138 -0
  86. package/node/GithubEvents/EventTypes/PushEvent.js +114 -0
  87. package/node/GithubEvents/GithubEvents.js +1463 -0
  88. package/node/GithubEvents/index.js +9 -0
  89. package/node/apiHandlers/getPullRequestDetails.js +127 -0
  90. package/node/apiHandlers/index.js +13 -0
  91. package/node/index.js +27 -0
  92. package/node/types/github.js +5 -0
  93. package/package.json +71 -0
  94. package/types/github.d.ts +107 -0
  95. package/types/github.js +1 -0
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = PullRequestEvent;
8
+ var React = _interopRequireWildcard(require("react"));
9
+ var _Box = _interopRequireDefault(require("@mui/material/Box"));
10
+ var _Typography4 = _interopRequireDefault(require("@mui/material/Typography"));
11
+ var _Link = _interopRequireDefault(require("@mui/material/Link"));
12
+ var _Chip3 = _interopRequireDefault(require("@mui/material/Chip"));
13
+ var _CircularProgress2 = _interopRequireDefault(require("@mui/material/CircularProgress"));
14
+ var _Avatar = _interopRequireDefault(require("@mui/material/Avatar"));
15
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
16
+ var _CallMade = _interopRequireDefault(require("@mui/icons-material/CallMade"));
17
+ var _PullRequestView = _interopRequireDefault(require("./PullRequestView"));
18
+ var _apiHandlers = require("packages/sui-github/src/apiHandlers");
19
+ var _jsxRuntime = require("react/jsx-runtime");
20
+ var _CheckoutIcon, _Typography2, _Typography3, _CircularProgress; // import Stack from '@mui/material/Stack';
21
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
22
+ async function getPRDetails({
23
+ apiUrl,
24
+ params
25
+ }) {
26
+ if (apiUrl) {
27
+ const response = await fetch(`${apiUrl}?owner=${params.owner}&repo=${params.repo}&pull_number=${params.pull_number}`);
28
+ if (!response.ok) {
29
+ throw new Error('Failed to fetch PR details');
30
+ }
31
+ return response.json();
32
+ }
33
+ return (0, _apiHandlers.getPullRequestDetails)(params);
34
+ }
35
+ function PullRequestEvent({
36
+ event,
37
+ apiUrl
38
+ }) {
39
+ var _event$payload, _event$payload2, _pullRequest$base, _pullRequest$head, _pullRequest$user, _pullRequest$user2, _Typography, _Chip, _Chip2;
40
+ const [loading, setLoading] = React.useState(true);
41
+ const [prDetails, setPrDetails] = React.useState(null);
42
+ const [error, setError] = React.useState(null);
43
+
44
+ // Use a ref to track if we've already loaded data for this PR
45
+ const requestIdRef = React.useRef(null);
46
+ const currentRequestId = `${event.repo}-${(_event$payload = event.payload) == null || (_event$payload = _event$payload.pull_request) == null ? void 0 : _event$payload.number}`;
47
+
48
+ // Prevent navigation only from anchors in the title and buttons
49
+ const handleLinkClick = e => {
50
+ e.preventDefault();
51
+ e.stopPropagation();
52
+
53
+ // Optional: Open the link in a new tab if needed
54
+ // const href = (e.currentTarget as HTMLAnchorElement).href;
55
+ // window.open(href, '_blank', 'noopener,noreferrer');
56
+ };
57
+
58
+ // Check if event is valid
59
+ if (!(event != null && event.date)) {
60
+ return null;
61
+ }
62
+ const pullRequest = (_event$payload2 = event.payload) == null ? void 0 : _event$payload2.pull_request;
63
+ if (!pullRequest) {
64
+ return null;
65
+ }
66
+
67
+ // Extract repo, branches and user info
68
+ const repoFullName = event.repo;
69
+ const [repoOwner, repoName] = repoFullName.split('/');
70
+ const baseBranch = ((_pullRequest$base = pullRequest.base) == null ? void 0 : _pullRequest$base.ref) || 'unknown';
71
+ const headBranch = ((_pullRequest$head = pullRequest.head) == null ? void 0 : _pullRequest$head.ref) || 'unknown';
72
+ const authorLogin = ((_pullRequest$user = pullRequest.user) == null ? void 0 : _pullRequest$user.login) || event.user;
73
+ const authorAvatar = ((_pullRequest$user2 = pullRequest.user) == null ? void 0 : _pullRequest$user2.avatar_url) || event.avatarUrl;
74
+
75
+ // Check if PR is deleted or closed before making API call
76
+ const isPRDeleted = event.payload.action === 'deleted' || pullRequest.state === 'closed' || pullRequest.state === 'merged';
77
+ React.useEffect(() => {
78
+ // Skip if this is the same PR we've already loaded
79
+ if (requestIdRef.current === currentRequestId && prDetails !== null) {
80
+ return;
81
+ }
82
+
83
+ // Track the current request
84
+ requestIdRef.current = currentRequestId;
85
+ let isMounted = true;
86
+ const fetchPRDetails = async () => {
87
+ try {
88
+ // If PR is deleted, don't make the API call
89
+ if (isPRDeleted) {
90
+ if (isMounted) {
91
+ setLoading(false);
92
+ setPrDetails({
93
+ title: pullRequest.title,
94
+ number: pullRequest.number,
95
+ state: pullRequest.state,
96
+ merged: pullRequest.merged,
97
+ user: pullRequest.user,
98
+ created_at: pullRequest.created_at,
99
+ updated_at: pullRequest.updated_at,
100
+ closed_at: pullRequest.closed_at,
101
+ merged_at: pullRequest.merged_at,
102
+ commits_list: [],
103
+ files: []
104
+ });
105
+ }
106
+ return;
107
+ }
108
+ if (isMounted) {
109
+ setLoading(true);
110
+ setError(null);
111
+ }
112
+ try {
113
+ // Extract owner and repo from the repository URL
114
+ let owner, repo;
115
+ try {
116
+ const repoUrl = new URL(pullRequest.html_url);
117
+ const pathParts = repoUrl.pathname.split('/').filter(Boolean);
118
+ if (pathParts.length >= 2) {
119
+ owner = pathParts[0];
120
+ repo = pathParts[1];
121
+ } else {
122
+ throw new Error('Invalid repository URL');
123
+ }
124
+ } catch (urlError) {
125
+ // Fallback to the repo name if URL parsing fails
126
+ const [fallbackOwner, fallbackRepo] = repoFullName.split('/');
127
+ owner = fallbackOwner;
128
+ repo = fallbackRepo;
129
+ }
130
+ if (!owner || !repo || !pullRequest.number) {
131
+ throw new Error('Missing required information to fetch PR details');
132
+ }
133
+ const params = {
134
+ owner,
135
+ repo,
136
+ pull_number: pullRequest.number
137
+ };
138
+ const data = await getPRDetails({
139
+ apiUrl,
140
+ params
141
+ });
142
+ if (isMounted) {
143
+ setPrDetails(data);
144
+ }
145
+ } catch (err) {
146
+ console.error('Error fetching PR details:', err);
147
+ if (isMounted) {
148
+ setError(err instanceof Error ? err.message : 'Failed to load PR details');
149
+ }
150
+ } finally {
151
+ if (isMounted) {
152
+ setLoading(false);
153
+ }
154
+ }
155
+ } catch (err) {
156
+ console.error('Error in PR details flow:', err);
157
+ if (isMounted) {
158
+ setLoading(false);
159
+ setError('An unexpected error occurred');
160
+ }
161
+ }
162
+ };
163
+ fetchPRDetails();
164
+
165
+ // Cleanup function to prevent state updates if component unmounts
166
+ return () => {
167
+ isMounted = false;
168
+ };
169
+ }, [currentRequestId, isPRDeleted]); // Only depend on the request ID, not the entire object
170
+
171
+ const handleCheckout = hash => {
172
+ // TODO: Implement checkout functionality
173
+ };
174
+
175
+ // PR Header component with context info
176
+ const PrHeader = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
177
+ sx: {
178
+ mb: 2
179
+ },
180
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
181
+ sx: {
182
+ display: 'flex',
183
+ alignItems: 'top',
184
+ justifyContent: 'space-between',
185
+ mb: 1
186
+ },
187
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
188
+ sx: {
189
+ display: 'flex',
190
+ alignItems: 'center',
191
+ gap: 1,
192
+ flexWrap: 'wrap'
193
+ },
194
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography4.default, {
195
+ variant: "caption",
196
+ color: "text.secondary",
197
+ children: event.date
198
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip3.default, {
199
+ label: `${repoOwner}/${repoName}`,
200
+ size: "small",
201
+ color: "primary",
202
+ variant: "outlined"
203
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip3.default, {
204
+ label: `#${pullRequest.number}`,
205
+ size: "small",
206
+ color: "default"
207
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip3.default, {
208
+ label: pullRequest.state,
209
+ size: "small",
210
+ color: pullRequest.state === 'open' ? 'success' : 'error'
211
+ })]
212
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
213
+ sx: {
214
+ height: 'min-content',
215
+ padding: '8px',
216
+ '@media (min-width:40px)': {
217
+ display: 'none'
218
+ },
219
+ textTransform: 'none'
220
+ },
221
+ variant: "outlined",
222
+ size: "small",
223
+ startIcon: _CheckoutIcon || (_CheckoutIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_CallMade.default, {})),
224
+ onClick: e => {
225
+ e.preventDefault();
226
+ handleCheckout();
227
+ },
228
+ children: "Checkout"
229
+ })]
230
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography4.default, {
231
+ variant: "h6",
232
+ component: "h3",
233
+ sx: {
234
+ mb: 1
235
+ },
236
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.default, {
237
+ href: pullRequest.html_url,
238
+ target: "_blank",
239
+ rel: "noopener noreferrer",
240
+ sx: {
241
+ textDecoration: 'none'
242
+ },
243
+ onClick: handleLinkClick,
244
+ children: pullRequest.title
245
+ })
246
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
247
+ sx: {
248
+ display: 'flex',
249
+ alignItems: 'center',
250
+ gap: 1,
251
+ mb: 1
252
+ },
253
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Avatar.default, {
254
+ src: authorAvatar,
255
+ alt: authorLogin,
256
+ sx: {
257
+ width: 24,
258
+ height: 24
259
+ }
260
+ }), _Typography || (_Typography = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography4.default, {
261
+ variant: "body2",
262
+ children: authorLogin
263
+ })), _Typography2 || (_Typography2 = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography4.default, {
264
+ variant: "body2",
265
+ color: "text.secondary",
266
+ children: "wants to merge from"
267
+ })), _Chip || (_Chip = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip3.default, {
268
+ label: headBranch,
269
+ size: "small",
270
+ color: "default",
271
+ variant: "outlined"
272
+ })), _Typography3 || (_Typography3 = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography4.default, {
273
+ variant: "body2",
274
+ color: "text.secondary",
275
+ children: "into"
276
+ })), _Chip2 || (_Chip2 = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip3.default, {
277
+ label: baseBranch,
278
+ size: "small",
279
+ color: "default",
280
+ variant: "outlined"
281
+ }))]
282
+ })]
283
+ });
284
+ if (loading) {
285
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
286
+ sx: {
287
+ p: '16px'
288
+ },
289
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(PrHeader, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
290
+ sx: {
291
+ display: 'flex',
292
+ justifyContent: 'center',
293
+ p: 4
294
+ },
295
+ children: _CircularProgress || (_CircularProgress = /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress2.default, {}))
296
+ })]
297
+ });
298
+ }
299
+ if (error) {
300
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
301
+ sx: {
302
+ p: '16px'
303
+ },
304
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(PrHeader, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography4.default, {
305
+ color: "error",
306
+ children: error
307
+ }), isPRDeleted && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography4.default, {
308
+ color: "text.secondary",
309
+ sx: {
310
+ mt: 1
311
+ },
312
+ children: ["This pull request is no longer available.", pullRequest.state === 'merged' && ' It has been merged.', pullRequest.state === 'closed' && ' It has been closed.', event.payload.action === 'deleted' && ' It has been deleted.']
313
+ })]
314
+ });
315
+ }
316
+ if (!prDetails) {
317
+ return null;
318
+ }
319
+
320
+ // Transform the PR details into the format expected by PullRequestView
321
+ const transformedCommits = (prDetails.commits_list || []).map(commit => {
322
+ var _commit$author;
323
+ return {
324
+ id: commit.sha,
325
+ message: commit.commit.message,
326
+ author: {
327
+ name: commit.commit.author.name,
328
+ avatar: ((_commit$author = commit.author) == null ? void 0 : _commit$author.avatar_url) || ''
329
+ },
330
+ date: commit.commit.author.date,
331
+ hash: commit.sha
332
+ };
333
+ });
334
+ const transformedFiles = (prDetails.files || []).map(file => ({
335
+ path: file.path,
336
+ type: file.type,
337
+ additions: file.additions,
338
+ deletions: file.deletions,
339
+ diff: file.diff
340
+ }));
341
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
342
+ sx: {
343
+ p: '16px'
344
+ },
345
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(PrHeader, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_PullRequestView.default, {
346
+ title: "" // Set to empty to avoid duplicate title
347
+ ,
348
+ number: prDetails.number,
349
+ commits: transformedCommits,
350
+ files: transformedFiles,
351
+ onCheckout: handleCheckout
352
+ })]
353
+ });
354
+ }
355
+
356
+ // Helper function to parse diff content into line objects
357
+ // function parseDiff(patch: string): Array<{ type: 'addition' | 'deletion' | 'context'; content: string; lineNumber: number }> {
358
+ // if (!patch) return [];
359
+ //
360
+ // return patch.split('\n').map((line, index) => {
361
+ // if (line.startsWith('+')) {
362
+ // return {
363
+ // type: 'addition',
364
+ // content: line,
365
+ // lineNumber: index + 1,
366
+ // };
367
+ // } else if (line.startsWith('-')) {
368
+ // return {
369
+ // type: 'deletion',
370
+ // content: line,
371
+ // lineNumber: index + 1,
372
+ // };
373
+ // } else {
374
+ // return {
375
+ // type: 'context',
376
+ // content: line,
377
+ // lineNumber: index + 1,
378
+ // };
379
+ // }
380
+ // });
381
+ // }
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = PullRequestView;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
10
+ var React = _interopRequireWildcard(require("react"));
11
+ var _Box = _interopRequireDefault(require("@mui/material/Box"));
12
+ var _Tabs = _interopRequireDefault(require("@mui/material/Tabs"));
13
+ var _Tab = _interopRequireDefault(require("@mui/material/Tab"));
14
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
15
+ var _styles = require("@mui/material/styles");
16
+ var _CommitsList = _interopRequireDefault(require("./CommitsList"));
17
+ var _FileChanges = _interopRequireDefault(require("./FileChanges"));
18
+ var _jsxRuntime = require("react/jsx-runtime");
19
+ const _excluded = ["children", "value", "index"]; // Custom styled components to match GitHub's UI
20
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
21
+ const StyledTabs = (0, _styles.styled)(_Tabs.default)(({
22
+ theme
23
+ }) => ({
24
+ borderBottom: `1px solid ${theme.palette.divider}`,
25
+ '& .MuiTab-root': {
26
+ textTransform: 'none',
27
+ minHeight: 48,
28
+ padding: '0 16px',
29
+ color: theme.palette.text.secondary,
30
+ '&.Mui-selected': {
31
+ color: theme.palette.text.primary
32
+ }
33
+ }
34
+ }));
35
+ const StatsBox = (0, _styles.styled)(_Box.default)(({
36
+ theme
37
+ }) => ({
38
+ display: 'flex',
39
+ alignItems: 'center',
40
+ gap: theme.spacing(1),
41
+ padding: theme.spacing(1, 2),
42
+ backgroundColor: theme.palette.background.paper,
43
+ borderRadius: theme.shape.borderRadius,
44
+ border: `1px solid ${theme.palette.divider}`
45
+ }));
46
+ function TabPanel(props) {
47
+ const {
48
+ children,
49
+ value,
50
+ index
51
+ } = props,
52
+ other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
53
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
54
+ role: "tabpanel",
55
+ hidden: value !== index,
56
+ id: `pr-tabpanel-${index}`,
57
+ "aria-labelledby": `pr-tab-${index}`
58
+ }, other, {
59
+ children: value === index && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
60
+ sx: {
61
+ p: 3
62
+ },
63
+ children: children
64
+ })
65
+ }));
66
+ }
67
+ function PullRequestView({
68
+ title,
69
+ number,
70
+ commits,
71
+ files,
72
+ onCheckout
73
+ }) {
74
+ const [tabValue, setTabValue] = React.useState(0);
75
+ const handleTabChange = (event, newValue) => {
76
+ setTabValue(newValue);
77
+ };
78
+ const totalAdditions = files.reduce((sum, file) => sum + file.additions, 0);
79
+ const totalDeletions = files.reduce((sum, file) => sum + file.deletions, 0);
80
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
81
+ sx: {
82
+ width: '100%'
83
+ },
84
+ children: [title && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
85
+ sx: {
86
+ display: 'flex',
87
+ justifyContent: 'space-between',
88
+ alignItems: 'center',
89
+ mb: 2
90
+ },
91
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
92
+ variant: "h5",
93
+ component: "h1",
94
+ children: [title, " #", number]
95
+ })
96
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
97
+ sx: {
98
+ borderBottom: 1,
99
+ borderColor: 'divider'
100
+ },
101
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(StyledTabs, {
102
+ value: tabValue,
103
+ onChange: handleTabChange,
104
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Tab.default, {
105
+ label: `Commits (${commits.length})`,
106
+ id: "pr-tab-0"
107
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tab.default, {
108
+ label: `Files changed (${files.length})`,
109
+ id: "pr-tab-1"
110
+ })]
111
+ })
112
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(TabPanel, {
113
+ value: tabValue,
114
+ index: 0,
115
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CommitsList.default, {
116
+ commits: commits,
117
+ onCheckout: onCheckout
118
+ })
119
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(TabPanel, {
120
+ value: tabValue,
121
+ index: 1,
122
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
123
+ sx: {
124
+ mb: 2
125
+ },
126
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(StatsBox, {
127
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
128
+ variant: "body2",
129
+ component: "span",
130
+ children: ["Showing ", files.length, " changed files with ", totalAdditions, " additions and ", totalDeletions, " deletions"]
131
+ })
132
+ })
133
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_FileChanges.default, {
134
+ files: files
135
+ })]
136
+ })]
137
+ });
138
+ }
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = PushEvent;
8
+ var React = _interopRequireWildcard(require("react"));
9
+ var _Box = _interopRequireDefault(require("@mui/material/Box"));
10
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
11
+ var _Link = _interopRequireDefault(require("@mui/material/Link"));
12
+ var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
13
+ var _jsxRuntime = require("react/jsx-runtime");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ function PushEvent({
16
+ event
17
+ }) {
18
+ var _event$ref, _event$payload;
19
+ if (!(event != null && event.date)) {
20
+ return null;
21
+ }
22
+ const commitMessage = event.description || 'No commit message available';
23
+ const commitUrl = event.url || `https://github.com/${event.repo}`;
24
+ const branchName = ((_event$ref = event.ref) == null ? void 0 : _event$ref.replace('refs/heads/', '')) || 'main';
25
+ const commits = ((_event$payload = event.payload) == null ? void 0 : _event$payload.commits) || [];
26
+ const commitCount = commits.length;
27
+ // const firstCommit = commits[0];
28
+
29
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
30
+ sx: {
31
+ p: '16px'
32
+ },
33
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
34
+ sx: {
35
+ display: 'flex',
36
+ alignItems: 'center',
37
+ gap: 1,
38
+ mb: 2
39
+ },
40
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
41
+ variant: "caption",
42
+ color: "text.secondary",
43
+ children: event.date
44
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip.default, {
45
+ label: branchName,
46
+ size: "small",
47
+ color: "default"
48
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip.default, {
49
+ label: `${commitCount} commit${commitCount !== 1 ? 's' : ''}`,
50
+ size: "small",
51
+ color: "primary"
52
+ })]
53
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
54
+ variant: "h6",
55
+ component: "h3",
56
+ sx: {
57
+ mb: 1
58
+ },
59
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.default, {
60
+ href: commitUrl,
61
+ target: "_blank",
62
+ rel: "noopener noreferrer",
63
+ sx: {
64
+ textDecoration: 'none'
65
+ },
66
+ children: commitMessage
67
+ })
68
+ }), commits.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
69
+ sx: {
70
+ mt: 2
71
+ },
72
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
73
+ variant: "subtitle2",
74
+ sx: {
75
+ mb: 1
76
+ },
77
+ children: "Commits:"
78
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
79
+ component: "ul",
80
+ sx: {
81
+ listStyle: 'none',
82
+ p: 0,
83
+ m: 0,
84
+ '& li': {
85
+ mb: 1,
86
+ '&:last-child': {
87
+ mb: 0
88
+ }
89
+ }
90
+ },
91
+ children: commits.map((commit, index) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
92
+ component: "li",
93
+ sx: {
94
+ display: 'flex',
95
+ alignItems: 'flex-start',
96
+ gap: 1
97
+ },
98
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
99
+ variant: "body2",
100
+ component: "span",
101
+ sx: {
102
+ color: 'text.secondary',
103
+ minWidth: '7ch'
104
+ },
105
+ children: commit.sha.substring(0, 7)
106
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
107
+ variant: "body2",
108
+ children: commit.message
109
+ })]
110
+ }, index))
111
+ })]
112
+ })]
113
+ });
114
+ }