Skip to content

Match UI of MyListing and Home#80

Merged
evan-taylor merged 2 commits intodevfrom
feature/POLY-61/Listing-UI
Apr 16, 2026
Merged

Match UI of MyListing and Home#80
evan-taylor merged 2 commits intodevfrom
feature/POLY-61/Listing-UI

Conversation

@mattphanm
Copy link
Copy Markdown
Collaborator

@mattphanm mattphanm commented Apr 16, 2026

Closes #61
Linear: POLY-61 (e.g., POLY-123)

Summary

Match UI of MyListing Page with Home Page + Refactored layout on Home Page (Suggestion)

  • 2 Columns, Reduced gap between listings, decreased font size, pushed font size to true border of listing image

How to Test

Steps to verify locally:

  • npm run lint
  • npm run typecheck
  • npm test
  • Manual flow:
    1. npm run dev:backend (in terminal A)
    2. npm run dev (in terminal B)
    3. Verify the change: <describe expected behavior/screens>

Checklist

  • Tests added/updated (if applicable)
  • Lint/tests pass locally (npm run lint)
  • Docs updated (README/ADR/changelog if needed)
  • Follows conventional commit format
  • No merge conflicts with dev

Screenshots / Demos

image

Summary by CodeRabbit

Release Notes

  • New Features

    • Added flat shell style variant for listing cards
  • Style

    • Refined header, search bar, and listing card styling with improved design tokens
    • Updated responsive layout breakpoints for optimal mobile and tablet experiences
    • Enhanced app-wide typography, spacing, and border radius consistency
  • Chores

    • Configured iOS application build infrastructure, Xcode projects, and runtime settings

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 16, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
poly-buys Ready Ready Preview, Comment Apr 16, 2026 1:05pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 16, 2026

Warning

Rate limit exceeded

@evan-taylor has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 51 minutes and 18 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 51 minutes and 18 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2da52037-66e6-477a-990a-1ed240a6ca87

📥 Commits

Reviewing files that changed from the base of the PR and between 21c9dc9 and 023061a.

📒 Files selected for processing (5)
  • frontend/app/(tabs)/_layout.tsx
  • frontend/app/(tabs)/index.tsx
  • frontend/app/(tabs)/my-listings.tsx
  • frontend/components/FilterBar.tsx
  • frontend/components/ListingCard.tsx
📝 Walkthrough

Walkthrough

Adds comprehensive iOS native Xcode build configuration (project files, CocoaPods integration, app delegate, assets, and plist) for the PolyBuys app. Updates frontend UI components with refined theme-based styling tokens, introduces a flat shell style variant for listing cards, and adjusts responsive layout logic.

Changes

Cohort / File(s) Summary
Frontend Layout & Navigation
frontend/app/(tabs)/_layout.tsx, frontend/app/(tabs)/index.tsx, frontend/app/(tabs)/my-listings.tsx
Updated web header styling with theme tokens (colors.surface, spacing, borderRadius), adjusted search control dimensions and border styling. Simplified mobile/tablet layout by removing desktop-specific hero card rendering. Changed ListingCard usage to include shellStyle="flat". Replaced responsive column-count logic in My Listings with fixed 2-column layout.
Frontend Component Styling
frontend/components/ListingCard.tsx, frontend/components/FilterBar.tsx
Added new ListingCardShellStyle type and optional shellStyle prop to ListingCard enabling flat shell variant with updated image heights, typography, and card surface styling. Removed border/color settings on flat shell. Reduced FilterBar bottom margin from 12 to 0.
iOS Build Configuration
frontend/ios/Podfile, frontend/ios/Podfile.properties.json, frontend/ios/.xcode.env, frontend/ios/.gitignore
Added CocoaPods Podfile with React Native/Expo autolinking, Fabric configuration, Hermes setup, and build phase hooks. Added environment variable setup for Node binary resolution. Configured Hermes JS engine and dev client inspector flags. Added macOS/Xcode artifact ignore rules.
iOS Xcode Project Files
frontend/ios/PolyBuys.xcodeproj/project.pbxproj, frontend/ios/PolyBuys.xcodeproj/xcshareddata/xcschemes/PolyBuys.xcscheme, frontend/ios/PolyBuys.xcworkspace/contents.xcworkspacedata
Defined complete Xcode project structure with Swift source compilation, app resources, CocoaPods framework integration, build phases (manifests, Expo config, React bundling, Sentry), and debug/release configurations. Added scheme for app build/test/run actions. Declared workspace structure referencing project and Pods.
iOS App Source & Configuration
frontend/ios/PolyBuys/AppDelegate.swift, frontend/ios/PolyBuys/PolyBuys-Bridging-Header.h, frontend/ios/PolyBuys/Info.plist, frontend/ios/PolyBuys/PolyBuys.entitlements
Implemented Expo app delegate with React Native initialization, deep-link/universal-link handling, and bundle URL resolution (Metro for debug, bundled JS for release). Added URL schemes (polybuys, com.polybuys.polybuys, exp+polybuy). Configured app transport security, entitlements for universal links, and launch storyboard.
iOS Assets & Supporting Files
frontend/ios/PolyBuys/Images.xcassets/...*, frontend/ios/PolyBuys/SplashScreen.storyboard, frontend/ios/PolyBuys/Supporting/Expo.plist, frontend/ios/PolyBuys/PrivacyInfo.xcprivacy, frontend/ios/sentry.properties
Added app icons, splash screen images/colors, storyboard-based launch screen, privacy manifest with API tracking declarations, and Sentry configuration. Configured Expo updates behavior (disabled with zero wait time) and app privacy settings.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • jaydonkc

Poem

🐰 Hops with glee through native ground,
Xcode schemes and pods abound!
Cards now wear their flattest shell,
iOS builds with tokens well.
Layout tokens dance and play,
PolyBuys ships another day! 🚀

🚥 Pre-merge checks | ✅ 1 | ❌ 4

❌ Failed checks (3 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning This PR implements UI/styling changes to match MyListing and Home layouts. However, the linked issue #61 specifies building status filtering, action sheets, error handling, and listing management features—none of which are present in these changes, which focus only on visual styling and layout adjustments. The PR changes are limited to styling and layout refactoring. To meet issue #61 requirements, implement status filtering, action sheets for listing operations, error handling improvements, and listing management UI updates.
Out of Scope Changes check ⚠️ Warning The PR includes extensive iOS build configuration files (Podfile, Xcode project, AppDelegate, entitlements, plist files) that are unrelated to the stated objective of matching UI between MyListing and Home pages, introducing significant out-of-scope infrastructure additions. Remove iOS-specific build configuration files (Podfile, project.pbxproj, AppDelegate.swift, Info.plist, entitlements, storyboards, privacy manifests, etc.) unless iOS app setup is a documented requirement for this PR's scope.
Docstring Coverage ⚠️ Warning Docstring coverage is 30.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description includes most required sections but lacks detailed testing instructions and verification details for the UI changes mentioned. Add specific verification steps for the UI changes (e.g., 'verify 2-column grid layout on Home page', 'confirm reduced gaps and font sizes match design') and clearly describe expected behavior for each modified screen (Home, MyListings, and filter bar).
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Match UI of MyListing and Home' clearly summarizes the main change: aligning the UI appearance between the MyListing page and Home page, which is the core objective of this PR.

✏️ 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 feature/POLY-61/Listing-UI

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.

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: 6

Caution

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

⚠️ Outside diff range comments (1)
frontend/app/(tabs)/index.tsx (1)

570-574: ⚠️ Potential issue | 🟡 Minor

Dead code: isDesktopWeb is always false in the mobile branch.

Since this code is inside the mobile (non-web) render path (after line 489's web return), isDesktopWeb will always be false here because isDesktopWeb = isWeb && width >= 1024. The listContainerDesktop style will never be applied.

🧹 Proposed fix
             contentContainerStyle={[
               styles.listContainer,
-              isDesktopWeb && styles.listContainerDesktop,
               { paddingBottom: Math.max(insets.bottom + 60, 80) },
             ]}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/app/`(tabs)/index.tsx around lines 570 - 574, The conditional styles
array in contentContainerStyle contains a dead branch: isDesktopWeb &&
styles.listContainerDesktop will always be false inside the mobile (non-web)
render path; remove that check and the unreachable styles.listContainerDesktop
from the mobile branch (or replace it with the intended mobile style, e.g.,
styles.listContainerMobile) so contentContainerStyle only includes relevant
styles (keep styles.listContainer and the paddingBottom object); refer to
isDesktopWeb, styles.listContainerDesktop and contentContainerStyle to locate
and update the code.
🧹 Nitpick comments (2)
frontend/components/ListingCard.tsx (1)

239-240: Consider removing unused style objects.

imageContainerHome and imageContainerHomeWeb are empty objects that have no effect when applied. If they're not intended as placeholders for future styling, consider removing them and their references in lines 143-144 to reduce noise.

♻️ Proposed cleanup
           <View
             style={[
               styles.imageContainer,
-              isHomeDensity && styles.imageContainerHome,
-              isHomeDensity && isWeb && styles.imageContainerHomeWeb,
             ]}
           >

And remove the style definitions:

   imageContainer: {
     width: '100%',
     height: LISTING_IMAGE_HEIGHT,
     backgroundColor: colors.surface,
     borderRadius: borderRadius.sm,
     overflow: 'hidden',
     position: 'relative',
   },
-  imageContainerHome: {},
-  imageContainerHomeWeb: {},
   saveButton: {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/components/ListingCard.tsx` around lines 239 - 240, Remove the
unused empty style objects imageContainerHome and imageContainerHomeWeb from the
ListingCard component's styles and delete any references to them in the
component JSX (where those styles are spread/applied around the image container,
previously referenced near the image rendering code). If these were intended as
placeholders, either add the intended styles or replace their usages with the
appropriate existing style object (e.g., imageContainer or imageContainerWeb);
otherwise remove both the definitions and their usages to clean up dead code.
frontend/app/(tabs)/index.tsx (1)

294-305: Consider simplifying the nested ternary for readability.

The contentPadding calculation has deeply nested ternaries that are difficult to follow. Consider extracting this into a helper function or using a more explicit conditional structure.

♻️ Proposed refactor
-  const contentPadding = isWeb
-    ? isDesktopWeb
-      ? spacing.xl
-      : width >= 900
-        ? spacing.lg
-        : 10
-    : width >= 900
-      ? spacing.xxl
-      : isCompactLayout
-        ? spacing.md
-        : spacing.lg;
+  const contentPadding = (() => {
+    if (isWeb) {
+      if (isDesktopWeb) return spacing.xl;
+      if (width >= 900) return spacing.lg;
+      return 10;
+    }
+    if (width >= 900) return spacing.xxl;
+    if (isCompactLayout) return spacing.md;
+    return spacing.lg;
+  })();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/app/`(tabs)/index.tsx around lines 294 - 305, The nested ternary
calculating contentPadding (using isCompactLayout, isWeb, isDesktopWeb, width,
and spacing) is hard to read; refactor it into a small helper function (e.g.,
getContentPadding) or replace with an explicit if/else/switch so the branching
is clear: evaluate isWeb first, then isDesktopWeb/width cases, and finally the
non-web width/isCompactLayout cases, returning the appropriate spacing value;
update the contentPadding assignment to call the new helper to improve
readability and maintain the same return values.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@frontend/ios/.xcode.env`:
- Line 11: The export of NODE_BINARY using command -v node can be empty in
non-interactive Xcode shells, so add a guard immediately after setting
NODE_BINARY to detect an empty value and fail fast: check if "$NODE_BINARY" is
unset or empty and print a clear error message (e.g., "Node binary not found;
ensure Node is installed and in PATH for Xcode build") then exit with non-zero
status; reference the NODE_BINARY variable and the build script invocations that
use "$NODE_BINARY" so maintainers can locate and verify the guard is placed
before any usage.

In `@frontend/ios/Podfile.properties.json`:
- Around line 2-3: The EX_DEV_CLIENT_NETWORK_INSPECTOR flag is hardcoded to
"true" in Podfile.properties.json and unconditionally applied in the Podfile;
remove this hardcoded entry or gate its export in the Podfile so it only applies
to dev-client/Debug builds. Modify Podfile.properties.json to omit
EX_DEV_CLIENT_NETWORK_INSPECTOR (or set it via CI/dev-only script), and in the
Podfile update the logic around the export of
ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] (the conditional that currently sets it
on line ~17) to check the build scheme or a DEV_CLIENT env var (e.g., only set
when config == "Debug" or when ENV['DEV_CLIENT'] == "1") before exporting it.
Ensure references to EX_DEV_CLIENT_NETWORK_INSPECTOR in Podfile and any build
scripts are updated to match this conditional behavior.

In `@frontend/ios/PolyBuys.xcodeproj/project.pbxproj`:
- Line 494: The LIBRARY_SEARCH_PATHS entry is malformed: fix the quoted path
separation so the SDK path and the inherited token are two separate
space-separated quoted entries (replace the single quoted string containing
escaped quotes with two quoted values), e.g., change the LIBRARY_SEARCH_PATHS
value to have "$(SDKROOT)/usr/lib/swift" "$(inherited)"; update both occurrences
of the LIBRARY_SEARCH_PATHS setting (Debug and Release configs) to use this
corrected syntax.

In `@frontend/ios/PolyBuys.xcodeproj/xcshareddata/xcschemes/PolyBuys.xcscheme`:
- Around line 31-39: The scheme's TestableReference block references a
non-existent test target (BuildableName/BlueprintName "PolyBuysTests" with
BlueprintIdentifier "00E356ED1AD99517003FC87E"); remove or fix that
TestableReference in the TestAction: either delete the entire <TestableReference
...>...</TestableReference> entry if you don't have tests yet, or replace
BlueprintName/BuildableName and BlueprintIdentifier with the actual target
values for "PolyBuys" (use the real BlueprintIdentifier from your
project.pbxproj) so the TestAction points to a valid buildable.

In `@frontend/ios/PolyBuys/AppDelegate.swift`:
- Line 1: Remove the invalid access-level modifier on the import by changing the
import statement in AppDelegate.swift (the line with "internal import Expo") to
a plain import; locate the import in the AppDelegate.swift top-level imports and
delete the "internal" token so it uses "import Expo" for Swift 5.0
compatibility.

In `@frontend/ios/PolyBuys/PolyBuys.entitlements`:
- Around line 5-6: The entitlements file currently hardcodes the APNs
environment via the aps-environment key in PolyBuys.entitlements; update it to
use a build variable instead and add the corresponding build settings: replace
the literal string value for aps-environment with the variable reference
$(APS_ENVIRONMENT) in PolyBuys.entitlements, then define
APS_ENVIRONMENT=development for the Debug configuration and
APS_ENVIRONMENT=production for the Release configuration (or alternatively
create separate entitlements files per configuration and point each build
configuration to the appropriate file).

---

Outside diff comments:
In `@frontend/app/`(tabs)/index.tsx:
- Around line 570-574: The conditional styles array in contentContainerStyle
contains a dead branch: isDesktopWeb && styles.listContainerDesktop will always
be false inside the mobile (non-web) render path; remove that check and the
unreachable styles.listContainerDesktop from the mobile branch (or replace it
with the intended mobile style, e.g., styles.listContainerMobile) so
contentContainerStyle only includes relevant styles (keep styles.listContainer
and the paddingBottom object); refer to isDesktopWeb,
styles.listContainerDesktop and contentContainerStyle to locate and update the
code.

---

Nitpick comments:
In `@frontend/app/`(tabs)/index.tsx:
- Around line 294-305: The nested ternary calculating contentPadding (using
isCompactLayout, isWeb, isDesktopWeb, width, and spacing) is hard to read;
refactor it into a small helper function (e.g., getContentPadding) or replace
with an explicit if/else/switch so the branching is clear: evaluate isWeb first,
then isDesktopWeb/width cases, and finally the non-web width/isCompactLayout
cases, returning the appropriate spacing value; update the contentPadding
assignment to call the new helper to improve readability and maintain the same
return values.

In `@frontend/components/ListingCard.tsx`:
- Around line 239-240: Remove the unused empty style objects imageContainerHome
and imageContainerHomeWeb from the ListingCard component's styles and delete any
references to them in the component JSX (where those styles are spread/applied
around the image container, previously referenced near the image rendering
code). If these were intended as placeholders, either add the intended styles or
replace their usages with the appropriate existing style object (e.g.,
imageContainer or imageContainerWeb); otherwise remove both the definitions and
their usages to clean up dead code.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 43d0cc22-a2a8-4c4d-9beb-d836b4e3a730

📥 Commits

Reviewing files that changed from the base of the PR and between 9e5c87d and 21c9dc9.

⛔ Files ignored due to path filters (5)
  • frontend/ios/Podfile.lock is excluded by !**/*.lock
  • frontend/ios/PolyBuys/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png is excluded by !**/*.png
  • frontend/ios/PolyBuys/Images.xcassets/SplashScreenLegacy.imageset/image.png is excluded by !**/*.png
  • frontend/ios/PolyBuys/Images.xcassets/SplashScreenLegacy.imageset/image@2x.png is excluded by !**/*.png
  • frontend/ios/PolyBuys/Images.xcassets/SplashScreenLegacy.imageset/image@3x.png is excluded by !**/*.png
📒 Files selected for processing (24)
  • frontend/app/(tabs)/_layout.tsx
  • frontend/app/(tabs)/index.tsx
  • frontend/app/(tabs)/my-listings.tsx
  • frontend/components/FilterBar.tsx
  • frontend/components/ListingCard.tsx
  • frontend/ios/.gitignore
  • frontend/ios/.xcode.env
  • frontend/ios/Podfile
  • frontend/ios/Podfile.properties.json
  • frontend/ios/PolyBuys.xcodeproj/project.pbxproj
  • frontend/ios/PolyBuys.xcodeproj/xcshareddata/xcschemes/PolyBuys.xcscheme
  • frontend/ios/PolyBuys.xcworkspace/contents.xcworkspacedata
  • frontend/ios/PolyBuys/AppDelegate.swift
  • frontend/ios/PolyBuys/Images.xcassets/AppIcon.appiconset/Contents.json
  • frontend/ios/PolyBuys/Images.xcassets/Contents.json
  • frontend/ios/PolyBuys/Images.xcassets/SplashScreenBackground.colorset/Contents.json
  • frontend/ios/PolyBuys/Images.xcassets/SplashScreenLegacy.imageset/Contents.json
  • frontend/ios/PolyBuys/Info.plist
  • frontend/ios/PolyBuys/PolyBuys-Bridging-Header.h
  • frontend/ios/PolyBuys/PolyBuys.entitlements
  • frontend/ios/PolyBuys/PrivacyInfo.xcprivacy
  • frontend/ios/PolyBuys/SplashScreen.storyboard
  • frontend/ios/PolyBuys/Supporting/Expo.plist
  • frontend/ios/sentry.properties

Comment thread frontend/ios/.xcode.env Outdated
# Customize the NODE_BINARY variable here.
# For example, to use nvm with brew, add the following line
# . "$(brew --prefix nvm)/nvm.sh" --no-use
export NODE_BINARY=$(command -v node)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify how NODE_BINARY is consumed across Xcode scripts.
rg -n '\$NODE_BINARY|\$\{NODE_BINARY:-node\}|source "\$PODS_ROOT/\.\./\.xcode\.env"' frontend/ios/PolyBuys.xcodeproj/project.pbxproj

Repository: codebox-calpoly/PolyBuys

Length of output: 1866


Add a guard to fail fast if Node binary cannot be found.

The Xcode build script (line 223 of project.pbxproj) directly invokes "$NODE_BINARY" multiple times without a fallback. If command -v node returns empty in Xcode's non-interactive shell environment, these calls will fail and break the iOS build.

Proposed change
-export NODE_BINARY=$(command -v node)
+NODE_BINARY="$(command -v node || true)"
+if [ -z "$NODE_BINARY" ]; then
+  echo "error: node binary not found in PATH. Set NODE_BINARY in .xcode.env.local." >&2
+  exit 1
+fi
+export NODE_BINARY
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export NODE_BINARY=$(command -v node)
NODE_BINARY="$(command -v node || true)"
if [ -z "$NODE_BINARY" ]; then
echo "error: node binary not found in PATH. Set NODE_BINARY in .xcode.env.local." >&2
exit 1
fi
export NODE_BINARY
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/ios/.xcode.env` at line 11, The export of NODE_BINARY using command
-v node can be empty in non-interactive Xcode shells, so add a guard immediately
after setting NODE_BINARY to detect an empty value and fail fast: check if
"$NODE_BINARY" is unset or empty and print a clear error message (e.g., "Node
binary not found; ensure Node is installed and in PATH for Xcode build") then
exit with non-zero status; reference the NODE_BINARY variable and the build
script invocations that use "$NODE_BINARY" so maintainers can locate and verify
the guard is placed before any usage.

Comment thread frontend/ios/Podfile.properties.json Outdated
/usr/lib/swift,
"$(inherited)",
);
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if this is the standard Expo-generated format or a typo
rg -n "LIBRARY_SEARCH_PATHS" frontend/ios/

Repository: codebox-calpoly/PolyBuys

Length of output: 313


🏁 Script executed:

# Check the surrounding lines for context around LIBRARY_SEARCH_PATHS
sed -n '490,510p' frontend/ios/PolyBuys.xcodeproj/project.pbxproj

Repository: codebox-calpoly/PolyBuys

Length of output: 744


🏁 Script executed:

# Check line 552 context in Release configuration
sed -n '548,560p' frontend/ios/PolyBuys.xcodeproj/project.pbxproj

Repository: codebox-calpoly/PolyBuys

Length of output: 519


🏁 Script executed:

# Search for other build settings to see the pattern used for multi-value settings
rg -n "LIBRARY_SEARCH_PATHS|FRAMEWORK_SEARCH_PATHS|HEADER_SEARCH_PATHS" frontend/ios/PolyBuys.xcodeproj/project.pbxproj

Repository: codebox-calpoly/PolyBuys

Length of output: 217


🌐 Web query:

pbxproj LIBRARY_SEARCH_PATHS syntax multiple paths escaped quotes xcode

💡 Result:

In Xcode's project.pbxproj file, the LIBRARY_SEARCH_PATHS build setting is a space-separated list of paths. To specify multiple paths, separate them with spaces. Paths containing spaces must be enclosed in double quotes ("). Alternatively, escape spaces within paths using backslashes (), though quoting is preferred for readability. Example syntax in pbxproj: LIBRARY_SEARCH_PATHS = "$(SRCROOT)/path1" "$(SRCROOT)/path with spaces/path2" "$(SRCROOT)/path3"; This matches the syntax for similar settings like HEADER_SEARCH_PATHS and FRAMEWORK_SEARCH_PATHS, as documented in Apple's build settings reference. Quotes prevent the shell/command line from misinterpreting spaces as argument separators, which is critical for command-line builds (e.g., xcodebuild). When editing project.pbxproj manually, ensure values are properly quoted to avoid build failures. Xcode's UI handles quoting automatically, but direct edits require attention to this format.

Citations:


Malformed LIBRARY_SEARCH_PATHS — fix path separation syntax.

The escaped quotes do not properly separate paths. In pbxproj files, LIBRARY_SEARCH_PATHS must be space-separated, not a single quoted string with escaped quotes. The current syntax creates a malformed path value $(SDKROOT)/usr/lib/swift"$(inherited)" with literal quote characters embedded.

Correct format:

LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift" "$(inherited)";

This same issue appears on Line 552 in the Release configuration and should be fixed in both places.

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

In `@frontend/ios/PolyBuys.xcodeproj/project.pbxproj` at line 494, The
LIBRARY_SEARCH_PATHS entry is malformed: fix the quoted path separation so the
SDK path and the inherited token are two separate space-separated quoted entries
(replace the single quoted string containing escaped quotes with two quoted
values), e.g., change the LIBRARY_SEARCH_PATHS value to have
"$(SDKROOT)/usr/lib/swift" "$(inherited)"; update both occurrences of the
LIBRARY_SEARCH_PATHS setting (Debug and Release configs) to use this corrected
syntax.

Comment thread frontend/ios/PolyBuys.xcodeproj/xcshareddata/xcschemes/PolyBuys.xcscheme Outdated
Comment thread frontend/ios/PolyBuys/AppDelegate.swift Outdated
@@ -0,0 +1,69 @@
internal import Expo
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

Does Swift 5.0 support internal import syntax?

💡 Result:

No, Swift 5.0 does not support internal import syntax such as internal import Module. This feature was introduced by SE-0409 "Access-level modifiers on import declarations", which was implemented in Swift 6.0. In Swift 5.0, plain import Module behaves as if public, but access level modifiers like internal on imports were not available. The proposal explicitly states it preserves the Swift 5 behavior where the only official import is public-like, and implementation began much later (around 2023), available experimentally in Swift 5.9+ via -enable-experimental-feature AccessLevelOnImport. Swift 5.0 release notes (2019) mention no such import syntax changes.

Citations:


🏁 Script executed:

# Find and read the AppDelegate.swift file
find . -name "AppDelegate.swift" -type f 2>/dev/null | head -5

Repository: codebox-calpoly/PolyBuys

Length of output: 109


🏁 Script executed:

# Check for Swift version configuration in project files
fd -t f "\.pbxproj$" | head -5

Repository: codebox-calpoly/PolyBuys

Length of output: 115


🏁 Script executed:

# Read the first few lines of AppDelegate.swift to verify line 1
head -10 ./frontend/ios/PolyBuys/AppDelegate.swift

Repository: codebox-calpoly/PolyBuys

Length of output: 312


🏁 Script executed:

# Check Swift version in pbxproj
grep -i "SWIFT_VERSION" frontend/ios/PolyBuys.xcodeproj/project.pbxproj | head -20

Repository: codebox-calpoly/PolyBuys

Length of output: 117


Remove internal keyword from import statement for Swift 5.0 compatibility.

Line 1 uses internal import Expo, which is a Swift 6 feature (SE-0409). The project is configured for Swift 5.0 and does not support access-level modifiers on imports, causing a compilation error.

Change to:

-internal import Expo
+import Expo
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
internal import Expo
import Expo
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/ios/PolyBuys/AppDelegate.swift` at line 1, Remove the invalid
access-level modifier on the import by changing the import statement in
AppDelegate.swift (the line with "internal import Expo") to a plain import;
locate the import in the AppDelegate.swift top-level imports and delete the
"internal" token so it uses "import Expo" for Swift 5.0 compatibility.

Comment on lines +5 to +6
<key>aps-environment</key>
<string>development</string>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify entitlements/build-config wiring for APS env.
rg -n 'CODE_SIGN_ENTITLEMENTS|APS_ENVIRONMENT|PolyBuys.entitlements' frontend/ios/PolyBuys.xcodeproj/project.pbxproj
rg -n 'aps-environment' frontend/ios/PolyBuys/PolyBuys.entitlements

Repository: codebox-calpoly/PolyBuys

Length of output: 283


🏁 Script executed:

#!/bin/bash
# Get context around the CODE_SIGN_ENTITLEMENTS assignments
echo "=== Context around CODE_SIGN_ENTITLEMENTS assignments ==="
sed -n '375,390p' frontend/ios/PolyBuys.xcodeproj/project.pbxproj | head -20
echo ""
sed -n '410,425p' frontend/ios/PolyBuys.xcodeproj/project.pbxproj | head -20

echo ""
echo "=== Checking for build configuration names ==="
rg -n 'buildConfigurationName|Release|Debug' frontend/ios/PolyBuys.xcodeproj/project.pbxproj | head -30

echo ""
echo "=== Full entitlements file ==="
cat frontend/ios/PolyBuys/PolyBuys.entitlements

echo ""
echo "=== Search for any aps-environment or APS_ENVIRONMENT references ==="
rg -i 'aps.environment|APS_ENVIRONMENT' frontend/ios/PolyBuys.xcodeproj/ --type plist --type xml

Repository: codebox-calpoly/PolyBuys

Length of output: 6377


APNs environment must differ between Debug and Release configurations.

Both Debug and Release build configurations use the same PolyBuys.entitlements file with aps-environment hardcoded to development (lines 5-6). This breaks push notifications in Release and TestFlight builds—APNs tokens generated with a development environment won't validate against the production push certificate.

Solution: Either create separate entitlements files per configuration or add APS_ENVIRONMENT build variables and use $(APS_ENVIRONMENT) in the entitlements file. If using build variables, ensure they are defined in both Debug and Release build settings:

  • Debug: APS_ENVIRONMENT = development
  • Release: APS_ENVIRONMENT = production
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@frontend/ios/PolyBuys/PolyBuys.entitlements` around lines 5 - 6, The
entitlements file currently hardcodes the APNs environment via the
aps-environment key in PolyBuys.entitlements; update it to use a build variable
instead and add the corresponding build settings: replace the literal string
value for aps-environment with the variable reference $(APS_ENVIRONMENT) in
PolyBuys.entitlements, then define APS_ENVIRONMENT=development for the Debug
configuration and APS_ENVIRONMENT=production for the Release configuration (or
alternatively create separate entitlements files per configuration and point
each build configuration to the appropriate file).

@evan-taylor evan-taylor merged commit c6e450c into dev Apr 16, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants