Skip to content

feat: add getAllTransactionsIOS wrappers and docs updates#101

Merged
hyochan merged 1 commit into
mainfrom
feat/framework-wrappers-and-docs-improvements
Apr 16, 2026
Merged

feat: add getAllTransactionsIOS wrappers and docs updates#101
hyochan merged 1 commit into
mainfrom
feat/framework-wrappers-and-docs-improvements

Conversation

@hyochan
Copy link
Copy Markdown
Member

@hyochan hyochan commented Apr 16, 2026

Summary

  • Add getAllTransactionsIOS wrapper to all framework libraries (react-native-iap, expo-iap, flutter_inapp_purchase, godot-iap)
  • Fix button border clipping and dark mode text visibility in docs (.btn exclusion from a[target='_blank'] styles)
  • Fix SPM badge tag filter (apple-v* -> 2.*)
  • Add Claude Code ($200) and Codex ($100) to operational costs, domain -> ~$3
  • Expand "The Problem" section with Horizon OS, Vega OS, Fire OS, Galaxy Store, Onside etc.
  • Add Foundation draft notice

Follows up on #100

Test plan

  • react-native-iap tsc --noEmit — passed
  • expo-iap tsc --noEmit — passed
  • flutter_inapp_purchase flutter analyze — passed
  • docs tsc --noEmit + prettier — passed

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added new functionality to retrieve all iOS transactions across supported platforms.
  • Documentation

    • Added draft notice indicating governance section is in preparation.
    • Updated problem narrative to address expanding platform and store fragmentation.
    • Revised operational cost estimates to include AI assistant resources.
    • Improved version badge and link styling in documentation.
  • Style

    • Refined link styling in documentation pages.

@hyochan hyochan added the 🎯 feature New feature label Apr 16, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 2026

Warning

Rate limit exceeded

@hyochan has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 31 minutes and 19 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 31 minutes and 19 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 84b1d15e-96af-4e39-9a1d-d5967b32c008

📥 Commits

Reviewing files that changed from the base of the PR and between 5c0b018 and 3ab5e0e.

📒 Files selected for processing (19)
  • libraries/expo-iap/ios/ExpoIapModule.swift
  • libraries/expo-iap/src/modules/ios.ts
  • libraries/flutter_inapp_purchase/ios/Classes/FlutterInappPurchasePlugin.swift
  • libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart
  • libraries/godot-iap/addons/godot-iap/godot_iap.gd
  • libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift
  • libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt
  • libraries/react-native-iap/ios/HybridRnIap.swift
  • libraries/react-native-iap/src/__tests__/index.test.ts
  • libraries/react-native-iap/src/index.ts
  • libraries/react-native-iap/src/specs/RnIap.nitro.ts
  • packages/docs/src/pages/docs/foundation/founding-supporters.tsx
  • packages/docs/src/pages/docs/foundation/governance.tsx
  • packages/docs/src/pages/docs/foundation/one-pager.tsx
  • packages/docs/src/pages/docs/foundation/roadmap-budget.tsx
  • packages/docs/src/pages/docs/foundation/sponsorship.tsx
  • packages/docs/src/pages/docs/updates/releases.tsx
  • packages/docs/src/pages/docs/updates/versions.tsx
  • packages/docs/src/styles/documentation.css
📝 Walkthrough

Walkthrough

This PR adds a cross-platform getAllTransactionsIOS API across Expo IAP, React Native IAP, Flutter, and Godot libraries with native iOS bridge implementations, TypeScript/Dart wrappers, Android stubs, and documentation updates.

Changes

Cohort / File(s) Summary
iOS Native Bridges
libraries/expo-iap/ios/ExpoIapModule.swift, libraries/react-native-iap/ios/HybridRnIap.swift, libraries/flutter_inapp_purchase/ios/Classes/FlutterInappPurchasePlugin.swift
Added new iOS-only async methods that call OpenIapModule.shared.getAllTransactionsIOS(), serialize/convert transactions, sanitize payloads, and return results. React Native includes caching via purchasePayloadById; Flutter includes error handling with FlutterError.serviceError.
TypeScript/JavaScript Query Functions
libraries/expo-iap/src/modules/ios.ts, libraries/react-native-iap/src/index.ts
Added new exported async query functions that wrap native calls, return coerced PurchaseIOS[] arrays, handle platform checks, and include error parsing/standardization for React Native.
Hybrid Interface & Specs
libraries/react-native-iap/src/specs/RnIap.nitro.ts, libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt
Added method signature to Nitro interface; Android implementation throws FeatureNotSupported error.
Dart/Flutter Handler
libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart
Added iOS/macOS query handler that invokes native method, processes results via extractPurchases, and registers handler in QueryHandlers interface.
GDScript (Godot)
libraries/godot-iap/addons/godot-iap/godot_iap.gd
Added iOS-only public method that calls native plugin, parses JSON response, and maps transaction dictionaries to Types.PurchaseIOS objects.
Test Mock
libraries/react-native-iap/src/__tests__/index.test.ts
Added empty-array mock for getAllTransactionsIOS in test IAP object.
Documentation Pages
packages/docs/src/pages/docs/foundation/governance.tsx, packages/docs/src/pages/docs/foundation/one-pager.tsx, packages/docs/src/pages/docs/foundation/roadmap-budget.tsx, packages/docs/src/pages/docs/updates/versions.tsx
Added governance draft notice; expanded fragmentation narrative with additional platform/store links; updated operational costs table with new AI-assistant line items ($200 Claude, $100 Codex); updated Swift badge filter and added no-icon class to release links.
Link Styling
packages/docs/src/styles/documentation.css
Modified selectors to exclude .btn elements from documentation link styles (added :not(.btn) to base links, hover variants, and external-link icon rules).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

📱 iOS, 📖 documentation

Poem

🐰 Hops through platforms swift and wide,
Transactions gathered, none to hide,
From Swift to Kotlin, Dart in tow,
getAllTransactionsIOS steals the show!
While docs bloom bright with clearer sight.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the two main categories of changes: adding getAllTransactionsIOS wrappers across multiple frameworks and updating documentation/operational information.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/framework-wrappers-and-docs-improvements

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.

@hyochan hyochan added the 🍗 enhancement New feature or request label Apr 16, 2026
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request implements the getAllTransactionsIOS method across the Expo, Flutter, Godot, and React Native libraries to support retrieving the full StoreKit 2 transaction history on iOS. Additionally, it updates the documentation with a governance draft notice, expanded landscape details, and revised budget estimates. Feedback for the React Native iOS implementation suggests batching state updates on the MainActor to avoid unnecessary context switches and refining error handling to throw OpenIapException instead of returning an empty array on failure.

Comment thread libraries/react-native-iap/ios/HybridRnIap.swift
Comment thread libraries/react-native-iap/ios/HybridRnIap.swift
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/docs/src/styles/documentation.css (1)

569-580: ⚠️ Potential issue | 🟠 Major

Dark mode still applies external-link styling to .btn links.

You excluded .btn in light-mode target-blank rules, but the dark-mode rules at Line [652] and Line [658] still include .btn. This reintroduces dotted-border/link styling on buttons in dark theme.

