Skip to content

feat: wire CryptoCheckout 4-step flow into billing page#63

Merged
TSavo merged 1 commit intomainfrom
feat/crypto-checkout-swap
Mar 24, 2026
Merged

feat: wire CryptoCheckout 4-step flow into billing page#63
TSavo merged 1 commit intomainfrom
feat/crypto-checkout-swap

Conversation

@TSavo
Copy link
Contributor

@TSavo TSavo commented Mar 24, 2026

Replaces flat token bar with 4-step crypto checkout: amount → coin/chain → deposit QR → confirmations. Fixes two pre-existing type errors from PR #62.

Summary by Sourcery

Integrate the multi-step CryptoCheckout flow into the billing credits page and tidy up supporting mocks and layout.

New Features:

  • Expose the CryptoCheckout component on the billing credits page in place of the previous crypto credits panel.

Bug Fixes:

  • Correct type usage in the framer-motion mock to align with React node typing and resolve prior type errors.

Enhancements:

  • Simplify and slightly restructure the CryptoCheckout component flow handling and layout without changing user-facing behavior.

Note

Wire CryptoCheckout 4-step flow into the billing credits page

Replaces BuyCryptoCreditPanel with CryptoCheckout in credits/page.tsx. Also removes the amountUsd prop from the PaymentMethodPicker call inside CryptoCheckout.

Macroscope summarized 6c329dd.

Summary by CodeRabbit

  • Tests

    • Updated test mocks with improved type safety for component props.
  • Refactor

    • Improved code formatting and organization in billing components.
    • Updated crypto checkout component integration on the credits page.

Replaces flat token bar (BuyCryptoCreditPanel) with 4-step flow:
amount → coin/chain picker → deposit address + QR → confirmation tracker.
Fixes PaymentMethodPicker amountUsd prop and test ReactNode type.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@TSavo TSavo merged commit 082c260 into main Mar 24, 2026
5 of 7 checks passed
@sourcery-ai
Copy link

sourcery-ai bot commented Mar 24, 2026

Reviewer's Guide

Replaces the previous crypto credits purchase panel with the new 4-step CryptoCheckout flow on the billing credits page and tidies up related types, tests, and UI wiring.

Sequence diagram for CryptoCheckout polling and status transitions

sequenceDiagram
  actor User
  participant BillingCreditsPage
  participant CryptoCheckout
  participant PaymentMethodPicker
  participant BackendAPI

  User->>BillingCreditsPage: Open billing credits page
  BillingCreditsPage->>CryptoCheckout: Render CryptoCheckout
  CryptoCheckout->>BackendAPI: getSupportedPaymentMethods
  BackendAPI-->>CryptoCheckout: methods

  User->>CryptoCheckout: Enter amount and continue
  CryptoCheckout->>PaymentMethodPicker: Render with methods and callbacks
  User->>PaymentMethodPicker: Select payment method
  PaymentMethodPicker-->>CryptoCheckout: onSelect(method)

  CryptoCheckout->>BackendAPI: Create checkout for method and amount
  BackendAPI-->>CryptoCheckout: checkoutId and initial status pending

  loop Poll until terminal status
    CryptoCheckout->>BackendAPI: getPaymentStatus(checkoutId)
    BackendAPI-->>CryptoCheckout: status and amounts
    alt status expired or failed
      CryptoCheckout->>CryptoCheckout: setStatus(expired or failed)
      CryptoCheckout->>CryptoCheckout: clear polling interval
    else full amount received and >= expected
      CryptoCheckout->>CryptoCheckout: setStatus(confirming)
      CryptoCheckout->>CryptoCheckout: setStep(confirming)
    else partial amount received
      CryptoCheckout->>CryptoCheckout: setStatus(partial)
    else still pending
      CryptoCheckout->>CryptoCheckout: keep polling
    end
  end

  alt status credited
    CryptoCheckout->>User: Show credited state and Done button
    User->>CryptoCheckout: Click Done buy more credits
    CryptoCheckout->>CryptoCheckout: handleReset and go back to amount step
  end
Loading

Class diagram for updated billing credits page and CryptoCheckout components

