Files
2026-07-12 10:17:17 -04:00

2.4 KiB

Cross-Origin / Same-Code Debugging (SPQ-specific)

Diagnose why the same PocketBase + React app code behaves differently on two domains.

When to Use

User reports: "Feature X works on shopproquote.graj-media.com but returns 'Invalid input' / 'Error' on grajmedia.duckdns.org." Both serve the same build.

Protocol

1. Verify code is identical

Check nginx config at /etc/nginx/sites-enabled/:

cat /etc/nginx/sites-enabled/shopproquote

Look for:

  • root directive — same path for both server_name entries?
  • server_name — both domains listed in the same server block?

In SPQ's deployment, nginx serves all three domains (grajmedia.duckdns.org, graj-media.com, shopproquote.graj-media.com) from a single root at /mnt/seagate8tb/Websites/ShopProQuote.backup-20260626-2058/spq-v2/dist.

2. Check backend proxy

In the same nginx config, check all location /pb/ blocks:

proxy_pass http://127.0.0.1:8091/;

Both domains proxy to the same PocketBase instance. No difference possible.

3. Conclusion

If code AND backend are identical, the difference is client-side state:

  • localStorage — per-origin; the Zustand spq-quote store is persisted here
  • Service worker cache (less common)
  • Cookies

4. Find the failing data path

In SPQ's Quote Generator, both Save (handleSave in QuoteSummary.tsx) and Share (handleShareensureShareToken) do:

const parsed = quoteWriteSchema.safeParse(data);
if (!parsed.success) {
  console.warn('Quote schema validation failed:', JSON.stringify(parsed.error.issues, null, 2));
  showToast(parsed.error.issues[0].message, 'error');
  return;
}

The toast message like "Invalid input" comes from Zod validation. Common fields that fail:

Field Schema constraint Stale localStorage value
discountType z.enum(['dollar', 'percent']) null, undefined, or unexpected string
customerDecision (per service) z.enum(['approved', 'declined', 'pending']) undefined (missing from old store shape)
customerName z.string().min(1) ""
vehicleInfo z.string().min(1) ""

5. Confirm stale localStorage

Open DevTools → Application → Local Storage → <origin> → key spq-quote. Compare the stored discount and services arrays against the current Zod schema (src/schemas/quote.ts).

6. Fix

localStorage.removeItem('spq-quote');

Reload and retry.