@githat/nextjs 0.2.4 → 0.2.6

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.
package/dist/index.js CHANGED
@@ -22,8 +22,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var src_exports = {};
23
23
  __export(src_exports, {
24
24
  ChangePasswordForm: () => ChangePasswordForm,
25
+ CognitoButton: () => CognitoButton,
26
+ CognitoCallback: () => CognitoCallback,
25
27
  ForgotPasswordForm: () => ForgotPasswordForm,
26
28
  GitHatProvider: () => GitHatProvider,
29
+ GitHubButton: () => GitHubButton,
30
+ GitHubCallback: () => GitHubCallback,
27
31
  OrgSwitcher: () => OrgSwitcher,
28
32
  ProtectedRoute: () => ProtectedRoute,
29
33
  ResetPasswordForm: () => ResetPasswordForm,
@@ -424,33 +428,23 @@ function useGitHat() {
424
428
  );
425
429
  const forgotPassword = (0, import_react2.useCallback)(
426
430
  async (email) => {
427
- const response = await fetch(`${ctx.config.apiUrl}/auth/forgot-password`, {
431
+ await client.fetchApi("/auth/forgot-password", {
428
432
  method: "POST",
429
- headers: { "Content-Type": "application/json" },
430
433
  body: JSON.stringify({ email })
431
434
  });
432
- if (!response.ok) {
433
- const error = await response.json().catch(() => ({}));
434
- throw new Error(error.message || "Failed to send reset email");
435
- }
436
435
  return { success: true };
437
436
  },
438
- [ctx.config.apiUrl]
437
+ [client]
439
438
  );
440
439
  const resetPassword = (0, import_react2.useCallback)(
441
440
  async (token, newPassword) => {
442
- const response = await fetch(`${ctx.config.apiUrl}/auth/reset-password`, {
441
+ await client.fetchApi("/auth/reset-password", {
443
442
  method: "POST",
444
- headers: { "Content-Type": "application/json" },
445
443
  body: JSON.stringify({ token, password: newPassword })
446
444
  });
447
- if (!response.ok) {
448
- const error = await response.json().catch(() => ({}));
449
- throw new Error(error.message || "Failed to reset password");
450
- }
451
445
  return { success: true };
452
446
  },
453
- [ctx.config.apiUrl]
447
+ [client]
454
448
  );
455
449
  const changePassword = (0, import_react2.useCallback)(
456
450
  async (currentPassword, newPassword) => {
@@ -464,33 +458,90 @@ function useGitHat() {
464
458
  );
465
459
  const verifyEmail = (0, import_react2.useCallback)(
466
460
  async (token) => {
467
- const response = await fetch(`${ctx.config.apiUrl}/auth/verify-email`, {
461
+ await client.fetchApi("/auth/verify-email", {
468
462
  method: "POST",
469
- headers: { "Content-Type": "application/json" },
470
463
  body: JSON.stringify({ token })
471
464
  });
472
- if (!response.ok) {
473
- const error = await response.json().catch(() => ({}));
474
- throw new Error(error.message || "Failed to verify email");
475
- }
476
465
  return { success: true };
477
466
  },
478
- [ctx.config.apiUrl]
467
+ [client]
479
468
  );
480
469
  const resendVerificationEmail = (0, import_react2.useCallback)(
481
470
  async (email) => {
482
- const response = await fetch(`${ctx.config.apiUrl}/auth/resend-verification`, {
471
+ await client.fetchApi("/auth/resend-verification", {
483
472
  method: "POST",
484
- headers: { "Content-Type": "application/json" },
485
473
  body: JSON.stringify({ email })
486
474
  });
487
- if (!response.ok) {
488
- const error = await response.json().catch(() => ({}));
489
- throw new Error(error.message || "Failed to resend verification email");
490
- }
491
475
  return { success: true };
492
476
  },
493
- [ctx.config.apiUrl]
477
+ [client]
478
+ );
479
+ const getGitHubOAuthUrl = (0, import_react2.useCallback)(
480
+ async (options) => {
481
+ const params = new URLSearchParams();
482
+ if (options?.redirectUri) params.append("redirectUri", options.redirectUri);
483
+ if (options?.state) params.append("state", options.state);
484
+ const queryString = params.toString();
485
+ const path = queryString ? `/auth/oauth/github/url?${queryString}` : "/auth/oauth/github/url";
486
+ return client.fetchApi(path);
487
+ },
488
+ [client]
489
+ );
490
+ const signInWithGitHub = (0, import_react2.useCallback)(
491
+ async (code, options) => {
492
+ const response = await client.fetchApi("/auth/oauth/github", {
493
+ method: "POST",
494
+ body: JSON.stringify({
495
+ code,
496
+ redirectUri: options?.redirectUri
497
+ })
498
+ });
499
+ if (response.accessToken) {
500
+ window.dispatchEvent(new CustomEvent("githat:auth-changed", {
501
+ detail: { user: response.user, org: response.org, signedIn: true }
502
+ }));
503
+ }
504
+ return {
505
+ user: response.user,
506
+ org: response.org,
507
+ isNewUser: response.isNewUser
508
+ };
509
+ },
510
+ [client]
511
+ );
512
+ const getCognitoOAuthUrl = (0, import_react2.useCallback)(
513
+ async (options) => {
514
+ const params = new URLSearchParams();
515
+ if (options?.redirectUri) params.append("redirectUri", options.redirectUri);
516
+ if (options?.state) params.append("state", options.state);
517
+ if (options?.identityProvider) params.append("identityProvider", options.identityProvider);
518
+ const queryString = params.toString();
519
+ const path = queryString ? `/auth/oauth/cognito/url?${queryString}` : "/auth/oauth/cognito/url";
520
+ return client.fetchApi(path);
521
+ },
522
+ [client]
523
+ );
524
+ const signInWithCognito = (0, import_react2.useCallback)(
525
+ async (code, options) => {
526
+ const response = await client.fetchApi("/auth/oauth/cognito", {
527
+ method: "POST",
528
+ body: JSON.stringify({
529
+ code,
530
+ redirectUri: options?.redirectUri
531
+ })
532
+ });
533
+ if (response.accessToken) {
534
+ window.dispatchEvent(new CustomEvent("githat:auth-changed", {
535
+ detail: { user: response.user, org: response.org, signedIn: true }
536
+ }));
537
+ }
538
+ return {
539
+ user: response.user,
540
+ org: response.org,
541
+ isNewUser: response.isNewUser
542
+ };
543
+ },
544
+ [client]
494
545
  );
495
546
  return {
496
547
  fetch: client.fetchApi,
@@ -505,7 +556,12 @@ function useGitHat() {
505
556
  changePassword,
506
557
  // Email verification
507
558
  verifyEmail,
508
- resendVerificationEmail
559
+ resendVerificationEmail,
560
+ // OAuth (Web2)
561
+ getGitHubOAuthUrl,
562
+ signInWithGitHub,
563
+ getCognitoOAuthUrl,
564
+ signInWithCognito
509
565
  };
510
566
  }
511
567
 
@@ -614,7 +670,7 @@ function SignInForm({ onSuccess, signUpUrl, forgotPasswordUrl }) {
614
670
  window.location.href = params.get("redirect_url") || config.afterSignInUrl;
615
671
  }
616
672
  } catch (err) {
617
- setError(err.message || "Sign in failed");
673
+ setError(err instanceof Error ? err.message : "Sign in failed");
618
674
  } finally {
619
675
  setLoading(false);
620
676
  }
@@ -712,7 +768,7 @@ function SignUpForm({ onSuccess, signInUrl }) {
712
768
  window.location.href = config.afterSignInUrl;
713
769
  }
714
770
  } catch (err) {
715
- setError(err.message || "Sign up failed");
771
+ setError(err instanceof Error ? err.message : "Sign up failed");
716
772
  } finally {
717
773
  setLoading(false);
718
774
  }
@@ -1337,11 +1393,436 @@ function ChangePasswordForm({
1337
1393
  ] })
1338
1394
  ] });
1339
1395
  }
1396
+
1397
+ // src/components/GitHubButton.tsx
1398
+ var import_react15 = require("react");
1399
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1400
+ var GitHubIcon = () => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("path", { d: "M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z" }) });
1401
+ function GitHubButton({
1402
+ children = "Continue with GitHub",
1403
+ redirectUri,
1404
+ onSuccess,
1405
+ onError,
1406
+ className = "",
1407
+ variant = "default",
1408
+ disabled = false
1409
+ }) {
1410
+ const { getGitHubOAuthUrl } = useGitHat();
1411
+ const [isLoading, setIsLoading] = (0, import_react15.useState)(false);
1412
+ const handleClick = (0, import_react15.useCallback)(async () => {
1413
+ if (isLoading || disabled) return;
1414
+ setIsLoading(true);
1415
+ try {
1416
+ const state = crypto.randomUUID();
1417
+ sessionStorage.setItem("githat_oauth_state", state);
1418
+ const { url } = await getGitHubOAuthUrl({ redirectUri, state });
1419
+ window.location.href = url;
1420
+ } catch (error) {
1421
+ setIsLoading(false);
1422
+ if (onError) {
1423
+ onError(error instanceof Error ? error : new Error("Failed to start GitHub OAuth"));
1424
+ }
1425
+ }
1426
+ }, [getGitHubOAuthUrl, redirectUri, onError, isLoading, disabled]);
1427
+ const baseStyles = "githat-github-button";
1428
+ const variantStyles = variant === "outline" ? "githat-github-button-outline" : "";
1429
+ const disabledStyles = disabled || isLoading ? "githat-github-button-disabled" : "";
1430
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1431
+ "button",
1432
+ {
1433
+ type: "button",
1434
+ onClick: handleClick,
1435
+ disabled: disabled || isLoading,
1436
+ className: `${baseStyles} ${variantStyles} ${disabledStyles} ${className}`.trim(),
1437
+ children: [
1438
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "githat-github-spinner" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(GitHubIcon, {}),
1439
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children })
1440
+ ]
1441
+ }
1442
+ );
1443
+ }
1444
+ if (typeof document !== "undefined") {
1445
+ const styleId = "githat-github-button-styles";
1446
+ if (!document.getElementById(styleId)) {
1447
+ const style = document.createElement("style");
1448
+ style.id = styleId;
1449
+ style.textContent = `
1450
+ .githat-github-button {
1451
+ display: inline-flex;
1452
+ align-items: center;
1453
+ justify-content: center;
1454
+ gap: 0.5rem;
1455
+ padding: 0.625rem 1rem;
1456
+ font-size: 0.875rem;
1457
+ font-weight: 500;
1458
+ border-radius: 0.375rem;
1459
+ border: none;
1460
+ cursor: pointer;
1461
+ transition: all 0.15s ease;
1462
+ background-color: #24292f;
1463
+ color: #ffffff;
1464
+ width: 100%;
1465
+ }
1466
+ .githat-github-button:hover:not(:disabled) {
1467
+ background-color: #32383f;
1468
+ }
1469
+ .githat-github-button-outline {
1470
+ background-color: transparent;
1471
+ color: #24292f;
1472
+ border: 1px solid #d0d7de;
1473
+ }
1474
+ .githat-github-button-outline:hover:not(:disabled) {
1475
+ background-color: #f6f8fa;
1476
+ border-color: #24292f;
1477
+ }
1478
+ .githat-github-button-disabled {
1479
+ opacity: 0.5;
1480
+ cursor: not-allowed;
1481
+ }
1482
+ .githat-github-spinner {
1483
+ width: 1rem;
1484
+ height: 1rem;
1485
+ border: 2px solid currentColor;
1486
+ border-top-color: transparent;
1487
+ border-radius: 50%;
1488
+ animation: githat-spin 0.6s linear infinite;
1489
+ }
1490
+ @keyframes githat-spin {
1491
+ to { transform: rotate(360deg); }
1492
+ }
1493
+ `;
1494
+ document.head.appendChild(style);
1495
+ }
1496
+ }
1497
+
1498
+ // src/components/GitHubCallback.tsx
1499
+ var import_react16 = require("react");
1500
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1501
+ function GitHubCallback({
1502
+ redirectUrl = "/dashboard",
1503
+ newUserRedirectUrl,
1504
+ onSuccess,
1505
+ onError,
1506
+ loadingComponent,
1507
+ errorComponent
1508
+ }) {
1509
+ const { signInWithGitHub } = useGitHat();
1510
+ const { config } = useAuth();
1511
+ const [error, setError] = (0, import_react16.useState)(null);
1512
+ const [isProcessing, setIsProcessing] = (0, import_react16.useState)(true);
1513
+ (0, import_react16.useEffect)(() => {
1514
+ const handleCallback = async () => {
1515
+ const params = new URLSearchParams(window.location.search);
1516
+ const code = params.get("code");
1517
+ const state = params.get("state");
1518
+ const errorParam = params.get("error");
1519
+ const errorDescription = params.get("error_description");
1520
+ if (errorParam) {
1521
+ const errorMsg = errorDescription || errorParam;
1522
+ setError(errorMsg);
1523
+ setIsProcessing(false);
1524
+ if (onError) {
1525
+ onError(new Error(errorMsg));
1526
+ }
1527
+ return;
1528
+ }
1529
+ if (!code) {
1530
+ const errorMsg = "No authorization code received";
1531
+ setError(errorMsg);
1532
+ setIsProcessing(false);
1533
+ if (onError) {
1534
+ onError(new Error(errorMsg));
1535
+ }
1536
+ return;
1537
+ }
1538
+ const savedState = sessionStorage.getItem("githat_oauth_state");
1539
+ if (savedState && state !== savedState) {
1540
+ const errorMsg = "Invalid state parameter";
1541
+ setError(errorMsg);
1542
+ setIsProcessing(false);
1543
+ if (onError) {
1544
+ onError(new Error(errorMsg));
1545
+ }
1546
+ return;
1547
+ }
1548
+ sessionStorage.removeItem("githat_oauth_state");
1549
+ try {
1550
+ const result = await signInWithGitHub(code);
1551
+ if (onSuccess) {
1552
+ onSuccess(result);
1553
+ }
1554
+ const targetUrl = result.isNewUser && newUserRedirectUrl ? newUserRedirectUrl : redirectUrl || config.afterSignInUrl || "/dashboard";
1555
+ window.location.href = targetUrl;
1556
+ } catch (err) {
1557
+ const errorMsg = err instanceof Error ? err.message : "Authentication failed";
1558
+ setError(errorMsg);
1559
+ setIsProcessing(false);
1560
+ if (onError) {
1561
+ onError(err instanceof Error ? err : new Error(errorMsg));
1562
+ }
1563
+ }
1564
+ };
1565
+ handleCallback();
1566
+ }, [signInWithGitHub, redirectUrl, newUserRedirectUrl, config.afterSignInUrl, onSuccess, onError]);
1567
+ if (error) {
1568
+ if (errorComponent) {
1569
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: errorComponent(error) });
1570
+ }
1571
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "githat-callback-error", children: [
1572
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h2", { children: "Authentication Failed" }),
1573
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children: error }),
1574
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: "/sign-in", children: "Back to Sign In" })
1575
+ ] });
1576
+ }
1577
+ if (loadingComponent) {
1578
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: loadingComponent });
1579
+ }
1580
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "githat-callback-loading", children: [
1581
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "githat-callback-spinner" }),
1582
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children: "Completing sign in with GitHub..." })
1583
+ ] });
1584
+ }
1585
+ if (typeof document !== "undefined") {
1586
+ const styleId = "githat-callback-styles";
1587
+ if (!document.getElementById(styleId)) {
1588
+ const style = document.createElement("style");
1589
+ style.id = styleId;
1590
+ style.textContent = `
1591
+ .githat-callback-loading,
1592
+ .githat-callback-error {
1593
+ display: flex;
1594
+ flex-direction: column;
1595
+ align-items: center;
1596
+ justify-content: center;
1597
+ min-height: 200px;
1598
+ padding: 2rem;
1599
+ text-align: center;
1600
+ }
1601
+ .githat-callback-spinner {
1602
+ width: 2rem;
1603
+ height: 2rem;
1604
+ border: 3px solid #e5e7eb;
1605
+ border-top-color: #3b82f6;
1606
+ border-radius: 50%;
1607
+ animation: githat-spin 0.8s linear infinite;
1608
+ margin-bottom: 1rem;
1609
+ }
1610
+ .githat-callback-error h2 {
1611
+ color: #dc2626;
1612
+ margin-bottom: 0.5rem;
1613
+ }
1614
+ .githat-callback-error p {
1615
+ color: #6b7280;
1616
+ margin-bottom: 1rem;
1617
+ }
1618
+ .githat-callback-error a {
1619
+ color: #3b82f6;
1620
+ text-decoration: underline;
1621
+ }
1622
+ @keyframes githat-spin {
1623
+ to { transform: rotate(360deg); }
1624
+ }
1625
+ `;
1626
+ document.head.appendChild(style);
1627
+ }
1628
+ }
1629
+
1630
+ // src/components/CognitoButton.tsx
1631
+ var import_react17 = require("react");
1632
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1633
+ var AWSIcon = () => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { d: "M6.763 10.036c0 .296.032.535.088.71.064.176.144.368.256.576.04.063.056.127.056.183 0 .08-.048.16-.152.24l-.503.335a.383.383 0 0 1-.208.072c-.08 0-.16-.04-.239-.112a2.47 2.47 0 0 1-.287-.375 6.18 6.18 0 0 1-.248-.471c-.622.734-1.405 1.101-2.347 1.101-.67 0-1.205-.191-1.596-.574-.391-.384-.59-.894-.59-1.533 0-.678.239-1.23.726-1.644.487-.415 1.133-.623 1.955-.623.272 0 .551.024.846.064.296.04.6.104.918.176v-.583c0-.607-.127-1.03-.375-1.277-.255-.248-.686-.367-1.3-.367-.28 0-.568.031-.863.103-.295.072-.583.16-.862.272a2.287 2.287 0 0 1-.28.104.488.488 0 0 1-.127.023c-.112 0-.168-.08-.168-.247v-.391c0-.128.016-.224.056-.28a.597.597 0 0 1 .224-.167c.279-.144.614-.264 1.005-.36a4.84 4.84 0 0 1 1.246-.151c.95 0 1.644.216 2.091.647.439.43.662 1.085.662 1.963v2.586zm-3.24 1.214c.263 0 .534-.048.822-.144.287-.096.543-.271.758-.51.128-.152.224-.32.272-.512.047-.191.08-.423.08-.694v-.335a6.66 6.66 0 0 0-.735-.136 6.02 6.02 0 0 0-.75-.048c-.535 0-.926.104-1.19.32-.263.215-.39.518-.39.917 0 .375.095.655.295.846.191.2.47.296.838.296zm6.41.862c-.144 0-.24-.024-.304-.08-.064-.048-.12-.16-.168-.311L7.586 5.55a1.398 1.398 0 0 1-.072-.32c0-.128.064-.2.191-.2h.783c.151 0 .255.025.31.08.065.048.113.16.16.312l1.342 5.284 1.245-5.284c.04-.16.088-.264.151-.312a.549.549 0 0 1 .32-.08h.638c.152 0 .256.025.32.08.063.048.12.16.151.312l1.261 5.348 1.381-5.348c.048-.16.104-.264.16-.312a.52.52 0 0 1 .311-.08h.743c.127 0 .2.065.2.2 0 .04-.009.08-.017.128a1.137 1.137 0 0 1-.056.2l-1.923 6.17c-.048.16-.104.264-.168.312a.51.51 0 0 1-.303.08h-.687c-.151 0-.255-.024-.32-.08-.063-.056-.119-.16-.15-.32l-1.238-5.148-1.23 5.14c-.04.16-.087.264-.15.32-.065.056-.177.08-.32.08zm10.256.215c-.415 0-.83-.048-1.229-.143-.399-.096-.71-.2-.918-.32-.128-.071-.215-.151-.247-.223a.563.563 0 0 1-.048-.224v-.407c0-.167.064-.247.183-.247.048 0 .096.008.144.024.048.016.12.048.2.08.271.12.566.215.878.279.319.064.63.096.95.096.502 0 .894-.088 1.165-.264a.86.86 0 0 0 .415-.758.777.777 0 0 0-.215-.559c-.144-.151-.415-.287-.806-.415l-1.157-.36c-.583-.183-1.014-.454-1.277-.813a1.902 1.902 0 0 1-.4-1.158c0-.335.073-.63.216-.886.144-.255.336-.479.575-.654.24-.184.51-.32.83-.415.32-.096.655-.136 1.006-.136.176 0 .359.008.535.032.183.024.35.056.518.088.16.04.312.08.455.127.144.048.256.096.336.144a.69.69 0 0 1 .24.2.43.43 0 0 1 .071.263v.375c0 .168-.064.256-.184.256a.83.83 0 0 1-.303-.096 3.652 3.652 0 0 0-1.532-.311c-.455 0-.815.071-1.062.223-.248.152-.375.383-.375.71 0 .224.08.416.24.567.159.152.454.304.877.44l1.134.358c.574.184.99.44 1.237.767.247.327.367.702.367 1.117 0 .343-.072.655-.207.926-.144.272-.336.511-.583.703-.248.2-.543.343-.886.447-.36.111-.734.167-1.142.167z" }) });
1634
+ function CognitoButton({
1635
+ children = "Continue with AWS",
1636
+ redirectUri,
1637
+ identityProvider,
1638
+ onError,
1639
+ className = "",
1640
+ variant = "default",
1641
+ disabled = false
1642
+ }) {
1643
+ const { getCognitoOAuthUrl } = useGitHat();
1644
+ const [isLoading, setIsLoading] = (0, import_react17.useState)(false);
1645
+ const handleClick = (0, import_react17.useCallback)(async () => {
1646
+ if (isLoading || disabled) return;
1647
+ setIsLoading(true);
1648
+ try {
1649
+ const state = crypto.randomUUID();
1650
+ sessionStorage.setItem("githat_cognito_oauth_state", state);
1651
+ const { url } = await getCognitoOAuthUrl({ redirectUri, state, identityProvider });
1652
+ window.location.href = url;
1653
+ } catch (error) {
1654
+ setIsLoading(false);
1655
+ if (onError) {
1656
+ onError(error instanceof Error ? error : new Error("Failed to start Cognito OAuth"));
1657
+ }
1658
+ }
1659
+ }, [getCognitoOAuthUrl, redirectUri, identityProvider, onError, isLoading, disabled]);
1660
+ const baseStyles = "githat-cognito-button";
1661
+ const variantStyles = variant === "outline" ? "githat-cognito-button-outline" : "";
1662
+ const disabledStyles = disabled || isLoading ? "githat-cognito-button-disabled" : "";
1663
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1664
+ "button",
1665
+ {
1666
+ type: "button",
1667
+ onClick: handleClick,
1668
+ disabled: disabled || isLoading,
1669
+ className: `${baseStyles} ${variantStyles} ${disabledStyles} ${className}`.trim(),
1670
+ children: [
1671
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "githat-cognito-spinner" }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(AWSIcon, {}),
1672
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children })
1673
+ ]
1674
+ }
1675
+ );
1676
+ }
1677
+ if (typeof document !== "undefined") {
1678
+ const styleId = "githat-cognito-button-styles";
1679
+ if (!document.getElementById(styleId)) {
1680
+ const style = document.createElement("style");
1681
+ style.id = styleId;
1682
+ style.textContent = `
1683
+ .githat-cognito-button {
1684
+ display: inline-flex;
1685
+ align-items: center;
1686
+ justify-content: center;
1687
+ gap: 0.5rem;
1688
+ padding: 0.625rem 1rem;
1689
+ font-size: 0.875rem;
1690
+ font-weight: 500;
1691
+ border-radius: 0.375rem;
1692
+ border: none;
1693
+ cursor: pointer;
1694
+ transition: all 0.15s ease;
1695
+ background-color: #ff9900;
1696
+ color: #232f3e;
1697
+ width: 100%;
1698
+ }
1699
+ .githat-cognito-button:hover:not(:disabled) {
1700
+ background-color: #ec7211;
1701
+ }
1702
+ .githat-cognito-button-outline {
1703
+ background-color: transparent;
1704
+ color: #ff9900;
1705
+ border: 1px solid #ff9900;
1706
+ }
1707
+ .githat-cognito-button-outline:hover:not(:disabled) {
1708
+ background-color: rgba(255, 153, 0, 0.1);
1709
+ }
1710
+ .githat-cognito-button-disabled {
1711
+ opacity: 0.5;
1712
+ cursor: not-allowed;
1713
+ }
1714
+ .githat-cognito-spinner {
1715
+ width: 1rem;
1716
+ height: 1rem;
1717
+ border: 2px solid currentColor;
1718
+ border-top-color: transparent;
1719
+ border-radius: 50%;
1720
+ animation: githat-cognito-spin 0.6s linear infinite;
1721
+ }
1722
+ @keyframes githat-cognito-spin {
1723
+ to { transform: rotate(360deg); }
1724
+ }
1725
+ `;
1726
+ document.head.appendChild(style);
1727
+ }
1728
+ }
1729
+
1730
+ // src/components/CognitoCallback.tsx
1731
+ var import_react18 = require("react");
1732
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1733
+ function CognitoCallback({
1734
+ redirectUrl = "/dashboard",
1735
+ newUserRedirectUrl,
1736
+ onSuccess,
1737
+ onError,
1738
+ loadingComponent,
1739
+ errorComponent
1740
+ }) {
1741
+ const { signInWithCognito } = useGitHat();
1742
+ const { config } = useAuth();
1743
+ const [error, setError] = (0, import_react18.useState)(null);
1744
+ const [isProcessing, setIsProcessing] = (0, import_react18.useState)(true);
1745
+ (0, import_react18.useEffect)(() => {
1746
+ const handleCallback = async () => {
1747
+ const params = new URLSearchParams(window.location.search);
1748
+ const code = params.get("code");
1749
+ const state = params.get("state");
1750
+ const errorParam = params.get("error");
1751
+ const errorDescription = params.get("error_description");
1752
+ if (errorParam) {
1753
+ const errorMsg = errorDescription || errorParam;
1754
+ setError(errorMsg);
1755
+ setIsProcessing(false);
1756
+ if (onError) {
1757
+ onError(new Error(errorMsg));
1758
+ }
1759
+ return;
1760
+ }
1761
+ if (!code) {
1762
+ const errorMsg = "No authorization code received";
1763
+ setError(errorMsg);
1764
+ setIsProcessing(false);
1765
+ if (onError) {
1766
+ onError(new Error(errorMsg));
1767
+ }
1768
+ return;
1769
+ }
1770
+ const savedState = sessionStorage.getItem("githat_cognito_oauth_state");
1771
+ if (savedState && state !== savedState) {
1772
+ const errorMsg = "Invalid state parameter";
1773
+ setError(errorMsg);
1774
+ setIsProcessing(false);
1775
+ if (onError) {
1776
+ onError(new Error(errorMsg));
1777
+ }
1778
+ return;
1779
+ }
1780
+ sessionStorage.removeItem("githat_cognito_oauth_state");
1781
+ try {
1782
+ const result = await signInWithCognito(code);
1783
+ if (onSuccess) {
1784
+ onSuccess(result);
1785
+ }
1786
+ const targetUrl = result.isNewUser && newUserRedirectUrl ? newUserRedirectUrl : redirectUrl || config.afterSignInUrl || "/dashboard";
1787
+ window.location.href = targetUrl;
1788
+ } catch (err) {
1789
+ const errorMsg = err instanceof Error ? err.message : "Authentication failed";
1790
+ setError(errorMsg);
1791
+ setIsProcessing(false);
1792
+ if (onError) {
1793
+ onError(err instanceof Error ? err : new Error(errorMsg));
1794
+ }
1795
+ }
1796
+ };
1797
+ handleCallback();
1798
+ }, [signInWithCognito, redirectUrl, newUserRedirectUrl, config.afterSignInUrl, onSuccess, onError]);
1799
+ if (error) {
1800
+ if (errorComponent) {
1801
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: errorComponent(error) });
1802
+ }
1803
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "githat-callback-error", children: [
1804
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h2", { children: "Authentication Failed" }),
1805
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: error }),
1806
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("a", { href: "/sign-in", children: "Back to Sign In" })
1807
+ ] });
1808
+ }
1809
+ if (loadingComponent) {
1810
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: loadingComponent });
1811
+ }
1812
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "githat-callback-loading", children: [
1813
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "githat-callback-spinner" }),
1814
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: "Completing sign in with AWS Cognito..." })
1815
+ ] });
1816
+ }
1340
1817
  // Annotate the CommonJS export names for ESM import in node:
1341
1818
  0 && (module.exports = {
1342
1819
  ChangePasswordForm,
1820
+ CognitoButton,
1821
+ CognitoCallback,
1343
1822
  ForgotPasswordForm,
1344
1823
  GitHatProvider,
1824
+ GitHubButton,
1825
+ GitHubCallback,
1345
1826
  OrgSwitcher,
1346
1827
  ProtectedRoute,
1347
1828
  ResetPasswordForm,