classDiagram
  class BillingCreditsPage {
    +render()
  }

  class BuyCreditsPanel {
    +render()
  }

  class CouponInput {
    +render()
  }

  class CryptoCheckout {
    -methods PaymentMethod[]
    -status PaymentStatus
    -step CryptoCheckoutStep
    -loading boolean
    +useEffect_loadMethods()
    +useEffect_pollStatus()
    +handleMethod(method PaymentMethod)
    +handleReset()
    +render()
  }

  class PaymentMethodPicker {
    +methods PaymentMethod[]
    +onSelect(method PaymentMethod)
    +onBack()
    +render()
  }

  class AutoTopupCard {
    +render()
  }

  class TransactionHistory {
    +render()
  }

  BillingCreditsPage --> BuyCreditsPanel : renders
  BillingCreditsPage --> CouponInput : renders
  BillingCreditsPage --> CryptoCheckout : renders
  BillingCreditsPage --> AutoTopupCard : renders
  BillingCreditsPage --> TransactionHistory : renders

  CryptoCheckout --> PaymentMethodPicker : renders
  CryptoCheckout --> PaymentMethod : uses

  class PaymentMethod {
    +id string
    +name string
    +coin string
    +chain string
  }

  class PaymentStatus {
    <<enumeration>>
    pending
    partial
    confirming
    credited
    expired
    failed
  }

  class CryptoCheckoutStep {
    <<enumeration>>
    amount
    method
    deposit
    confirming
  }

  CryptoCheckout --> PaymentStatus : uses
  CryptoCheckout --> CryptoCheckoutStep : uses
Loading

File-Level Changes

Change Details Files
Wire the new CryptoCheckout component into the billing credits page in place of the old crypto purchase panel.
  • Replace BuyCryptoCreditPanel usage with CryptoCheckout in the CreditsContent layout
  • Keep surrounding billing components (buy-credits, coupon, auto-topup, history) unchanged to preserve page structure
src/app/(dashboard)/billing/credits/page.tsx
Refine CryptoCheckout flow behavior and layout without changing overall logic.
  • Format and expand the motion.div animation props for clearer configuration
  • Split long polling condition that checks received vs expected amount into a multi-line conditional for readability
  • Reformat the getSupportedPaymentMethods effect to a multi-line promise chain with explicit catch
  • Remove unused amountUsd prop from PaymentMethodPicker invocation to match its current API
  • Improve button and status text layout by wrapping long JSX props across lines
src/components/billing/crypto-checkout.tsx
Tighten test mocks and fixture data for the CryptoCheckout feature to align with current component types.
  • Update framer-motion mock motion.div props type to include React.ReactNode children and an index signature, fixing prior type errors
  • Reformat mocked payment methods array into multi-line objects for readability while preserving data
  • Ensure mocked API responses (getSupportedPaymentMethods, createCheckout) still cover BTC and USDT test scenarios
src/__tests__/crypto-checkout.test.tsx

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai
Copy link

coderabbitai bot commented Mar 24, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 102fd8b0-8fe8-4e8e-a738-e1025bc43fce

📥 Commits

Reviewing files that changed from the base of the PR and between 9b54b7c and 6c329dd.

📒 Files selected for processing (3)
  • src/__tests__/crypto-checkout.test.tsx
  • src/app/(dashboard)/billing/credits/page.tsx
  • src/components/billing/crypto-checkout.tsx

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


📝 Walkthrough

Walkthrough

Three files are modified: test mocks are reformatted for clarity, a crypto payment component is swapped on the credits page, and the checkout component is refactored with improved formatting and a prop removal from a child component.

Changes

Cohort / File(s) Summary
Test Updates
src/__tests__/crypto-checkout.test.tsx
Strengthened motion.div mock type signature to accept children?: React.ReactNode and reformatted mocked payment method objects to multi-line literals without changing data semantics.
Page Component Swap
src/app/(dashboard)/billing/credits/page.tsx
Replaced BuyCryptoCreditPanel with CryptoCheckout component in the credits page render flow.
Checkout Component Refactoring
src/components/billing/crypto-checkout.tsx
Reordered imports, expanded promise handling and conditional logic to multi-line format, refactored JSX formatting, and removed amountUsd prop from PaymentMethodPicker component.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 A checkout transformed, cleaner and bright,
Components dance in refactored light,
Props trimmed away, the flow runs so smooth,
Tests now explicit, with nothing to lose! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/crypto-checkout-swap

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

🎉 This PR is included in version 1.26.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 1 issue, and left some high level feedback:

  • The getSupportedPaymentMethods call is swallowed on error and methods.length === 0 returns null, which means the crypto checkout silently disappears on failure; consider surfacing a minimal error or fallback state so the user understands why the option isn’t available.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `getSupportedPaymentMethods` call is swallowed on error and `methods.length === 0` returns `null`, which means the crypto checkout silently disappears on failure; consider surfacing a minimal error or fallback state so the user understands why the option isn’t available.

