Releases: sharetribe/web-template
v5.3.0
The main feature here is the introduction of Permission Management for Marketplace Operators
This release introduces support for the upcoming permission feature, allowing marketplace operators to grant or remove a user's right to post listings. The fetchCurrentUser
call now includes a new relationship: effectivePermissionSet. This resource serves as the source of truth to determine whether a user can post listings, or reopen previously closed listings. For more detailed information, please refer to the pull request.
Check API endpoint restrictions: https://www.sharetribe.com/api-reference/marketplace.html#currentuser-permissionset
Additional Fixes and Improvements
In addition to the main feature, this update includes several smaller fixes and enhancements. Here are a couple of highlights:
Improved Stripe Onboarding Experience:
Stripe requires a business URL for each seller during onboarding. However, a seller's profile page may be too sparse at the time of creating their first listing (e.g., it might only display "Hi, I'm John"). This has led to some reports from new marketplaces where Stripe blocked sellers due to insufficient profile content. To mitigate this, we now redirect Stripe to the landing page, which typically has more comprehensive content, helping Stripe's algorithm better understand the nature of the business. See PR #430
Enhanced URL Autolinking:
We've added support for parentheses in autolinked URLs within listing descriptions, user bios, and messages.
Translations
New translations
"NoAccessPage.postListings.schemaTitle": "No publishing rights",
"NoAccessPage.postListings.heading": "You can't publish listings",
"NoAccessPage.postListings.content": "You need to receive publishing rights from the {marketplaceName} team.",
Changes v5.3.0
-
[change] ProfilePage: redirect Stripe's crawler to landing page (profile page might be empty).
#430 -
[add] Add currently available translations for DE, ES, FR.
#429 -
[add] Handle API's new permission model & permission to post listings
- CurrentUser fetch includes a new relationship: effectivePermissionSet
- There is a new Page component: NoAccessPage
- If user has no posting rights: they can't create or edit a draft listing and they can't open a
previously closed published listing. Instead, they are redirected to NoAccessPage
-
[fix] Routes.js: reTry can be undefined in some cases (reTry.scrollIntoView)
#427 -
[change] ProfilePage: remove withViewport and refactor a bit.
#424 -
[change] Update express.js (v4.19.2) and nodemon (3.1.4).
#421 -
[add] richText.js: support parentheses on autolinked URLs.
#419 -
[fix] Safari has a bug related to reading array directly from JSON-LD script tag.
#418 -
[fix] There could be rare time-windows when indexing has not caught up with deleted & closed
listings. This might result those listings to be included to listing queries.
#417
v5.2.1
This is a patch release to fix one significant bug: when additional shipping fee was set to 0, there was no shipping fee included.
In addition, listing page schema for bookable listings mentioned out-of-stock flag even though stock was not relevant for bookable listings.
Changes v5.2.1
- [fix] fix: calculateShippingFee (when shippingPriceInSubunitsAdditionalItems is 0, no shipping fee
was included) #414 - [fix] Remove stock from schema if there's no stock in use.
#405 - [fix] Remove left-behind slash from inquiry-new-inquiry email template reference.
#406 - [fix] The subject line of purchase-new-order email had a wrong variable name.
#413 - [change] Fix another typo in FR translations.
#409 - [change] Fix a typo in FR translations.
#408 - [add] Add currently available translations for de, es, fr.
#404 - [fix] The example files of SignupForm and ConfirmSignupForm had wrong data.
#403 - [change] FilterComponent: relax generated name-attribute for inputs: allow camelCase.
#402
v5.2.0
This release prepares the codebase for User types!
Read more from the pull request.
In addition, it's going to be possible to
- Toggle the visibility of unselected options on SectionMultiEnumMaybe through hosted assets.
- StripeConnectAccount: use 'collectionOptions' instead of deprecated 'collect'. The
future_requirements uses 'include' by default.
Translation changes
New translations
"ConfirmSignupForm.displayNameLabel": "Display name",
"ConfirmSignupForm.displayNamePlaceholder": "Jane D",
"ConfirmSignupForm.displayNameRequired": "You need to add a display name.",
"ConfirmSignupForm.phoneNumberLabel": "Phone number",
"ConfirmSignupForm.phoneNumberPlaceholder": "Enter your phone number.",
"ConfirmSignupForm.phoneNumberRequired": "You need to add a phone number.",
"ContactDetailsForm.phoneRequired": "A phone number is required.",
"EditListingDetailsForm.listingTypeRequired": "You need to select a listing type.",
"FieldSelectUserType.label": "User type",
"FieldSelectUserType.placeholder": "Choose a user type",
"FieldSelectUserType.required": "You need to select a user type.",
"ListingPage.errorInvalidListingMessage": "The listing contained invalid data. Please contact the marketplace operator.",
"ProfileSettingsForm.displayNameHeading": "Your display name",
"ProfileSettingsForm.displayNameInfo": "The display name defaults to first name plus initial of last name.",
"ProfileSettingsForm.displayNameLabel": "Display name",
"ProfileSettingsForm.displayNamePlaceholder": "Jane D",
"ProfileSettingsForm.displayNameRequired": "This field is required.",
"SignupForm.displayNameLabel": "Display name",
"SignupForm.displayNamePlaceholder": "Jane D",
"SignupForm.displayNameRequired": "You need to add a display name.",
"SignupForm.phoneNumberLabel": "Phone number",
"SignupForm.phoneNumberPlaceholder": "Enter your phone number.",
"SignupForm.phoneNumberRequired": "You need to add a phone number.",
Changed translations
"ModalMissingInformation.verifyEmailText": "Please verify your email address so we can send you your receipt and information on your order status. We are unable to send you emails before your email has been verified.",
"StripeConnectAccountForm.stripeToSText": "By saving the details, you agree to the {stripeConnectedAccountTermsLink}.",
Changes v5.2.0
-
[add] add currently available translations for de, es, fr.
#400 -
[add] This adds user types. User fields can be tied to user types
- User fields contain multiple default user fields
- Only displayName and phoneNumber can be toggle on/off
- You can also toggle wether those are shown on sign up forms.
- Only displayName and phoneNumber can be toggle on/off
- Custom user fields can be tied to user types.
- AuthenticationPage: SignupForm and ConfirmSignupForm show a dropdown to select user type if it's
not preselected- Default
- New route SignupForUserTypePage with path
/signup/:userType
- This route preselects one user type for the sign up forms.
- If preselected userType is there (
/signup/:userType
), then- Dropdown selector is not shown.
- Toggling between login & signup tabs should keep the userType in memory
- Using SSO, saves the preselected user type to a temporary cookie (to be used in
ConfirmSignupForm after returning from ID provider's website)
- An unknown (e.g. outdated) userType in the route will show 404 page.
- User fields contain multiple default user fields
-
[add] Toggle the visibility of unselected options on SectionMultiEnumMaybe through hosted assets.
#382 -
[fix] Update SDK to v1.21.1. Fixes bug with extended data with a key
length
and a number type
value. #398 -
[fix] util/sanitize.js: handle publicData = null case which happens with banned user
#397 -
[fix] en.json: typo on 'ModalMissingInformation.verifyEmailText'
#396 -
[fix] Ensure that there is listingType, transactionProcessAlias and unitType defined.
#394 -
[fix] en.json: typo on 'StripeConnectAccountForm.stripeToSText'
#395 -
[change] StripeConnectAccount: use 'collectionOptions' instead of deprecated 'collect'. The
future_requirements uses 'include' by default.
#392 -
[fix] mergeDefaultTypesAndFieldsForDebugging was set to true, which is wrong. The 0 handling with
min and max was wrong. #393
v5.1.0
This release contains several small updates:
- Updates SDK to v1.21.0
- Changes login-as feature
- Adds autolinking to bio on profile page, description on listing page, listing fields & user fields that are of schema type 'text', and messages between customer and provider.
- Note: only links starting with http are considered and the link is detected and added on UI rendering phase.
- Prepares codebase to get the color of
<PrimeryButton>
from branding asset. - Prepares codebase to handle listing fields with schema type ’long’: adds a new filter.
Translation changes
New translation keys
"CustomExtendedDataField.numberTooSmall": "The number must be larger than or equal to {min}",
"CustomExtendedDataField.numberTooBig": "The number must be less than or equal to {max}",
"LimitedAccessBanner.fullRightsMessage": "You're logged in as {firstName} {lastName}. You have full access rights. In a Live environment, you will have limited rights.",
"LimitedAccessBanner.fallbackMessage": "You're logged in as {firstName} {lastName}.",
"IntegerRangeFilter.labelSelectedPlain": "{minValue} - {maxValue}",
Changed translations
- "LimitedAccessBanner.message": "You are logged in as {firstName} {lastName}. You have limited rights for actions. You cannot initiate transactions, take actions in them or send messages on behalf of transacting parties.",
+ "LimitedAccessBanner.message": "You're logged in as {firstName} {lastName}. You have limited access rights. You can't initiate transactions, move them forward, or send messages on the user's behalf.",
Changes v5.1.0
-
[add] support for extended data fields with type
long
#364 -
[change] the login-as feature has changed:
- Update SDK to v1.21.0
- Use
sdk.loginAs
instead ofsdk.login
, which is deprecated for this purpose - Use
authInfo.isLoggedInAs
instead of relying on auth token'sscope
to determine if current
session is operator user logged in as marketplace user. - Note: when taking update from upstream, check also commit be7e2b9.
-
[fix] the email template for default-purchase process
(purchase-order-canceled-from-disputed-provider-html.html) contained copy-paste related typo.
#390 -
[add] Autolink text on the UI. Those links must start with 'http' to be recognized.
- ListingPage > Listing's description
- ListingPage > Listing fields with schema type ‘text’
- ListingPage > User's bio on
- ProfilePage > User's bio
- ProfilePage > User fields with schema type ‘text’
- TransactionPage > Messages
- TransactionPage > inquiryMessage
-
[change] handle listings with draft and pending-approval state with login-as feature.
#387 -
[Add] Get the color of the PrimeryButton from branding asset.
#379 -
[change] Add preview resolution for listing in PreviewResolverPage
#384 -
[add] Support for a target path parameter (target_path) in the login as user functionality
#383 -
[change] listingMinimumPriceSubUnits: update code comments (0 is not valid value in hosted asset).
#381 -
[fix] Styleguide shows multiple versions of some components. The 'id' attributes need to be
unique. #380
v5.0.1
Changes v5.0.1
- [fix] Fix: currentUser was not passed to billing details, which resulted email address missing on
Stripe side. #377 - [fix] currentUserHasListings info. This is an old bug that emerged when we introduced draft status
to listing. The fetched listing might not be a published one but a draft listing. The ownListings
API endpoint is not queryable to get only published listings but luckily we have introduced
authorId filter to listings end point later on.
#376 - [add] Update translations for de.json, es.json, and fr.json.
#374 - [change] Update one copy text. #373
- [change] EditListingDetailsForm: pass categoryLevel as argument to translations.
#372 - [fix] Fix: when changing categories, clear previously saved ones
#371 - [fix] util/search.js: fix pickInitialValuesForFieldSelectTree.
#369
Translation changes
Changed translations
- A new argument categoryLevel is passed for category input field
- Gif is not mentioned as it caused confusion. Animated gifs are not supported by the service we use for generating responsive images.
"EditListingDetailsForm.categoryLabel": "{categoryLevel, select, categoryLevel1 {Category} other {Subcategory}}",
"EditListingDetailsForm.categoryPlaceholder": "{categoryLevel, select, categoryLevel1 {Select category} other {Select subcategory}}",
"EditListingDetailsForm.categoryRequired": "{categoryLevel, select, categoryLevel1 {You need to select a category.} other {You need to select a subcategory.}}",
"EditListingPhotosForm.imageTypes": ".JPG or .PNG. Max. 20 MB",
"ProfileSettingsForm.fileInfo": ".JPG or .PNG. Max. 20 MB",
Deleted translation keys
"EditListingDetailsForm.subCategoryLabel": "Subcategory",
v5.0.0
This major release prepares the codebase for the new concepts: user fields and categories. The
biggest changes are on PRs: #314 and #337.
Note: We will also introduce user types later on, but that concept might still change a bit from
what we have in this release.
This affects several hosted assets:
- user-fields.json: makes it possible to add custom user fields to profile page, profile settings page and sign-up forms. The asset will support enum, multi-enum and text schema types at the moment.
- listing-categories.json: describes the structure of nested categories (3 levels are supported)
- listing-search.json: defines whether categories filter is in use on search page
- listing-fields.json has added a new restriction to listing fields. You can limit fields to a specific categories in addition to specific listingTypes.
Selected category or nested categories are saved to listing's public data with these category keys:
- categoryLevel1
- categoryLevel2
- categoryLevel3
There are also smaller changes and bug fixes included. Check all the changes and PRs below.
Translation changes
New translations
"EditListingDetailsForm.categoryLabel": "Category",
"EditListingDetailsForm.categoryPlaceholder": "Select category",
"EditListingDetailsForm.categoryRequired": "You need to select a category.",
"EditListingDetailsForm.subCategoryLabel": "Subcategory",
"FilterComponent.categoryLabel": "Category",
"ProfilePage.detailNo": "No",
"ProfilePage.detailYes": "Yes",
"ProfilePage.detailsTitle": "Details",
Deleted translations
"SelectSingleFilter.plainClear": "Clear",
"SelectSingleFilter.popupClear": "Clear",
Changes v5.0.0
-
[add] Add support for hosted category configuration
- Prepare for a future asset: listing-categories.json
- Prepare for a future changes to assets: listing-search.json and listing-fields.json
- Collect (nested) category info on EditListingDetailsPanel
- Saved to publicData as categoryLevel1, categoryLelvel2, categoryLevel3.
- Allow listing fields to be limited to categories in addition to listing types.
- Show listing fields on the ListingPage (category restrictions apply)
- Show category filter on the SearchPage
- Show listing fields on the SearchPage if category restrictions allow
-
[change] Fix a typo in translation keys.
#365 -
[change] Update browserlist-db aka caniuse-lite.
#363 -
[change] Update moment-timezone library to v0.5.45
#362 -
[add] Update translations for de.json, es.json, and fr.json.
#361 -
[add] Add support for user fields, which will be released later as a new hosted asset.
- The hosted asset will support enums, multi-enums, and text fields in the same manner as listing
fields. - User fields will be stored in public data at this point.
- The ProfilePage will display these fields by default.
- The ProfileSettingsPage is the default location for adding or editing user fields.
- The AuthenticationPage (SignupForm and ConfirmSignupForm) can also collect user field data.
- The hosted asset will support enums, multi-enums, and text fields in the same manner as listing
-
[change] Update Node.js version to >= 18.20.1 (engine) 20.12.1 (circleci)
#360 -
[change] formatMoney should use correct formattingOptions (JPY gets correct formatting)
#356 -
[change] Twitter's brand and logo has changed to X.
#355 -
[fix] Verify that browser's clock is not more than a minute out of sync.
#354 -
[change] configStripe.js: update code-comment for dayCountAvailableForBooking.
#352 -
[add] Add a readme for the Topbar component
#353 -
[fix] Some email templates were not using the correct helper to format currencies and dates based
on localization. #351
v4.1.2
This release fixes SSO signup forms not displaying hosted Terms & Privacy policy assets, prevents unintended scrolling triggered by keystrokes in inputs within sticky elements, and addresses a missing htmlFor attribute in KeywordsFilter.
Changes v4.1.2
V4.1.1
This release fixes a bug related to Daylight saving time handling in certain time zones, as well as a search input width issue in TopbarDesktop.
Changes v4.1.1
- [fix] configDefault.js: fix Fb & twitter examples.
#339 - [fix] Daylight saving time bug on those time zones that change exactly at midnight.
#338 - [add] Update translations for de.json, es.json, and fr.json.
#335 - [fix] TopbarDesktop: when CustomLinksMenu is not in use, reduce the min-width of search input.
#334
v4.1.0
This prepares the codebase for the possibility of custom links on the Topbar component. Those links will come through a new asset (content/top-bar.json). It also includes a possibility to link Logo to some external domain. Read more from the PR #320.
There are also a bunch of small copy-texts, bug fixes, and other improvements added. Check the changelog.
Translation changes
New translation keys
"AuthenticationPage.idpAuthFailed": "Failed to authenticate with an external identity provider.",
"TopbarDesktop.LinksMenu.all": "Menu",
"TopbarDesktop.LinksMenu.more": "More",
Changed translations
Facebook & Google require a specific translations to be used for SSO:
"AuthenticationPage.loginWithFacebook": "Continue with Facebook",
"AuthenticationPage.loginWithGoogle": "Continue with Google",
"AuthenticationPage.signupWithFacebook": "Continue with Facebook",
"AuthenticationPage.signupWithGoogle": "Continue with Google",
In addition, we wanted to highlight the no-delivery-method-set scenario better:
"TransactionPage.default-purchase.customer.purchased.extraInfo": "{deliveryMethod, select, shipping {You'll be notified when {providerName} ships the item.} pickup {Use the chat function below to agree on a time for pickup.} other {Use the chat below to agree on the order details.}}",
Changes v4.1.0
- [add] new component CustomLinksMenu added to the Topbar. It shows custom links if there's enough
space available, or adds a new menu component that includes those links in a dropdown list.
#320 - [add] Mention Sharetribe Experts in the README.md
#332 - [fix] AuthenticationPage: fix mobile layout issue when content was too long
#330 - [add] Update translations for de.json, es.json, and fr.json.
#328 - [change] Update social login button labels to be aligned with branding guides
#327 - [fix] Show an error message on the authentication page in case identity provider authentication fails
#326 - [change] Upgrade Sharetribe SDK to 1.20.1
#326 - [change] Update the copy of TransactionPage.default-purchase.customer.purchased.extraInfo
#323 - [add] PageBuilder/SectionContainer: break long words (e.g. links) so that the mobile layout does not
break. #322 - [change] OrderBreakdown: ensure that only those line-items are shown that have been included for
the currentUser's role (customer vs provider).
#321 - [fix] A listing using the inquiry transaction process should not show the payout details warning
to the user. #319 - [add] Update translations for de.json, es.json, and fr.json.
#317 - [fix] When the delivery method is not set, it's still better to maintain the value as a string, because
it's used as an argument in translations.
#316
v4.0.0
Breaking changes:
if you have customized your transaction process, you need to update the email templates. The new customer commission (#293) adds changes to emails that contain a receipt aka order breakdown information. In addition, also PR #310 touches the email templates.
This release also prepares the codebase for future configuration possibilities:
- Postponing the requirement (for a provider) to give payout details before publishing a listing
- Payout details are still needed before orders can work. (see #297)
- This feature makes it a bit more clear for operators, if potential provider needs help with Stripe onboarding.
- Makes certain listing features optional (location, delivery method)
- Adds infinity stock (It is emulated through a big number 10^15)
This adds a new environment variable: REACT_APP_MARKETPLACE_NAME. It makes it a bit easier to work with multiple app instances (for Live, Test, Dev).
Note: you have probably changed src/util/configDefault.js to use your own marketplace name instead of 'Biketribe'. Check that the line doesn't use 'Biketribe' if you take an update from the upstream!
marketplaceName: process.env.REACT_APP_MARKETPLACE_NAME || 'Biketribe',
More components are now code-splitted: Topbar, FieldDateInput, FieldDateRangeInput, FieldDateRangeController
Translations changes
New translation keys:
"CheckoutPage.destinationAccountNotCompleteStripeError": "This listing is currently unavailable because the listing author's payout information is incomplete. Your card hasn't been charged. Please contact support.",
"ListingPage.addPayoutDetails": "Add payout details",
"ListingPage.addPayoutDetailsMessage": "Please add your payout details to start accepting orders.",
"ListingPage.payoutDetailsWarning": "This listing is not available {processType, select, booking {for booking} other {for purchase}}. You have not added your payout details yet.",
"ListingPage.payoutDetailsWarningLink": "Add your payout details",
"ProductOrderForm.ownListing": "This is your own listing.",
"EditListingPricingAndStockForm.updateToInfinite": "Update the stock of this listing to “infinite”",
"EditListingPricingAndStockForm.updateToInfiniteInfo": "<b>The stock type of this listing type has changed.</b> The stock of this listing is currently {currentStock}, but listings in this listing type should now have “infinite” stock.",
"EditListingPricingAndStockForm.updateToInfiniteRequired": "You need to update the stock of this listing to infinite to save changes.",
Old translations with updated arguments:
The deliveryMethod argument in the following translations has a new value 'none' if deliveryMethod doesn't exist. The change affects these (but 'none' is not included in the default translation as the other scenario works fine for it too):
"TransactionPage.ActivityFeed.default-purchase.delivered": "{deliveryMethod, select, shipping {The listing was shipped.} other {The listing was delivered.}}",
"TransactionPage.default-purchase.customer.purchased.extraInfo": "{deliveryMethod, select, shipping {You'll be notified when {providerName} ships the item.} other {Use the chat function below to agree on a time for pickup.}}",
The role argument added for the following translation:
"OrderBreakdown.commission": "{role, select, customer {{marketplaceName} fee *} provider {{marketplaceName} fee *} other {}}",
Updates to existing translations:
"CheckoutPage.providerStripeAccountMissingError": "This listing is currently unavailable because the listing author hasn't added their payout details yet. Please contact support.",
"EditListingPricingAndStockForm.oldStockTotalWasOutOfSync": "Oops, the stock of this listing is out of sync. Someone might just have bought this item. Please refresh the page and try again.",
"EditListingWizard.default-booking.new.saveAvailability": "Next",
"EditListingWizard.default-booking.new.saveDetails": "Next",
"EditListingWizard.default-booking.new.saveLocation": "Next",
"EditListingWizard.default-booking.new.savePhotos": "Publish listing",
"EditListingWizard.default-booking.new.savePricing": "Next",
"EditListingWizard.default-inquiry.new.saveDetails": "Next",
"EditListingWizard.default-inquiry.new.saveLocation": "Next",
"EditListingWizard.default-inquiry.new.saveLocationNoPricingTab": "Next",
"EditListingWizard.default-inquiry.new.savePhotos": "Publish listing",
"EditListingWizard.default-inquiry.new.savePricing": "Next",
"EditListingWizard.default-purchase.new.saveDelivery": "Next",
"EditListingWizard.default-purchase.new.saveDetails": "Next",
"EditListingWizard.default-purchase.new.savePhotos": "Publish listing",
"EditListingWizard.default-purchase.new.savePricingAndStock": "Next",
Changes 2024-02-07
- [add] Update de.json asset. #313
- [add] Update fr.json asset. #311
- [add] Update translation assets for German, French, and Spanish.
#309 - [change] Update default email templates (no need to use triple handlebars anymore).
#310 - [add] Add stock types: infiniteOneItem and infiniteMultipleItems (faked through 10^15)
#299 - [change] Make location and delivery method configurable on EditListingWizard. This just prepares
the codebase for an upcoming feature, when the configuration is ready on Console.
#298 - [change] Make the requirement of payout details configurable on EditListingWizard. This just
prepares the codebase for an upcoming feature, when the configuration is ready on Console.
#297 - [fix] The destructuring of undefined commissionAsset variable can't be against null.
#308 - [change] Allow distinguishing customer and provider commission translations in OrderBreakdown and
email templates #307 - [change] Add environment variable REACT_APP_MARKETPLACE_NAME and add code-comments to built-in
configs about hosted configs, which might overwrite them. Check that the line doesn't use
'Biketribe' if you take an update from the upstream!
#305 - [change] Updated a small patch of outdated libraries: express, body-parser, moment,
moment-timezone, helmet, nodemon, decimal.js, concurrently, classnames, jose, passport
#304 - [add] CSP: add new rules: *.analytics.google.com and *.giphy.com
#303 - [change] Fetch customer commission from assets and add handling. This update introduces changes to
the transaction process email templates, so the transaction process needs to be updated in
Sharetribe backend. #293 - [change] ext/ directory: update email translation defaults for no-delivery-method scenario.
#292 - [change] Code-split FieldDateInput, FieldDateRangeInput, FieldDateRangeController. The consequence
is that react-dates library is code-splitted too.
#290 - [change] Move IconCard under SaveCardDetails (might be code-splitted later).
#283 - [change] Code-split Topbar component and move it under TopbarContainer.
#282 - [fix] AuthenticationPage/lodash: do not import the whole library.
#288 - [change] PageBuilder/YoutubeEmbed: add rel=0 search param (show related videos only from the same channel).
This also adds width and height to iframe element.
#286 - [fix] FieldRadioButton: disabled style was missing.
#284 - [fix] Add missing imports to an email template file
#279