diff --git a/src/Components/Core/Adapters/BackendAdapter/MockBackendAdapter.ts b/src/Components/Core/Adapters/BackendAdapter/MockBackendAdapter.ts index f07bc2e89..af8a248f0 100644 --- a/src/Components/Core/Adapters/BackendAdapter/MockBackendAdapter.ts +++ b/src/Components/Core/Adapters/BackendAdapter/MockBackendAdapter.ts @@ -891,7 +891,11 @@ export default class MockBackendAdapter implements IBackendPort { spaceTemplateStyle: "Campus", spaceStory: { introStory: { - storyTexts: ["Hallo", "Ich bin ein Story-Element"], + storyTexts: [ + "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolorekasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + ], elementModel: "a_npc_defaultnpc", }, outroStory: { diff --git a/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElement.tsx b/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElement.tsx index c9c6678d4..74aea9509 100644 --- a/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElement.tsx +++ b/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElement.tsx @@ -1,3 +1,12 @@ +import campusNPC from "../../../../../../Assets/misc/quizBackgrounds/a_npc_dozentlukas.png"; +import campusNPCClose from "../../../../../../Assets/misc/quizBackgrounds/a_npc_dozentlukas_close.png"; +import arcadeNPC from "../../../../../../Assets/misc/quizBackgrounds/a_npc_sheriffjustice.png"; +import arcadeNPCClose from "../../../../../../Assets/misc/quizBackgrounds/a_npc_sheriffjustice_close.png"; +import defaultNPC from "../../../../../../Assets/misc/quizBackgrounds/a_npc_defaultnpc.png"; +import defaultNPCClose from "../../../../../../Assets/misc/quizBackgrounds/a_npc_defaultnpc_close.png"; +import robotNPC from "../../../../../../Assets/misc/quizBackgrounds/a_npc_alerobot.png"; +import robotNPCClose from "../../../../../../Assets/misc/quizBackgrounds/a_npc_alerobot_close.png"; + import { AdLerUIComponent } from "src/Components/Core/Types/ReactTypes"; import useBuilder from "~ReactComponents/ReactRelated/CustomHooks/useBuilder"; import StoryElementViewModel from "./StoryElementViewModel"; @@ -6,10 +15,31 @@ import BUILDER_TYPES from "~DependencyInjection/Builders/BUILDER_TYPES"; import useObservable from "~ReactComponents/ReactRelated/CustomHooks/useObservable"; import { useCallback } from "react"; import { useTranslation } from "react-i18next"; -import StyledModal from "~ReactComponents/ReactRelated/ReactBaseComponents/StyledModal"; import tailwindMerge from "../../../Utils/TailwindMerge"; import { StoryElementType } from "src/Components/Core/Domain/Types/StoryElementType"; import StyledButton from "~ReactComponents/ReactRelated/ReactBaseComponents/StyledButton"; +import StyledContainer from "~ReactComponents/ReactRelated/ReactBaseComponents/StyledContainer"; +import { + LearningElementModel, + LearningElementModelTypeEnums, +} from "src/Components/Core/Domain/LearningElementModels/LearningElementModelTypes"; + +function getNPCImage( + model: LearningElementModel | null, + close: boolean +): string { + switch (model) { + case LearningElementModelTypeEnums.QuizElementModelTypes.RobotNPC: + return close ? robotNPCClose : robotNPC; + case LearningElementModelTypeEnums.QuizElementModelTypes.ArcadeNPC: + return close ? arcadeNPCClose : arcadeNPC; + case LearningElementModelTypeEnums.QuizElementModelTypes.CampusNPC: + return close ? campusNPCClose : campusNPC; + case LearningElementModelTypeEnums.QuizElementModelTypes.DefaultNPC: + default: + return close ? defaultNPCClose : defaultNPC; + } +} export default function StoryElement({ className }: AdLerUIComponent<{}>) { const [viewModel, controller] = useBuilder< @@ -19,6 +49,7 @@ export default function StoryElement({ className }: AdLerUIComponent<{}>) { const [isOpen, setOpen] = useObservable(viewModel?.isOpen); const [pageId] = useObservable(viewModel?.pageId); const [type] = useObservable(viewModel?.type); + useObservable(viewModel?.showOnlyIntro); useObservable(viewModel?.showOnlyOutro); useObservable(viewModel?.outroUnlocked); @@ -87,101 +118,163 @@ export default function StoryElement({ className }: AdLerUIComponent<{}>) { } else { return null; } + return ( - { - closeModal(); - controller.closePanel(); - }} - showModal={isOpen} - className={tailwindMerge( - className, - "flex flex-col justify-center gap-2 p-5 rounded-lg" - )} - > - {!complexStory && createBasicLayout(contentTexts, pageId, controller)} - {complexStory && ( - <> - {!viewModel.showOnlyIntro.Value && !viewModel.showOnlyOutro.Value && ( - <> - - {translate("introStoryTitle").toString()} - + +
+ {/* Background NPC */} +
+ LearningImage! +
+ {/* Modal */} +
+
+ {/* Header */} +
+ LearningImage! + +
{titleText}
+ - {translate("outroStoryTitle").toString()} + X - - )} - {(viewModel.showOnlyIntro.Value || viewModel.showOnlyOutro.Value) && - createBasicLayoutWithBackButton( - contentTexts, - pageId, - controller, - translate("backButton").toString() - )} - - )} - - ); -} - -function createBasicLayout( - contentTexts: string[], - pageId: number, - controller: IStoryElementController -) { - return ( - <> - {contentTexts[pageId].toString()} -
- {pageId < contentTexts.length - 1 && ( - - {">"} - - )} - {pageId > 0 && ( - - {"<"} - - )} +
+
+ {!complexStory && + createBasicLayout(contentTexts, pageId, controller)} + {complexStory && ( + <> + {!viewModel.showOnlyIntro.Value && + !viewModel.showOnlyOutro.Value && ( + <> + + {translate("introStoryTitle").toString()} + + + {translate("outroStoryTitle").toString()} + + + )} + {(viewModel.showOnlyIntro.Value || + viewModel.showOnlyOutro.Value) && + createBasicLayoutWithBackButton( + contentTexts, + pageId, + controller, + translate("backButton").toString() + )} + + )} +
+
+
- + ); -} -function createBasicLayoutWithBackButton( - contentTexts: string[], - pageId: number, - controller: IStoryElementController, - backbuttonText: string -) { - return ( - <> - {contentTexts[pageId].toString()} -
- {pageId < contentTexts.length - 1 && ( - - {">"} - - )} - {pageId > 0 && ( - - {"<"} + + function createBasicLayout( + contentTexts: string[], + pageId: number, + controller: IStoryElementController + ) { + return ( + <> +
+ {contentTexts[pageId].toString()} +
+
+
+
+ {" "} + {pageId > 0 && ( + + {"<"} + + )} +
+ +
+ {pageId < contentTexts.length - 1 && ( + + {">"} + + )} +
+
+
+ + ); + } + function createBasicLayoutWithBackButton( + contentTexts: string[], + pageId: number, + controller: IStoryElementController, + backbuttonText: string + ) { + return ( + <> +
+ {contentTexts[pageId].toString()} +
+
+ + {backbuttonText} - )} - - {backbuttonText} - -
- - ); +
+
+ {" "} + {pageId > 0 && ( + + {"<"} + + )} +
+ +
+ {pageId < contentTexts.length - 1 && ( + + {">"} + + )} +
+
+
+ + ); + } } diff --git a/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementPresenter.ts b/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementPresenter.ts index 0b0acaa74..5bbcab8b9 100644 --- a/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementPresenter.ts +++ b/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementPresenter.ts @@ -20,6 +20,7 @@ export default class StoryElementPresenter implements IStoryElementPresenter { onLearningSpaceLoaded(learningSpaceTO: LearningSpaceTO): void { this.viewModel.type.Value = learningSpaceTO.storyElement.storyType; + this.viewModel.modelType.Value = learningSpaceTO.storyElement.modelType; this.viewModel.introTexts.Value = learningSpaceTO.storyElement.introStoryTexts; this.viewModel.outroTexts.Value = diff --git a/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementViewModel.ts b/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementViewModel.ts index 131bc9a01..b29e62d69 100644 --- a/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementViewModel.ts +++ b/src/Components/Core/Presentation/React/LearningSpaceDisplay/StoryElement/StoryElementViewModel.ts @@ -1,5 +1,6 @@ import { StoryElementType } from "src/Components/Core/Domain/Types/StoryElementType"; import Observable from "../../../../../../Lib/Observable"; +import { LearningElementModel } from "src/Components/Core/Domain/LearningElementModels/LearningElementModelTypes"; export default class StoryElementViewModel { introTexts: Observable = new Observable( @@ -17,4 +18,6 @@ export default class StoryElementViewModel { //MenuNavigation showOnlyIntro: Observable = new Observable(false); showOnlyOutro: Observable = new Observable(false); + modelType: Observable = + new Observable(null); } diff --git a/src/localize/de/learningSpace.json b/src/localize/de/learningSpace.json index e89ff0d6e..65070c0f8 100644 --- a/src/localize/de/learningSpace.json +++ b/src/localize/de/learningSpace.json @@ -12,12 +12,12 @@ "exitRoomTitle": "Raum verlassen?", "exitRoomButton": "Raum verlassen", - "introStoryTitle": "Lernraum Einführung", - "outroStoryTitle": "Lernraum Abschluss", - "introOutroStoryTitle": "Lernraum Einführung & Abschluss", + "introStoryTitle": "Intro", + "outroStoryTitle": "Outro", + "introOutroStoryTitle": "Wähle zwischen Intro oder Outro der Lernraumstory", "outroLockedTitle": "Lernraum Abschluss gesperrt", "outroLockedText": "Dieses Element ist noch nicht verfügbar. Schließe zuerst den Raum ab!", - "backButton": "Zurück zur Auswahl", + "backButton": "Intro/Outro Auswahl", "spaceScore": "{{current}} von {{required}}",