## Individual Comments

### Comment 1
<location path="src/components/billing/crypto-checkout.tsx" line_range="35" />
<code_context>
-    getSupportedPaymentMethods().then(setMethods).catch(() => {});
+    getSupportedPaymentMethods()
+      .then(setMethods)
+      .catch(() => {});
   }, []);

</code_context>
<issue_to_address>
**issue (bug_risk):** Swallowing errors in the payment methods fetch makes debugging and UX issues harder to detect.

This empty catch means network or backend failures when loading payment methods are ignored, potentially resulting in an empty UI (`methods.length === 0`) with no signal of the underlying issue. Please at least log the error (e.g., Sentry/console) or show a simple fallback state so production issues are detectable.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

getSupportedPaymentMethods().then(setMethods).catch(() => {});
getSupportedPaymentMethods()
.then(setMethods)
.catch(() => {});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Swallowing errors in the payment methods fetch makes debugging and UX issues harder to detect.

This empty catch means network or backend failures when loading payment methods are ignored, potentially resulting in an empty UI (methods.length === 0) with no signal of the underlying issue. Please at least log the error (e.g., Sentry/console) or show a simple fallback state so production issues are detectable.

@greptile-apps
Copy link

greptile-apps bot commented Mar 24, 2026

Greptile Summary

This PR wires the existing CryptoCheckout 4-step component (amount → coin/chain → deposit QR → confirmations) into the billing credits page, replacing the previous flat BuyCryptoCreditPanel. It also fixes two pre-existing TypeScript type errors: an extra amountUsd prop that was erroneously passed to PaymentMethodPicker (which never declared it), and a loose Record<string, unknown> type on the framer-motion mock that caused children to lose its type. Most changes in this PR are formatting-only reformats for Prettier compliance.

Key findings:

  • Silent checkout creation failure: handleMethod swallows errors with an empty catch block and no user-facing message. In a billing payment flow, this leaves users unable to distinguish a failed checkout from a slow one — a meaningful UX regression.
  • Stale confirmationsRequired on reset: handleReset zeros confirmations but not confirmationsRequired, meaning a second purchase could briefly show the wrong required confirmations in ConfirmationTracker until the first 5-second poll fires.
  • Redundant state updates in polling interval: After the full deposit amount is received, setStep("confirming") and setStatus("confirming") are called on every poll tick rather than only on the first transition, generating needless re-renders.

Confidence Score: 3/5

  • Safe to merge after addressing the silent checkout failure — a payment flow without error feedback is a meaningful UX regression.
  • The page-level wiring and TypeScript fixes are clean and low-risk. However, handleMethod silently swallows createCheckout errors with no user feedback in a billing payment flow, and handleReset leaves confirmationsRequired stale. Both are functional issues introduced or visible in the new code path.
  • src/components/billing/crypto-checkout.tsx — silent error handling in handleMethod and incomplete state reset in handleReset.

Important Files Changed

Filename Overview
src/components/billing/crypto-checkout.tsx Core 4-step checkout component. Two logic issues: silent failure on createCheckout error with no user feedback, and confirmationsRequired not cleared on handleReset.
src/app/(dashboard)/billing/credits/page.tsx Straightforward swap of BuyCryptoCreditPanel import for CryptoCheckout; no logic changes, clean integration.
src/tests/crypto-checkout.test.tsx Type fix for framer-motion mock and reformatting of mock data; two existing tests cover happy-path render and amount-to-picker navigation.

Sequence Diagram

sequenceDiagram
    participant U as User
    participant CC as CryptoCheckout
    participant API as @/lib/api (tRPC)

    U->>CC: Mount (billing page)
    CC->>API: getSupportedPaymentMethods()
    API-->>CC: SupportedPaymentMethod[]

    U->>CC: Select amount (AmountSelector)
    CC->>CC: setStep("method")

    U->>CC: Select payment method (PaymentMethodPicker)
    CC->>API: createCheckout(methodId, amountUsd)
    API-->>CC: CheckoutResult { depositAddress, referenceId, ... }
    CC->>CC: setStep("deposit")

    loop Poll every 5s while checkout active
        CC->>API: getChargeStatus(referenceId)
        API-->>CC: ChargeStatusResult
        alt credited === true
            CC->>CC: setStatus("credited"), clearInterval
        else status expired/failed
            CC->>CC: setStatus(status), clearInterval
        else amountReceived >= amountExpected
            CC->>CC: setStatus("confirming"), setStep("confirming")
        else amountReceived > 0
            CC->>CC: setStatus("partial")
        end
    end

    U->>CC: Click "Done — buy more credits"
    CC->>CC: handleReset() → setStep("amount")
Loading

Comments Outside Diff (2)

  1. src/components/billing/crypto-checkout.tsx, line 73-88 (link)

    P1 Silent checkout failure leaves user without feedback

    When createCheckout throws (network error, server validation error, rate limit, etc.), the catch block silently stays on the method step. In a billing payment flow, this is a meaningful UX issue — the loading spinner disappears and nothing indicates to the user that something went wrong. They may repeatedly tap the same payment method assuming it's loading, or assume the flow is broken.

    At minimum, a local error state should be surfaced:

    const handleMethod = useCallback(
      async (method: SupportedPaymentMethod) => {
        setLoading(true);
        setCheckoutError(null);
        try {
          const result = await createCheckout(method.id, amountUsd);
          setCheckout(result);
          setStatus("waiting");
          setStep("deposit");
        } catch {
          setCheckoutError("Failed to create checkout. Please try again.");
        } finally {
          setLoading(false);
        }
      },
      [amountUsd],
    );
    

    And render checkoutError below the PaymentMethodPicker similarly to how loading is rendered.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/components/billing/crypto-checkout.tsx
    Line: 73-88
    
    Comment:
    **Silent checkout failure leaves user without feedback**
    
    When `createCheckout` throws (network error, server validation error, rate limit, etc.), the `catch` block silently stays on the method step. In a billing payment flow, this is a meaningful UX issue — the loading spinner disappears and nothing indicates to the user that something went wrong. They may repeatedly tap the same payment method assuming it's loading, or assume the flow is broken.
    
    At minimum, a local error state should be surfaced:
    
    ```
    const handleMethod = useCallback(
      async (method: SupportedPaymentMethod) => {
        setLoading(true);
        setCheckoutError(null);
        try {
          const result = await createCheckout(method.id, amountUsd);
          setCheckout(result);
          setStatus("waiting");
          setStep("deposit");
        } catch {
          setCheckoutError("Failed to create checkout. Please try again.");
        } finally {
          setLoading(false);
        }
      },
      [amountUsd],
    );
    ```
    
    And render `checkoutError` below the `PaymentMethodPicker` similarly to how `loading` is rendered.
    
    How can I resolve this? If you propose a fix, please make it concise.
  2. src/components/billing/crypto-checkout.tsx, line 90-96 (link)

    P1 confirmationsRequired not reset in handleReset

    handleReset resets confirmations to 0 but omits confirmationsRequired. If a user completes a Bitcoin purchase (e.g. 3 confirmations required) and then immediately starts a new Ethereum checkout, the ConfirmationTracker will display the stale confirmationsRequired value until the first poll fires (up to 5 seconds after the deposit step is reached). This produces a misleading progress indicator.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/components/billing/crypto-checkout.tsx
    Line: 90-96
    
    Comment:
    **`confirmationsRequired` not reset in `handleReset`**
    
    `handleReset` resets `confirmations` to `0` but omits `confirmationsRequired`. If a user completes a Bitcoin purchase (e.g. 3 confirmations required) and then immediately starts a new Ethereum checkout, the `ConfirmationTracker` will display the stale `confirmationsRequired` value until the first poll fires (up to 5 seconds after the deposit step is reached). This produces a misleading progress indicator.
    
    
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/components/billing/crypto-checkout.tsx
Line: 73-88

Comment:
**Silent checkout failure leaves user without feedback**

When `createCheckout` throws (network error, server validation error, rate limit, etc.), the `catch` block silently stays on the method step. In a billing payment flow, this is a meaningful UX issue — the loading spinner disappears and nothing indicates to the user that something went wrong. They may repeatedly tap the same payment method assuming it's loading, or assume the flow is broken.

At minimum, a local error state should be surfaced:

