orionplace-react 0.1.0 → 0.2.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 +276 -35
- package/bin/orionplace-react.mjs +4 -1
- package/package.json +18 -5
- package/runtime/app.d.mts +6 -0
- package/runtime/app.mjs +48 -0
- package/runtime/marketplace.d.mts +13 -8
- package/runtime/marketplace.mjs +287 -211
- package/src/project-readme.mjs +95 -35
- package/src/setup.mjs +36 -13
- package/templates/app/StorefrontShell.tsx +435 -0
- package/templates/app/[[...path]]/page.app.tsx +11 -0
- package/templates/app/_storefront/ActivityPage.tsx +23 -0
- package/templates/app/_storefront/AddressesPage.tsx +29 -0
- package/templates/app/_storefront/AppRoutes.tsx +182 -0
- package/templates/app/_storefront/ArticlePage.tsx +81 -0
- package/templates/app/_storefront/CartPage.tsx +53 -0
- package/templates/app/_storefront/CatalogPage.tsx +37 -0
- package/templates/app/_storefront/CategoryPage.tsx +64 -0
- package/templates/app/_storefront/ContactPage.tsx +32 -0
- package/templates/app/_storefront/HomePage.tsx +140 -0
- package/templates/app/_storefront/JournalPage.tsx +36 -0
- package/templates/app/_storefront/LogoutPage.tsx +91 -0
- package/templates/app/_storefront/ManufacturersPage.tsx +64 -0
- package/templates/app/_storefront/OrdersPage.tsx +129 -0
- package/templates/app/_storefront/ProductPage.tsx +105 -0
- package/templates/app/_storefront/ProfilePage.tsx +75 -0
- package/templates/app/_storefront/PromoPage.tsx +66 -0
- package/templates/app/_storefront/PromocodesPage.tsx +17 -0
- package/templates/app/_storefront/SearchPage.tsx +220 -0
- package/templates/app/_storefront/SellersPage.tsx +160 -0
- package/templates/app/_storefront/StorefrontErrorRoute.tsx +42 -0
- package/templates/app/_storefront/StorefrontPageMetadata.tsx +74 -0
- package/templates/app/_storefront/StorefrontPageStatus.tsx +61 -0
- package/templates/app/_storefront/StoresPage.tsx +53 -0
- package/templates/app/_storefront/SubscriptionsPage.tsx +62 -0
- package/templates/app/_storefront/SupportPage.tsx +141 -0
- package/templates/app/_storefront/TariffsPage.tsx +180 -0
- package/templates/app/_storefront/UnsubscribePage.tsx +29 -0
- package/templates/app/_storefront/WalletPage.tsx +78 -0
- package/templates/app/_storefront/WishlistPage.tsx +79 -0
- package/templates/app/_storefront/storefrontRoutes.tsx +738 -0
- package/templates/app/_storefront/useAccountWallet.ts +27 -0
- package/templates/app/_storefront/useBlogComments.ts +389 -0
- package/templates/app/_storefront/useProductSearch.ts +171 -0
- package/templates/app/_storefront/useStorefrontNavigation.ts +36 -0
- package/templates/app/activity/page.tsx +9 -0
- package/templates/app/addresses/page.tsx +9 -0
- package/templates/app/api/[...orionplace]/route.ts +11 -4
- package/templates/app/browse/page.tsx +27 -0
- package/templates/app/cart/page.tsx +9 -0
- package/templates/app/catalog/page.tsx +9 -0
- package/templates/app/category/[id]/page.tsx +9 -0
- package/templates/app/contact/page.tsx +9 -0
- package/templates/app/error.tsx +7 -0
- package/templates/app/featured/page.tsx +9 -0
- package/templates/app/global-error.tsx +61 -0
- package/templates/app/globals.css +50 -2
- package/templates/app/journal/[id]/page.tsx +9 -0
- package/templates/app/journal/page.tsx +9 -0
- package/templates/app/layout.app.tsx +20 -0
- package/templates/app/layout.tsx +44 -10
- package/templates/app/logout/page.tsx +9 -0
- package/templates/app/manufacturers/page.tsx +9 -0
- package/templates/app/not-found.tsx +5 -0
- package/templates/app/orders/page.tsx +9 -0
- package/templates/app/page.module.css +12 -8
- package/templates/app/page.tsx +8 -79
- package/templates/app/product/[id]/page.tsx +9 -0
- package/templates/app/profile/page.tsx +9 -0
- package/templates/app/promo/[id]/page.tsx +9 -0
- package/templates/app/promocodes/page.tsx +9 -0
- package/templates/app/ps3/blog/[...orionplace]/route.ts +13 -0
- package/templates/app/sellers/page.tsx +9 -0
- package/templates/app/storefront.module.css +406 -0
- package/templates/app/stores/page.tsx +9 -0
- package/templates/app/subscriptions/page.tsx +9 -0
- package/templates/app/tariffs/[slug]/[id]/page.tsx +9 -0
- package/templates/app/tariffs/page.tsx +9 -0
- package/templates/app/tickets/page.tsx +9 -0
- package/templates/app/unsubscribe/page.tsx +9 -0
- package/templates/app/wallet/page.tsx +9 -0
- package/templates/app/wishlist/page.tsx +9 -0
- package/templates/components/orionplace/account/AccountActivity.README.md +70 -0
- package/templates/components/orionplace/account/AccountActivity.module.css +16 -0
- package/templates/components/orionplace/account/AccountActivity.tsx +94 -0
- package/templates/components/orionplace/account/AccountPromocodes.README.md +70 -0
- package/templates/components/orionplace/account/AccountPromocodes.module.css +92 -0
- package/templates/components/orionplace/account/AccountPromocodes.tsx +257 -0
- package/templates/components/orionplace/account/AccountSection.README.md +46 -0
- package/templates/components/orionplace/account/AccountSection.module.css +110 -0
- package/templates/components/orionplace/account/AccountSection.tsx +109 -0
- package/templates/components/orionplace/account/ProfileAvatar.README.md +48 -0
- package/templates/components/orionplace/account/ProfileAvatar.module.css +31 -0
- package/templates/components/orionplace/account/ProfileAvatar.tsx +138 -0
- package/templates/components/orionplace/account/ProfileDeleteAccount.README.md +59 -0
- package/templates/components/orionplace/account/ProfileDeleteAccount.module.css +51 -0
- package/templates/components/orionplace/account/ProfileDeleteAccount.tsx +171 -0
- package/templates/components/orionplace/account/ProfileDetailsForm.README.md +44 -0
- package/templates/components/orionplace/account/ProfileDetailsForm.module.css +35 -0
- package/templates/components/orionplace/account/ProfileDetailsForm.tsx +178 -0
- package/templates/components/orionplace/account/ProfileEmailSettings.README.md +52 -0
- package/templates/components/orionplace/account/ProfileEmailSettings.module.css +51 -0
- package/templates/components/orionplace/account/ProfileEmailSettings.tsx +276 -0
- package/templates/components/orionplace/account/ProfilePasswordForm.README.md +45 -0
- package/templates/components/orionplace/account/ProfilePasswordForm.module.css +43 -0
- package/templates/components/orionplace/account/ProfilePasswordForm.tsx +227 -0
- package/templates/components/orionplace/account/ProfileSignIn.README.md +64 -0
- package/templates/components/orionplace/account/ProfileSignIn.module.css +86 -0
- package/templates/components/orionplace/account/ProfileSignIn.tsx +463 -0
- package/templates/components/orionplace/account/SignInHistory.README.md +52 -0
- package/templates/components/orionplace/account/SignInHistory.module.css +81 -0
- package/templates/components/orionplace/account/SignInHistory.tsx +231 -0
- package/templates/components/orionplace/account/StorefrontLogout.README.md +48 -0
- package/templates/components/orionplace/account/StorefrontLogout.module.css +166 -0
- package/templates/components/orionplace/account/StorefrontLogout.tsx +73 -0
- package/templates/components/orionplace/account/StorefrontProfile.README.md +71 -0
- package/templates/components/orionplace/account/StorefrontProfile.module.css +65 -0
- package/templates/components/orionplace/account/StorefrontProfile.tsx +189 -0
- package/templates/components/orionplace/account/account.module.css +1180 -0
- package/templates/components/orionplace/account/profile.module.css +696 -0
- package/templates/components/orionplace/address/AddressForm.README.md +152 -0
- package/templates/components/orionplace/address/AddressForm.module.css +336 -0
- package/templates/components/orionplace/address/AddressForm.tsx +827 -0
- package/templates/components/orionplace/address/StorefrontAddresses.README.md +99 -0
- package/templates/components/orionplace/address/StorefrontAddresses.module.css +271 -0
- package/templates/components/orionplace/address/StorefrontAddresses.tsx +438 -0
- package/templates/components/orionplace/banners/MainBanner.README.md +65 -0
- package/templates/components/orionplace/banners/MainBanner.module.css +112 -0
- package/templates/components/orionplace/banners/MainBanner.tsx +159 -0
- package/templates/components/orionplace/blog/BlogArticle.README.md +143 -0
- package/templates/components/orionplace/blog/BlogArticle.module.css +304 -0
- package/templates/components/orionplace/blog/BlogArticle.tsx +371 -0
- package/templates/components/orionplace/blog/BlogCommentForm.README.md +51 -0
- package/templates/components/orionplace/blog/BlogCommentForm.module.css +93 -0
- package/templates/components/orionplace/blog/BlogCommentForm.tsx +125 -0
- package/templates/components/orionplace/blog/BlogComments.README.md +98 -0
- package/templates/components/orionplace/blog/BlogComments.module.css +151 -0
- package/templates/components/orionplace/blog/BlogComments.tsx +590 -0
- package/templates/components/orionplace/blog/BlogPostCard.README.md +51 -0
- package/templates/components/orionplace/blog/BlogPostCard.module.css +167 -0
- package/templates/components/orionplace/blog/BlogPostCard.tsx +177 -0
- package/templates/components/orionplace/blog/BlogPostGroup.README.md +49 -0
- package/templates/components/orionplace/blog/BlogPostGroup.module.css +37 -0
- package/templates/components/orionplace/blog/BlogPostGroup.tsx +129 -0
- package/templates/components/orionplace/blog/StorefrontJournal.README.md +105 -0
- package/templates/components/orionplace/blog/StorefrontJournal.module.css +387 -0
- package/templates/components/orionplace/blog/StorefrontJournal.tsx +548 -0
- package/templates/components/orionplace/branding/BrandLogos.README.md +29 -0
- package/templates/components/orionplace/branding/BrandLogos.module.css +7 -0
- package/templates/components/orionplace/branding/BrandLogos.tsx +30 -0
- package/templates/components/orionplace/cart/CartCheckoutDetails.README.md +92 -0
- package/templates/components/orionplace/cart/CartCheckoutDetails.module.css +159 -0
- package/templates/components/orionplace/cart/CartCheckoutDetails.tsx +370 -0
- package/templates/components/orionplace/cart/CartDeliverySelector.README.md +166 -0
- package/templates/components/orionplace/cart/CartDeliverySelector.module.css +105 -0
- package/templates/components/orionplace/cart/CartDeliverySelector.tsx +679 -0
- package/templates/components/orionplace/cart/CartItemOptions.README.md +172 -0
- package/templates/components/orionplace/cart/CartItemOptions.module.css +113 -0
- package/templates/components/orionplace/cart/CartItemOptions.tsx +503 -0
- package/templates/components/orionplace/cart/CartLineItem.README.md +138 -0
- package/templates/components/orionplace/cart/CartLineItem.module.css +57 -0
- package/templates/components/orionplace/cart/CartLineItem.tsx +263 -0
- package/templates/components/orionplace/cart/CartPreview.README.md +99 -0
- package/templates/components/orionplace/cart/CartPreview.module.css +225 -0
- package/templates/components/orionplace/cart/CartPreview.tsx +188 -0
- package/templates/components/orionplace/cart/DeliveryMap.README.md +65 -0
- package/templates/components/orionplace/cart/DeliveryMap.module.css +32 -0
- package/templates/components/orionplace/cart/DeliveryMap.tsx +131 -0
- package/templates/components/orionplace/cart/StorefrontCart.README.md +281 -0
- package/templates/components/orionplace/cart/StorefrontCart.module.css +460 -0
- package/templates/components/orionplace/cart/StorefrontCart.tsx +937 -0
- package/templates/components/orionplace/catalog/CatalogHeader.README.md +136 -0
- package/templates/components/orionplace/catalog/CatalogHeader.module.css +387 -0
- package/templates/components/orionplace/catalog/CatalogHeader.tsx +644 -0
- package/templates/components/orionplace/catalog/CatalogRepresentative.README.md +68 -0
- package/templates/components/orionplace/catalog/CatalogRepresentative.tsx +51 -0
- package/templates/components/orionplace/catalog/StorefrontCatalog.README.md +120 -0
- package/templates/components/orionplace/catalog/StorefrontCatalog.module.css +179 -0
- package/templates/components/orionplace/catalog/StorefrontCatalog.tsx +304 -0
- package/templates/components/orionplace/categories/CategoryGroup.README.md +68 -0
- package/templates/components/orionplace/categories/CategoryGroup.module.css +110 -0
- package/templates/components/orionplace/categories/CategoryGroup.tsx +123 -0
- package/templates/components/orionplace/categories/StorefrontCategory.README.md +155 -0
- package/templates/components/orionplace/categories/StorefrontCategory.module.css +148 -0
- package/templates/components/orionplace/categories/StorefrontCategory.tsx +225 -0
- package/templates/components/orionplace/contact/AboutPage.README.md +40 -0
- package/templates/components/orionplace/contact/AboutPage.module.css +216 -0
- package/templates/components/orionplace/contact/AboutPage.tsx +191 -0
- package/templates/components/orionplace/contact/ContactForm.README.md +93 -0
- package/templates/components/orionplace/contact/ContactForm.module.css +264 -0
- package/templates/components/orionplace/contact/ContactForm.tsx +382 -0
- package/templates/components/orionplace/contact/EmailUnsubscribe.README.md +67 -0
- package/templates/components/orionplace/contact/EmailUnsubscribe.module.css +94 -0
- package/templates/components/orionplace/contact/EmailUnsubscribe.tsx +130 -0
- package/templates/components/orionplace/contact/StorefrontContact.README.md +73 -0
- package/templates/components/orionplace/contact/StorefrontContact.module.css +101 -0
- package/templates/components/orionplace/contact/StorefrontContact.tsx +62 -0
- package/templates/components/orionplace/currencies/MainCurrencySwitcher.README.md +37 -0
- package/templates/components/orionplace/currencies/MainCurrencySwitcher.tsx +68 -0
- package/templates/components/orionplace/events/EventEnrollmentDialog.README.md +108 -0
- package/templates/components/orionplace/events/EventEnrollmentDialog.module.css +110 -0
- package/templates/components/orionplace/events/EventEnrollmentDialog.tsx +315 -0
- package/templates/components/orionplace/events/EventsBlock.README.md +58 -0
- package/templates/components/orionplace/events/EventsBlock.module.css +101 -0
- package/templates/components/orionplace/events/EventsBlock.tsx +109 -0
- package/templates/components/orionplace/locale/MainLanguageSwitcher.README.md +46 -0
- package/templates/components/orionplace/locale/MainLanguageSwitcher.module.css +196 -0
- package/templates/components/orionplace/locale/MainLanguageSwitcher.tsx +387 -0
- package/templates/components/orionplace/manufacturers/ManufacturerIndex.README.md +83 -0
- package/templates/components/orionplace/manufacturers/ManufacturerIndex.module.css +271 -0
- package/templates/components/orionplace/manufacturers/ManufacturerIndex.tsx +218 -0
- package/templates/components/orionplace/manufacturers/StorefrontManufacturers.README.md +122 -0
- package/templates/components/orionplace/manufacturers/StorefrontManufacturers.module.css +92 -0
- package/templates/components/orionplace/manufacturers/StorefrontManufacturers.tsx +455 -0
- package/templates/components/orionplace/orders/OrderDetails.README.md +116 -0
- package/templates/components/orionplace/orders/OrderDetails.module.css +730 -0
- package/templates/components/orionplace/orders/OrderDetails.tsx +693 -0
- package/templates/components/orionplace/orders/OrderPaymentForm.README.md +92 -0
- package/templates/components/orionplace/orders/OrderPaymentForm.module.css +105 -0
- package/templates/components/orionplace/orders/OrderPaymentForm.tsx +90 -0
- package/templates/components/orionplace/orders/StorefrontOrders.README.md +131 -0
- package/templates/components/orionplace/orders/StorefrontOrders.module.css +633 -0
- package/templates/components/orionplace/orders/StorefrontOrders.tsx +922 -0
- package/templates/components/orionplace/payments/PaymentPanel.README.md +114 -0
- package/templates/components/orionplace/payments/PaymentPanel.module.css +134 -0
- package/templates/components/orionplace/payments/PaymentPanel.tsx +76 -0
- package/templates/components/orionplace/products/HoverImageViewer.README.md +62 -0
- package/templates/components/orionplace/products/HoverImageViewer.module.css +88 -0
- package/templates/components/orionplace/products/HoverImageViewer.tsx +179 -0
- package/templates/components/orionplace/products/ProductCard.README.md +152 -0
- package/templates/components/orionplace/products/ProductCard.module.css +333 -0
- package/templates/components/orionplace/products/ProductCard.tsx +716 -0
- package/templates/components/orionplace/products/ProductCardActions.README.md +84 -0
- package/templates/components/orionplace/products/ProductCardActions.module.css +146 -0
- package/templates/components/orionplace/products/ProductCardActions.tsx +311 -0
- package/templates/components/orionplace/products/ProductCardBadges.README.md +44 -0
- package/templates/components/orionplace/products/ProductCardBadges.module.css +15 -0
- package/templates/components/orionplace/products/ProductCardBadges.tsx +78 -0
- package/templates/components/orionplace/products/ProductCardDescription.README.md +33 -0
- package/templates/components/orionplace/products/ProductCardDescription.module.css +6 -0
- package/templates/components/orionplace/products/ProductCardDescription.tsx +43 -0
- package/templates/components/orionplace/products/ProductCardFavorite.README.md +52 -0
- package/templates/components/orionplace/products/ProductCardFavorite.module.css +64 -0
- package/templates/components/orionplace/products/ProductCardFavorite.tsx +90 -0
- package/templates/components/orionplace/products/ProductCardPrice.README.md +33 -0
- package/templates/components/orionplace/products/ProductCardPrice.module.css +22 -0
- package/templates/components/orionplace/products/ProductCardPrice.tsx +50 -0
- package/templates/components/orionplace/products/ProductCardRating.README.md +33 -0
- package/templates/components/orionplace/products/ProductCardRating.module.css +7 -0
- package/templates/components/orionplace/products/ProductCardRating.tsx +56 -0
- package/templates/components/orionplace/products/ProductCardSeller.README.md +36 -0
- package/templates/components/orionplace/products/ProductCardSeller.module.css +31 -0
- package/templates/components/orionplace/products/ProductCardSeller.tsx +61 -0
- package/templates/components/orionplace/products/ProductCardStockNotice.README.md +36 -0
- package/templates/components/orionplace/products/ProductCardStockNotice.module.css +8 -0
- package/templates/components/orionplace/products/ProductCardStockNotice.tsx +35 -0
- package/templates/components/orionplace/products/ProductCardTitle.README.md +30 -0
- package/templates/components/orionplace/products/ProductCardTitle.module.css +13 -0
- package/templates/components/orionplace/products/ProductCardTitle.tsx +31 -0
- package/templates/components/orionplace/products/ProductCardVariants.README.md +77 -0
- package/templates/components/orionplace/products/ProductCardVariants.module.css +97 -0
- package/templates/components/orionplace/products/ProductCardVariants.tsx +350 -0
- package/templates/components/orionplace/products/ProductGroup.README.md +89 -0
- package/templates/components/orionplace/products/ProductGroup.module.css +64 -0
- package/templates/components/orionplace/products/ProductGroup.tsx +183 -0
- package/templates/components/orionplace/products/ProductPreorderDialog.README.md +89 -0
- package/templates/components/orionplace/products/ProductPreorderDialog.module.css +320 -0
- package/templates/components/orionplace/products/ProductPreorderDialog.tsx +346 -0
- package/templates/components/orionplace/products/ProductReviewForm.README.md +72 -0
- package/templates/components/orionplace/products/ProductReviewForm.module.css +217 -0
- package/templates/components/orionplace/products/ProductReviewForm.tsx +288 -0
- package/templates/components/orionplace/products/ProductReviewGallery.README.md +61 -0
- package/templates/components/orionplace/products/ProductReviewGallery.module.css +108 -0
- package/templates/components/orionplace/products/ProductReviewGallery.tsx +110 -0
- package/templates/components/orionplace/products/ProductReviewImageViewer.README.md +49 -0
- package/templates/components/orionplace/products/ProductReviewImageViewer.module.css +50 -0
- package/templates/components/orionplace/products/ProductReviewImageViewer.tsx +260 -0
- package/templates/components/orionplace/products/ProductReviews.README.md +137 -0
- package/templates/components/orionplace/products/ProductReviews.module.css +602 -0
- package/templates/components/orionplace/products/ProductReviews.tsx +944 -0
- package/templates/components/orionplace/products/ProductSecondaryVariantModal.README.md +67 -0
- package/templates/components/orionplace/products/ProductSecondaryVariantModal.module.css +79 -0
- package/templates/components/orionplace/products/ProductSecondaryVariantModal.tsx +324 -0
- package/templates/components/orionplace/products/ProductSpecificationsDialog.README.md +52 -0
- package/templates/components/orionplace/products/ProductSpecificationsDialog.module.css +138 -0
- package/templates/components/orionplace/products/ProductSpecificationsDialog.tsx +117 -0
- package/templates/components/orionplace/products/StorefrontProduct.README.md +200 -0
- package/templates/components/orionplace/products/StorefrontProduct.module.css +767 -0
- package/templates/components/orionplace/products/StorefrontProduct.tsx +1339 -0
- package/templates/components/orionplace/products/StorefrontWishlist.README.md +162 -0
- package/templates/components/orionplace/products/StorefrontWishlist.module.css +71 -0
- package/templates/components/orionplace/products/StorefrontWishlist.tsx +402 -0
- package/templates/components/orionplace/promo/PromoProducts.README.md +133 -0
- package/templates/components/orionplace/promo/PromoProducts.module.css +68 -0
- package/templates/components/orionplace/promo/PromoProducts.tsx +345 -0
- package/templates/components/orionplace/search/MainSearch.README.md +73 -0
- package/templates/components/orionplace/search/MainSearch.module.css +202 -0
- package/templates/components/orionplace/search/MainSearch.tsx +217 -0
- package/templates/components/orionplace/search/ProductSearchResults.README.md +166 -0
- package/templates/components/orionplace/search/ProductSearchResults.module.css +358 -0
- package/templates/components/orionplace/search/ProductSearchResults.tsx +308 -0
- package/templates/components/orionplace/search/SearchFilters.README.md +109 -0
- package/templates/components/orionplace/search/SearchFilters.module.css +274 -0
- package/templates/components/orionplace/search/SearchFilters.tsx +439 -0
- package/templates/components/orionplace/sellers/SellerFilters.README.md +66 -0
- package/templates/components/orionplace/sellers/SellerFilters.module.css +232 -0
- package/templates/components/orionplace/sellers/SellerFilters.tsx +201 -0
- package/templates/components/orionplace/sellers/SellerPhotoGallery.README.md +72 -0
- package/templates/components/orionplace/sellers/SellerPhotoGallery.module.css +314 -0
- package/templates/components/orionplace/sellers/SellerPhotoGallery.tsx +335 -0
- package/templates/components/orionplace/sellers/SellerSummary.README.md +62 -0
- package/templates/components/orionplace/sellers/SellerSummary.module.css +182 -0
- package/templates/components/orionplace/sellers/SellerSummary.tsx +107 -0
- package/templates/components/orionplace/sellers/StorefrontSellers.README.md +120 -0
- package/templates/components/orionplace/sellers/StorefrontSellers.module.css +147 -0
- package/templates/components/orionplace/sellers/StorefrontSellers.tsx +360 -0
- package/templates/components/orionplace/shared/OrionplaceAvatar.README.md +35 -0
- package/templates/components/orionplace/shared/OrionplaceAvatar.module.css +35 -0
- package/templates/components/orionplace/shared/OrionplaceAvatar.tsx +61 -0
- package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.README.md +33 -0
- package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.module.css +81 -0
- package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.tsx +91 -0
- package/templates/components/orionplace/shared/OrionplaceEmptyState.README.md +37 -0
- package/templates/components/orionplace/shared/OrionplaceEmptyState.module.css +126 -0
- package/templates/components/orionplace/shared/OrionplaceEmptyState.tsx +78 -0
- package/templates/components/orionplace/shared/OrionplaceImage.README.md +45 -0
- package/templates/components/orionplace/shared/OrionplaceImage.module.css +22 -0
- package/templates/components/orionplace/shared/OrionplaceImage.tsx +96 -0
- package/templates/components/orionplace/shared/OrionplaceInfoHint.README.md +31 -0
- package/templates/components/orionplace/shared/OrionplaceInfoHint.module.css +59 -0
- package/templates/components/orionplace/shared/OrionplaceInfoHint.tsx +126 -0
- package/templates/components/orionplace/shared/OrionplacePasswordInput.README.md +39 -0
- package/templates/components/orionplace/shared/OrionplacePasswordInput.module.css +79 -0
- package/templates/components/orionplace/shared/OrionplacePasswordInput.tsx +103 -0
- package/templates/components/orionplace/shared/OrionplaceSearchSelect.README.md +97 -0
- package/templates/components/orionplace/shared/OrionplaceSearchSelect.module.css +246 -0
- package/templates/components/orionplace/shared/OrionplaceSearchSelect.tsx +367 -0
- package/templates/components/orionplace/shared/OrionplaceSelect.README.md +69 -0
- package/templates/components/orionplace/shared/OrionplaceSelect.module.css +233 -0
- package/templates/components/orionplace/shared/OrionplaceSelect.tsx +439 -0
- package/templates/components/orionplace/shared/StorefrontErrorPage.README.md +52 -0
- package/templates/components/orionplace/shared/StorefrontErrorPage.module.css +141 -0
- package/templates/components/orionplace/shared/StorefrontErrorPage.tsx +103 -0
- package/templates/components/orionplace/shared/StorefrontPagination.README.md +39 -0
- package/templates/components/orionplace/shared/StorefrontPagination.module.css +69 -0
- package/templates/components/orionplace/shared/StorefrontPagination.tsx +102 -0
- package/templates/components/orionplace/shared/dialogs.css +36 -0
- package/templates/components/orionplace/shared/emptyStateArt.ts +231 -0
- package/templates/components/orionplace/shared/features.module.css +162 -0
- package/templates/components/orionplace/social/SocialLinks.README.md +16 -0
- package/templates/components/orionplace/social/SocialLinks.module.css +36 -0
- package/templates/components/orionplace/social/SocialLinks.tsx +59 -0
- package/templates/components/orionplace/storefront/StorefrontAccount.README.md +59 -0
- package/templates/components/orionplace/storefront/StorefrontAccount.module.css +159 -0
- package/templates/components/orionplace/storefront/StorefrontAccount.tsx +303 -0
- package/templates/components/orionplace/storefront/StorefrontCartButton.README.md +47 -0
- package/templates/components/orionplace/storefront/StorefrontCartButton.module.css +88 -0
- package/templates/components/orionplace/storefront/StorefrontCartButton.tsx +54 -0
- package/templates/components/orionplace/storefront/StorefrontFooter.README.md +55 -0
- package/templates/components/orionplace/storefront/StorefrontFooter.module.css +118 -0
- package/templates/components/orionplace/storefront/StorefrontFooter.tsx +165 -0
- package/templates/components/orionplace/storefront/StorefrontHeader.README.md +150 -0
- package/templates/components/orionplace/storefront/StorefrontHeader.module.css +186 -0
- package/templates/components/orionplace/storefront/StorefrontHeader.tsx +389 -0
- package/templates/components/orionplace/storefront/StorefrontHome.README.md +138 -0
- package/templates/components/orionplace/storefront/StorefrontHome.module.css +116 -0
- package/templates/components/orionplace/storefront/StorefrontHome.tsx +282 -0
- package/templates/components/orionplace/storefront/StorefrontWishlistButton.README.md +51 -0
- package/templates/components/orionplace/storefront/StorefrontWishlistButton.module.css +95 -0
- package/templates/components/orionplace/storefront/StorefrontWishlistButton.tsx +80 -0
- package/templates/components/orionplace/stores/StorefrontStores.README.md +87 -0
- package/templates/components/orionplace/stores/StorefrontStores.module.css +218 -0
- package/templates/components/orionplace/stores/StorefrontStores.tsx +396 -0
- package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.README.md +183 -0
- package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.module.css +347 -0
- package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.tsx +884 -0
- package/templates/components/orionplace/subscriptions/StorefrontTariff.README.md +111 -0
- package/templates/components/orionplace/subscriptions/StorefrontTariff.module.css +311 -0
- package/templates/components/orionplace/subscriptions/StorefrontTariff.tsx +474 -0
- package/templates/components/orionplace/subscriptions/StorefrontTariffs.README.md +102 -0
- package/templates/components/orionplace/subscriptions/StorefrontTariffs.module.css +219 -0
- package/templates/components/orionplace/subscriptions/StorefrontTariffs.tsx +350 -0
- package/templates/components/orionplace/subscriptions/SubscriptionCancelDialog.README.md +67 -0
- package/templates/components/orionplace/subscriptions/SubscriptionCancelDialog.tsx +175 -0
- package/templates/components/orionplace/subscriptions/SubscriptionChangeDialog.README.md +95 -0
- package/templates/components/orionplace/subscriptions/SubscriptionChangeDialog.tsx +634 -0
- package/templates/components/orionplace/subscriptions/SubscriptionDialog.module.css +453 -0
- package/templates/components/orionplace/subscriptions/SubscriptionExtendDialog.README.md +75 -0
- package/templates/components/orionplace/subscriptions/SubscriptionExtendDialog.tsx +384 -0
- package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.README.md +116 -0
- package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.module.css +168 -0
- package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.tsx +236 -0
- package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.README.md +123 -0
- package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.module.css +57 -0
- package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.tsx +101 -0
- package/templates/components/orionplace/subscriptions/SubscriptionRenewalDialog.README.md +109 -0
- package/templates/components/orionplace/subscriptions/SubscriptionRenewalDialog.tsx +253 -0
- package/templates/components/orionplace/support/StorefrontSupport.README.md +157 -0
- package/templates/components/orionplace/support/StorefrontSupport.tsx +1040 -0
- package/templates/components/orionplace/support/Support.module.css +1133 -0
- package/templates/components/orionplace/support/TicketConversation.README.md +105 -0
- package/templates/components/orionplace/support/TicketConversation.tsx +502 -0
- package/templates/components/orionplace/support/TicketImage.README.md +52 -0
- package/templates/components/orionplace/support/TicketImage.tsx +254 -0
- package/templates/components/orionplace/support/TicketItemCard.README.md +66 -0
- package/templates/components/orionplace/support/TicketItemCard.tsx +140 -0
- package/templates/components/orionplace/support/TicketMessageForm.README.md +88 -0
- package/templates/components/orionplace/support/TicketMessageForm.tsx +261 -0
- package/templates/components/orionplace/support/TicketSubscriptionCard.README.md +53 -0
- package/templates/components/orionplace/support/TicketSubscriptionCard.tsx +118 -0
- package/templates/components/orionplace/tariffs/TariffCard.README.md +108 -0
- package/templates/components/orionplace/tariffs/TariffCard.module.css +86 -0
- package/templates/components/orionplace/tariffs/TariffCard.tsx +218 -0
- package/templates/components/orionplace/tariffs/TariffCardDescription.README.md +40 -0
- package/templates/components/orionplace/tariffs/TariffCardDescription.module.css +72 -0
- package/templates/components/orionplace/tariffs/TariffCardDescription.tsx +58 -0
- package/templates/components/orionplace/tariffs/TariffCardFeatures.README.md +58 -0
- package/templates/components/orionplace/tariffs/TariffCardFeatures.module.css +60 -0
- package/templates/components/orionplace/tariffs/TariffCardFeatures.tsx +140 -0
- package/templates/components/orionplace/tariffs/TariffCardImage.README.md +36 -0
- package/templates/components/orionplace/tariffs/TariffCardImage.module.css +8 -0
- package/templates/components/orionplace/tariffs/TariffCardImage.tsx +32 -0
- package/templates/components/orionplace/tariffs/TariffCardPrices.README.md +74 -0
- package/templates/components/orionplace/tariffs/TariffCardPrices.module.css +142 -0
- package/templates/components/orionplace/tariffs/TariffCardPrices.tsx +181 -0
- package/templates/components/orionplace/tariffs/TariffCardTitle.README.md +32 -0
- package/templates/components/orionplace/tariffs/TariffCardTitle.module.css +9 -0
- package/templates/components/orionplace/tariffs/TariffCardTitle.tsx +29 -0
- package/templates/components/orionplace/tariffs/TariffCards.README.md +88 -0
- package/templates/components/orionplace/tariffs/TariffCards.module.css +24 -0
- package/templates/components/orionplace/tariffs/TariffCards.tsx +44 -0
- package/templates/components/orionplace/tariffs/TariffSubscriptionModal.README.md +92 -0
- package/templates/components/orionplace/tariffs/TariffSubscriptionModal.module.css +214 -0
- package/templates/components/orionplace/tariffs/TariffSubscriptionModal.tsx +299 -0
- package/templates/components/orionplace/theme/OrionplaceThemeProvider.README.md +30 -0
- package/templates/components/orionplace/theme/OrionplaceThemeProvider.module.css +8 -0
- package/templates/components/orionplace/theme/OrionplaceThemeProvider.tsx +32 -0
- package/templates/components/orionplace/units/UnitSwitcher.README.md +35 -0
- package/templates/components/orionplace/units/UnitSwitcher.tsx +58 -0
- package/templates/components/orionplace/wallet/StorefrontWallet.README.md +154 -0
- package/templates/components/orionplace/wallet/StorefrontWallet.module.css +507 -0
- package/templates/components/orionplace/wallet/StorefrontWallet.tsx +915 -0
- package/templates/components/orionplace/wallet/WalletBalance.README.md +46 -0
- package/templates/components/orionplace/wallet/WalletBalance.module.css +46 -0
- package/templates/components/orionplace/wallet/WalletBalance.tsx +51 -0
- package/templates/components/orionplace/wallet/WalletTopUpForm.README.md +54 -0
- package/templates/components/orionplace/wallet/WalletTopUpForm.module.css +152 -0
- package/templates/components/orionplace/wallet/WalletTopUpForm.tsx +181 -0
- package/templates/hooks/useAccountActivity.ts +251 -0
- package/templates/hooks/useAccountAddresses.ts +81 -0
- package/templates/hooks/useAccountPromocodes.ts +91 -0
- package/templates/hooks/useOrionplaceActionMenu.ts +118 -0
- package/templates/hooks/useOrionplaceAddressForm.ts +262 -0
- package/templates/hooks/useOrionplaceApi.ts +98 -0
- package/templates/hooks/useOrionplaceAppLoad.ts +38 -6
- package/templates/hooks/useOrionplaceBlogReading.ts +351 -0
- package/templates/hooks/useOrionplaceDialog.ts +85 -0
- package/templates/hooks/useOrionplaceHomeProducts.ts +97 -0
- package/templates/hooks/useOrionplaceMap.tsx +230 -0
- package/templates/hooks/useOrionplaceMediaFormat.ts +33 -0
- package/templates/hooks/useOrionplaceProduct.ts +28 -0
- package/templates/hooks/useOrionplaceProfile.ts +347 -0
- package/templates/hooks/useOrionplaceReviews.ts +352 -0
- package/templates/hooks/useOrionplaceStableHeight.ts +65 -0
- package/templates/hooks/useOrionplaceStorefront.tsx +575 -0
- package/templates/hooks/useOrionplaceTariffPurchase.ts +152 -0
- package/templates/interfaces/orionplace/accounts/IContact.ts +21 -0
- package/templates/interfaces/orionplace/accounts/IEmailNotificationLocale.ts +17 -0
- package/templates/interfaces/orionplace/accounts/IEmailVerification.ts +59 -0
- package/templates/interfaces/orionplace/accounts/IProfileActions.ts +38 -0
- package/templates/interfaces/orionplace/accounts/IProfileData.ts +123 -0
- package/templates/interfaces/orionplace/accounts/IProfileMedia.ts +17 -0
- package/templates/interfaces/orionplace/accounts/IStorefrontProfile.ts +54 -0
- package/templates/interfaces/orionplace/address/IAddressCitySuggestion.ts +19 -0
- package/templates/interfaces/orionplace/address/IAddressEditor.ts +9 -0
- package/templates/interfaces/orionplace/address/IAddressLocationSuggestion.ts +22 -0
- package/templates/interfaces/orionplace/address/IAddressRegionSearch.ts +30 -0
- package/templates/interfaces/orionplace/address/IAddressSuggestion.ts +20 -0
- package/templates/interfaces/orionplace/address/IUserAddress.ts +87 -0
- package/templates/interfaces/orionplace/appBase/IAppLoad.ts +4 -3
- package/templates/interfaces/orionplace/appBase/IAppLoadCommon.ts +22 -31
- package/templates/interfaces/orionplace/appBase/IApploadUserProfile.ts +1 -1
- package/templates/interfaces/orionplace/appBase/IForm.ts +1 -1
- package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonBanner.ts +7 -7
- package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonPath.ts +2 -2
- package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSEO.ts +20 -7
- package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonTariff.ts +2 -2
- package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVariables.ts +1 -0
- package/templates/interfaces/orionplace/blog/IBlogApi.ts +247 -0
- package/templates/interfaces/orionplace/blog/IBlogPostPreview.ts +30 -0
- package/templates/interfaces/orionplace/cart/ICartActions.ts +67 -0
- package/templates/interfaces/orionplace/cart/ICartData.ts +382 -0
- package/templates/interfaces/orionplace/cart/ICartDeliveryActions.ts +68 -0
- package/templates/interfaces/orionplace/cart/ICartModal.ts +22 -0
- package/templates/interfaces/orionplace/cart/IDeliveryMap.ts +29 -0
- package/templates/interfaces/orionplace/catalog/ICatalogDirectory.ts +75 -0
- package/templates/interfaces/orionplace/category/ICategory.ts +2 -1
- package/templates/interfaces/orionplace/domains/IDomain.ts +2 -2
- package/templates/interfaces/orionplace/forms/ICustomerSubfilter.ts +19 -0
- package/templates/interfaces/orionplace/index.ts +64 -30
- package/templates/interfaces/orionplace/marketing/IPromoActions.ts +51 -0
- package/templates/interfaces/orionplace/orders/IOrderActions.ts +99 -0
- package/templates/interfaces/orionplace/orders/IOrderHistory.ts +259 -0
- package/templates/interfaces/orionplace/orders/IProductPreorder.ts +31 -0
- package/templates/interfaces/orionplace/payments/IInvoice.ts +147 -0
- package/templates/interfaces/orionplace/products/IProduct.ts +178 -151
- package/templates/interfaces/orionplace/products/IProductFeedbackApi.ts +218 -0
- package/templates/interfaces/orionplace/products/IProductSearchApi.ts +146 -0
- package/templates/interfaces/orionplace/products/IProductSearchFacets.ts +35 -0
- package/templates/interfaces/orionplace/products/IProductSecondaryVariantRequest.ts +15 -0
- package/templates/interfaces/orionplace/products/IProductSpecification.ts +14 -0
- package/templates/interfaces/orionplace/products/IWishlist.ts +22 -0
- package/templates/interfaces/orionplace/sellers/ISellerDirectory.ts +70 -0
- package/templates/interfaces/orionplace/shared/IBreadcrumb.ts +10 -0
- package/templates/interfaces/orionplace/shared/IStorefrontControls.ts +6 -0
- package/templates/interfaces/orionplace/state.ts +1 -1
- package/templates/interfaces/orionplace/stores/IStoreDirectory.ts +63 -0
- package/templates/interfaces/orionplace/subscribeTariff/ISubscribeTariff.ts +41 -31
- package/templates/interfaces/orionplace/subscribeTariff/ITariffSelection.ts +11 -0
- package/templates/interfaces/orionplace/subscribes/ISubscribe.ts +1 -1
- package/templates/interfaces/orionplace/subscribes/ISubscriptionApi.ts +125 -0
- package/templates/interfaces/orionplace/tickets/ICustomerTicketApi.ts +223 -0
- package/templates/interfaces/orionplace/transport.ts +7 -3
- package/templates/lib/orionplace/accountLabels.ts +22 -0
- package/templates/lib/orionplace/activityLabels.ts +65 -0
- package/templates/lib/orionplace/activityPresentation.ts +9 -0
- package/templates/lib/orionplace/addressChanges.ts +26 -0
- package/templates/lib/orionplace/addressPresentation.ts +58 -0
- package/templates/lib/orionplace/api.ts +326 -0
- package/templates/lib/orionplace/appLoadClient.ts +63 -21
- package/templates/lib/orionplace/appLoadResult.ts +75 -21
- package/templates/lib/orionplace/appLoadServer.ts +66 -21
- package/templates/lib/orionplace/blogArticle.ts +97 -0
- package/templates/lib/orionplace/blogArticleHtml.ts +370 -0
- package/templates/lib/orionplace/blogComments.ts +102 -0
- package/templates/lib/orionplace/blogJournal.ts +115 -0
- package/templates/lib/orionplace/blogLabels.ts +108 -0
- package/templates/lib/orionplace/blogPresentation.ts +67 -0
- package/templates/lib/orionplace/browseLabels.ts +98 -0
- package/templates/lib/orionplace/cartAddress.ts +86 -0
- package/templates/lib/orionplace/cartController.ts +104 -0
- package/templates/lib/orionplace/cartLabels.ts +261 -0
- package/templates/lib/orionplace/cartOptions.ts +115 -0
- package/templates/lib/orionplace/cartPreview.ts +120 -0
- package/templates/lib/orionplace/cartPromo.ts +150 -0
- package/templates/lib/orionplace/cartShipment.ts +61 -0
- package/templates/lib/orionplace/cartSnapshot.ts +21 -0
- package/templates/lib/orionplace/catalog.ts +150 -0
- package/templates/lib/orionplace/categoryLabels.ts +21 -0
- package/templates/lib/orionplace/contact.ts +47 -0
- package/templates/lib/orionplace/contactLabels.ts +102 -0
- package/templates/lib/orionplace/currency.ts +128 -0
- package/templates/lib/orionplace/deliveryMap.ts +86 -0
- package/templates/lib/orionplace/directoryLabels.ts +133 -0
- package/templates/lib/orionplace/domain.ts +11 -6
- package/templates/lib/orionplace/errorPageLabels.ts +74 -0
- package/templates/lib/orionplace/eventEnrollment.ts +22 -0
- package/templates/lib/orionplace/featureData.ts +28 -0
- package/templates/lib/orionplace/featureLabels.ts +271 -0
- package/templates/lib/orionplace/featuredLabels.ts +28 -0
- package/templates/lib/orionplace/footerLabels.ts +35 -0
- package/templates/lib/orionplace/guestSession.ts +55 -0
- package/templates/lib/orionplace/headerLabels.ts +68 -0
- package/templates/lib/orionplace/homeContent.ts +193 -0
- package/templates/lib/orionplace/homeLabels.ts +52 -0
- package/templates/lib/orionplace/htmlText.ts +51 -0
- package/templates/lib/orionplace/manufacturerDirectory.ts +71 -0
- package/templates/lib/orionplace/manufacturerIndex.ts +92 -0
- package/templates/lib/orionplace/modalWindow.ts +109 -0
- package/templates/lib/orionplace/nativeApp.ts +365 -0
- package/templates/lib/orionplace/navigation.tsx +121 -0
- package/templates/lib/orionplace/notice.ts +22 -0
- package/templates/lib/orionplace/orderLabels.ts +311 -0
- package/templates/lib/orionplace/orderPresentation.ts +574 -0
- package/templates/lib/orionplace/pageMetadata.ts +247 -0
- package/templates/lib/orionplace/pageSeo.ts +274 -0
- package/templates/lib/orionplace/paginationScroll.ts +131 -0
- package/templates/lib/orionplace/phone.ts +22 -0
- package/templates/lib/orionplace/presentation.ts +84 -0
- package/templates/lib/orionplace/productActionLabels.ts +60 -0
- package/templates/lib/orionplace/productAvailability.ts +30 -0
- package/templates/lib/orionplace/productGallery.ts +64 -0
- package/templates/lib/orionplace/productLabels.ts +82 -0
- package/templates/lib/orionplace/productPage.ts +308 -0
- package/templates/lib/orionplace/productPhotos.ts +67 -0
- package/templates/lib/orionplace/productSearch.ts +232 -0
- package/templates/lib/orionplace/productSeller.ts +56 -0
- package/templates/lib/orionplace/profile.ts +157 -0
- package/templates/lib/orionplace/profileLabels.ts +151 -0
- package/templates/lib/orionplace/promoLabels.ts +75 -0
- package/templates/lib/orionplace/promoPresentation.ts +381 -0
- package/templates/lib/orionplace/reviewLabels.ts +172 -0
- package/templates/lib/orionplace/reviewPresentation.ts +64 -0
- package/templates/lib/orionplace/reviewScope.ts +38 -0
- package/templates/lib/orionplace/searchFilters.ts +99 -0
- package/templates/lib/orionplace/searchHistory.ts +144 -0
- package/templates/lib/orionplace/sellerDirectory.ts +120 -0
- package/templates/lib/orionplace/seo.ts +52 -0
- package/templates/lib/orionplace/serverApi.ts +158 -0
- package/templates/lib/orionplace/serverLocale.ts +29 -0
- package/templates/lib/orionplace/serverMetadata.ts +86 -0
- package/templates/lib/orionplace/serverRecords.ts +25 -0
- package/templates/lib/orionplace/serverRoute.tsx +51 -0
- package/templates/lib/orionplace/sessionLabels.ts +27 -0
- package/templates/lib/orionplace/signInReturn.ts +89 -0
- package/templates/lib/orionplace/storeDirectory.ts +47 -0
- package/templates/lib/orionplace/storefrontRecords.ts +29 -0
- package/templates/lib/orionplace/subscriptionChanges.ts +120 -0
- package/templates/lib/orionplace/subscriptionLabels.ts +67 -0
- package/templates/lib/orionplace/subscriptionManageLabels.ts +306 -0
- package/templates/lib/orionplace/subscriptionPlans.ts +122 -0
- package/templates/lib/orionplace/subscriptionRemote.ts +85 -0
- package/templates/lib/orionplace/subscriptionUsage.ts +58 -0
- package/templates/lib/orionplace/tariffLabels.ts +123 -0
- package/templates/lib/orionplace/tariffPage.ts +54 -0
- package/templates/lib/orionplace/tariffVariables.ts +136 -0
- package/templates/lib/orionplace/tariffs.ts +192 -0
- package/templates/lib/orionplace/ticketItems.ts +75 -0
- package/templates/lib/orionplace/ticketLabels.ts +335 -0
- package/templates/lib/orionplace/ticketLocation.ts +79 -0
- package/templates/lib/orionplace/ticketRequests.ts +70 -0
- package/templates/lib/orionplace/walletTransaction.ts +105 -0
- package/templates/orionplace/COMPONENT-DOWNLOAD.md +66 -0
- package/templates/orionplace/COMPONENTS.md +35 -0
- package/templates/providers/OrionplaceProvider.tsx +164 -12
- package/templates/proxy.ts +8 -3
- package/templates/stores/orionplace.ts +212 -49
- package/templates/stores/orionplaceBrowse.ts +89 -0
- package/templates/stores/orionplaceCatalog.ts +144 -0
- package/templates/stores/orionplaceProducts.ts +389 -0
- package/templates/stores/orionplaceScope.ts +104 -0
- package/templates/stores/orionplaceSelections.ts +130 -0
- package/templates/themes/orionplace.ts +106 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# TicketConversation · React
|
|
2
|
+
|
|
3
|
+
## English
|
|
4
|
+
|
|
5
|
+
`TicketConversation` renders one support conversation from `ticket` and its
|
|
6
|
+
complete `replies` list. It shows the localized type, open or closed state,
|
|
7
|
+
creation date and, for an order conversation, the return decision and order
|
|
8
|
+
link. A return request marked as a defect (`is_defect: true`) shows Defect
|
|
9
|
+
beside the type. A conversation about a purchased item or subscription includes the
|
|
10
|
+
matching subject card when the parent supplies that data.
|
|
11
|
+
|
|
12
|
+
For a return, the component shows the current shipment state and what the
|
|
13
|
+
customer should do next, carrier details, tracking number, and each returned
|
|
14
|
+
item with its stage counts and selected-currency refund amount. Customer
|
|
15
|
+
messages appear on the right and support replies on the left. Each protected
|
|
16
|
+
attachment is loaded through `onLoadImage` by `TicketImage`.
|
|
17
|
+
|
|
18
|
+
An open conversation displays `TicketMessageForm` and calls
|
|
19
|
+
`onSubmit(text, files)`. Close and delete require an inline confirmation before
|
|
20
|
+
calling `onClose` or `onDelete`; deletion is available only while the
|
|
21
|
+
conversation has at most one message and no approved decision. A closed
|
|
22
|
+
conversation displays the current rating and calls `onRate(rating)`. Refresh
|
|
23
|
+
calls `onRefresh`. `pending` disables all actions, and `sentRevision` remounts
|
|
24
|
+
the reply form after confirmed delivery.
|
|
25
|
+
|
|
26
|
+
When `ticket.reply_wait` is set, the reply form is locked with the
|
|
27
|
+
`ticketReplyWaitText()` hint: `support_reply` until support answers for the
|
|
28
|
+
first time, `delay` while the store's `ticket_reply_delay_minutes` after the
|
|
29
|
+
customer's last message have not passed. A `delay` wait unlocks by itself
|
|
30
|
+
after `reply_wait.seconds`; a `support_reply` wait ends when `onRefresh`
|
|
31
|
+
brings the ticket with the support reply. The backend applies the same rule to
|
|
32
|
+
`customer_tickets_reply`.
|
|
33
|
+
|
|
34
|
+
The component makes no list, reply or mutation request itself. Source is
|
|
35
|
+
maintained in `components/orionplace/support/TicketConversation.tsx`.
|
|
36
|
+
|
|
37
|
+
### Props
|
|
38
|
+
|
|
39
|
+
| Prop | Meaning |
|
|
40
|
+
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `ticket: ICustomerTicket` | Support ticket displayed in the conversation. |
|
|
42
|
+
| `replies: ICustomerTicketReply[]` | Replies grouped under their owning record. |
|
|
43
|
+
| `pending?: boolean` | Shows the loading state and blocks duplicate actions. |
|
|
44
|
+
| `sentRevision?: number` | Changes after a successful send so the message form can reset its draft. |
|
|
45
|
+
| `subscription?: ICustomerSubscription` | Customer subscription displayed or changed by the component. |
|
|
46
|
+
| `subscriptionPlan?: ISubscribeTariff` | Plan data used to describe the support ticket subscription. |
|
|
47
|
+
| `orderHref?: (orderId: number, locale: string) => string` | Builds the order destination from the callback arguments. |
|
|
48
|
+
| `onLoadImage: (action: TicketImageLoadAction) => Promise<Blob> \| Blob` | Called when a protected image must be loaded. The callback payload is shown in its type. |
|
|
49
|
+
| `onSubmit?: (text: string, files: File[]) => void` | Passes reply `text` and the `files` array from the message form. The application sends the reply and supplies the updated conversation and `sentRevision`. |
|
|
50
|
+
| `onClose?: () => void` | Called without arguments after the customer confirms closing the support ticket. The application submits the close request and updates ticket data. |
|
|
51
|
+
| `onDelete?: () => void` | Called without arguments after the customer confirms deleting the support ticket. The application submits the deletion request and updates the list. |
|
|
52
|
+
| `onRate?: (rating: number) => void` | Passes the numeric support rating when the closed ticket’s rating form is submitted. The application saves the rating and updates ticket data. |
|
|
53
|
+
| `onRefresh?: () => void` | The refresh button calls the handler without arguments. The application loads the current ticket and replies. |
|
|
54
|
+
|
|
55
|
+
## Русский
|
|
56
|
+
|
|
57
|
+
`TicketConversation` выводит одно обращение из `ticket` и полный список его
|
|
58
|
+
сообщений `replies`. Компонент показывает локализованный тип, открытое или
|
|
59
|
+
закрытое состояние, дату создания, а для обращения по заказу — решение по
|
|
60
|
+
возврату и ссылку на заказ. Заявка на возврат, отмеченная как брак
|
|
61
|
+
(`is_defect: true`), показывает «Брак» рядом с типом. Для обращения по купленному товару или подписке
|
|
62
|
+
показывается соответствующая карточка, если родитель передал эти данные.
|
|
63
|
+
|
|
64
|
+
Для возврата выводятся текущее состояние отправления и следующее действие
|
|
65
|
+
покупателя, перевозчик, трек-номер и каждый возвращаемый товар с количеством на
|
|
66
|
+
этапах возврата и суммой в выбранной валюте. Сообщения покупателя находятся
|
|
67
|
+
справа, ответы поддержки — слева. Каждое защищённое вложение `TicketImage`
|
|
68
|
+
загружает через `onLoadImage`.
|
|
69
|
+
|
|
70
|
+
В открытом обращении `TicketMessageForm` вызывает `onSubmit(text, files)`.
|
|
71
|
+
Закрытие и удаление сначала требуют подтверждения, затем вызывают `onClose` или
|
|
72
|
+
`onDelete`; удалить можно только обращение не более чем с одним сообщением и
|
|
73
|
+
без одобренного решения. В закрытом обращении показывается текущая оценка, а
|
|
74
|
+
сохранение вызывает `onRate(rating)`. Обновление вызывает `onRefresh`.
|
|
75
|
+
`pending` блокирует действия, а смена `sentRevision` создаёт форму ответа
|
|
76
|
+
заново после подтверждённой отправки.
|
|
77
|
+
|
|
78
|
+
Если задан `ticket.reply_wait`, форма ответа блокируется с подсказкой
|
|
79
|
+
`ticketReplyWaitText()`: `support_reply` — до первого ответа поддержки,
|
|
80
|
+
`delay` — пока после последнего сообщения покупателя не прошло
|
|
81
|
+
`ticket_reply_delay_minutes` магазина. Ожидание `delay` снимается само через
|
|
82
|
+
`reply_wait.seconds`; ожидание `support_reply` заканчивается, когда
|
|
83
|
+
`onRefresh` приносит обращение с ответом поддержки. Сервер применяет то же
|
|
84
|
+
правило к `customer_tickets_reply`.
|
|
85
|
+
|
|
86
|
+
Сам компонент не загружает список и сообщения и не выполняет изменения.
|
|
87
|
+
Исходный файл: `components/orionplace/support/TicketConversation.tsx`.
|
|
88
|
+
|
|
89
|
+
### Свойства
|
|
90
|
+
|
|
91
|
+
| Свойство | Назначение |
|
|
92
|
+
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
93
|
+
| `ticket: ICustomerTicket` | Обращение, которое показано в переписке с поддержкой. |
|
|
94
|
+
| `replies: ICustomerTicketReply[]` | Ответы, сгруппированные под исходной записью. |
|
|
95
|
+
| `pending?: boolean` | Показывает загрузку и блокирует повторные действия. |
|
|
96
|
+
| `sentRevision?: number` | Меняется после успешной отправки, чтобы форма очистила черновик. |
|
|
97
|
+
| `subscription?: ICustomerSubscription` | Подписка покупателя, которую показывает или изменяет компонент. |
|
|
98
|
+
| `subscriptionPlan?: ISubscribeTariff` | Данные тарифа для описания подписки в обращении. |
|
|
99
|
+
| `orderHref?: (orderId: number, locale: string) => string` | Строит адрес ссылки заказа из аргументов обработчика. |
|
|
100
|
+
| `onLoadImage: (action: TicketImageLoadAction) => Promise<Blob> \| Blob` | Вызывается, когда нужно загрузить защищённое изображение. Данные обработчика указаны в его типе. |
|
|
101
|
+
| `onSubmit?: (text: string, files: File[]) => void` | Передаёт текст ответа `text` и массив файлов `files` из формы сообщения. Приложение отправляет ответ и передаёт обновлённую переписку и `sentRevision`. |
|
|
102
|
+
| `onClose?: () => void` | Вызывается без аргументов после подтверждения закрытия обращения. Приложение отправляет запрос закрытия и обновляет данные обращения. |
|
|
103
|
+
| `onDelete?: () => void` | Вызывается без аргументов после подтверждения удаления обращения. Приложение отправляет запрос удаления и обновляет список. |
|
|
104
|
+
| `onRate?: (rating: number) => void` | Передаёт числовую оценку поддержки при отправке формы оценки закрытого обращения. Приложение сохраняет оценку и обновляет данные обращения. |
|
|
105
|
+
| `onRefresh?: () => void` | Кнопка обновления вызывает обработчик без аргументов. Приложение загружает актуальное обращение и ответы. |
|
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { useOrionplaceSelections } from '@/providers/OrionplaceProvider';
|
|
5
|
+
import type { ISubscribeTariff } from '@/interfaces/orionplace/subscribeTariff/ISubscribeTariff';
|
|
6
|
+
import type { ICustomerSubscription } from '@/interfaces/orionplace/subscribes/ISubscriptionApi';
|
|
7
|
+
import {
|
|
8
|
+
ECustomerTicketSolution,
|
|
9
|
+
ECustomerTicketStatus,
|
|
10
|
+
ECustomerTicketType,
|
|
11
|
+
ETicketReplyDirection,
|
|
12
|
+
type ICustomerTicket,
|
|
13
|
+
type ICustomerTicketReply,
|
|
14
|
+
} from '@/interfaces/orionplace/tickets/ICustomerTicketApi';
|
|
15
|
+
import { featureLabels } from '@/lib/orionplace/featureLabels';
|
|
16
|
+
import { orderRefundEntries } from '@/lib/orionplace/orderPresentation';
|
|
17
|
+
import { getAvailableNestedValueFromObject } from '@/lib/orionplace/presentation';
|
|
18
|
+
import {
|
|
19
|
+
refundShipmentView,
|
|
20
|
+
ticketLabels,
|
|
21
|
+
ticketSolutionText,
|
|
22
|
+
ticketSolutionTone,
|
|
23
|
+
ticketReplyWaitText,
|
|
24
|
+
ticketStatusView,
|
|
25
|
+
ticketTypeText,
|
|
26
|
+
} from '@/lib/orionplace/ticketLabels';
|
|
27
|
+
import {
|
|
28
|
+
orderTicketLines,
|
|
29
|
+
ticketOrderLine,
|
|
30
|
+
} from '@/lib/orionplace/ticketItems';
|
|
31
|
+
import { OrionplaceSelect } from '@/components/orionplace/shared/OrionplaceSelect';
|
|
32
|
+
import { TicketImage, type TicketImageLoadAction } from './TicketImage';
|
|
33
|
+
import { TicketItemCard } from './TicketItemCard';
|
|
34
|
+
import { TicketMessageForm } from './TicketMessageForm';
|
|
35
|
+
import { TicketSubscriptionCard } from './TicketSubscriptionCard';
|
|
36
|
+
import styles from './Support.module.css';
|
|
37
|
+
|
|
38
|
+
export interface TicketConversationProps {
|
|
39
|
+
ticket: ICustomerTicket;
|
|
40
|
+
replies: ICustomerTicketReply[];
|
|
41
|
+
pending?: boolean;
|
|
42
|
+
sentRevision?: number;
|
|
43
|
+
subscription?: ICustomerSubscription;
|
|
44
|
+
subscriptionPlan?: ISubscribeTariff;
|
|
45
|
+
orderHref?: (orderId: number, locale: string) => string;
|
|
46
|
+
onLoadImage: (action: TicketImageLoadAction) => Promise<Blob> | Blob;
|
|
47
|
+
onSubmit?: (text: string, files: File[]) => void;
|
|
48
|
+
onClose?: () => void;
|
|
49
|
+
onDelete?: () => void;
|
|
50
|
+
onRate?: (rating: number) => void;
|
|
51
|
+
onRefresh?: () => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function Icon({ children }: { children: React.ReactNode }) {
|
|
55
|
+
return (
|
|
56
|
+
<svg
|
|
57
|
+
className={styles.icon}
|
|
58
|
+
viewBox="0 0 24 24"
|
|
59
|
+
fill="none"
|
|
60
|
+
stroke="currentColor"
|
|
61
|
+
strokeWidth="1.6"
|
|
62
|
+
strokeLinecap="round"
|
|
63
|
+
strokeLinejoin="round"
|
|
64
|
+
aria-hidden="true"
|
|
65
|
+
>
|
|
66
|
+
{children}
|
|
67
|
+
</svg>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function StatusIcon({ locked }: { locked: boolean }) {
|
|
72
|
+
return (
|
|
73
|
+
<svg
|
|
74
|
+
viewBox="0 0 24 24"
|
|
75
|
+
fill="none"
|
|
76
|
+
stroke="currentColor"
|
|
77
|
+
strokeWidth="1.6"
|
|
78
|
+
strokeLinecap="round"
|
|
79
|
+
strokeLinejoin="round"
|
|
80
|
+
aria-hidden="true"
|
|
81
|
+
>
|
|
82
|
+
<rect
|
|
83
|
+
x="5"
|
|
84
|
+
y="11"
|
|
85
|
+
width="14"
|
|
86
|
+
height="10"
|
|
87
|
+
/>
|
|
88
|
+
<path
|
|
89
|
+
d={locked ? 'M8 11V7a4 4 0 0 1 8 0v4' : 'M8 11V7a4 4 0 0 1 7.6-1.7'}
|
|
90
|
+
/>
|
|
91
|
+
</svg>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function TicketConversation({
|
|
96
|
+
ticket,
|
|
97
|
+
replies,
|
|
98
|
+
pending = false,
|
|
99
|
+
sentRevision = 0,
|
|
100
|
+
subscription,
|
|
101
|
+
subscriptionPlan,
|
|
102
|
+
orderHref = (id, locale) =>
|
|
103
|
+
`/orders?order=${id}&locale=${encodeURIComponent(locale)}`,
|
|
104
|
+
onLoadImage,
|
|
105
|
+
onSubmit,
|
|
106
|
+
onClose,
|
|
107
|
+
onDelete,
|
|
108
|
+
onRate,
|
|
109
|
+
onRefresh,
|
|
110
|
+
}: TicketConversationProps) {
|
|
111
|
+
const locale = useOrionplaceSelections((state) => state.localeCode);
|
|
112
|
+
const currencyId = useOrionplaceSelections((state) => state.currencyId);
|
|
113
|
+
const labels = ticketLabels(locale);
|
|
114
|
+
const common = featureLabels(locale);
|
|
115
|
+
const [confirmation, setConfirmation] = useState<'close' | 'delete'>();
|
|
116
|
+
const [rating, setRating] = useState(String(ticket.rating));
|
|
117
|
+
const status = ticketStatusView(ticket.status, labels);
|
|
118
|
+
const type = ticketTypeText(ticket.type, labels);
|
|
119
|
+
const refund = ticket.refund;
|
|
120
|
+
const refundState = refund
|
|
121
|
+
? refundShipmentView(refund.shipment_status, labels)
|
|
122
|
+
: undefined;
|
|
123
|
+
const carrier = getAvailableNestedValueFromObject(
|
|
124
|
+
refund?.track?.carrier_name,
|
|
125
|
+
locale,
|
|
126
|
+
'carrier_name',
|
|
127
|
+
);
|
|
128
|
+
const orderLines = orderTicketLines(refund?.order, locale);
|
|
129
|
+
const refundItems = orderRefundEntries(refund?.order, currencyId).map(
|
|
130
|
+
(entry) => ({
|
|
131
|
+
...entry,
|
|
132
|
+
option: orderLines.find((line) => line.key === entry.key)?.option,
|
|
133
|
+
}),
|
|
134
|
+
);
|
|
135
|
+
const line = ticketOrderLine(ticket, orderLines);
|
|
136
|
+
const subject =
|
|
137
|
+
ticket.type.int === ECustomerTicketType.ORDER &&
|
|
138
|
+
(ticket.product || line?.product)
|
|
139
|
+
? {
|
|
140
|
+
product: line?.product ?? ticket.product ?? null,
|
|
141
|
+
quantity: line?.quantity,
|
|
142
|
+
option: line?.option,
|
|
143
|
+
amount: line?.amount,
|
|
144
|
+
}
|
|
145
|
+
: undefined;
|
|
146
|
+
const decision =
|
|
147
|
+
ticket.type.int === ECustomerTicketType.ORDER
|
|
148
|
+
? {
|
|
149
|
+
text: ticketSolutionText(ticket.solution, labels),
|
|
150
|
+
tone: ticketSolutionTone(ticket.solution),
|
|
151
|
+
}
|
|
152
|
+
: undefined;
|
|
153
|
+
const created = [ticket.time_created?.date, ticket.time_created?.time]
|
|
154
|
+
.filter(Boolean)
|
|
155
|
+
.join(' ');
|
|
156
|
+
const canDelete =
|
|
157
|
+
ticket.counts.c_total_messages <= 1 &&
|
|
158
|
+
ticket.solution.int !== ECustomerTicketSolution.SOLUTION_APROOVED;
|
|
159
|
+
const ratings = {
|
|
160
|
+
0: labels.unrated,
|
|
161
|
+
1: '★',
|
|
162
|
+
2: '★★',
|
|
163
|
+
3: '★★★',
|
|
164
|
+
4: '★★★★',
|
|
165
|
+
5: '★★★★★',
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
setRating(String(ticket.rating));
|
|
170
|
+
setConfirmation(undefined);
|
|
171
|
+
}, [ticket.id, ticket.rating]);
|
|
172
|
+
|
|
173
|
+
// A `delay` wait ends by itself, so a timer unlocks the form; a
|
|
174
|
+
// `support_reply` wait ends when a refresh brings the support reply.
|
|
175
|
+
const replyWait = ticket.reply_wait;
|
|
176
|
+
const [waitOver, setWaitOver] = useState(false);
|
|
177
|
+
const waitHint = waitOver
|
|
178
|
+
? ''
|
|
179
|
+
: ticketReplyWaitText(replyWait, labels);
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
setWaitOver(false);
|
|
182
|
+
if (replyWait?.reason !== 'delay' || !replyWait.seconds) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const timer = setTimeout(() => setWaitOver(true), replyWait.seconds * 1000);
|
|
186
|
+
return () => clearTimeout(timer);
|
|
187
|
+
}, [replyWait]);
|
|
188
|
+
|
|
189
|
+
function confirm() {
|
|
190
|
+
if (confirmation === 'close') {
|
|
191
|
+
onClose?.();
|
|
192
|
+
} else if (confirmation === 'delete') {
|
|
193
|
+
onDelete?.();
|
|
194
|
+
}
|
|
195
|
+
setConfirmation(undefined);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return (
|
|
199
|
+
<section
|
|
200
|
+
className={`${styles.root} ${styles.stack}`}
|
|
201
|
+
data-feature-part="TicketConversation"
|
|
202
|
+
>
|
|
203
|
+
<header className={styles.conversationHeader}>
|
|
204
|
+
<div className={styles.conversationHeading}>
|
|
205
|
+
<h2>
|
|
206
|
+
{labels.ticket} #{ticket.id}
|
|
207
|
+
</h2>
|
|
208
|
+
<p className={styles.meta}>
|
|
209
|
+
{type ? <span>{type}</span> : null}
|
|
210
|
+
{ticket.is_defect ? (
|
|
211
|
+
<span
|
|
212
|
+
className={styles.defectMark}
|
|
213
|
+
data-ticket-defect
|
|
214
|
+
>
|
|
215
|
+
{labels.defect}
|
|
216
|
+
</span>
|
|
217
|
+
) : null}
|
|
218
|
+
{status.text ? (
|
|
219
|
+
<span
|
|
220
|
+
className={styles.status}
|
|
221
|
+
data-ticket-status={status.icon}
|
|
222
|
+
>
|
|
223
|
+
<StatusIcon locked={status.icon === 'lock'} />
|
|
224
|
+
{status.text}
|
|
225
|
+
</span>
|
|
226
|
+
) : null}
|
|
227
|
+
{decision ? (
|
|
228
|
+
<span
|
|
229
|
+
className={styles.decision}
|
|
230
|
+
data-tone={decision.tone}
|
|
231
|
+
>
|
|
232
|
+
{labels.decision}: {decision.text}
|
|
233
|
+
</span>
|
|
234
|
+
) : null}
|
|
235
|
+
{created ? <time>{created}</time> : null}
|
|
236
|
+
</p>
|
|
237
|
+
{ticket.order_id ? (
|
|
238
|
+
<a
|
|
239
|
+
className={`${styles.link} ${styles.orderLink}`}
|
|
240
|
+
href={orderHref(ticket.order_id, locale)}
|
|
241
|
+
>
|
|
242
|
+
{labels.order} #{ticket.order_id}
|
|
243
|
+
</a>
|
|
244
|
+
) : null}
|
|
245
|
+
</div>
|
|
246
|
+
<div className={styles.tools}>
|
|
247
|
+
<button
|
|
248
|
+
className={`${styles.tool} ${styles.iconButton}`}
|
|
249
|
+
type="button"
|
|
250
|
+
aria-label={common.refresh}
|
|
251
|
+
title={common.refresh}
|
|
252
|
+
disabled={pending}
|
|
253
|
+
onClick={() => onRefresh?.()}
|
|
254
|
+
>
|
|
255
|
+
<Icon>
|
|
256
|
+
<path d="M20 11a8 8 0 1 0-2.3 5.7M20 4v7h-7" />
|
|
257
|
+
</Icon>
|
|
258
|
+
</button>
|
|
259
|
+
{ticket.status.int === ECustomerTicketStatus.OPEN ? (
|
|
260
|
+
<button
|
|
261
|
+
className={styles.tool}
|
|
262
|
+
type="button"
|
|
263
|
+
disabled={pending}
|
|
264
|
+
aria-label={labels.closeHint}
|
|
265
|
+
onClick={() => setConfirmation('close')}
|
|
266
|
+
>
|
|
267
|
+
<Icon>
|
|
268
|
+
<circle
|
|
269
|
+
cx="12"
|
|
270
|
+
cy="12"
|
|
271
|
+
r="9"
|
|
272
|
+
/>
|
|
273
|
+
<path d="m8 12.5 2.5 2.5L16 9.5" />
|
|
274
|
+
</Icon>
|
|
275
|
+
{labels.close}
|
|
276
|
+
</button>
|
|
277
|
+
) : null}
|
|
278
|
+
{canDelete ? (
|
|
279
|
+
<button
|
|
280
|
+
className={`${styles.tool} ${styles.danger}`}
|
|
281
|
+
type="button"
|
|
282
|
+
disabled={pending}
|
|
283
|
+
aria-label={labels.deleteHint}
|
|
284
|
+
onClick={() => setConfirmation('delete')}
|
|
285
|
+
>
|
|
286
|
+
<Icon>
|
|
287
|
+
<path d="M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v5m4-5v5" />
|
|
288
|
+
</Icon>
|
|
289
|
+
{labels.delete}
|
|
290
|
+
</button>
|
|
291
|
+
) : null}
|
|
292
|
+
</div>
|
|
293
|
+
</header>
|
|
294
|
+
|
|
295
|
+
{subject ? (
|
|
296
|
+
<section
|
|
297
|
+
className={styles.subject}
|
|
298
|
+
data-ticket-subject
|
|
299
|
+
aria-labelledby={`ticket-${ticket.id}-subject`}
|
|
300
|
+
>
|
|
301
|
+
<h3
|
|
302
|
+
id={`ticket-${ticket.id}-subject`}
|
|
303
|
+
className={styles.subjectTitle}
|
|
304
|
+
>
|
|
305
|
+
{labels.subject}
|
|
306
|
+
</h3>
|
|
307
|
+
<TicketItemCard
|
|
308
|
+
{...subject}
|
|
309
|
+
gallery
|
|
310
|
+
/>
|
|
311
|
+
</section>
|
|
312
|
+
) : null}
|
|
313
|
+
|
|
314
|
+
{subscription ? (
|
|
315
|
+
<section
|
|
316
|
+
className={styles.subject}
|
|
317
|
+
data-ticket-subscription-subject
|
|
318
|
+
aria-labelledby={`ticket-${ticket.id}-subscription`}
|
|
319
|
+
>
|
|
320
|
+
<h3
|
|
321
|
+
id={`ticket-${ticket.id}-subscription`}
|
|
322
|
+
className={styles.subjectTitle}
|
|
323
|
+
>
|
|
324
|
+
{labels.subscriptionSubject}
|
|
325
|
+
</h3>
|
|
326
|
+
<TicketSubscriptionCard
|
|
327
|
+
subscription={subscription}
|
|
328
|
+
plan={subscriptionPlan}
|
|
329
|
+
/>
|
|
330
|
+
</section>
|
|
331
|
+
) : null}
|
|
332
|
+
|
|
333
|
+
{refund && refundState ? (
|
|
334
|
+
<section
|
|
335
|
+
className={styles.refund}
|
|
336
|
+
data-tone={refundState.tone}
|
|
337
|
+
data-ticket-refund
|
|
338
|
+
aria-labelledby={`ticket-${ticket.id}-refund`}
|
|
339
|
+
>
|
|
340
|
+
<header className={styles.refundHeader}>
|
|
341
|
+
<h3
|
|
342
|
+
id={`ticket-${ticket.id}-refund`}
|
|
343
|
+
className={styles.refundTitle}
|
|
344
|
+
>
|
|
345
|
+
{labels.refund} #{refund.id}
|
|
346
|
+
</h3>
|
|
347
|
+
<span className={styles.refundState}>{refundState.text}</span>
|
|
348
|
+
</header>
|
|
349
|
+
{refundState.hint ? (
|
|
350
|
+
<p className={styles.refundCopy}>{refundState.hint}</p>
|
|
351
|
+
) : null}
|
|
352
|
+
<dl className={styles.refundFacts}>
|
|
353
|
+
{carrier ? (
|
|
354
|
+
<div>
|
|
355
|
+
<dt>{labels.refundCarrier}</dt>
|
|
356
|
+
<dd>{carrier}</dd>
|
|
357
|
+
</div>
|
|
358
|
+
) : null}
|
|
359
|
+
{refund.track?.track ? (
|
|
360
|
+
<div>
|
|
361
|
+
<dt>{labels.refundTrack}</dt>
|
|
362
|
+
<dd>{refund.track.track}</dd>
|
|
363
|
+
</div>
|
|
364
|
+
) : null}
|
|
365
|
+
{refund.track?.status ? (
|
|
366
|
+
<div>
|
|
367
|
+
<dt>{labels.refundCarrierStatus}</dt>
|
|
368
|
+
<dd>{refund.track.status}</dd>
|
|
369
|
+
</div>
|
|
370
|
+
) : null}
|
|
371
|
+
</dl>
|
|
372
|
+
{refundItems.length ? (
|
|
373
|
+
<>
|
|
374
|
+
<h4 className={styles.subjectTitle}>{labels.refundItems}</h4>
|
|
375
|
+
<ul className={styles.refundItems}>
|
|
376
|
+
{refundItems.map((entry) => (
|
|
377
|
+
<li key={entry.key}>
|
|
378
|
+
<TicketItemCard
|
|
379
|
+
product={entry.product}
|
|
380
|
+
quantity={entry.quantity}
|
|
381
|
+
option={entry.option}
|
|
382
|
+
amount={entry.refund.amount}
|
|
383
|
+
amountLabel={labels.refundAmount}
|
|
384
|
+
>
|
|
385
|
+
{entry.refund.counts.map((count) => (
|
|
386
|
+
<span
|
|
387
|
+
key={count.key}
|
|
388
|
+
className={styles.refundCount}
|
|
389
|
+
>
|
|
390
|
+
{labels.refundCounts[count.key]}: {count.count}
|
|
391
|
+
</span>
|
|
392
|
+
))}
|
|
393
|
+
</TicketItemCard>
|
|
394
|
+
</li>
|
|
395
|
+
))}
|
|
396
|
+
</ul>
|
|
397
|
+
</>
|
|
398
|
+
) : null}
|
|
399
|
+
</section>
|
|
400
|
+
) : null}
|
|
401
|
+
|
|
402
|
+
{confirmation ? (
|
|
403
|
+
<div className={`${styles.notice} ${styles.confirmation}`}>
|
|
404
|
+
<p>
|
|
405
|
+
{confirmation === 'close'
|
|
406
|
+
? labels.closeQuestion
|
|
407
|
+
: labels.deleteQuestion}
|
|
408
|
+
</p>
|
|
409
|
+
<div className={styles.actions}>
|
|
410
|
+
<button
|
|
411
|
+
className={`${styles.button} ${styles.primary}`}
|
|
412
|
+
type="button"
|
|
413
|
+
disabled={pending}
|
|
414
|
+
onClick={confirm}
|
|
415
|
+
>
|
|
416
|
+
{common.continue}
|
|
417
|
+
</button>
|
|
418
|
+
<button
|
|
419
|
+
className={styles.button}
|
|
420
|
+
type="button"
|
|
421
|
+
disabled={pending}
|
|
422
|
+
onClick={() => setConfirmation(undefined)}
|
|
423
|
+
>
|
|
424
|
+
{common.back}
|
|
425
|
+
</button>
|
|
426
|
+
</div>
|
|
427
|
+
</div>
|
|
428
|
+
) : null}
|
|
429
|
+
|
|
430
|
+
<ol
|
|
431
|
+
className={styles.messages}
|
|
432
|
+
aria-live="polite"
|
|
433
|
+
>
|
|
434
|
+
{replies.map((reply) => {
|
|
435
|
+
const own =
|
|
436
|
+
reply.direction.int === ETicketReplyDirection.TO_MANAGMENT;
|
|
437
|
+
return (
|
|
438
|
+
<li
|
|
439
|
+
key={reply.id}
|
|
440
|
+
className={`${styles.message} ${own ? styles.ownMessage : ''}`.trim()}
|
|
441
|
+
>
|
|
442
|
+
<div className={styles.bubble}>
|
|
443
|
+
<p className={styles.sender}>
|
|
444
|
+
{reply.sender.first_name} {reply.sender.last_name}
|
|
445
|
+
</p>
|
|
446
|
+
<p className={styles.messageText}>{reply.reply_text}</p>
|
|
447
|
+
{reply.reply_images.length ? (
|
|
448
|
+
<div className={styles.attachments}>
|
|
449
|
+
{reply.reply_images.map((file) => (
|
|
450
|
+
<TicketImage
|
|
451
|
+
key={file.id}
|
|
452
|
+
imageId={file.id}
|
|
453
|
+
onLoad={onLoadImage}
|
|
454
|
+
/>
|
|
455
|
+
))}
|
|
456
|
+
</div>
|
|
457
|
+
) : null}
|
|
458
|
+
</div>
|
|
459
|
+
<time className={styles.messageTime}>
|
|
460
|
+
{reply.reply_time?.date} {reply.reply_time?.time}
|
|
461
|
+
</time>
|
|
462
|
+
</li>
|
|
463
|
+
);
|
|
464
|
+
})}
|
|
465
|
+
</ol>
|
|
466
|
+
|
|
467
|
+
{ticket.status.int === ECustomerTicketStatus.OPEN ? (
|
|
468
|
+
<TicketMessageForm
|
|
469
|
+
key={`${ticket.id}:${sentRevision}`}
|
|
470
|
+
pending={pending}
|
|
471
|
+
waitHint={waitHint}
|
|
472
|
+
onSubmit={onSubmit}
|
|
473
|
+
/>
|
|
474
|
+
) : (
|
|
475
|
+
<form
|
|
476
|
+
className={`${styles.panel} ${styles.rating}`}
|
|
477
|
+
onSubmit={(event) => {
|
|
478
|
+
event.preventDefault();
|
|
479
|
+
onRate?.(Number(rating));
|
|
480
|
+
}}
|
|
481
|
+
>
|
|
482
|
+
<div className={styles.ratingField}>
|
|
483
|
+
<OrionplaceSelect
|
|
484
|
+
options={ratings}
|
|
485
|
+
label={labels.rating}
|
|
486
|
+
value={rating}
|
|
487
|
+
disabled={pending}
|
|
488
|
+
onValueChange={setRating}
|
|
489
|
+
/>
|
|
490
|
+
</div>
|
|
491
|
+
<button
|
|
492
|
+
className={styles.button}
|
|
493
|
+
type="submit"
|
|
494
|
+
disabled={pending}
|
|
495
|
+
>
|
|
496
|
+
{common.save}
|
|
497
|
+
</button>
|
|
498
|
+
</form>
|
|
499
|
+
)}
|
|
500
|
+
</section>
|
|
501
|
+
);
|
|
502
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# TicketImage · React
|
|
2
|
+
|
|
3
|
+
## English
|
|
4
|
+
|
|
5
|
+
`TicketImage` loads one protected support attachment. After hydration it calls
|
|
6
|
+
`onLoad` with endpoint `customer_tickets_ticket_images`, an empty request,
|
|
7
|
+
`path.image_id` and an abort signal. The callback must return the image as a
|
|
8
|
+
`Blob`. JSON and HTML responses are rejected as failures.
|
|
9
|
+
|
|
10
|
+
The component reserves a square attachment area while loading. A successful
|
|
11
|
+
blob becomes a local object URL and opens in a new tab from a 96 by 96 image.
|
|
12
|
+
The object URL is revoked when the image changes or the component unmounts. A
|
|
13
|
+
failed request displays Retry and starts the same action again. `initialSource`
|
|
14
|
+
can supply a server-rendered URL and prevents the automatic request;
|
|
15
|
+
`loadOnMount={false}` also disables automatic loading.
|
|
16
|
+
|
|
17
|
+
Source is maintained in `components/orionplace/support/TicketImage.tsx`.
|
|
18
|
+
|
|
19
|
+
### Props
|
|
20
|
+
|
|
21
|
+
| Prop | Meaning |
|
|
22
|
+
| ------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `imageId: number` | ID of the image handled by TicketImage. |
|
|
24
|
+
| `initialSource?: string` | Server-provided initial source used for the first render and hydration. |
|
|
25
|
+
| `loadOnMount?: boolean` | Starts the load callback after hydration when server data was not supplied. |
|
|
26
|
+
| `onLoad: (action: TicketImageLoadAction) => Promise<Blob> \| Blob` | Called when the component needs its primary data. The callback payload is shown in its type. |
|
|
27
|
+
|
|
28
|
+
## Русский
|
|
29
|
+
|
|
30
|
+
`TicketImage` загружает одно защищённое изображение из обращения. После
|
|
31
|
+
гидратации компонент вызывает `onLoad` с методом
|
|
32
|
+
`customer_tickets_ticket_images`, пустым запросом, `path.image_id` и сигналом
|
|
33
|
+
отмены. Обработчик должен вернуть изображение как `Blob`. Ответы JSON и HTML
|
|
34
|
+
считаются ошибкой.
|
|
35
|
+
|
|
36
|
+
Во время загрузки компонент сохраняет квадратную область вложения. Успешный
|
|
37
|
+
`Blob` превращается в локальный URL и открывается в новой вкладке из изображения
|
|
38
|
+
96 на 96. При смене изображения и удалении компонента локальный URL
|
|
39
|
+
освобождается. После ошибки появляется кнопка повтора того же запроса.
|
|
40
|
+
`initialSource` задаёт URL для серверного HTML и отменяет автоматический запрос;
|
|
41
|
+
`loadOnMount={false}` также отключает автоматическую загрузку.
|
|
42
|
+
|
|
43
|
+
Исходный файл: `components/orionplace/support/TicketImage.tsx`.
|
|
44
|
+
|
|
45
|
+
### Свойства
|
|
46
|
+
|
|
47
|
+
| Свойство | Назначение |
|
|
48
|
+
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- |
|
|
49
|
+
| `imageId: number` | ID изображения, с которым работает TicketImage. |
|
|
50
|
+
| `initialSource?: string` | Начальное значение адреса изображения, полученное на сервере для первого рендера и гидратации. |
|
|
51
|
+
| `loadOnMount?: boolean` | Запускает загрузку после гидратации, если серверные данные не переданы. |
|
|
52
|
+
| `onLoad: (action: TicketImageLoadAction) => Promise<Blob> \| Blob` | Вызывается, когда компоненту нужны основные данные. Данные обработчика указаны в его типе. |
|