@wix/agent-skills 1.15.1 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -7
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +4 -1
- package/skills/wix-app/references/APP_TOOLS.md +134 -0
- package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +1 -1
- package/skills/wix-app/references/DASHBOARD_PAGE.md +0 -10
- package/skills/wix-app/references/DATA_COLLECTION.md +1 -1
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +28 -9
- package/skills/wix-app/references/SERVICE_PLUGIN.md +12 -10
- package/skills/wix-app/references/app-tools/TOOLS.md +75 -0
- package/skills/wix-app/references/dashboard-page/DASHBOARD_API.md +2 -2
- package/skills/wix-app/references/editor-react-component/A11Y-REVIEW-REFERENCE.md +172 -0
- package/skills/wix-app/references/editor-react-component/A11Y-REVIEW.md +138 -0
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +23 -2
- package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +29 -0
- package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +1 -1
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +27 -2
- package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +5 -3
- package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +18 -1
- package/skills/wix-app/references/editor-react-component/PARTS.md +15 -2
- package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +2 -3
- package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +13 -9
- package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +4 -0
- package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +4 -0
- package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +3 -1
- package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +4 -0
- package/skills/wix-app/references/service-plugin/TOOLS_PROVIDER.md +54 -0
- package/skills/wix-app/references/stores/QUERY.md +32 -0
- package/skills/wix-docs/SKILL.md +35 -3
- package/skills/wix-headless/SKILL.md +3 -1
- package/skills/wix-headless/references/CONTENT.md +36 -0
- package/skills/wix-headless/references/DESIGN.md +54 -0
- package/skills/wix-headless/references/DISCOVERY.md +24 -0
- package/skills/wix-headless/references/IMAGE_GENERATION.md +10 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +3 -2
- package/skills/wix-headless/references/inline-recipes/setup-online-store.md +32 -23
- package/skills/wix-headless/references/managed/CONNECT.md +1 -1
- package/skills/wix-headless/references/managed/CREATE.md +14 -0
- package/skills/wix-headless/references/managed/DEPLOYMENT.md +25 -0
- package/skills/wix-manage/SKILL.md +123 -7
- package/skills/wix-manage/references/analytics/analytics-dashboard-navigation.md +41 -0
- package/skills/wix-manage/references/app-installation/app-installation-dashboard-navigation.md +28 -0
- package/skills/wix-manage/references/blog/blog-dashboard-navigation.md +56 -0
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +31 -6
- package/skills/wix-manage/references/bookings/booking-service-policy-setup.md +3 -1
- package/skills/wix-manage/references/bookings/bookings-dashboard-navigation.md +63 -0
- package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +10 -1
- package/skills/wix-manage/references/cms/cms-dashboard-navigation.md +44 -0
- package/skills/wix-manage/references/cms/cms-data-items-crud.md +31 -3
- package/skills/wix-manage/references/cms/cms-publishing-flow.md +287 -0
- package/skills/wix-manage/references/cms/cms-schema-management.md +27 -1
- package/skills/wix-manage/references/contacts/contacts-dashboard-navigation.md +46 -0
- package/skills/wix-manage/references/contacts/create-a-contact.md +82 -0
- package/skills/wix-manage/references/contacts/update-a-contact.md +119 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +82 -0
- package/skills/wix-manage/references/dashboard-navigation/routes.json +1733 -0
- package/skills/wix-manage/references/domains/domains-dashboard-navigation.md +32 -0
- package/skills/wix-manage/references/ecommerce/ecom-pricing.md +4 -4
- package/skills/wix-manage/references/ecommerce/ecom-shipping.md +1 -1
- package/skills/wix-manage/references/ecommerce/gift-cards/ecom-gift-cards-goal-sell-gift-cards.md +338 -0
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-create-discount-rule.md +42 -78
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-bundle-and-save.md +1 -1
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-stock-mover.md +1 -1
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-upsell-boost.md +1 -1
- package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +90 -92
- package/skills/wix-manage/references/events/create-wix-event.md +176 -0
- package/skills/wix-manage/references/events/manage-wix-events.md +174 -0
- package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +44 -0
- package/skills/wix-manage/references/get-paid/get-paid-dashboard-navigation.md +52 -0
- package/skills/wix-manage/references/google-ads/billing-and-payment.md +80 -0
- package/skills/wix-manage/references/google-ads/create-performance-max-campaign.md +212 -0
- package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +110 -0
- package/skills/wix-manage/references/google-ads/google-ads-dashboard-navigation.md +25 -0
- package/skills/wix-manage/references/google-ads/install-and-create-account.md +155 -0
- package/skills/wix-manage/references/google-ads/manage-campaign-lifecycle.md +63 -0
- package/skills/wix-manage/references/google-ads/query-campaign-analytics.md +155 -0
- package/skills/wix-manage/references/marketing/marketing-dashboard-navigation.md +52 -0
- package/skills/wix-manage/references/pricing-plans/create-and-update-pricing-plans.md +99 -1
- package/skills/wix-manage/references/pricing-plans/pricing-plans-dashboard-navigation.md +45 -0
- package/skills/wix-manage/references/restaurants/restaurants-dashboard-navigation.md +68 -0
- package/skills/wix-manage/references/restaurants/wix-restaurants-setup.md +94 -125
- package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +48 -9
- package/skills/wix-manage/references/site-properties/site-properties-dashboard-navigation.md +31 -0
- package/skills/wix-manage/references/sites/create-headless-site.md +52 -0
- package/skills/wix-manage/references/sites/create-site-from-template.md +2 -25
- package/skills/wix-manage/references/sites/site-import.md +163 -190
- package/skills/wix-manage/references/sites/sites-dashboard-navigation.md +29 -0
- package/skills/wix-manage/references/stores/add-store-pages-to-site.md +17 -1
- package/skills/wix-manage/references/stores/find-products-query-and-search-catalog-v3.md +26 -8
- package/skills/wix-manage/references/stores/stores-dashboard-navigation.md +65 -0
- package/skills/wix-manage/references/stores/update-product-with-options.md +39 -7
- package/skills/wix-replatform/.publish-manifest.json +8 -0
- package/skills/wix-replatform/SKILL.md +693 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +215 -0
- package/skills/wix-replatform/lib/completion-report.js +200 -0
- package/skills/wix-replatform/lib/config-env.js +59 -0
- package/skills/wix-replatform/lib/execution-manifest.js +185 -0
- package/skills/wix-replatform/lib/execution-state.js +173 -0
- package/skills/wix-replatform/lib/import-recovery.js +313 -0
- package/skills/wix-replatform/lib/local-state.js +642 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +143 -0
- package/skills/wix-replatform/lib/orchestration-router.js +122 -0
- package/skills/wix-replatform/lib/orchestration-state.js +455 -0
- package/skills/wix-replatform/lib/progress-log.js +224 -0
- package/skills/wix-replatform/lib/progress-log.sh +140 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +391 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +184 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +529 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +316 -0
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/mint-token.sh +64 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +1114 -0
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +430 -0
- package/skills/wix-replatform/resources/rp-mapper/lib/mapping-resolve.js +217 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/resolve-mapping.js +148 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +378 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +183 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +478 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/canonical-record.js +136 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fingerprint.js +310 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-layout.js +1081 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-parse.js +618 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +949 -0
- package/skills/wix-replatform/resources/rp-source-csv/source-schema.example.json +196 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/bigcommerce.json +66 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/magento.json +60 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/shopify.json +95 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/woocommerce.json +82 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +256 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +249 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +444 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +774 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/source-schema.example.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +632 -0
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +330 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +21 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +39 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +35 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +35 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +35 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +131 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +21 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +97 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +528 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +53 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +25 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/audit-summary.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +141 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +384 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/ndjson.js +260 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +238 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +237 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +238 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +2219 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +31 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge.js +100 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +107 -0
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +344 -0
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +250 -0
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1927 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +83 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +141 -0
- package/skills/wix-replatform/scripts/artifact-freshness.js +76 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +43 -0
- package/skills/wix-replatform/scripts/execution-state-prepare.js +128 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +48 -0
- package/skills/wix-replatform/scripts/orchestration-route.js +46 -0
- package/skills/wix-replatform/scripts/orchestration-state.js +245 -0
- package/skills/wix-vibe-headless/SKILL.md +48 -25
- package/skills/wix-vibe-headless/install/deploy.cjs +95 -0
- package/skills/wix-vibe-headless/install/pin-agents-md.cjs +34 -0
- package/skills/wix-vibe-headless/platforms/README.md +8 -4
- package/skills/wix-vibe-headless/platforms/base44.md +133 -98
- package/skills/wix-vibe-headless/platforms/generic.md +99 -64
- package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +230 -119
- package/skills/wix-vibe-headless/references/blog/app/components/PostCard.jsx +43 -0
- package/skills/wix-vibe-headless/references/blog/app/components/PostChips.jsx +25 -0
- package/skills/wix-vibe-headless/references/blog/app/components/PostGrid.jsx +15 -0
- package/skills/wix-vibe-headless/references/blog/app/context/TaxonomyContext.jsx +35 -0
- package/skills/wix-vibe-headless/references/blog/app/hooks/usePostDetail.js +38 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/Blog.jsx +40 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/CategoryPage.jsx +54 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/PostDetail.jsx +65 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/TagPage.jsx +50 -0
- package/skills/wix-vibe-headless/references/blog/seed/SEED.md +103 -0
- package/skills/wix-vibe-headless/references/blog/seed/seed-blog.js +270 -0
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +260 -149
- package/skills/wix-vibe-headless/references/bookings/app/components/BookingForm.jsx +65 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/ServiceCard.jsx +47 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/ServiceGrid.jsx +13 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/SlotPicker.jsx +126 -0
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +108 -0
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServices.js +58 -0
- package/skills/wix-vibe-headless/references/bookings/app/lib/serviceFacts.js +95 -0
- package/skills/wix-vibe-headless/references/bookings/app/pages/ServiceDetail.jsx +94 -0
- package/skills/wix-vibe-headless/references/bookings/app/pages/Services.jsx +89 -0
- package/skills/wix-vibe-headless/references/bookings/{wix-bookings-checkout.js → app/rest/wix-bookings-checkout.js} +1 -1
- package/skills/wix-vibe-headless/references/bookings/{wix-bookings-services.js → app/rest/wix-bookings-services.js} +87 -11
- package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +117 -0
- package/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.js +333 -0
- package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +169 -147
- package/skills/wix-vibe-headless/references/cms/app/collection.config.js +31 -0
- package/skills/wix-vibe-headless/references/cms/app/lib/wixImage.js +18 -0
- package/skills/wix-vibe-headless/references/cms/{wix-cms.js → app/rest/wix-cms.js} +47 -2
- package/skills/wix-vibe-headless/references/cms/seed/SEED.md +145 -0
- package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +228 -131
- package/skills/wix-vibe-headless/references/events/app/components/CategoryFilter.jsx +23 -0
- package/skills/wix-vibe-headless/references/events/app/components/EventCard.jsx +43 -0
- package/skills/wix-vibe-headless/references/events/app/components/EventGrid.jsx +13 -0
- package/skills/wix-vibe-headless/references/events/app/components/EventRegistration.jsx +29 -0
- package/skills/wix-vibe-headless/references/events/app/components/RsvpForm.jsx +57 -0
- package/skills/wix-vibe-headless/references/events/app/components/TicketPicker.jsx +78 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useEventDetail.js +27 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useEventsList.js +54 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useRsvpForm.js +40 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useTicketing.js +81 -0
- package/skills/wix-vibe-headless/references/events/app/pages/EventDetail.jsx +48 -0
- package/skills/wix-vibe-headless/references/events/app/pages/Events.jsx +36 -0
- package/skills/wix-vibe-headless/references/events/{wix-events-browse.js → app/rest/wix-events-browse.js} +1 -1
- package/skills/wix-vibe-headless/references/events/seed/SEED.md +107 -0
- package/skills/wix-vibe-headless/references/events/seed/seed-events.js +251 -0
- package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +276 -188
- package/skills/wix-vibe-headless/references/members/app/components/LoginForm.jsx +101 -0
- package/skills/wix-vibe-headless/references/members/app/components/MemberMenu.jsx +33 -0
- package/skills/wix-vibe-headless/references/members/app/components/RequireAuth.jsx +21 -0
- package/skills/wix-vibe-headless/references/members/app/components/SocialButtons.jsx +29 -0
- package/skills/wix-vibe-headless/references/members/app/context/MemberContext.jsx +54 -0
- package/skills/wix-vibe-headless/references/members/app/hooks/useLoginForm.js +77 -0
- package/skills/wix-vibe-headless/references/members/app/pages/Account.jsx +36 -0
- package/skills/wix-vibe-headless/references/members/app/pages/Callback.jsx +32 -0
- package/skills/wix-vibe-headless/references/members/app/pages/Login.jsx +35 -0
- package/skills/wix-vibe-headless/references/members/{wix-members-auth.js → app/rest/wix-members-auth.js} +6 -3
- package/skills/wix-vibe-headless/references/members/install/Register.jsx +22 -0
- package/skills/wix-vibe-headless/references/members/seed/SEED.md +22 -0
- package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +233 -104
- package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionCard.jsx +31 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionGrid.jsx +15 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectCard.jsx +39 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectGrid.jsx +15 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectMedia.jsx +29 -0
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/useCollectionProjects.js +35 -0
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/usePortfolioGallery.js +27 -0
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/useProjectDetail.js +25 -0
- package/skills/wix-vibe-headless/references/portfolio/app/pages/CollectionPage.jsx +39 -0
- package/skills/wix-vibe-headless/references/portfolio/app/pages/Portfolio.jsx +27 -0
- package/skills/wix-vibe-headless/references/portfolio/app/pages/ProjectDetail.jsx +60 -0
- package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +94 -0
- package/skills/wix-vibe-headless/references/portfolio/seed/seed-portfolio.js +236 -0
- package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +240 -117
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/OrderCard.jsx +35 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanCard.jsx +48 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanGrid.jsx +16 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanPrice.jsx +35 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/useMyPlans.js +25 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlanDetail.js +28 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlans.js +30 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/MyPlans.jsx +30 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/PlanDetail.jsx +53 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/Plans.jsx +28 -0
- package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +86 -0
- package/skills/wix-vibe-headless/references/pricing-plans/seed/seed-pricing-plans.js +251 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +248 -124
- package/skills/wix-vibe-headless/references/restaurants/app/components/ItemDialog.jsx +81 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/MenuItemCard.jsx +71 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/MenuList.jsx +43 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartButton.jsx +21 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartDrawer.jsx +60 -0
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +63 -0
- package/skills/wix-vibe-headless/references/restaurants/app/hooks/useItemOrder.js +32 -0
- package/skills/wix-vibe-headless/references/restaurants/app/hooks/useReservation.js +73 -0
- package/skills/wix-vibe-headless/references/restaurants/app/pages/Menu.jsx +28 -0
- package/skills/wix-vibe-headless/references/restaurants/app/pages/Reservations.jsx +102 -0
- package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +180 -0
- package/skills/wix-vibe-headless/references/restaurants/seed/seed-restaurants.js +452 -0
- package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +56 -0
- package/skills/wix-vibe-headless/references/shared/{wix-client.js → app/rest/wix-client.js} +6 -8
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-config.js +6 -0
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +263 -157
- package/skills/wix-vibe-headless/references/storefront/app/components/CartButton.jsx +20 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +150 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +167 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +51 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +54 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +119 -0
- package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +71 -0
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +109 -0
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useShop.js +98 -0
- package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +27 -0
- package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +139 -0
- package/skills/wix-vibe-headless/references/storefront/app/pages/Shop.jsx +75 -0
- package/skills/wix-vibe-headless/references/storefront/{wix-store-cart.js → app/rest/wix-store-cart.js} +1 -1
- package/skills/wix-vibe-headless/references/storefront/{wix-store-catalog.js → app/rest/wix-store-catalog.js} +20 -1
- package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +111 -0
- package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +299 -0
- /package/skills/wix-vibe-headless/references/blog/{wix-blog.js → app/rest/wix-blog.js} +0 -0
- /package/skills/wix-vibe-headless/references/events/{wix-events-registration.js → app/rest/wix-events-registration.js} +0 -0
- /package/skills/wix-vibe-headless/references/portfolio/{wix-portfolio.js → app/rest/wix-portfolio.js} +0 -0
- /package/skills/wix-vibe-headless/references/pricing-plans/{wix-pricing-plans.js → app/rest/wix-pricing-plans.js} +0 -0
- /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-menu.js → app/rest/wix-restaurants-menu.js} +0 -0
- /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-ordering.js → app/rest/wix-restaurants-ordering.js} +0 -0
- /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-reservations.js → app/rest/wix-restaurants-reservations.js} +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Credential login/sign-up form — a thin view over useLoginForm (all logic lives in the hook).
|
|
2
|
+
// Styled with base44 design tokens (shadcn Tailwind classes); don't rewrite this JSX. Renders one of
|
|
3
|
+
// three phases the hook drives: the email/password form, the 6-digit verification-code entry, or a
|
|
4
|
+
// pending-approval notice.
|
|
5
|
+
import { useLoginForm } from "@/hooks/useLoginForm";
|
|
6
|
+
|
|
7
|
+
const inputCls =
|
|
8
|
+
"w-full py-[11px] px-3 box-border text-[15px] border border-input rounded-sm bg-background text-foreground";
|
|
9
|
+
const labelCls = "block text-[13px] text-muted-foreground mb-1.5";
|
|
10
|
+
|
|
11
|
+
export default function LoginForm({ onSuccess }) {
|
|
12
|
+
const f = useLoginForm({ onSuccess });
|
|
13
|
+
|
|
14
|
+
if (f.phase === "pending") {
|
|
15
|
+
return <Notice>Your account is awaiting owner approval. You'll be able to sign in once it's approved.</Notice>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (f.phase === "verify") {
|
|
19
|
+
return (
|
|
20
|
+
<form onSubmit={f.submitCode} className={formCls}>
|
|
21
|
+
<p className="text-muted-foreground m-0 leading-normal">
|
|
22
|
+
We emailed you a 6-digit code. Enter it to finish.
|
|
23
|
+
</p>
|
|
24
|
+
<div>
|
|
25
|
+
<label className={labelCls} htmlFor="mf-code">Verification code</label>
|
|
26
|
+
<input id="mf-code" className={inputCls} inputMode="numeric" autoComplete="one-time-code"
|
|
27
|
+
value={f.code} onChange={(e) => f.setCode(e.target.value)} />
|
|
28
|
+
</div>
|
|
29
|
+
{f.error && <ErrorText>{f.error}</ErrorText>}
|
|
30
|
+
<SubmitButton busy={f.busy}>Verify</SubmitButton>
|
|
31
|
+
</form>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<form onSubmit={f.submit} className={formCls}>
|
|
37
|
+
<div className="flex gap-2">
|
|
38
|
+
<ModeTab active={f.mode === "login"} onClick={() => f.switchMode("login")}>Sign in</ModeTab>
|
|
39
|
+
<ModeTab active={f.mode === "register"} onClick={() => f.switchMode("register")}>Sign up</ModeTab>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
{f.mode === "register" && (
|
|
43
|
+
<div className="flex gap-3">
|
|
44
|
+
<div className="flex-1">
|
|
45
|
+
<label className={labelCls} htmlFor="mf-first">First name</label>
|
|
46
|
+
<input id="mf-first" className={inputCls} value={f.fields.firstName}
|
|
47
|
+
onChange={(e) => f.setField("firstName", e.target.value)} />
|
|
48
|
+
</div>
|
|
49
|
+
<div className="flex-1">
|
|
50
|
+
<label className={labelCls} htmlFor="mf-last">Last name</label>
|
|
51
|
+
<input id="mf-last" className={inputCls} value={f.fields.lastName}
|
|
52
|
+
onChange={(e) => f.setField("lastName", e.target.value)} />
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
)}
|
|
56
|
+
|
|
57
|
+
<div>
|
|
58
|
+
<label className={labelCls} htmlFor="mf-email">Email</label>
|
|
59
|
+
<input id="mf-email" type="email" autoComplete="email" required className={inputCls}
|
|
60
|
+
value={f.fields.email} onChange={(e) => f.setField("email", e.target.value)} />
|
|
61
|
+
</div>
|
|
62
|
+
<div>
|
|
63
|
+
<label className={labelCls} htmlFor="mf-pass">Password</label>
|
|
64
|
+
<input id="mf-pass" type="password" required className={inputCls}
|
|
65
|
+
autoComplete={f.mode === "register" ? "new-password" : "current-password"}
|
|
66
|
+
value={f.fields.password} onChange={(e) => f.setField("password", e.target.value)} />
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
{f.error && <ErrorText>{f.error}</ErrorText>}
|
|
70
|
+
<SubmitButton busy={f.busy}>{f.mode === "register" ? "Create account" : "Sign in"}</SubmitButton>
|
|
71
|
+
</form>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const formCls = "flex flex-col gap-4";
|
|
76
|
+
|
|
77
|
+
function ModeTab({ active, onClick, children }) {
|
|
78
|
+
return (
|
|
79
|
+
<button type="button" onClick={onClick}
|
|
80
|
+
className={`flex-1 py-2 px-0 cursor-pointer text-sm font-semibold border border-border rounded-sm ${active ? "bg-card text-foreground" : "bg-transparent text-muted-foreground"}`}
|
|
81
|
+
>{children}</button>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function SubmitButton({ busy, children }) {
|
|
86
|
+
return (
|
|
87
|
+
<button type="submit" disabled={busy}
|
|
88
|
+
className="px-6 py-3 cursor-pointer bg-primary text-primary-foreground border-none rounded-sm text-[15px] font-semibold disabled:opacity-50 disabled:cursor-not-allowed"
|
|
89
|
+
>{busy ? "…" : children}</button>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function ErrorText({ children }) {
|
|
94
|
+
return <p role="alert" className="text-destructive m-0 text-sm">{children}</p>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function Notice({ children }) {
|
|
98
|
+
return (
|
|
99
|
+
<p className="p-4 bg-card text-foreground border border-border rounded-lg leading-normal m-0">{children}</p>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Header account control — the members analog of a cart button. Reads useMember() and renders the
|
|
2
|
+
// session state: a "Log in" link for a visitor, or the member's name + a log-out button once signed
|
|
3
|
+
// in. Drop it into the Header you build (STEP 4), same as the storefront's CartButton. Pure UI reading
|
|
4
|
+
// useMember + base44 design tokens (shadcn Tailwind classes) — render it as-is; don't wrap it in your own auth logic.
|
|
5
|
+
import { Link } from "react-router-dom";
|
|
6
|
+
import { useMember } from "@/context/MemberContext";
|
|
7
|
+
|
|
8
|
+
export default function MemberMenu() {
|
|
9
|
+
const { loggedIn, member, loading, logout } = useMember();
|
|
10
|
+
|
|
11
|
+
if (loading) return <span className="text-muted-foreground text-sm">…</span>;
|
|
12
|
+
|
|
13
|
+
if (!loggedIn) {
|
|
14
|
+
return (
|
|
15
|
+
<Link to="/login" className="text-primary no-underline text-sm font-semibold">Log in</Link>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// member may be null when logged in but the Members Area app isn't installed — fall back to a
|
|
20
|
+
// generic label rather than assuming a profile (see INSTRUCTIONS → identity vs. profile).
|
|
21
|
+
const name = member?.profile?.nickname || member?.contact?.firstName || member?.loginEmail || "Account";
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<div className="flex items-center gap-3">
|
|
25
|
+
<Link to="/account" className="text-foreground no-underline text-sm font-semibold">
|
|
26
|
+
{name}
|
|
27
|
+
</Link>
|
|
28
|
+
<button type="button" onClick={() => logout()}
|
|
29
|
+
className="bg-transparent border border-border rounded-full py-1 px-3 text-[13px] cursor-pointer text-muted-foreground"
|
|
30
|
+
>Log out</button>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Route gate for member-only surfaces. Wrap any protected element in <RequireAuth> — it renders the
|
|
2
|
+
// children only for a logged-in member, otherwise redirects to /login (carrying the attempted path so
|
|
3
|
+
// login can return there). This is the gate the shipped Account page uses; reuse it for your own
|
|
4
|
+
// member-only routes ("my orders", "my plans", …). Reads useMember; no styling of its own.
|
|
5
|
+
import { Navigate, useLocation } from "react-router-dom";
|
|
6
|
+
import { useMember } from "@/context/MemberContext";
|
|
7
|
+
|
|
8
|
+
export default function RequireAuth({ children, fallback = "/login" }) {
|
|
9
|
+
const { loggedIn, loading } = useMember();
|
|
10
|
+
const location = useLocation();
|
|
11
|
+
|
|
12
|
+
// Wait for the initial session read before deciding — otherwise a logged-in member gets bounced to
|
|
13
|
+
// /login on first paint while the token check is still resolving.
|
|
14
|
+
if (loading) {
|
|
15
|
+
return <div className="p-12 text-center text-muted-foreground">Loading…</div>;
|
|
16
|
+
}
|
|
17
|
+
if (!loggedIn) {
|
|
18
|
+
return <Navigate to={fallback} replace state={{ from: location.pathname }} />;
|
|
19
|
+
}
|
|
20
|
+
return children;
|
|
21
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// "Continue with Google / Facebook" buttons. Social/SSO is a FULL-PAGE redirect: this kicks it off
|
|
2
|
+
// with startSocialLogin, which sends the browser to the provider and returns to your /callback route
|
|
3
|
+
// (mount Callback there). callbackUri MUST be allow-listed on the OAuth app or Wix rejects it before
|
|
4
|
+
// returning — see INSTRUCTIONS (allowedRedirectUris). Styled with base44 design tokens (shadcn Tailwind classes).
|
|
5
|
+
import { startSocialLogin, IDP } from "@/rest/wix-members-auth";
|
|
6
|
+
|
|
7
|
+
// The exact /callback URL that must be registered as an allowed redirect URI. `returnTo` is where
|
|
8
|
+
// the member lands after login — carry the current path so they resume where they started.
|
|
9
|
+
function go(idp) {
|
|
10
|
+
const callbackUri = new URL("/callback", window.location.origin).href;
|
|
11
|
+
startSocialLogin(idp, callbackUri, window.location.pathname);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default function SocialButtons() {
|
|
15
|
+
return (
|
|
16
|
+
<div className="flex flex-col gap-2.5">
|
|
17
|
+
<ProviderButton onClick={() => go(IDP.GOOGLE)}>Continue with Google</ProviderButton>
|
|
18
|
+
<ProviderButton onClick={() => go(IDP.FACEBOOK)}>Continue with Facebook</ProviderButton>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function ProviderButton({ onClick, children }) {
|
|
24
|
+
return (
|
|
25
|
+
<button type="button" onClick={onClick}
|
|
26
|
+
className="w-full py-[11px] px-4 cursor-pointer text-[15px] font-semibold bg-background text-foreground border border-border rounded-sm"
|
|
27
|
+
>{children}</button>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Member auth state — mirrors the Wix SESSION on the shared client (never a local guess). Wrap the
|
|
2
|
+
// app in <MemberProvider>; every component reads useMember(). Login mechanisms (credential/social)
|
|
3
|
+
// write member tokens onto @/rest/wix-client via the auth helper; this provider reads that session
|
|
4
|
+
// and exposes the current member + logout. Data wiring is correct as-is — do not re-derive it.
|
|
5
|
+
//
|
|
6
|
+
// NAMED useMember (not useAuth) ON PURPOSE: the Base44 App.jsx already ships a platform
|
|
7
|
+
// AuthProvider/useAuth for the builder account — a second `useAuth` would shadow it. This is the
|
|
8
|
+
// WIX member session, kept under its own name so the two never collide.
|
|
9
|
+
import { createContext, useContext, useState, useEffect, useCallback } from "react";
|
|
10
|
+
import { isLoggedIn, getCurrentMember, logout as apiLogout } from "@/rest/wix-members-auth";
|
|
11
|
+
|
|
12
|
+
const MemberContext = createContext(null);
|
|
13
|
+
|
|
14
|
+
export function MemberProvider({ children }) {
|
|
15
|
+
const [member, setMember] = useState(null);
|
|
16
|
+
const [loggedIn, setLoggedIn] = useState(false);
|
|
17
|
+
const [loading, setLoading] = useState(true);
|
|
18
|
+
|
|
19
|
+
// Re-read the session from the shared client. Call after a successful login so the header/account
|
|
20
|
+
// update without a reload. `member` stays null (with loggedIn true) when the Members Area app
|
|
21
|
+
// isn't installed — that's setup, not a bug (see INSTRUCTIONS → identity vs. profile).
|
|
22
|
+
const refresh = useCallback(async () => {
|
|
23
|
+
setLoading(true);
|
|
24
|
+
try {
|
|
25
|
+
const active = isLoggedIn();
|
|
26
|
+
setLoggedIn(active);
|
|
27
|
+
setMember(active ? await getCurrentMember() : null);
|
|
28
|
+
} finally {
|
|
29
|
+
setLoading(false);
|
|
30
|
+
}
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
useEffect(() => { refresh(); }, [refresh]);
|
|
34
|
+
|
|
35
|
+
// logout() clears local tokens then redirects through the Wix logout URL, so it navigates away;
|
|
36
|
+
// we still reset local state first for the instant before the redirect lands.
|
|
37
|
+
const logout = useCallback(async (returnTo) => {
|
|
38
|
+
setMember(null);
|
|
39
|
+
setLoggedIn(false);
|
|
40
|
+
await apiLogout(returnTo);
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<MemberContext.Provider value={{ member, loggedIn, loading, refresh, logout }}>
|
|
45
|
+
{children}
|
|
46
|
+
</MemberContext.Provider>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function useMember() {
|
|
51
|
+
const ctx = useContext(MemberContext);
|
|
52
|
+
if (!ctx) throw new Error("useMember must be used within <MemberProvider>");
|
|
53
|
+
return ctx;
|
|
54
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// useLoginForm — all credential-auth logic, no markup: hold the form fields, run login/register,
|
|
2
|
+
// and DRIVE THE STATE MACHINE. register()/login()/verifyEmail() resolve to { state, member?,
|
|
3
|
+
// stateToken? }; SUCCESS is only one of the branches. Handling every branch (email verification,
|
|
4
|
+
// owner approval) and mapping MemberAuthError to a message is the bug-prone part — keep it verbatim;
|
|
5
|
+
// the LoginForm component only renders what this returns. Social/SSO does NOT go through here (it's
|
|
6
|
+
// a full-page redirect — see SocialButtons + the /callback page).
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { login, register, verifyEmail, MemberAuthError } from "@/rest/wix-members-auth";
|
|
9
|
+
import { useMember } from "@/context/MemberContext";
|
|
10
|
+
|
|
11
|
+
export function useLoginForm({ onSuccess } = {}) {
|
|
12
|
+
const { refresh } = useMember();
|
|
13
|
+
const [mode, setMode] = useState("login"); // "login" | "register"
|
|
14
|
+
const [fields, setFields] = useState({ email: "", password: "", firstName: "", lastName: "" });
|
|
15
|
+
// phase drives which UI shows: the form, the 6-digit code entry, or a pending-approval notice.
|
|
16
|
+
const [phase, setPhase] = useState("form"); // "form" | "verify" | "pending"
|
|
17
|
+
const [stateToken, setStateToken] = useState(null);
|
|
18
|
+
const [code, setCode] = useState("");
|
|
19
|
+
const [error, setError] = useState(null);
|
|
20
|
+
const [busy, setBusy] = useState(false);
|
|
21
|
+
|
|
22
|
+
const setField = (name, value) => setFields((f) => ({ ...f, [name]: value }));
|
|
23
|
+
|
|
24
|
+
// Route a resolved { state } to the right phase. On SUCCESS refresh the member session (so the
|
|
25
|
+
// header/account update) and hand control back to the caller (navigate away).
|
|
26
|
+
async function applyResult(res) {
|
|
27
|
+
if (res.state === "SUCCESS") {
|
|
28
|
+
await refresh();
|
|
29
|
+
onSuccess?.(res.member);
|
|
30
|
+
} else if (res.state === "REQUIRE_EMAIL_VERIFICATION") {
|
|
31
|
+
setStateToken(res.stateToken);
|
|
32
|
+
setPhase("verify");
|
|
33
|
+
} else if (res.state === "REQUIRE_OWNER_APPROVAL") {
|
|
34
|
+
setPhase("pending");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Wrap a helper call: clear the error, flip busy, map MemberAuthError to a shown message.
|
|
39
|
+
// emailAlreadyExists on register → bounce the user to the login tab instead of erroring out.
|
|
40
|
+
async function run(fn) {
|
|
41
|
+
setError(null);
|
|
42
|
+
setBusy(true);
|
|
43
|
+
try {
|
|
44
|
+
await applyResult(await fn());
|
|
45
|
+
} catch (e) {
|
|
46
|
+
if (e instanceof MemberAuthError) {
|
|
47
|
+
if (e.code === "emailAlreadyExists") { setMode("login"); setError(e.message); }
|
|
48
|
+
else setError(e.message);
|
|
49
|
+
} else throw e;
|
|
50
|
+
} finally {
|
|
51
|
+
setBusy(false);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const submit = (e) => {
|
|
56
|
+
e?.preventDefault?.();
|
|
57
|
+
const { email, password, firstName, lastName } = fields;
|
|
58
|
+
if (mode === "register") {
|
|
59
|
+
const profile = (firstName || lastName) ? { firstName, lastName } : undefined;
|
|
60
|
+
return run(() => register(email, password, profile));
|
|
61
|
+
}
|
|
62
|
+
return run(() => login(email, password));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const submitCode = (e) => {
|
|
66
|
+
e?.preventDefault?.();
|
|
67
|
+
return run(() => verifyEmail(code, stateToken));
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const switchMode = (next) => { setMode(next); setError(null); };
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
mode, switchMode, fields, setField,
|
|
74
|
+
phase, code, setCode,
|
|
75
|
+
error, busy, submit, submitCode,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Account page (`/account`) — the member's own profile + log out. Gate it with <RequireAuth> in the
|
|
2
|
+
// router (STEP 4) so a visitor is bounced to /login. Reads the member from useMember(); shows the
|
|
3
|
+
// identity-only fallback when the Members Area app isn't installed (member is null but loggedIn is
|
|
4
|
+
// true — that's setup, not a bug). Styled with base44 design tokens (shadcn Tailwind classes).
|
|
5
|
+
import { useMember } from "@/context/MemberContext";
|
|
6
|
+
|
|
7
|
+
export default function Account() {
|
|
8
|
+
const { member, logout } = useMember();
|
|
9
|
+
|
|
10
|
+
const name = member?.profile?.nickname
|
|
11
|
+
|| [member?.contact?.firstName, member?.contact?.lastName].filter(Boolean).join(" ")
|
|
12
|
+
|| member?.loginEmail
|
|
13
|
+
|| "Member";
|
|
14
|
+
const email = member?.loginEmail;
|
|
15
|
+
const photo = member?.profile?.photo?.url;
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<main className="max-w-[420px] mx-auto py-8 px-4">
|
|
19
|
+
<div className="flex flex-col items-center gap-3 text-center p-6 bg-card border border-border rounded-lg shadow-sm">
|
|
20
|
+
<div className="w-[72px] h-[72px] rounded-full overflow-hidden bg-background border border-border">
|
|
21
|
+
{photo && <img src={photo.startsWith("//") ? `https:${photo}` : photo} alt="" className="w-full h-full object-cover" />}
|
|
22
|
+
</div>
|
|
23
|
+
<h1 className="font-display m-0 text-[22px]">{name}</h1>
|
|
24
|
+
{email && <p className="text-muted-foreground m-0">{email}</p>}
|
|
25
|
+
{!member && (
|
|
26
|
+
<p className="text-muted-foreground m-0 text-[13px] leading-normal">
|
|
27
|
+
You're signed in. Install the Wix Members Area app to show profile details here.
|
|
28
|
+
</p>
|
|
29
|
+
)}
|
|
30
|
+
<button type="button" onClick={() => logout()}
|
|
31
|
+
className="mt-2 py-2.5 px-6 cursor-pointer text-sm font-semibold bg-primary text-primary-foreground border-none rounded-sm"
|
|
32
|
+
>Log out</button>
|
|
33
|
+
</div>
|
|
34
|
+
</main>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Social/SSO callback page — mount at EXACTLY `/callback` (the URL you allow-list on the OAuth app;
|
|
2
|
+
// it must match SocialButtons' callbackUri character-for-character). The provider redirects the whole
|
|
3
|
+
// page back here with `#code`/`#state` in the hash; completeSocialLogin() verifies state, exchanges
|
|
4
|
+
// the code for member tokens, and logs the member in on the shared client. Then refresh the session
|
|
5
|
+
// and send them to `returnTo`. Styled with base44 design tokens (shadcn Tailwind classes).
|
|
6
|
+
import { useEffect, useState } from "react";
|
|
7
|
+
import { completeSocialLogin } from "@/rest/wix-members-auth";
|
|
8
|
+
import { useMember } from "@/context/MemberContext";
|
|
9
|
+
|
|
10
|
+
export default function Callback() {
|
|
11
|
+
const { refresh } = useMember();
|
|
12
|
+
const [error, setError] = useState(null);
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
let cancelled = false;
|
|
16
|
+
completeSocialLogin()
|
|
17
|
+
.then(async ({ returnTo }) => {
|
|
18
|
+
await refresh();
|
|
19
|
+
if (!cancelled) window.location.replace(returnTo || "/");
|
|
20
|
+
})
|
|
21
|
+
.catch((e) => { if (!cancelled) setError(e.message || "Login failed."); });
|
|
22
|
+
return () => { cancelled = true; };
|
|
23
|
+
}, [refresh]);
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<main className="p-12 text-center text-muted-foreground">
|
|
27
|
+
{error
|
|
28
|
+
? <p className="text-destructive" role="alert">{error} <a href="/login" className="text-primary">Try again</a></p>
|
|
29
|
+
: <p>Signing you in…</p>}
|
|
30
|
+
</main>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Login page (`/login`) — composes the shipped LoginForm (credential state machine) with
|
|
2
|
+
// SocialButtons (Google/Facebook redirect). On credential SUCCESS it returns the member to where
|
|
3
|
+
// they came from (RequireAuth stashes it in location.state.from) or home. Social login returns via
|
|
4
|
+
// /callback instead. Styled with base44 design tokens (shadcn Tailwind classes) — don't rewrite this page to add chrome
|
|
5
|
+
// (the Header/Footer live in the Layout).
|
|
6
|
+
import { useNavigate, useLocation } from "react-router-dom";
|
|
7
|
+
import LoginForm from "@/components/LoginForm";
|
|
8
|
+
import SocialButtons from "@/components/SocialButtons";
|
|
9
|
+
|
|
10
|
+
export default function Login() {
|
|
11
|
+
const navigate = useNavigate();
|
|
12
|
+
const location = useLocation();
|
|
13
|
+
const from = location.state?.from || "/";
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<main className="max-w-[420px] mx-auto py-8 px-4 flex flex-col gap-5">
|
|
17
|
+
<h1 className="font-display text-center m-0">Welcome</h1>
|
|
18
|
+
|
|
19
|
+
<LoginForm onSuccess={() => navigate(from, { replace: true })} />
|
|
20
|
+
|
|
21
|
+
<Divider>or</Divider>
|
|
22
|
+
<SocialButtons />
|
|
23
|
+
</main>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function Divider({ children }) {
|
|
28
|
+
return (
|
|
29
|
+
<div className="flex items-center gap-3 text-muted-foreground text-[13px]">
|
|
30
|
+
<span className="flex-1 h-px bg-border" />
|
|
31
|
+
{children}
|
|
32
|
+
<span className="flex-1 h-px bg-border" />
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -41,9 +41,12 @@ import {
|
|
|
41
41
|
* Members Area app or they're silently dropped. Social (B) can't collect any of
|
|
42
42
|
* these — that's the reason to pick direct-credential.
|
|
43
43
|
*
|
|
44
|
-
* Docs (curl the .md):
|
|
45
|
-
* ·
|
|
46
|
-
* ·
|
|
44
|
+
* Docs (curl the .md): Login https://dev.wix.com/docs/api-reference/business-management/headless/authentication/login-v-2.md
|
|
45
|
+
* · Register https://dev.wix.com/docs/api-reference/business-management/headless/authentication/register-v-2.md
|
|
46
|
+
* · Logout https://dev.wix.com/docs/api-reference/business-management/headless/authentication/logout.md
|
|
47
|
+
* · Change Password https://dev.wix.com/docs/api-reference/business-management/headless/authentication/change-password.md
|
|
48
|
+
* · Retrieve Tokens https://dev.wix.com/docs/api-reference/business-management/headless/authentication/retrieve-tokens.md
|
|
49
|
+
* · external/social login https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
|
|
47
50
|
*/
|
|
48
51
|
|
|
49
52
|
const AUTH_BASE = "/_api/iam/authentication/v2";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Repair stub for `/register` — NOT part of the shipped route surface.
|
|
2
|
+
//
|
|
3
|
+
// This vertical has no registration page by design: sign-up is the "Sign up" tab inside the shipped
|
|
4
|
+
// LoginForm (see components/LoginForm.jsx), and the routes are `/login`, `/callback`, `/account`.
|
|
5
|
+
// Base44, however, seeds its OWN src/pages/Register.jsx (email/password + OTP against base44.auth)
|
|
6
|
+
// into every custom-auth-enrolled app at app creation, before any Wix skill runs. deploy.cjs writes
|
|
7
|
+
// this file over that leftover so a stale Base44 registration flow can't stay live — a redirect
|
|
8
|
+
// rather than a delete, because App.jsx may already route `/register` and a missing import would
|
|
9
|
+
// break the build.
|
|
10
|
+
//
|
|
11
|
+
// Lives outside `app/` on purpose: `app/` is copied into src/ for EVERY members install, and a fresh
|
|
12
|
+
// app with no Base44 leftover has no use for this page.
|
|
13
|
+
import { useEffect } from "react";
|
|
14
|
+
import { useNavigate } from "react-router-dom";
|
|
15
|
+
|
|
16
|
+
export default function Register() {
|
|
17
|
+
const navigate = useNavigate();
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
navigate("/login", { replace: true });
|
|
20
|
+
}, [navigate]);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Members — seeding
|
|
2
|
+
|
|
3
|
+
**Nothing to seed.** Members login is the identity layer: members **self-register** through the
|
|
4
|
+
Wix login page, so there is no member to create at build time and nothing lands in a `seeded`
|
|
5
|
+
map. There is intentionally no `seed-*.js` here.
|
|
6
|
+
|
|
7
|
+
The members work is entirely **frontend wiring** (custom login, account area, gated content) —
|
|
8
|
+
see this vertical's `INSTRUCTIONS.md` and the reference components.
|
|
9
|
+
|
|
10
|
+
_Optional, off by default:_ only if a run's prompt explicitly asks to exercise the pricing-plans
|
|
11
|
+
purchase path end-to-end, one test member may be created — keep this off so headless runs stay
|
|
12
|
+
deterministic and don't stall on an interactive login. If you need that, use the **`wix-docs`**
|
|
13
|
+
skill for the current member-create shape (source: `wix-headless/references/SEED.md` § members).
|
|
14
|
+
|
|
15
|
+
## Reference
|
|
16
|
+
Members self-register, so this vertical seeds nothing. These are the methods to read if you do reach
|
|
17
|
+
for one — each page carries the exact body shape, the required permission scope, and the response
|
|
18
|
+
envelope. `Create Member` needs an elevated credential; the rest run from the client.
|
|
19
|
+
- Create Member (admin — pre-creating a member, e.g. a blog author): https://dev.wix.com/docs/api-reference/crm/members-contacts/members/member-management/members/create-member.md
|
|
20
|
+
- Login: https://dev.wix.com/docs/api-reference/business-management/headless/authentication/login-v-2.md
|
|
21
|
+
- Register: https://dev.wix.com/docs/api-reference/business-management/headless/authentication/register-v-2.md
|
|
22
|
+
- Retrieve Tokens: https://dev.wix.com/docs/api-reference/business-management/headless/authentication/retrieve-tokens.md
|