```
const handleMethod = useCallback(
  async (method: SupportedPaymentMethod) => {
    setLoading(true);
    setCheckoutError(null);
    try {
      const result = await createCheckout(method.id, amountUsd);
      setCheckout(result);
      setStatus("waiting");
      setStep("deposit");
    } catch {
      setCheckoutError("Failed to create checkout. Please try again.");
    } finally {
      setLoading(false);
    }
  },
  [amountUsd],
);
```

And render `checkoutError` below the `PaymentMethodPicker` similarly to how `loading` is rendered.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/components/billing/crypto-checkout.tsx
Line: 90-96

Comment:
**`confirmationsRequired` not reset in `handleReset`**

`handleReset` resets `confirmations` to `0` but omits `confirmationsRequired`. If a user completes a Bitcoin purchase (e.g. 3 confirmations required) and then immediately starts a new Ethereum checkout, the `ConfirmationTracker` will display the stale `confirmationsRequired` value until the first poll fires (up to 5 seconds after the deposit step is reached). This produces a misleading progress indicator.

```suggestion
  const handleReset = useCallback(() => {
    setStep("amount");
    setCheckout(null);
    setStatus("waiting");
    setAmountUsd(0);
    setConfirmations(0);
    setConfirmationsRequired(0);
  }, []);
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/components/billing/crypto-checkout.tsx
Line: 52-58

Comment:
**Redundant `setStep("confirming")` on every poll**

Once the full amount is received but not yet credited, the condition `amountReceivedCents >= amountExpectedCents` remains true on every subsequent poll tick. This causes `setStep("confirming")` and `setStatus("confirming")` to be called redundantly on every 5-second interval, generating unnecessary re-renders.

```suggestion
        } else if (
          res.amountReceivedCents > 0 &&
          res.amountReceivedCents >= res.amountExpectedCents
        ) {
          setStatus((prev) => (prev !== "confirming" ? "confirming" : prev));
          setStep((prev) => (prev !== "confirming" ? "confirming" : prev));
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "feat: wire CryptoCheckout 4-step flow in..." | Re-trigger Greptile

Comment on lines +52 to 58
} else if (
res.amountReceivedCents > 0 &&
res.amountReceivedCents >= res.amountExpectedCents
) {
setStatus("confirming");
setStep("confirming");
} else if (res.amountReceivedCents > 0) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Redundant setStep("confirming") on every poll

Once the full amount is received but not yet credited, the condition amountReceivedCents >= amountExpectedCents remains true on every subsequent poll tick. This causes setStep("confirming") and setStatus("confirming") to be called redundantly on every 5-second interval, generating unnecessary re-renders.

Suggested change
} else if (
res.amountReceivedCents > 0 &&
res.amountReceivedCents >= res.amountExpectedCents
) {
setStatus("confirming");
setStep("confirming");
} else if (res.amountReceivedCents > 0) {
} else if (
res.amountReceivedCents > 0 &&
res.amountReceivedCents >= res.amountExpectedCents
) {
setStatus((prev) => (prev !== "confirming" ? "confirming" : prev));
setStep((prev) => (prev !== "confirming" ? "confirming" : prev));
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/components/billing/crypto-checkout.tsx
Line: 52-58

Comment:
**Redundant `setStep("confirming")` on every poll**

Once the full amount is received but not yet credited, the condition `amountReceivedCents >= amountExpectedCents` remains true on every subsequent poll tick. This causes `setStep("confirming")` and `setStatus("confirming")` to be called redundantly on every 5-second interval, generating unnecessary re-renders.

```suggestion
        } else if (
          res.amountReceivedCents > 0 &&
          res.amountReceivedCents >= res.amountExpectedCents
        ) {
          setStatus((prev) => (prev !== "confirming" ? "confirming" : prev));
          setStep((prev) => (prev !== "confirming" ? "confirming" : prev));
```

How can I resolve this? If you propose a fix, please make it concise.

@github-actions
Copy link

@claude Please fix all issues raised by the reviewers on this PR.

Feedback available from: greptile-apps[bot] and coderabbitai[bot]

Steps:

  1. Read every comment from greptile-apps[bot] and coderabbitai[bot] on this PR
  2. Fix every issue they flagged — bugs, security concerns, TypeScript issues, missing error handling, test gaps
  3. Commit and push fixes to this branch
  4. Remove the auto-fixing label from this PR

Do not close or delete the PR. Do not skip issues. If a reviewer flags something, fix it or leave a clear explanation as a PR comment.
5. Run gh pr merge --auto --squash --repo wopr-network/platform-ui-core 63 to queue it for merge once CI passes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant