diff --git a/src/entities/activity/lib/types/item.ts b/src/entities/activity/lib/types/item.ts index ccac82496..59f6f0207 100644 --- a/src/entities/activity/lib/types/item.ts +++ b/src/entities/activity/lib/types/item.ts @@ -50,6 +50,7 @@ export interface ActivityItemBase { answer: Answer additionalText?: string | null conditionalLogic: ConditionalLogic | null + isHidden: boolean } export type Config = diff --git a/src/entities/applet/model/hooks/useActivityProgress.ts b/src/entities/applet/model/hooks/useActivityProgress.ts index 03f083fce..3730792c4 100644 --- a/src/entities/applet/model/hooks/useActivityProgress.ts +++ b/src/entities/applet/model/hooks/useActivityProgress.ts @@ -31,11 +31,9 @@ export const useActivityProgress = () => { splashScreenItem = mapSplashScreenToRecord(props.activity.splashScreen) } - const preparedActivityItemProgressRecords = props.activity.items - .filter(x => !x.isHidden) - .map(item => { - return mapItemToRecord(item) - }) + const preparedActivityItemProgressRecords = props.activity.items.map(item => { + return mapItemToRecord(item) + }) const items = splashScreenItem ? [splashScreenItem, ...preparedActivityItemProgressRecords] diff --git a/src/entities/applet/model/hooks/useSaveActivityItemAnswer.ts b/src/entities/applet/model/hooks/useSaveActivityItemAnswer.ts index ee60ba425..7c51267c4 100644 --- a/src/entities/applet/model/hooks/useSaveActivityItemAnswer.ts +++ b/src/entities/applet/model/hooks/useSaveActivityItemAnswer.ts @@ -40,8 +40,16 @@ export const useSaveItemAnswer = ({ activityId, eventId }: Props) => { [dispatch, activityId, eventId], ) + const removeItemAnswer = useCallback( + (itemId: string) => { + saveItemAnswer(itemId, []) + }, + [saveItemAdditionalText, saveItemAnswer], + ) + return { saveItemAnswer, saveItemAdditionalText, + removeItemAnswer, } } diff --git a/src/entities/applet/model/mapper.ts b/src/entities/applet/model/mapper.ts index ff4642204..ccd516fa2 100644 --- a/src/entities/applet/model/mapper.ts +++ b/src/entities/applet/model/mapper.ts @@ -59,5 +59,6 @@ export function mapSplashScreenToRecord(splashScreen: string): ItemRecord { responseValues: null, answer: [], conditionalLogic: null, + isHidden: false, } } diff --git a/src/widgets/ActivityDetails/model/hooks/useSurvey.ts b/src/widgets/ActivityDetails/model/hooks/useSurvey.ts index 31822154c..650dfac11 100644 --- a/src/widgets/ActivityDetails/model/hooks/useSurvey.ts +++ b/src/widgets/ActivityDetails/model/hooks/useSurvey.ts @@ -5,7 +5,14 @@ import { appletModel } from "~/entities/applet" export const useSurvey = (activityProgress: appletModel.ActivityProgress) => { const items = useMemo(() => activityProgress?.items ?? [], [activityProgress.items]) - const processedItems = appletModel.conditionalLogicBuilder.process(items) + const visibleItems = items.filter(x => !x.isHidden) + + const processedItems = appletModel.conditionalLogicBuilder.process(visibleItems) + + const visibleItemIds = visibleItems.map(x => x.id) + const processedItemIds = processedItems.map(x => x.id) + + const conditionallyHiddenItemIds = visibleItemIds.filter(id => !processedItemIds.includes(id)) const step = activityProgress?.step ?? 0 @@ -18,15 +25,16 @@ export const useSurvey = (activityProgress: appletModel.ActivityProgress) => { const progress = useMemo(() => { const defaultProgressPercentage = 0 - if (!items) { + if (!visibleItems) { return defaultProgressPercentage } - return ((step + 1) / items.length) * 100 - }, [items, step]) + return ((step + 1) / visibleItems.length) * 100 + }, [visibleItems, step]) return { item, + conditionallyHiddenItemIds, hasNextStep, hasPrevStep, diff --git a/src/widgets/ActivityDetails/ui/AssessmentPassingScreen.tsx b/src/widgets/ActivityDetails/ui/AssessmentPassingScreen.tsx index 9fa20dc9f..a2a74646a 100644 --- a/src/widgets/ActivityDetails/ui/AssessmentPassingScreen.tsx +++ b/src/widgets/ActivityDetails/ui/AssessmentPassingScreen.tsx @@ -58,12 +58,12 @@ export const AssessmentPassingScreen = (props: Props) => { eventId, }) - const { saveItemAnswer, saveItemAdditionalText } = appletModel.hooks.useSaveItemAnswer({ + const { saveItemAnswer, saveItemAdditionalText, removeItemAnswer } = appletModel.hooks.useSaveItemAnswer({ activityId, eventId, }) - const { step, item, hasPrevStep, hasNextStep, progress } = useSurvey(activityProgress) + const { step, item, hasPrevStep, hasNextStep, progress, conditionallyHiddenItemIds } = useSurvey(activityProgress) const canGoBack = !item?.config.removeBackButton && props.activityDetails.responseIsEditable @@ -149,12 +149,23 @@ export const AssessmentPassingScreen = (props: Props) => { return } + conditionallyHiddenItemIds?.forEach(id => removeItemAnswer(id)) + if (!hasNextStep) { return setIsModalOpen(true) } return onNext() - }, [hasNextStep, item, onNext, props.activityDetails, showWarningNotification, t]) + }, [ + conditionallyHiddenItemIds, + removeItemAnswer, + hasNextStep, + item, + onNext, + props.activityDetails, + showWarningNotification, + t, + ]) const onItemValueChange = (value: string[]) => { saveItemAnswer(item.id, value)