Skip to content

Releases: sharetribe/web-template

v8.2.0

29 Apr 13:05
f6f7277

Choose a tag to compare

This release makes it a bit clearer when some of the marketplace-specific environment variables are not set. The enforced check for environment variables might look like this on Heroku's logs, if the variable is missing:
Screenshot 2025-04-29 at 17 06 14

In addition, we added new translation keys for listings that show prices when multiple price variations are in use.

The existing keys from v8.1.0 looks ~ like this:
"ListingCard.price": "{priceValue} {pricePerUnit}",
And the new keys added on this release look like this:
"ListingCard.priceStartingFrom": "From {priceValue} {pricePerUnit}",

NOTE: Check also bug fixes on price variants added on v8.3.0

The last highlight is category filter: if category id was a number instead of a string, it was not highlighted correctly as a filter option.

Changes v8.2.0

  • [add] Check that some of the environment variables are set (and crash the app if not):

    • REACT_APP_SHARETRIBE_SDK_CLIENT_ID
    • SHARETRIBE_SDK_CLIENT_SECRET
    • REACT_APP_MARKETPLACE_NAME
    • REACT_APP_MARKETPLACE_ROOT_URL

    #589

  • [add] Separate translation keys for listing with price variations. This affects ListingCard,
    ManageListingCard, SearchMapInfoCard, SearchMapPriceLabel.
    #591

  • [fix] Convert non-string category URL param to string
    #590

  • [add] Add currently available translations for DE, ES, FR.
    #587

Translation changes

New translation

  "ListingCard.priceStartingFrom": "From {priceValue} {pricePerUnit}",
  "ManageListingCard.price": "{priceValue} {pricePerUnit}",
  "ManageListingCard.priceStartingFrom": "From {priceValue} {pricePerUnit}",
  "SearchMapInfoCard.priceStartingFrom": "From {priceValue}",
  "SearchMapPriceLabel.priceStartingFrom": "From {priceValue}",

Changed translations

-  "EditListingPricingForm.priceVariant.nameInputPlaceholder": "Name the session…",
+  "EditListingPricingForm.priceVariant.nameInputPlaceholder": "Add a name…",

v8.1.0

24 Apr 11:13
c2e34a5

Choose a tag to compare

The main feature of this release is about adding support for price variations for bookable listings: daily, nightly, hourly, and fixed. Check more information about that from the pull request: #582.
In addition, there are some small bug fixes and updates to dependencies.

NOTE: Check also

  • the extension of price labels added on v8.2.0
  • bug fixes added on v8.3.0
    • [fix] BookingFixedDurationForm: undefined booking length with single fixed price variant.
      #595
    • [fix] EditListingPricingPanel: Add initial value for the startTimeInterval.
      #594

Translations

New translations

  "EditListingPricingForm.priceVariant.delete": "Delete variation",
  "EditListingPricingForm.priceVariant.name": "Variation name",
  "EditListingPricingForm.priceVariant.nameInputPlaceholder": "Name the session…",
  "EditListingPricingForm.priceVariant.nameMustBeUnique": "The name must be unique.",
  "EditListingPricingForm.priceVariant.nameRequired": "You need to add a name.",
  "EditListingPricingForm.priceVariant.variationNamesMustBeUnique": "Each variation must have a unique name.",
  "ListingCard.price": "{priceValue} {pricePerUnit}",
  "OrderPanel.listingPriceVariantsAreInvalid": "Oops, the pricing of this listing is not set properly. Please contact support.",
  "OrderPanel.price": "{priceValue} {pricePerUnit}",
  "OrderPanel.priceInMobileCTA": "{priceValue}",
  "PriceVariantPicker.onePriceVariantOnly": "{priceVariantName}",
  "PriceVariantPicker.priceVariantLabel": "Pick an option",
  "PriceVariantPicker.priceVariantUnselected": "Choose…",
  "SearchMapInfoCard.perUnit": "{unitType, select, day {per day} night {per night} hour {per hour} other {}}",
  "SearchMapInfoCard.price": "{priceValue}",
  "SearchMapPriceLabel.price": "{priceValue}",

Changed translations

Improved consistency: ellipsis instead of 3 dots separately.

-  "BookingDatesForm.seatsPlaceholder": "Select...",
+  "BookingDatesForm.seatsPlaceholder": "Select…",
-  "BookingTimeForm.seatsPlaceholder": "Select...",
+  "BookingTimeForm.seatsPlaceholder": "Select…",
-  "DisputeModal.disputePlaceholder": "There was an issue with...",
+  "DisputeModal.disputePlaceholder": "There was an issue with…",
-  "ProductOrderForm.selectQuantityOption": "Select...",
+  "ProductOrderForm.selectQuantityOption": "Select…",
-  "StripePaymentForm.messagePlaceholder": "Hello {name}! You should know that...",
+  "StripePaymentForm.messagePlaceholder": "Hello {name}! You should know that…",

Changes v8.1.0

  • [add] Add support for price variations for bookable listings.
    #582
  • [add] Add currently available translations for DE, ES.
    #584
  • [change] update deeply nested dependency: path-to-regexp
    #580
  • [fix] SectionDetails (ListingPage & ProfilePage): fix line-height and padding for the details row.
    #576
  • [fix] OrderPanel: purchase and inquiries did not check closed status of the listing.
    #573

v8.0.1

03 Apr 10:34
496a9d8

Choose a tag to compare

Small patch that contains correct translation keys for BookingFixedDurationForm and
this removes the usage of the legacy Places API on Google Maps integration.
#570

Translation changes

v8.0.0 used translations dedicated for BookingTimeForm. Here's the updated set of translation keys

  "BookingFixedDurationForm.bookingStartTitle": "Pick a date",
  "BookingFixedDurationForm.fetchLineItemsError": "Oops, something went wrong. Please refresh the page and try again.",
  "BookingFixedDurationForm.ownListing": "You can't book your own listing.",
  "BookingFixedDurationForm.priceBreakdownTitle": "Booking breakdown",
  "BookingFixedDurationForm.requestToBook": "Request to book",
  "BookingFixedDurationForm.requiredDate": "Select an available date",
  "BookingFixedDurationForm.seatsPlaceholder": "Select...",
  "BookingFixedDurationForm.seatsTitle": "Number of seats",
  "BookingFixedDurationForm.youWontBeChargedInfo": "You won't be charged yet",
-  "ProductOrderForm.finePrint": "You won't be charged yet.",
+  "ProductOrderForm.finePrint": "You won't be charged yet",

Changes v8.0.1

  • [add] Add currently available translations for FR.
    #571
  • [change] Remove Google Maps legacy Places API support
    #570
  • [fix] Topbar/LinksMenu: align the menu label correctly.
    #569
  • [fix] BookingFixedDurationForm: form was using wrong translation keys.
    #568
  • [fix] Fix the transition of the SavedCardDetails menu.
    #567

v8.0.0

26 Mar 14:01
8359dbd

Choose a tag to compare

This release contains a big change for the default-booking process:

  • There is will be a new unit type: 'fixed'
  • In addition, the 'hour' unit type has a new behaviour how time-slots are fetched.
    • New API feature for the time-slots query is taken into use
  • If you have customized default-booking transaction process and you want to merge this update to your codebase, you must also update your email templates: #552 and this commit.
  • NOTE: this release is missing the correct translation keys: #568

Screenshot 2025-03-11 at 18 04 45
Console shows a new unit type for bookings (work-in-progress / not released yet)

Pricing panel in the wizard

The public data will get 2 new properties

  • priceVariants: it contains an array of prices and booking lengths
    • This is an array because we are going to add price variants for bookings in the upcoming project.
  • startTimeInterval: string with possible values: hour, halfHour, quarterHour
    • So, we have introduced 2 new custom time units: halfHour, quarterHour

Screenshot 2025-03-11 at 18 17 01
Console shows new public data properties: priceVariants & startTimeInterval

Pricing panel for 'fixed' length bookings:
Screenshot 2025-03-14 at 15 51 48
Provider can set booking length and interval of start times on EditListingWizard.

The time-slot query for small time units

We have introduced new query parameters to the time-slot query. Those calls are made on the ListingPage (and TransactionPage).
Screenshot 2025-03-12 at 18 33 02
Monthly time slot query when today is 12.03.2025 16:33:00
Start time interval: Every half hour
Booking length: 2h 45m
Listing's time zone: 'Etc/UTC'

With the introduction of IntervalDuration, we want to reduce the time-slot data that potentially needs to be fetched, when ever user navigates between months on the date picker. So, for 'hour' and 'fixed' bookings, the monthly time-slot query only fetches max 1 time-slot per given interval (1 day). This information is then used to show calendar dates as active or blocked.

Side note: 15 minute booking length (with multiple seats) can theoretically mean 4 × 24 × 31 = 2976 time-slots.

When user clicks a date on the calendar, we make another time-slot query to fetch all the time slots for that selected date only.

Side note: for 'fixed' booking length: both monthly queries and date-specific queries are fetching time slots up to the end of the date expanded with booking length. I.e. the range end expands over the next day a bit (in the screenshot, the monthly query is overlapping with April with 2h 45m).

OrderPanel

OrderPanel gets new property timeSlotsForDate in addition to monthlyTimeSlots. In addition, there's a new form imported and taken into use: BookingFixedDurationForm. Since this form shares some functionality with BookingTimeForm, some of the functions of FieldDateAndTimeInput are moved to the new file: booking.shared.js

Screenshot 2025-03-12 at 18 23 59
Listing page allows customer to select start date and start time

Note: The previous setup for hourly bookings fetched time slot data only when user navigated between different months on the date picker. It did not fetch new time slots when user selected a date from the picker. With this new setup, selecting a date makes an API call - with the exception of a small (currently 1 minute) cache before making a new call to the previously fetched date-specific time slot data (unless user makes a full page refresh).

CheckoutPage

On checkout page, Template saves the chosen price variant to the protected data of the transaction entity.
Screenshot 2025-03-11 at 19 26 30
Transaction's protected data shown on Console

InboxPage

Inbox items use date-time range, when referencing the 'fixed' unit type.
Screenshot 2025-03-12 at 15 41 12

Other changes to be aware of

  • util/generators.js > timeSlotsPerDate fn:
    • new option: minDurationStartingInDay defines the minimum length of the time slot we are considering
  • util/dates.js
    • bookingTimeUnits configuration (halfHour, quarterHour)
    • moment.js extension: startOfMinuteBasedInterval for those custom time units
  • server/api-util/lineItems.js
    • combined helpers that handled single seat vs multiple-seats
    • Added getFixedQuantityAndLineItems
  • Fix: if listing is turned from multiple seat mode to single seat mode -> time-slot boundaries per seat count should be handled. (commit and commit)
  • Fix: do not omit double values created by DST change. commit

Translations

New translations

  "EditListingPricingForm.priceVariant.addPriceVariant": "+ Add a price variation",
  "EditListingPricingForm.priceVariant.bookingLengthLabel": "Session length",
  "EditListingPricingForm.priceVariant.bookingLengthRequired": "The minimum session length is 15 minutes",
  "EditListingPricingForm.priceVariant.hoursOption": "{hours} {hours, plural, one {hour} other {hours}}",
  "EditListingPricingForm.priceVariant.minutesOption": "{minutes} {minutes, plural, one {minute} other {minutes}}",
  "EditListingPricingForm.priceVariant.priceInputPlaceholder": "Add a price…",
  "EditListingPricingForm.priceVariant.pricePerProduct": "Price {unitType, select, day {per day} night {per night} hour {per hour} fixed {per session} other {}}",
  "EditListingPricingForm.priceVariant.required": "You need to add a price.",
  "OrderBreakdown.baseUnitFixedBooking": "{unitPrice}",
  "OrderBreakdown.baseUnitFixedBookingSeats": "{unitPrice} x {seats, number} {seats, plural, one {seat} other {seats}}",
  "OrderBreakdown.bookingWithDSTInEffect": "Daylight saving time",
  "StartTimeInterval.startEveryHalfHour": "Every half hour",
  "StartTimeInterval.startEveryHour": "Every hour",
  "StartTimeInterval.startEveryQuarterHour": "Every quarter hour",
  "StartTimeInterval.label": "When should bookings start?",

New translations for email templates

  "BookingAcceptedRequest.PriceBreakdownFixed":  "{amount, number, ::.00} {currency}",
  "BookingAcceptedRequest.PriceBreakdownFixedWithSeats": "{amount, number, ::.00} {currency} × {seats, number} {seats, plural, one {seat} other {seats}}",
  "BookingMoneyPaid.PriceBreakdownFixed": "{amount, number, ::.00} {currency}",
  "BookingMoneyPaid.PriceBreakdownFixedWithSeats": "{amount, number, ::.00} {currency} × {seats, number} {seats, plural, one {seat} other {seats}}",
  "BookingNewRequest.PriceForFixedBooking": "{amount, number, ::.00} {currency}",
  "BookingNewRequest.PriceForFixedBookingWithSeats": "{amount, number, ::.00} {currency} × {seats, number} {seats, plural, one {seat} other {seats}}",

Changes v8.0.0

  • [add] Add support for bookings with a fixed duration.
    #560
  • [fix] Fix the positioning of the camera control otpions on Google Maps
    #565
  • [fix] Fix currently available translations for FR.
    #559

v7.3.0

19 Feb 15:50
2b8bfbe

Choose a tag to compare

This is mostly about releasing a bunch of fixes (plus a preparation of email templates for 'fixed' booking unit type)

Highlights:

  • Authenticated user trying to access /login or /signup routes caused hydration issue (React v18)
  • Hourly booking: current day was blocked, if the time zone of a listing's time zone was behind a browser's time zone.
  • Datepicker flashed the old month quickly after transitioning between months

Changes v7.3.0

  • [fix] Remove obsolete Flex CLI references
    #550
  • [fix] BookingTimeForm (hourly booking): calendar day was not localized causing isDayBlocked fn to
    choose past day, if listing's time zone was to the west of the browser's location / time zone.
    #556
  • [fix] AuthenticationPage: fix a bug with autenticated users accessing the auth pages.
    #555
  • [fix] CheckoutPageWithPayment & PaymentMethodsPage had a typo in a variable name.
    #554
  • [fix] DatePicker: fix a bug with the calendar transition.
    #553
  • [add] Add fixed bookings and price variant name support to booking process email templates.
    #552
  • [fix] LocationAutocompleteInput: fix a bug with Google Maps API loading order with Webpack Dev Server.
    #548

v7.2.0

30 Jan 13:01
20d0715

Choose a tag to compare

This version introduces multiple bug fixes and adds support for Google's New Places API.

Changes v7.2.0

  • [add] Add support for the new Google Places API
    #539
  • [fix] SearchPageWithMap: duplicate class caused positioning issue on localhost:3000.
    #546
  • [fix] TopbarDesktop: fix a typo (non-existent element attribute), when the search form was not
    shown. #545
  • [change] priceForSchemaMaybe: render offer price when price is 0. This helps customizations, but
    it's not enough for no-code features to support 0 price for inquiries.
    #544
  • [fix] TabNavHorizontal: Dark skin tab focus styles overriding hover font color.
    #543
  • [fix] Private marketplace: allow search crawlers to access the /sitemap route.
    #541

v7.1.0

23 Jan 15:52
4a6e158

Choose a tag to compare

This release prepares the codebase to support hiding the Topbar search based on configuration from Console. The configuration options are

  • always display search in top bar
  • don't display search in top bar on Landing page
  • only display search in top bar on Search page

NOTE: The feature is not yet fully released on Console side.

In addition, this release contains fixes for listing page time slot fetching and search schema price formatting.

Changes 2025-01-23

  • [add] Add support for hiding the Topbar search based on configuration.
    #531
  • [fix] ListingPage: fetchMonthlyTimeSlots didn't work correctly with day unitType.
    #536
  • [change] Google's search schema requires a price that uses dot as decimal separator.
    #535

v7.0.0

15 Jan 14:14
ee7d32b

Choose a tag to compare

NOTE: take also this PR into use: #555

This release updates Sharetribe Web Template to work with React v18 (v18.3.1)

Besides v18, there are also other improvements and fixes.

Notes for ppl taking update from this repo:

The changes have been made in the PR 523

react-dom has been split
react-dom/server is a separated from the rest of the package. Template loads this separately (but we kept the file structure the same). To get grasp of the changes to hydration flow, check especially these files:

  • src/index.js
  • src/app.js
  • server/index.js
  • server/dataLoader.js
  • server/renderer.js

sharetribe-scripts
The dependency had a somewhat embarrasing bug with Loadable Components setup causing hydration issue with v18. The earlier React versions were able to resolve the issue silently, but v18 is more strict to enforce that the server-side rendered (SSR) HTML matches with the HTML created on the first rendering pass on the browser / client-side rendering (CSR).

The fix was small (one-liner), but it caused UI issue on SearchPage (map layout was broken). Therefore, the new release for the sharetribe-scripts is going to be a major one (instead of a patch release).

Other hydration issues we encountered
There were some components that used typeof window === 'undefined' type of checks directly on rendering function. Those will cause hydration issues with React v18 (as SSR returns true and CSR returns false), if the check causes different HTML structure.

Similarly, some components used matchMedia to change HTML on for mobile and desktop layouts. With React v18, you need to make the first pass on CSR to match with the SSR. One way to do that is to track when the component is mounted:

const MyComponent = props => {
  const [mounted, setMounted] = useState(false);
  useEffect(() => {
    setMounted(true);
  }, []);
  
  const isMobileLayout =
    mounted && window?.matchMedia ? window.matchMedia(`(max-width: 767px)`)?.matches : true;

 return isMobileLayout ? <div>Hello</div> : <main>world</main>;
};

With this kind of code, the first CSR rendering does not pick 'desktop' layout. There will be a second rendering pass after the mounted flag is turned to true.

Dependency libraries
Several dependency libraries have been updated to support React v18.

Spreading key prop from list items throws a warning
Component's key can't be spread from collection of props anymore.

-        const { schemaType, ...fieldProps } = customFieldProps;
+        const { schemaType, key, ...fieldProps } = customFieldProps;
         return schemaType === SCHEMA_TYPE_MULTI_ENUM ? (
-          <SectionMultiEnumMaybe {...fieldProps} />
+          <SectionMultiEnumMaybe key={key} {...fieldProps} />

defaultProps and propTypes
React v18.3.1 has deprecated defaultProps in favor of JavaScripts (ES6) native default parameters for spread. This PR changes all the places, where defaultProps has been used. In addition, propTypes (on the same components) are also be removed on next React version (v19). Therefore, we have removed propTypes too and added the same information as JSDoc comment for the exported components.

If you want to postpone defaultProps removal, you could choose v18.2 instead of v18.3.1. The latter gives the warning about deprecation.

Most of the changes in this PR is about propTypes & JSDoc comments.
Note: there are still some components (~20) that needs propTypes to be removed, and we'll likely improve JSDocs while developing new features.

Tests
There was changes to the Testing Library setup (we started to use act as rendering became more asynchronous with the updated libraries). Note: act is imported differently between React v18.2 and v18.3.1. If you choose to use v18.2, you need to import act from the React Testing Library instead of importing it directly from React.

What about server components?
We didn't start to use server components at this point. It would affect only few public routes (landing page, search, listing and profile pages mainly) and we already have SSR in place for the public pages. Furthermore, relevant page schema for bots that don’t render JavaScript, won’t be available if loadData is not completed on the server.

You are of course, free to explore and try that approach yourself, but do notice that you'd need to start streaming the server content with renderToPipeableStream and React’s expectation is that the whole HTML is part of React app. Template renders only part of the DOM: the app UI is rendered to a string that is then injected inside public/index.html document.

Read more about streaming:

What about React v19?
React v19 is released a month ago, but not all the dependency libraries support it atm. We don't plan to make v19 update anytime soon, but v18.3.1 is the last version before that major update: it already started to warn about deprecated features (like defaultProps & propTypes). Therefore that update might not be as huge as this one was.

Translation changes

New keys

  "EditListingAvailabilityPlanForm.delete": "Delete",

Note: this key was shared already before with Seats feature release (v6.3.0)

changed translations

  "CustomExtendedDataField.numberTooSmall": "The number must be greater than or equal to {min}",

Changes v7.0.0

This major release takes the React v17.0.2 into use.

  • [fix] EditListingWizard: fix a bug with YouTube field.
    #533

  • [fix] CustomExtendedDataField.module.css: add missing customMediaQuery import.
    #532

  • [change] This updates Sharetribe Web Template to use React v18 (v18.3.1). Some highlights:

    • Several dependency libraries have been updated.
    • Hydration is much more strict now. First render on client-side must match the server-side
      render.

    #523

  • [add] Add currently available translations for DE.
    #529

  • [fix] a link inside the inquiry message was invisible for the sender of the inquiry.
    #528

  • [add] Add currently available translations for DE, ES, FR.
    #527

  • [fix] AvailabilityPlanForm had a hard-coded "Delete" text.
    #525

  • [add] Add currently available translations for DE, ES, FR.
    #524

  • [change] Update the wording of the numberTooSmall error message for consistency.
    #522

v6.3.0

08 Jan 10:12
2f11379

Choose a tag to compare

This release adds the support for handling multiple seats with default-booking transaction process.

NOTE 1:
the entire feature is not fully released
(as there should be a new config passed in from listing-types asset and change in Marketplace Console is not yet ready).

NOTE 2:
If you have modified email templates using CLI, you need to check that the booking breakdowns on sent emails work correctly with multiple seats. See #518

NOTE 3:
This release modifies the availability tab on EditListingWizard. The UI changes so that the weekly calendar will show only 1 list of available time ranges - and that list also includes exceptions. See the screenshots on #502

In addition to seats releated changes, this release contains a few smaller improvements and bug fixes. Check the full changes v6.3.0 list below.

Translations

New translation keys

  "BookingDatesForm.seatsPlaceholder": "Select...",
  "BookingDatesForm.seatsTitle": "Number of seats",
  "BookingTimeForm.seatsPlaceholder": "Select...",
  "BookingTimeForm.seatsTitle": "Number of seats",
  "EditListingAvailabilityPanel.WeeklyCalendar.exception": "Exception: {exception}",
  "EditListingAvailabilityPanel.WeeklyCalendar.seats": "{seats, plural, one {{seats} seat} other {{seats} seats}}",
  "EditListingAvailabilityPlanForm.selectTime": "Select time",
  "FieldSeatsInput.numberTooBig": "The number must be less than or equal to {max}",
  "FieldSeatsInput.numberTooSmall": "The number must be greater than or equal to {min}",
  "FieldSeatsInput.seatsError": "This field is required",
  "FieldSeatsInput.seatsLabel": "Seats",
  "FieldSeatsInput.seatsPlaceholder": "Seats",
  "FilterComponent.seatsLabel": "Seats",
  "InboxPage.seats": "Number of seats: {seats}",
  "NumberInput.decrementButton": "Decrement the value by one",
  "NumberInput.incrementButton": "Increment the value by one",
  "OrderBreakdown.baseUnitDaySeats": "{unitPrice} x {quantity, number} {quantity, plural, one {day} other {days}} x { seats, number } { seats, plural, one {seat} other {seats} }",
  "OrderBreakdown.baseUnitNightSeats": "{unitPrice} x {quantity, number} {quantity, plural, one {night} other {nights}} x { seats, number } { seats, plural, one {seat} other {seats} }",
  "OrderBreakdown.baseUnitHourSeats": "{unitPrice} x {quantity, number} {quantity, plural, one {hour} other {hours}} x { seats, number } { seats, plural, one {seat} other {seats} }",
  "SeatsFilter.labelSelected":"Seats: {seatCount}",

Note: FieldSeatsInput: min = 0, max is 9007199254740991 aka Number.MAX_SAFE_INTEGER

Deleted translation keys

  "EditListingAvailabilityPanel.WeeklyCalendar.exceptions": "Exceptions",

Changes v6.3.0

  • [fix] fix a bug with seats handling in email templates.
    #518
  • [add] Add support for using multiple seats on default-booking process.
    #502
  • [fix] ListingPageVariant: the #author anchor was not pointing to ListingPageVariant.
    #515
  • [fix] target element didn't seem to work well with scroll-margin.
    #513
  • [change] Require account type when creating a Stripe account
    #512
  • [add] Add currently available translations for DE, ES, FR.
    #511

v6.2.0

26 Nov 12:05
8852e72

Choose a tag to compare

This release introduces updates to Stripe and Mapbox in the template.

Stripe

When collecting payout information from providers, the template no longer collects the user's bank account information. Instead, that information is collected in the Stripe Connect Onboarding flow.

In addition, the template supports setting a non-Stripe-supported currency for listings created with the default inquiry process.

Mapbox

The mapbox-gl-js library used in the template is updated v1.0.0 => v3.7.0. In addition, there is an update to the mapbox-sdk.js file that corresponds to the mapbox-sdk-js library and is included from a static folder for CSP purposes. See corresponding PR notes for details on license changes.

In addition, this release includes bug fixes and improvements.

Translation changes

New translation keys

  "CheckoutPage.incompatibleCurrency": "You're trying to initiate a payment using a currency not supported by Stripe. If you're using Stripe as your payment processor, you can only use currencies supported by Stripe.",
  "EditListingDetailsForm.incompatibleCurrency": "{marketplaceName} uses {marketplaceCurrency} as its currency. This listing type requires online payments, but Sharetribe's online payment system doesn't support {marketplaceCurrency} payments. If you want to publish a listing with this listing type, the currency of the marketplace needs to be changed.",
  "EditListingWizard.payoutModalInfoNew": "{marketplaceName} uses Stripe to process payments. Get verified with Stripe and add your payout details to receive money from transactions. Start by choosing your account type and country.",
  "StripeConnectAccountForm.accountTypes.company": "Company",
  "StripeConnectAccountForm.accountTypes.individual": "Individual",

Updated translation keys

  "EditListingWizard.payoutModalInfo": "{marketplaceName} uses Stripe to process payments. Get verified with Stripe and add your payout details to receive money from transactions.",
  "StripeConnectAccountForm.stripeToSText": "By moving forward in the process, you agree to the {stripeConnectedAccountTermsLink}.",
  "StripeConnectAccountStatusBox.verificationNeededText": "Stripe needs some more information from you to verify your account.",
  "StripeConnectAccountStatusBox.verificationNeededTitle": "Complete verification to receive payments",

Deleted translation keys

  "StripeBankAccountTokenInputField.accountNumber.inline": "account number",
  "StripeBankAccountTokenInputField.accountNumber.label": "Bank account number",
  "StripeBankAccountTokenInputField.accountNumber.placeholder": "Type in bank account number…",
  "StripeBankAccountTokenInputField.accountNumber.required": "Bank account number is required.",
  "StripeBankAccountTokenInputField.accountOwnerName.inline": "account owner name",
  "StripeBankAccountTokenInputField.accountOwnerName.label": "Bank account owner name",
  "StripeBankAccountTokenInputField.accountOwnerName.placeholder": "Jane Doe",
  "StripeBankAccountTokenInputField.accountOwnerName.required": "Bank account owner name is required.",
  "StripeBankAccountTokenInputField.andBeforeLastItemInAList": " and",
  "StripeBankAccountTokenInputField.bankCode.inline": "bank code",
  "StripeBankAccountTokenInputField.bankCode.label": "Bank code",
  "StripeBankAccountTokenInputField.bankCode.placeholder": "Type in bank code…",
  "StripeBankAccountTokenInputField.bankCode.required": "Bank code is required.",
  "StripeBankAccountTokenInputField.bankName.inline": "bank name",
  "StripeBankAccountTokenInputField.bankName.label": "Bank name",
  "StripeBankAccountTokenInputField.bankName.placeholder": "Type in bank name…",
  "StripeBankAccountTokenInputField.bankName.required": "Bank name is required.",
  "StripeBankAccountTokenInputField.branchCode.inline": "branch code",
  "StripeBankAccountTokenInputField.branchCode.label": "Branch code",
  "StripeBankAccountTokenInputField.branchCode.placeholder": "Type in branch code…",
  "StripeBankAccountTokenInputField.branchCode.required": "Branch code is required.",
  "StripeBankAccountTokenInputField.branchName.inline": "branch name",
  "StripeBankAccountTokenInputField.branchName.label": "Branch name",
  "StripeBankAccountTokenInputField.branchName.placeholder": "Type in branch name…",
  "StripeBankAccountTokenInputField.branchName.required": "Branch name is required.",
  "StripeBankAccountTokenInputField.bsb.inline": "BSB",
  "StripeBankAccountTokenInputField.bsb.label": "BSB",
  "StripeBankAccountTokenInputField.bsb.placeholder": "Type in BSB…",
  "StripeBankAccountTokenInputField.bsb.required": "BSB is required.",
  "StripeBankAccountTokenInputField.clabe.inline": "CLABE",
  "StripeBankAccountTokenInputField.clabe.label": "CLABE",
  "StripeBankAccountTokenInputField.clabe.placeholder": "Type in CLABE…",
  "StripeBankAccountTokenInputField.clabe.required": "CLABE is required.",
  "StripeBankAccountTokenInputField.clearingCode.inline": "clearing code",
  "StripeBankAccountTokenInputField.clearingCode.label": "Clearing code",
  "StripeBankAccountTokenInputField.clearingCode.placeholder": "Type in clearing code…",
  "StripeBankAccountTokenInputField.clearingCode.required": "Clearing code is required.",
  "StripeBankAccountTokenInputField.genericStripeError": "Couldn't connect account number. Please double-check that your {inputs} are valid in {country}",
  "StripeBankAccountTokenInputField.genericStripeErrorIban": "Couldn't connect account number. Please double-check that your account number is valid in {country}",
  "StripeBankAccountTokenInputField.iban.inline": "IBAN",
  "StripeBankAccountTokenInputField.iban.label": "Bank account number (IBAN)",
  "StripeBankAccountTokenInputField.iban.placeholder": "DE89 3704 0044 0532 0130 00",
  "StripeBankAccountTokenInputField.iban.required": "Bank account number (IBAN) is required.",
  "StripeBankAccountTokenInputField.institutionNumber.inline": "institution number",
  "StripeBankAccountTokenInputField.institutionNumber.label": "Institution number",
  "StripeBankAccountTokenInputField.institutionNumber.placeholder": "Type in institution number…",
  "StripeBankAccountTokenInputField.institutionNumber.required": "Institution number is required.",
  "StripeBankAccountTokenInputField.routingNumber.inline": "routing number",
  "StripeBankAccountTokenInputField.routingNumber.label": "Routing number",
  "StripeBankAccountTokenInputField.routingNumber.placeholder": "Type in routing number…",
  "StripeBankAccountTokenInputField.routingNumber.required": "Routing number is required.",
  "StripeBankAccountTokenInputField.sortCode.inline": "sort code",
  "StripeBankAccountTokenInputField.sortCode.label": "Sort code",
  "StripeBankAccountTokenInputField.sortCode.placeholder": "Type in sort code…",
  "StripeBankAccountTokenInputField.sortCode.required": "Sort code is required.",
  "StripeBankAccountTokenInputField.transitNumber.inline": "transit number",
  "StripeBankAccountTokenInputField.transitNumber.label": "Transit number",
  "StripeBankAccountTokenInputField.transitNumber.placeholder": "Type in transit number…",
  "StripeBankAccountTokenInputField.transitNumber.required": "Transit number is required.",
  "StripeBankAccountTokenInputField.unsupportedCountry": "Country not supported: {country}",

Changes

  • [add] Remove bank account collection from the template, so that it is collected in the
    Stripe Onboarding flow instead.
    #470
  • [add] Add currently available translations for DE, ES, FR.
    #508
  • [add] Add support for currencies not supported by Stripe in inquiry processes.
    #493
  • SingeDatePicker: don't update value to dateData if it has the same timestamp has not changed.
    #507
  • [change] Node v23.2 is failing. This adds engine rule for node (">=18.20.1 <23.2.0") for now.
    #505
  • [change] Update mapbox-gl-js (v1.0.0 => v3.7.0) and mapbox-sdk-js (0.6.0 => 0.16.1) Note: Mapbox
    license changed in v2 (and pricing for non-mapbox related map tiles)
    https://github.com/mapbox/mapbox-gl-js/releases/tag/v2.0.0
    #488
  • [change] Update default email template copy texts
    #501
  • [fix] ConfirmSignupForm: show spinner. (Handling for confirmInProgress state was missing.)
    #504
  • [fix] Topbar: if multiple custom links has the same text, the virtual DOM is confused.
    #503
  • [fix] PaymentMethodsPage: full page load did not fetch defaultPaymentMethod.
    #500
  • [change] Relax the Referrer-Policy to "origin".
    #498
  • [fix] Open discard modal on ManageListingsPage only if scrolling is disabled. Fixes an issue where
    opening the discard draft modal on mobile scrolled the page to the very bottom.
    #497