5.3 KiB
5.3 KiB
ManoonOils Project Memory
Project Overview
- Name: ManoonOils Headless Storefront
- Type: Next.js 16 + Saleor e-commerce
- URL: https://manoonoils.com
- Tech Stack: React 19, TypeScript, Tailwind CSS v4, GraphQL/Apollo
Git Workflow (CRITICAL)
feature/* → dev → master
Rules (MUST FOLLOW)
- All work starts on feature branch - Never commit to dev/master directly
- Commit working code immediately - No uncommitted files in working directory
- Clean working directory before switching branches - Run
git statusfirst - Flow forward only - feature → dev → master, never skip
- Reset feature branches after merge - Keep synchronized with master
Workflow Steps
# 1. Create feature branch
git checkout -b feature/description
# 2. Work and commit WORKING code
git add .
git commit -m "type: description"
git push origin feature/description
# 3. Merge to dev for testing
git checkout dev
git merge feature/description
git push origin dev
# 4. Merge to master for production
git checkout master
git merge dev
git push origin master
# 5. Reset feature branch to match master
git checkout feature/description
git reset --hard master
git push origin feature/description --force
Commit Types
feat:- New featurefix:- Bug fixdocs:- Documentationstyle:- Formattingrefactor:- Code restructuringtest:- Testschore:- Build/process
Project Structure
Key Directories
src/
├── app/[locale]/ # i18n routes
├── components/
│ ├── home/ # Homepage sections
│ ├── layout/ # Header, Footer
│ ├── providers/ # Context providers
│ └── ui/ # Reusable UI
├── hooks/ # Custom hooks
├── lib/
│ ├── mautic.ts # Mautic API client
│ ├── geoip.ts # GeoIP service
│ └── analytics.ts # Analytics tracking
├── i18n/messages/ # Translations (sr, en, de, fr)
k8s/ # Kubernetes manifests
Important Files
k8s/deployment.yaml- Production deployment configsrc/app/[locale]/layout.tsx- Root layout with ExitIntentDetectorsrc/lib/mautic.ts- Mautic integration.env.local- Environment variables
Environment Variables
Required for Production
# Saleor
NEXT_PUBLIC_SALEOR_API_URL=https://api.manoonoils.com/graphql/
# Mautic
MAUTIC_CLIENT_ID=2_23cgmaqef8kgg8oo4kggc0w4wccwoss8o8w48o8sc40cowgkkg
MAUTIC_CLIENT_SECRET=4k8367ab306co48c4c8g8sco8cgcwwww044gwccs0o0c8w4gco
MAUTIC_API_URL=https://mautic.nodecrew.me
# Analytics
NEXT_PUBLIC_RYBBIT_HOST=https://rybbit.nodecrew.me
NEXT_PUBLIC_RYBBIT_SITE_ID=1
RYBBIT_API_KEY=...
# Email
RESEND_API_KEY=...
Current Features
Email Capture Popup
- Location:
src/components/home/EmailCapturePopup.tsx - Trigger:
src/components/home/ExitIntentDetector.tsx - Triggers: Scroll 10% OR exit intent (mouse leaving viewport)
- Delay: Scroll has 5s delay, exit intent shows immediately
- Fields: First name (optional), Email (required)
- Tracking: UTM params, device info, time on page, referrer
- Integration: Creates contact in Mautic with tags
API Routes
/api/email-capture- Handles form submission to Mautic/api/geoip- Returns country/region from IP
i18n Support
- Locales: sr (default), en, de, fr
- Translation files:
src/i18n/messages/*.json
Common Commands
Development
npm run dev # Start dev server
npm run build # Production build
npm run test # Run tests
Kubernetes (doorwaysftw server)
# Check pods
ssh doorwaysftw "kubectl get pods -n manoonoils"
# Restart storefront
ssh doorwaysftw "kubectl delete pod -n manoonoils -l app=storefront"
# Check logs
ssh doorwaysftw "kubectl logs -n manoonoils deployment/storefront"
# Verify env vars
ssh doorwaysftw "kubectl exec -n manoonoils deployment/storefront -- env | grep MAUTIC"
Known Issues & Solutions
Hydration Errors
- Cause:
AnalyticsProviderreturningnull - Solution: Return
<></>instead, or remove component
Popup Not Showing
- Check
ExitIntentDetectoris inlayout.tsx - Verify
useVisitorStoreisn't showing popup already shown - Check browser console for errors
Mautic API Failures
- Verify env vars in k8s deployment
- Check Mautic credentials haven't expired
- Ensure country code isn't "Local" (use "XX" instead)
Deployment Checklist
Before deploying to production:
- All tests pass (
npm run test) - Build succeeds (
npm run build) - No uncommitted changes (
git status) - Merged to dev and tested
- Merged to master
- K8s deployment.yaml has correct env vars
- Pod restarted to pick up new code
- Smoke test on production URL
Architecture Decisions
Why No AnalyticsProvider?
Removed because it returns null causing hydration mismatches. Analytics scripts loaded directly in layout.
Why Direct Rybbit URL?
Using https://rybbit.nodecrew.me/api/script.js instead of /api/script.js preserves real visitor IP.
Why Exit Intent + Scroll?
Exit intent catches leaving users immediately. Scroll trigger catches engaged users after delay.
Contact
- Maintainer: User
- K8s Server: doorwaysftw (100.109.29.45)
- Mautic: https://mautic.nodecrew.me