From 17ce0d1eb880acaa57fe0e01de86d9a121d69d17 Mon Sep 17 00:00:00 2001 From: Lasse Rune Hansen Date: Sat, 13 Jun 2026 16:25:17 +0200 Subject: [PATCH] fix(frontend/story-integration): Fix TypeScript type imports and duplicate dictionary key - Added 'import type' syntax for TypeScript type-only imports - Removed duplicate 'ein' entry in GERMAN_WORD_DICTIONARY - Removed unused import in StoryPlayer component - Verified build passes successfully Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- german-app-frontend/package-lock.json | 60 ++++++++++++++++++- .../components/features/story/StoryPlayer.tsx | 3 +- .../features/story/StorySegment.tsx | 5 +- .../components/features/story/StoryTab.tsx | 2 +- german-app-frontend/src/lib/api/story.ts | 2 +- german-app-frontend/src/pages/StoryPage.tsx | 2 +- 6 files changed, 65 insertions(+), 9 deletions(-) diff --git a/german-app-frontend/package-lock.json b/german-app-frontend/package-lock.json index f79faae..e896ea3 100644 --- a/german-app-frontend/package-lock.json +++ b/german-app-frontend/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "react": "^19.2.6", - "react-dom": "^19.2.6" + "react-dom": "^19.2.6", + "react-router-dom": "^7.0.0" }, "devDependencies": { "@eslint/js": "^10.0.1", @@ -1324,6 +1325,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2397,6 +2411,44 @@ "react": "^19.2.6" } }, + "node_modules/react-router": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.17.0.tgz", + "integrity": "sha512-FDELK7rTMlCHO5+reyXsPlmfr7N1F91lPHsWYfMEGQm/KQ+F4JFM8jGoeQDmDvdTs93Fw9aSilH+uKRb4/jXvQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.17.0.tgz", + "integrity": "sha512-fyU2yjGups/hE6Xz0I5ZYbVL8Gx29eCjgpHaRaTaVU+OOAdfRX05KsvyRm0GO8YQwOkhpU3MurW1jyMUJn+zSw==", + "license": "MIT", + "dependencies": { + "react-router": "7.17.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/rolldown": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", @@ -2447,6 +2499,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/german-app-frontend/src/components/features/story/StoryPlayer.tsx b/german-app-frontend/src/components/features/story/StoryPlayer.tsx index e5a3e50..b9cb476 100644 --- a/german-app-frontend/src/components/features/story/StoryPlayer.tsx +++ b/german-app-frontend/src/components/features/story/StoryPlayer.tsx @@ -1,6 +1,5 @@ import { useState, useRef, useEffect, useCallback } from 'react'; -import { StorySegmentDto } from '../../../types/api/story'; -import { storyApi } from '../../../lib/api/story'; +import type { StorySegmentDto } from '../../../types/api/story'; interface StoryPlayerProps { segment: StorySegmentDto; diff --git a/german-app-frontend/src/components/features/story/StorySegment.tsx b/german-app-frontend/src/components/features/story/StorySegment.tsx index 42393ed..9ba3df7 100644 --- a/german-app-frontend/src/components/features/story/StorySegment.tsx +++ b/german-app-frontend/src/components/features/story/StorySegment.tsx @@ -1,6 +1,6 @@ import { useState, useCallback } from 'react'; -import { StorySegmentDto } from '../../../types/api/story'; -import { WordTranslation } from '../../../types/api/story'; +import type { StorySegmentDto } from '../../../types/api/story'; +import type { WordTranslation } from '../../../types/api/story'; // Simple German word dictionary for common words // In production, this should come from an API @@ -11,7 +11,6 @@ const GERMAN_WORD_DICTIONARY: Record = { das: { word: 'das', translation: 'the', partOfSpeech: 'article', gender: 'neuter' }, ein: { word: 'ein', translation: 'a/an', partOfSpeech: 'article', gender: 'masculine' }, eine: { word: 'eine', translation: 'a/an', partOfSpeech: 'article', gender: 'feminine' }, - ein: { word: 'ein', translation: 'a/an', partOfSpeech: 'article' }, // Pronouns ich: { word: 'ich', translation: 'I', partOfSpeech: 'pronoun' }, diff --git a/german-app-frontend/src/components/features/story/StoryTab.tsx b/german-app-frontend/src/components/features/story/StoryTab.tsx index a106ca1..9c08e16 100644 --- a/german-app-frontend/src/components/features/story/StoryTab.tsx +++ b/german-app-frontend/src/components/features/story/StoryTab.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react'; -import { StoryProgressDto, StorySegmentProgressDto } from '../../../types/api/story'; +import type { StoryProgressDto, StorySegmentProgressDto } from '../../../types/api/story'; import { storyApi } from '../../../lib/api/story'; interface StoryTabProps { diff --git a/german-app-frontend/src/lib/api/story.ts b/german-app-frontend/src/lib/api/story.ts index ebf3338..48d384a 100644 --- a/german-app-frontend/src/lib/api/story.ts +++ b/german-app-frontend/src/lib/api/story.ts @@ -1,4 +1,4 @@ -import { +import type { StorySegmentDto, CreateStorySegmentDto, UpdateStorySegmentDto, diff --git a/german-app-frontend/src/pages/StoryPage.tsx b/german-app-frontend/src/pages/StoryPage.tsx index 23a4f62..a59ceb2 100644 --- a/german-app-frontend/src/pages/StoryPage.tsx +++ b/german-app-frontend/src/pages/StoryPage.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; -import { StorySegmentDto, LevelWithStoriesDto } from '../types/api/story'; +import type { StorySegmentDto, LevelWithStoriesDto } from '../types/api/story'; import { storyApi } from '../lib/api/story'; import StorySegment from '../components/features/story/StorySegment'; import StoryPlayer from '../components/features/story/StoryPlayer';