Proposed fix
-:root.dark .doc-page a.external-link,
-:root.dark .doc-page a[target='_blank'] {
+:root.dark .doc-page a.external-link,
+:root.dark .doc-page a[target='_blank']:not(.btn) {
@@
-:root.dark .doc-page a.external-link:hover,
-:root.dark .doc-page a[target='_blank']:hover {
+:root.dark .doc-page a.external-link:hover,
+:root.dark .doc-page a[target='_blank']:not(.btn):hover {

Also applies to: 594-594

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/docs/src/styles/documentation.css` around lines 569 - 580, The
dark-mode CSS blocks still apply external-link styling to buttons; update the
dark-mode selectors (the ones matching .doc-page a.external-link:hover and
.doc-page a[target='_blank']:not(.btn):hover equivalents in the dark theme) to
also exclude .btn (e.g., use :not(.btn) where appropriate) so that buttons do
not receive the dotted-border/link styling in dark mode; make the same change
for the other affected selector mentioned (the one around the midpoint of the
external-link rules).
🧹 Nitpick comments (6)
packages/docs/src/pages/docs/foundation/one-pager.tsx (1)

33-100: Consider splitting this into shorter doc blocks for scannability.

Great content coverage, but this paragraph is very dense. Breaking it into 2–3 shorter paragraphs (or a short list of platforms/stores) would improve readability on docs pages.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/docs/src/pages/docs/foundation/one-pager.tsx` around lines 33 - 100,
The long dense JSX paragraph that lists platforms and stores (the block
containing the multiple <a> tags for Meta Horizon OS, Vega OS, Amazon Fire OS,
Galaxy Store, Amazon Appstore, Onside, Google Play, and Apple App Store) should
be split into 2–3 shorter paragraphs or converted to a short bulleted list to
improve scannability; update the JSX in the one-pager component so each logical
group (new platforms, alternative marketplaces, and established stores) is its
own <p> or an unordered list element, preserving the existing anchor tags,
spacing and rel/target attributes while keeping the original wording.
packages/docs/src/pages/docs/foundation/governance.tsx (1)

17-31: LGTM! Clean implementation of the draft notice.

The draft notice is well-styled, clearly visible, and appropriately positioned. The inline styles are consistent with the existing pattern in this file (see lines 392-396), and the use of CSS custom properties ensures theme compatibility.

Optional: If this draft notice pattern will be reused across other documentation pages, consider extracting it to a shared <DraftNotice> component to maintain consistency and reduce duplication.

♻️ Example extraction (if reuse is anticipated)

Create packages/docs/src/components/DraftNotice.tsx:

interface DraftNoticeProps {
  children: React.ReactNode;
}

export function DraftNotice({ children }: DraftNoticeProps) {
  return (
    <div
      style={{
        background: 'var(--bg-secondary)',
        border: '1px solid var(--border-color)',
        borderLeft: '3px solid var(--primary-color)',
        borderRadius: '4px',
        padding: '0.75rem 1rem',
        marginBottom: '1.5rem',
        fontSize: '0.9rem',
        color: 'var(--text-secondary)',
      }}
    >
      {children}
    </div>
  );
}

Then use it here:

<DraftNotice>
  <strong>Draft</strong> — The Foundation section is currently being
  prepared. Content may change as the governance structure is finalized.
</DraftNotice>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/docs/src/pages/docs/foundation/governance.tsx` around lines 17 - 31,
Approve the existing inline draft notice but optionally refactor it into a
reusable DraftNotice component: create a DraftNotice React component (e.g.,
export function DraftNotice({ children }: DraftNoticeProps)) that returns the
current styled div, move the hard-coded notice content into usage of
<DraftNotice> in governance.tsx, and replace the inline style block with the new
<DraftNotice> component to avoid duplication if this pattern will be reused
across docs.
libraries/expo-iap/src/modules/ios.ts (1)

360-365: Add JSDoc for the new exported getAllTransactionsIOS API.

Please add a short JSDoc block (params/returns/platform) like neighboring exports to keep the public surface consistent.

As per coding guidelines, “Add JSDoc comments for public functions and exported APIs.”

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@libraries/expo-iap/src/modules/ios.ts` around lines 360 - 365, Add a JSDoc
block above the exported getAllTransactionsIOS function (the export const
getAllTransactionsIOS: QueryField<'getAllTransactionsIOS'> = async () => { ...
}) matching the style of neighboring exports: short description, `@returns`
{Promise<PurchaseIOS[]>} describing the returned transactions array, and
`@platform` ios; note there are no params so omit `@param`. Ensure the comment sits
immediately above the export so the public API docs include it.
libraries/react-native-iap/src/index.ts (1)

1083-1107: Add JSDoc for this new public query export.

getAllTransactionsIOS is now part of the public API surface, so it should carry a short JSDoc block like adjacent exported wrappers.

Suggested doc block
+/**
+ * Get full StoreKit 2 transaction history (iOS only).
+ * Returns an empty array on non-iOS platforms.
+ * `@returns` Promise<PurchaseIOS[]> - All iOS transactions available from native StoreKit history
+ * `@platform` iOS
+ */
 export const getAllTransactionsIOS: QueryField<
   'getAllTransactionsIOS'
 > = async () => {
As per coding guidelines `**/*.{ts,tsx,js,jsx}: Add JSDoc comments for public functions and exported APIs`.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@libraries/react-native-iap/src/index.ts` around lines 1083 - 1107, Add a
JSDoc comment block above the exported getAllTransactionsIOS function describing
its purpose, platform behavior, return type and thrown errors; reference the
function name getAllTransactionsIOS and mention that it returns an array of
PurchaseIOS for iOS and an empty array on non-iOS platforms, and document that
it may throw a PurchaseError created by createPurchaseError (include param/docs
for possible error fields like code, message, responseCode, debugMessage)
following the style used by adjacent exported wrappers.
libraries/react-native-iap/src/__tests__/index.test.ts (1)

41-41: Add direct tests for getAllTransactionsIOS behavior.

This mock wiring is good, but there’s still no explicit test for the new wrapper’s iOS path, non‑iOS fallback ([]), and error normalization behavior.

Suggested test cases
+  describe('getAllTransactionsIOS', () => {
+    it('returns mapped purchases on iOS', async () => {
+      (Platform as any).OS = 'ios';
+      mockIap.getAllTransactionsIOS.mockResolvedValueOnce([
+        {
+          id: 't-all-1',
+          productId: 'sku.all.1',
+          transactionDate: Date.now(),
+          platform: 'ios',
+          store: 'apple',
+          quantity: 1,
+          purchaseState: 'purchased',
+          isAutoRenewing: false,
+        },
+      ]);
+      const result = await IAP.getAllTransactionsIOS();
+      expect(result).toHaveLength(1);
+      expect(result[0]?.productId).toBe('sku.all.1');
+    });
+
+    it('returns [] on non-iOS', async () => {
+      (Platform as any).OS = 'android';
+      await expect(IAP.getAllTransactionsIOS()).resolves.toEqual([]);
+    });
+  });
As per coding guidelines `**/*.test.{ts,tsx,js,jsx}: Write unit tests for all utility functions and business logic`.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@libraries/react-native-iap/src/__tests__/index.test.ts` at line 41, Add
explicit unit tests in libraries/react-native-iap/src/__tests__/index.test.ts to
cover the new iOS wrapper: write three tests that (1) assert
getAllTransactionsIOS is called and its results are returned on iOS, (2) assert
the non‑iOS fallback returns [] when platform is not iOS, and (3) assert error
normalization behavior by mocking getAllTransactionsIOS to throw and verifying
the wrapper converts the error into the expected normalized error shape;
reference the mock function getAllTransactionsIOS and the public wrapper (e.g.,
getAllTransactions or the exported function that calls getAllTransactionsIOS)
when arranging/mocking platform conditions.
libraries/react-native-iap/ios/HybridRnIap.swift (1)

720-744: Consider extracting shared transaction mapping/caching logic.

This block is nearly identical to getPendingTransactionsIOS(), which increases drift risk. A small private helper would keep behavior aligned.

♻️ Suggested refactor
 func getAllTransactionsIOS() throws -> Promise<[NitroPurchase]> {
     return Promise.async {
         do {
             RnIapLog.payload("getAllTransactionsIOS", nil)
             let all = try await OpenIapModule.shared.getAllTransactionsIOS()
-            var unionPurchases: [OpenIAP.Purchase] = []
-            for purchase in all {
-                let union = OpenIAP.Purchase.purchaseIos(purchase)
-                unionPurchases.append(union)
-                let raw = OpenIapSerialization.purchase(union)
-                if let identifier = raw["id"] as? String {
-                    await MainActor.run {
-                        self.purchasePayloadById[identifier] = raw
-                    }
-                }
-            }
-            let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(unionPurchases))
+            let payloads = try await self.mapAndCacheIosPurchases(all)
             RnIapLog.result("getAllTransactionsIOS", payloads)
             return payloads.map { RnIapHelper.convertPurchaseDictionary($0) }
         } catch {
             RnIapLog.failure("getAllTransactionsIOS", error: error)
             return []
         }
     }
 }
private func mapAndCacheIosPurchases(_ purchases: [PurchaseIOS]) async throws -> [[String: Any]] {
    var unionPurchases: [OpenIAP.Purchase] = []
    for purchase in purchases {
        let union = OpenIAP.Purchase.purchaseIos(purchase)
        unionPurchases.append(union)
        let raw = OpenIapSerialization.purchase(union)
        if let identifier = raw["id"] as? String {
            await MainActor.run { self.purchasePayloadById[identifier] = raw }
        }
    }
    return RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(unionPurchases))
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@libraries/react-native-iap/ios/HybridRnIap.swift` around lines 720 - 744, The
transaction mapping/caching logic in getAllTransactionsIOS is duplicated with
getPendingTransactionsIOS; extract it into a private async helper (e.g.,
mapAndCacheIosPurchases(_ purchases: [PurchaseIOS]) async -> [[String: Any]])
that converts each PurchaseIOS to OpenIAP.Purchase, serializes with
OpenIapSerialization.purchase, caches raw payloads into self.purchasePayloadById
on MainActor, then returns the sanitized array via
RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(...)); replace the loop
in both getAllTransactionsIOS and getPendingTransactionsIOS with a call to this
helper and then map the returned payloads with
RnIapHelper.convertPurchaseDictionary.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/docs/src/pages/docs/foundation/roadmap-budget.tsx`:
- Line 299: The total baseline cost shown as the fixed string
"<strong>~$380/month</strong>" should be changed to a range to reflect the
variability from the CI cost line ("GitHub Actions CI/CD: $0–50"); update the
markup in roadmap-budget.tsx so the total reads something like a range (e.g.,
"~$330–$380/month" or similar) instead of a single value, modifying the element
that currently renders "<strong>~$380/month</strong>" to compute or hardcode the
matching range.

In `@packages/docs/src/styles/documentation.css`:
- Around line 556-563: Stylelint fails because chained :not() pseudo-classes are
used in the selectors like ".doc-page a:not(.anchor-link):not(.btn)" and its
hover variant; replace chained :not() with a single :not() using complex-list
notation, e.g. change ".doc-page a:not(.anchor-link):not(.btn)" to ".doc-page
a:not(.anchor-link, .btn)" and likewise update the hover selector and the other
occurrence (the selector at the later block that also uses
:not(.anchor-link):not(.btn)) so all rules use :not(.anchor-link, .btn) instead
of chained :not().

---

Outside diff comments:
In `@packages/docs/src/styles/documentation.css`:
- Around line 569-580: The dark-mode CSS blocks still apply external-link
styling to buttons; update the dark-mode selectors (the ones matching .doc-page
a.external-link:hover and .doc-page a[target='_blank']:not(.btn):hover
equivalents in the dark theme) to also exclude .btn (e.g., use :not(.btn) where
appropriate) so that buttons do not receive the dotted-border/link styling in
dark mode; make the same change for the other affected selector mentioned (the
one around the midpoint of the external-link rules).

---

Nitpick comments:
In `@libraries/expo-iap/src/modules/ios.ts`:
- Around line 360-365: Add a JSDoc block above the exported
getAllTransactionsIOS function (the export const getAllTransactionsIOS:
QueryField<'getAllTransactionsIOS'> = async () => { ... }) matching the style of
neighboring exports: short description, `@returns` {Promise<PurchaseIOS[]>}
describing the returned transactions array, and `@platform` ios; note there are no
params so omit `@param`. Ensure the comment sits immediately above the export so
the public API docs include it.

In `@libraries/react-native-iap/ios/HybridRnIap.swift`:
- Around line 720-744: The transaction mapping/caching logic in
getAllTransactionsIOS is duplicated with getPendingTransactionsIOS; extract it
into a private async helper (e.g., mapAndCacheIosPurchases(_ purchases:
[PurchaseIOS]) async -> [[String: Any]]) that converts each PurchaseIOS to
OpenIAP.Purchase, serializes with OpenIapSerialization.purchase, caches raw
payloads into self.purchasePayloadById on MainActor, then returns the sanitized
array via RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(...));
replace the loop in both getAllTransactionsIOS and getPendingTransactionsIOS
with a call to this helper and then map the returned payloads with
RnIapHelper.convertPurchaseDictionary.

In `@libraries/react-native-iap/src/__tests__/index.test.ts`:
- Line 41: Add explicit unit tests in
libraries/react-native-iap/src/__tests__/index.test.ts to cover the new iOS
wrapper: write three tests that (1) assert getAllTransactionsIOS is called and
its results are returned on iOS, (2) assert the non‑iOS fallback returns [] when
platform is not iOS, and (3) assert error normalization behavior by mocking
getAllTransactionsIOS to throw and verifying the wrapper converts the error into
the expected normalized error shape; reference the mock function
getAllTransactionsIOS and the public wrapper (e.g., getAllTransactions or the
exported function that calls getAllTransactionsIOS) when arranging/mocking
platform conditions.

In `@libraries/react-native-iap/src/index.ts`:
- Around line 1083-1107: Add a JSDoc comment block above the exported
getAllTransactionsIOS function describing its purpose, platform behavior, return
type and thrown errors; reference the function name getAllTransactionsIOS and
mention that it returns an array of PurchaseIOS for iOS and an empty array on
non-iOS platforms, and document that it may throw a PurchaseError created by
createPurchaseError (include param/docs for possible error fields like code,
message, responseCode, debugMessage) following the style used by adjacent
exported wrappers.

In `@packages/docs/src/pages/docs/foundation/governance.tsx`:
- Around line 17-31: Approve the existing inline draft notice but optionally
refactor it into a reusable DraftNotice component: create a DraftNotice React
component (e.g., export function DraftNotice({ children }: DraftNoticeProps))
that returns the current styled div, move the hard-coded notice content into
usage of <DraftNotice> in governance.tsx, and replace the inline style block
with the new <DraftNotice> component to avoid duplication if this pattern will
be reused across docs.

In `@packages/docs/src/pages/docs/foundation/one-pager.tsx`:
- Around line 33-100: The long dense JSX paragraph that lists platforms and
stores (the block containing the multiple <a> tags for Meta Horizon OS, Vega OS,
Amazon Fire OS, Galaxy Store, Amazon Appstore, Onside, Google Play, and Apple
App Store) should be split into 2–3 shorter paragraphs or converted to a short
bulleted list to improve scannability; update the JSX in the one-pager component
so each logical group (new platforms, alternative marketplaces, and established
stores) is its own <p> or an unordered list element, preserving the existing
anchor tags, spacing and rel/target attributes while keeping the original
wording.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 23bfe2e8-697a-4cda-ad80-63b2c4c2bfd4

📥 Commits

Reviewing files that changed from the base of the PR and between cdee78d and 5c0b018.

📒 Files selected for processing (15)
  • libraries/expo-iap/ios/ExpoIapModule.swift
  • libraries/expo-iap/src/modules/ios.ts
  • libraries/flutter_inapp_purchase/ios/Classes/FlutterInappPurchasePlugin.swift
  • libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart
  • libraries/godot-iap/addons/godot-iap/godot_iap.gd
  • libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt
  • libraries/react-native-iap/ios/HybridRnIap.swift
  • libraries/react-native-iap/src/__tests__/index.test.ts
  • libraries/react-native-iap/src/index.ts
  • libraries/react-native-iap/src/specs/RnIap.nitro.ts
  • packages/docs/src/pages/docs/foundation/governance.tsx
  • packages/docs/src/pages/docs/foundation/one-pager.tsx
  • packages/docs/src/pages/docs/foundation/roadmap-budget.tsx
  • packages/docs/src/pages/docs/updates/versions.tsx
  • packages/docs/src/styles/documentation.css

Comment thread packages/docs/src/pages/docs/foundation/roadmap-budget.tsx Outdated
Comment thread packages/docs/src/styles/documentation.css Outdated
@hyochan hyochan force-pushed the feat/framework-wrappers-and-docs-improvements branch 3 times, most recently from 4e01eb3 to 13206e6 Compare April 16, 2026 16:58
Framework Libraries:
- Add getAllTransactionsIOS wrapper to react-native-iap, expo-iap,
  flutter_inapp_purchase, and godot-iap (GDScript + iOS GDExtension)

Docs:
- Fix button border clipping and dark mode text (.btn exclusion
  from doc-page link styles, using :not(.anchor-link, .btn) notation)
- Fix SPM badge tag filter (apple-v* -> 2.*)
- Add Claude Code and Codex to operational costs, domain -> ~$3
- Expand "The Problem" with Horizon OS, Vega OS, HarmonyOS, Fire OS,
  Galaxy Store, Huawei AppGallery, Onside (with official links)
- Add Foundation draft notice to all foundation pages
- Add framework library patch releases to release notes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@hyochan hyochan force-pushed the feat/framework-wrappers-and-docs-improvements branch from 13206e6 to 3ab5e0e Compare April 16, 2026 17:13
@hyochan hyochan merged commit 2647777 into main Apr 16, 2026
13 checks passed
@hyochan hyochan deleted the feat/framework-wrappers-and-docs-improvements branch April 16, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🍗 enhancement New feature or request 🎯 feature New feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant