diff --git a/apps/builder/src/features/blocks/inputs/rating/components/RatingInputContent.tsx b/apps/builder/src/features/blocks/inputs/rating/components/RatingInputContent.tsx index 9d8b233fe..9ddb535ec 100644 --- a/apps/builder/src/features/blocks/inputs/rating/components/RatingInputContent.tsx +++ b/apps/builder/src/features/blocks/inputs/rating/components/RatingInputContent.tsx @@ -17,7 +17,9 @@ export const RatingInputContent = ({ variableId, block }: Props) => { ) : ( {t('blocks.inputs.rating.from.label')}{' '} - {block.options?.buttonType === 'Icons' ? 1 : 0}{' '} + {block.options?.buttonType === 'Icons' + ? 1 + : block.options?.startsAt ?? defaultRatingInputOptions.startsAt}{' '} {t('blocks.inputs.rating.to.label')}{' '} {block.options?.length ?? defaultRatingInputOptions.length} diff --git a/apps/builder/src/features/blocks/inputs/rating/components/RatingInputSettings.tsx b/apps/builder/src/features/blocks/inputs/rating/components/RatingInputSettings.tsx index 42ecb0e4b..20c34af85 100644 --- a/apps/builder/src/features/blocks/inputs/rating/components/RatingInputSettings.tsx +++ b/apps/builder/src/features/blocks/inputs/rating/components/RatingInputSettings.tsx @@ -3,7 +3,7 @@ import { DropdownList } from '@/components/DropdownList' import { RatingInputBlock, Variable } from '@typebot.io/schemas' import React from 'react' import { SwitchWithLabel } from '@/components/inputs/SwitchWithLabel' -import { TextInput } from '@/components/inputs' +import { NumberInput, TextInput } from '@/components/inputs' import { VariableSearchInput } from '@/components/inputs/VariableSearchInput' import { defaultRatingInputOptions } from '@typebot.io/schemas/features/blocks/inputs/rating/constants' import { useTranslate } from '@tolgee/react' @@ -46,11 +46,15 @@ export const RatingInputSettings = ({ options, onOptionsChange }: Props) => { const handleOneClickSubmitChange = (isOneClickSubmitEnabled: boolean) => onOptionsChange({ ...options, isOneClickSubmitEnabled }) + const updateStartsAt = (startsAt: number | `{{${string}}}` | undefined) => + onOptionsChange({ ...options, startsAt }) + const length = options?.length ?? defaultRatingInputOptions.length const isOneClickSubmitEnabled = options?.isOneClickSubmitEnabled ?? defaultRatingInputOptions.isOneClickSubmitEnabled + const buttonType = options?.buttonType ?? defaultRatingInputOptions.buttonType return ( @@ -71,13 +75,20 @@ export const RatingInputSettings = ({ options, onOptionsChange }: Props) => { - {options?.buttonType === 'Icons' && ( + {buttonType === 'Numbers' && ( + + )} + + {buttonType === 'Icons' && ( { onCheckChange={handleCustomIconCheck} /> )} - {options?.buttonType === 'Icons' && options.customIcon?.isEnabled && ( + {buttonType === 'Icons' && options?.customIcon?.isEnabled && ( { )} { defaultRatingInputOptions.length) + ((props.block.options?.buttonType ?? defaultRatingInputOptions.buttonType) === 'Numbers' - ? 1 + ? -( + ((props.block.options?.startsAt as number | undefined) ?? + defaultRatingInputOptions.startsAt) - 1 + ) : 0) ) )} @@ -58,7 +61,8 @@ export const RatingForm = (props: Props) => { idx() + ((props.block.options?.buttonType ?? defaultRatingInputOptions.buttonType) === 'Numbers' - ? 0 + ? (props.block.options?.startsAt as number | undefined) ?? + defaultRatingInputOptions.startsAt : 1) } onClick={handleClick} diff --git a/packages/embeds/nextjs/package.json b/packages/embeds/nextjs/package.json index 64b18d118..bbe3b1f90 100644 --- a/packages/embeds/nextjs/package.json +++ b/packages/embeds/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/nextjs", - "version": "0.2.40", + "version": "0.2.41", "description": "Convenient library to display typebots on your Next.js website", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/embeds/react/package.json b/packages/embeds/react/package.json index 013cca657..dc74e62e0 100644 --- a/packages/embeds/react/package.json +++ b/packages/embeds/react/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/react", - "version": "0.2.40", + "version": "0.2.41", "description": "Convenient library to display typebots on your React app", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/schemas/features/blocks/inputs/rating/constants.ts b/packages/schemas/features/blocks/inputs/rating/constants.ts index 01ab6af2d..83ace3e07 100644 --- a/packages/schemas/features/blocks/inputs/rating/constants.ts +++ b/packages/schemas/features/blocks/inputs/rating/constants.ts @@ -7,6 +7,7 @@ export const defaultRatingInputOptions = { labels: { button: defaultButtonLabel, }, + startsAt: 0, customIcon: { isEnabled: false }, isOneClickSubmitEnabled: false, } as const satisfies RatingInputBlock['options'] diff --git a/packages/schemas/features/blocks/inputs/rating/schema.ts b/packages/schemas/features/blocks/inputs/rating/schema.ts index 61e1796bd..f7be1edbd 100644 --- a/packages/schemas/features/blocks/inputs/rating/schema.ts +++ b/packages/schemas/features/blocks/inputs/rating/schema.ts @@ -1,4 +1,5 @@ import { z } from '../../../../zod' +import { variableStringSchema } from '../../../utils' import { optionBaseSchema, blockBaseSchema } from '../../shared' import { InputBlockType } from '../constants' @@ -6,6 +7,7 @@ export const ratingInputOptionsSchema = optionBaseSchema.merge( z.object({ buttonType: z.literal('Icons').or(z.literal('Numbers')).optional(), length: z.number().optional(), + startsAt: z.number().or(variableStringSchema).optional(), labels: z .object({ left: z.string().optional(),