From ec55088c312c723aa730a39ba0968335d4bd67b2 Mon Sep 17 00:00:00 2001 From: Sergio N Date: Thu, 11 Dec 2025 23:20:22 +0100 Subject: [PATCH 1/8] FIX TYPO analysisPresignedUploadUrl --> analysisEntryPresignedUploadUrl --- src/components/partials/AnalysisStepNavigator.jsx | 6 +++--- src/pages/participate/ParticipateStepRouter.jsx | 4 ++-- src/pages/participate/ParticipateWrapper.jsx | 8 ++++---- src/pages/participate/steps/RecordingStep.jsx | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/partials/AnalysisStepNavigator.jsx b/src/components/partials/AnalysisStepNavigator.jsx index f18b01a..8b0baf9 100644 --- a/src/components/partials/AnalysisStepNavigator.jsx +++ b/src/components/partials/AnalysisStepNavigator.jsx @@ -5,7 +5,7 @@ import { IconAlertCircle, IconCheck, IconUpload, IconCircleCheck } from '@tabler import { useMediaPermissions } from '../../contexts/MediaPermissionsContext'; import apiClient from '../../config/API/axiosConfig.mjs'; -export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisId, analysisPresignedUploadUrl }) => { +export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisId, analysisEntryPresignedUploadUrl }) => { const { hasPermissions, permissionStatus, @@ -69,7 +69,7 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys recordingData.blob, analysisId, analysisEntryId, - analysisPresignedUploadUrl + analysisEntryPresignedUploadUrl ); if (!uploadSuccess) { @@ -240,5 +240,5 @@ AnalysisStepNavigator.propTypes = { analysisData: PropTypes.object, analysisEntryId: PropTypes.string, analysisId: PropTypes.string, - analysisPresignedUploadUrl: PropTypes.string + analysisEntryPresignedUploadUrl: PropTypes.string }; \ No newline at end of file diff --git a/src/pages/participate/ParticipateStepRouter.jsx b/src/pages/participate/ParticipateStepRouter.jsx index 5fb19b5..3ca7104 100644 --- a/src/pages/participate/ParticipateStepRouter.jsx +++ b/src/pages/participate/ParticipateStepRouter.jsx @@ -13,7 +13,7 @@ export const ParticipateStepRouter = ({ analysisData, analysisId, analysisEntryId, - analysisPresignedUploadUrl, + analysisEntryPresignedUploadUrl, error, setError, validationLoading, @@ -85,7 +85,7 @@ export const ParticipateStepRouter = ({ analysisData={analysisData} analysisEntryId={analysisEntryId} analysisId={analysisId} - analysisPresignedUploadUrl={analysisPresignedUploadUrl} + analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} onExit={handleExitAnalysis} buildAnalysisSteps={buildAnalysisSteps} /> diff --git a/src/pages/participate/ParticipateWrapper.jsx b/src/pages/participate/ParticipateWrapper.jsx index d1dbdd4..c0e940c 100644 --- a/src/pages/participate/ParticipateWrapper.jsx +++ b/src/pages/participate/ParticipateWrapper.jsx @@ -17,7 +17,7 @@ const ParticipateContent = () => { const [analysisData, setAnalysisData] = useState(null); const [analysisId, setAnalysisId] = useState(null); const [analysisEntryId, setAnalysisEntryId] = useState(null); - const [analysisPresignedUploadUrl, setAnalysisPresignedUploadUrl] = useState(null); + const [analysisEntryPresignedUploadUrl, setAnalysisEntryPresignedUploadUrl] = useState(null); const [error, setError] = useState(null); // Loading states for different steps @@ -85,7 +85,7 @@ const ParticipateContent = () => { if (response?.data?.success) { setAnalysisData(response.data.analysisData); setAnalysisEntryId(response.data.analysisEntryId); - setAnalysisPresignedUploadUrl(response.data.analysisPresignedUploadUrl); + setAnalysisEntryPresignedUploadUrl(response.data.analysisEntryPresignedUploadUrl); setCurrentStep('analysis'); } else { setError("Error al obtener los datos del análisis. Por favor, inténtalo de nuevo."); @@ -118,7 +118,7 @@ const ParticipateContent = () => { setAnalysisData(null); setAnalysisId(null); setAnalysisEntryId(null); - setAnalysisPresignedUploadUrl(null); + setAnalysisEntryPresignedUploadUrl(null); setError(null); setCurrentStep('input'); setShowSecurityModal(false); @@ -231,7 +231,7 @@ const ParticipateContent = () => { analysisData={analysisData} analysisId={analysisId} analysisEntryId={analysisEntryId} - analysisPresignedUploadUrl={analysisPresignedUploadUrl} + analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} error={error} setError={setError} validationLoading={validationLoading} diff --git a/src/pages/participate/steps/RecordingStep.jsx b/src/pages/participate/steps/RecordingStep.jsx index c34d94a..859fd1f 100644 --- a/src/pages/participate/steps/RecordingStep.jsx +++ b/src/pages/participate/steps/RecordingStep.jsx @@ -9,7 +9,7 @@ export const RecordingStep = ({ analysisData, analysisEntryId, analysisId, - analysisPresignedUploadUrl, + analysisEntryPresignedUploadUrl, onExit, buildAnalysisSteps }) => { @@ -43,7 +43,7 @@ export const RecordingStep = ({ analysisData={analysisData} analysisEntryId={analysisEntryId} analysisId={analysisId} - analysisPresignedUploadUrl={analysisPresignedUploadUrl} + analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} /> From a546469536d6fb04433bd8a341e84d599d7df48d Mon Sep 17 00:00:00 2001 From: Sergio N Date: Thu, 11 Dec 2025 23:44:53 +0100 Subject: [PATCH 2/8] MOVE transcript transformer into its own logical function --- .../partials/VideoPlayerSidebar.jsx | 27 ++----- src/pages/user/VideoPlayerPage.jsx | 28 +++---- src/utils/transcriptTransformer.js | 80 +++++++++++++++++++ 3 files changed, 98 insertions(+), 37 deletions(-) create mode 100644 src/utils/transcriptTransformer.js diff --git a/src/components/partials/VideoPlayerSidebar.jsx b/src/components/partials/VideoPlayerSidebar.jsx index 8de1c6b..62f665c 100644 --- a/src/components/partials/VideoPlayerSidebar.jsx +++ b/src/components/partials/VideoPlayerSidebar.jsx @@ -10,6 +10,7 @@ import { Tabs, } from '@mantine/core'; import { useMemo } from 'react'; +import { transformTranscript } from '../../utils/transcriptTransformer'; export const VideoPlayerSidebar = ({ transcript, @@ -23,29 +24,13 @@ export const VideoPlayerSidebar = ({ }) => { // Memoized transcript transformation to avoid expensive recalculations const transformedTranscript = useMemo(() => { - if (!transcript) return null; - - // Handle case where transcript is already the transcription array - if (Array.isArray(transcript)) { - return transcript.map((segment, index) => ({ - id: index, - start: segment.start_time, - text: segment.transcript, - end_time: segment.end_time - })); - } - - // Handle new API response format - if (transcript.transcriptionSegments && Array.isArray(transcript.transcriptionSegments)) { - return transcript.transcriptionSegments.map((segment, index) => ({ - id: index, - start: segment.start_time, - text: segment.transcript, - end_time: segment.end_time - })); + // If transcript is already in transformed format (has id, start, text properties), return as-is + if (transcript && Array.isArray(transcript) && transcript.length > 0 && transcript[0].id !== undefined) { + return transcript; } - return null; + // Otherwise, transform from raw API format + return transformTranscript(transcript); }, [transcript]); // Simple check for transcript tab visibility diff --git a/src/pages/user/VideoPlayerPage.jsx b/src/pages/user/VideoPlayerPage.jsx index 74f25d9..9869600 100644 --- a/src/pages/user/VideoPlayerPage.jsx +++ b/src/pages/user/VideoPlayerPage.jsx @@ -4,6 +4,7 @@ import apiClient from '../../config/API/axiosConfig.mjs'; import { Container, Text, Loader, Alert, Stack, Button, Group, Box } from '@mantine/core'; import VideoPlayer from '../../components/partials/VideoPlayer'; import { VideoPlayerSidebar } from '../../components/partials/VideoPlayerSidebar'; +import { transformTranscript } from '../../utils/transcriptTransformer'; export const VideoPlayerPage = () => { const { analysisId, entryId } = useParams(); @@ -29,11 +30,12 @@ export const VideoPlayerPage = () => { const videoResponse = await apiClient.get(`/api/v1/analysisEntry/${entryId}`); setVideoUrl(videoResponse.data.analysisEntryGetRecordingPresignedUrl); - // Handle direct transcript data from server response - const transcriptData = videoResponse.data.transcriptionSegments; + // Transform transcript data for consistent format across components + const rawTranscriptData = videoResponse.data.transcriptionSegments; - if (transcriptData) { - setTranscript(transcriptData); + if (rawTranscriptData) { + const transformedData = transformTranscript(rawTranscriptData); + setTranscript(transformedData || null); } else { setTranscript(null); } @@ -73,21 +75,15 @@ export const VideoPlayerPage = () => { const handleTimeUpdate = (time) => { setCurrentTime(time); - // Find active transcript segment - handle both transformed and raw transcript formats + // Find active transcript segment + // Since transcript is always transformed, we can use simplified logic if (transcript && Array.isArray(transcript)) { - const currentSegment = transcript.find((segment, index) => { - // Handle transformed transcript format (from sidebar) - if (segment.id !== undefined && segment.start !== undefined && segment.end_time !== undefined) { - return time >= segment.start && time <= segment.end_time; - } - // Handle raw transcript format (from API) - return time >= segment.start_time && time <= segment.end_time; - }); + const currentSegment = transcript.find(segment => + time >= segment.start && time <= segment.end_time + ); if (currentSegment) { - // Use the index as ID to match the sidebar transformation - const segmentIndex = transcript.indexOf(currentSegment); - setActiveTranscriptId(segmentIndex); + setActiveTranscriptId(currentSegment.id); } } }; diff --git a/src/utils/transcriptTransformer.js b/src/utils/transcriptTransformer.js new file mode 100644 index 0000000..c4edece --- /dev/null +++ b/src/utils/transcriptTransformer.js @@ -0,0 +1,80 @@ +/** + * Utility function to transform transcript data from API response format + * to a standardized format used throughout the application. + * + * API Response Format: + * { + * transcriptionSegments: [ + * { + * start_time: number, + * end_time: number, + * transcript: string + * } + * ] + * } + * + * Transformed Format: + * [ + * { + * id: number, + * start: number, + * end_time: number, + * text: string + * } + * ] + */ + +/** + * Transforms transcript data from API format to application format + * @param {Object|Array} transcriptData - Raw transcript data from API + * @returns {Array|null} - Transformed transcript array or null if invalid + */ +export const transformTranscript = (transcriptData) => { + if (!transcriptData) return null; + + // Handle case where transcript is already the transcription array + if (Array.isArray(transcriptData)) { + return transcriptData.map((segment, index) => ({ + id: index, + start: segment.start_time, + text: segment.transcript, + end_time: segment.end_time + })); + } + + // Handle API response format with transcriptionSegments property + if (transcriptData.transcriptionSegments && Array.isArray(transcriptData.transcriptionSegments)) { + return transcriptData.transcriptionSegments.map((segment, index) => ({ + id: index, + start: segment.start_time, + text: segment.transcript, + end_time: segment.end_time + })); + } + + return null; +}; + +/** + * Finds the active transcript segment for a given time + * @param {Array} transcriptSegments - Array of transcript segments + * @param {number} currentTime - Current time in seconds + * @returns {Object|null} - Active segment or null if not found + */ +export const findActiveSegment = (transcriptSegments, currentTime) => { + if (!transcriptSegments || !Array.isArray(transcriptSegments)) return null; + + return transcriptSegments.find(segment => { + // Handle transformed transcript format + if (segment.id !== undefined && segment.start !== undefined && segment.end_time !== undefined) { + return currentTime >= segment.start && currentTime <= segment.end_time; + } + + // Handle raw transcript format + if (segment.start_time !== undefined && segment.end_time !== undefined) { + return currentTime >= segment.start_time && currentTime <= segment.end_time; + } + + return false; + }); +}; \ No newline at end of file From c560dd10d50966caeadaa841c4ef095bd20a685d Mon Sep 17 00:00:00 2001 From: Sergio N Date: Thu, 11 Dec 2025 23:50:07 +0100 Subject: [PATCH 3/8] Standardize time formatting backup functionality --- src/components/partials/VideoPlayerSidebar.jsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/partials/VideoPlayerSidebar.jsx b/src/components/partials/VideoPlayerSidebar.jsx index 62f665c..d287fd8 100644 --- a/src/components/partials/VideoPlayerSidebar.jsx +++ b/src/components/partials/VideoPlayerSidebar.jsx @@ -22,6 +22,14 @@ export const VideoPlayerSidebar = ({ notes = [], scenario = '', }) => { + // Standardized time formatting fallback function to ensure consistency + const formatTimeFallback = (seconds) => { + if (typeof seconds !== 'number' || isNaN(seconds)) return '0:00'; + const mins = Math.floor(seconds / 60); + const secs = Math.floor(seconds % 60); + return `${mins}:${secs < 10 ? '0' : ''}${secs}`; + }; + // Memoized transcript transformation to avoid expensive recalculations const transformedTranscript = useMemo(() => { // If transcript is already in transformed format (has id, start, text properties), return as-is @@ -114,7 +122,7 @@ export const VideoPlayerSidebar = ({ {note.content || 'Sin contenido'} {note.timestamp && ( - Tiempo: {formatTime ? formatTime(note.timestamp) : note.timestamp} + Tiempo: {formatTime ? formatTime(note.timestamp) : formatTimeFallback(note.timestamp)} )} ))} @@ -149,7 +157,7 @@ export const VideoPlayerSidebar = ({ > - {formatTime && segment.start ? formatTime(segment.start) : segment.start?.toFixed(1) || '0.0'} + {formatTime ? formatTime(segment.start) : formatTimeFallback(segment.start)} From 7b7dc98d3073276db8c3af4f803dfdc051c1880a Mon Sep 17 00:00:00 2001 From: Sergio N Date: Sat, 13 Dec 2025 00:44:37 +0100 Subject: [PATCH 4/8] REMOVE references to analysisId & analysisStatus in /api/v1/analysisEntry These will be handled in the backend --- src/components/partials/AnalysisStepNavigator.jsx | 6 +----- src/contexts/MediaPermissionsContext.jsx | 2 +- src/pages/participate/ParticipateStepRouter.jsx | 2 -- src/pages/participate/ParticipateWrapper.jsx | 1 - src/pages/participate/steps/RecordingStep.jsx | 2 -- 5 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/components/partials/AnalysisStepNavigator.jsx b/src/components/partials/AnalysisStepNavigator.jsx index 8b0baf9..89d211e 100644 --- a/src/components/partials/AnalysisStepNavigator.jsx +++ b/src/components/partials/AnalysisStepNavigator.jsx @@ -5,7 +5,7 @@ import { IconAlertCircle, IconCheck, IconUpload, IconCircleCheck } from '@tabler import { useMediaPermissions } from '../../contexts/MediaPermissionsContext'; import apiClient from '../../config/API/axiosConfig.mjs'; -export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisId, analysisEntryPresignedUploadUrl }) => { +export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisEntryPresignedUploadUrl }) => { const { hasPermissions, permissionStatus, @@ -67,7 +67,6 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys // Step 5: Upload recording using presigned URL const uploadSuccess = await uploadRecording( recordingData.blob, - analysisId, analysisEntryId, analysisEntryPresignedUploadUrl ); @@ -88,8 +87,6 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys try { await apiClient.patch('/api/v1/analysisEntry', { analysisEntryId, - analysisEntryStatus: 'submitted', - analysisId }); } catch (patchErr) { setFinishError('Failed to update analysis entry after upload.'); @@ -239,6 +236,5 @@ AnalysisStepNavigator.propTypes = { onExit: PropTypes.func, analysisData: PropTypes.object, analysisEntryId: PropTypes.string, - analysisId: PropTypes.string, analysisEntryPresignedUploadUrl: PropTypes.string }; \ No newline at end of file diff --git a/src/contexts/MediaPermissionsContext.jsx b/src/contexts/MediaPermissionsContext.jsx index 55d4051..fedadb6 100644 --- a/src/contexts/MediaPermissionsContext.jsx +++ b/src/contexts/MediaPermissionsContext.jsx @@ -198,7 +198,7 @@ export const MediaPermissionsProvider = ({ children }) => { }, []); // Upload recording - const uploadRecording = useCallback(async (blob, analysisId, analysisEntryId, presignedUrl) => { + const uploadRecording = useCallback(async (blob, analysisEntryId, presignedUrl) => { if (!blob) { setUploadError('Missing recording data'); return false; diff --git a/src/pages/participate/ParticipateStepRouter.jsx b/src/pages/participate/ParticipateStepRouter.jsx index 3ca7104..515381c 100644 --- a/src/pages/participate/ParticipateStepRouter.jsx +++ b/src/pages/participate/ParticipateStepRouter.jsx @@ -11,7 +11,6 @@ export const ParticipateStepRouter = ({ currentStep, setCurrentStep, analysisData, - analysisId, analysisEntryId, analysisEntryPresignedUploadUrl, error, @@ -84,7 +83,6 @@ export const ParticipateStepRouter = ({ { currentStep={currentStep} setCurrentStep={setCurrentStep} analysisData={analysisData} - analysisId={analysisId} analysisEntryId={analysisEntryId} analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} error={error} diff --git a/src/pages/participate/steps/RecordingStep.jsx b/src/pages/participate/steps/RecordingStep.jsx index 859fd1f..6123142 100644 --- a/src/pages/participate/steps/RecordingStep.jsx +++ b/src/pages/participate/steps/RecordingStep.jsx @@ -8,7 +8,6 @@ import { useMediaPermissions } from "../../../contexts/MediaPermissionsContext"; export const RecordingStep = ({ analysisData, analysisEntryId, - analysisId, analysisEntryPresignedUploadUrl, onExit, buildAnalysisSteps @@ -42,7 +41,6 @@ export const RecordingStep = ({ onExit={onExit} analysisData={analysisData} analysisEntryId={analysisEntryId} - analysisId={analysisId} analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} /> From 394f3a2c6b17788a513cab887b238a0a5b61e871 Mon Sep 17 00:00:00 2001 From: Sergio N Date: Sat, 13 Dec 2025 00:57:20 +0100 Subject: [PATCH 5/8] Revert "REMOVE references to analysisId & analysisStatus in /api/v1/analysisEntry" This reverts commit 7b7dc98d3073276db8c3af4f803dfdc051c1880a. --- src/components/partials/AnalysisStepNavigator.jsx | 6 +++++- src/contexts/MediaPermissionsContext.jsx | 2 +- src/pages/participate/ParticipateStepRouter.jsx | 2 ++ src/pages/participate/ParticipateWrapper.jsx | 1 + src/pages/participate/steps/RecordingStep.jsx | 2 ++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/partials/AnalysisStepNavigator.jsx b/src/components/partials/AnalysisStepNavigator.jsx index 89d211e..8b0baf9 100644 --- a/src/components/partials/AnalysisStepNavigator.jsx +++ b/src/components/partials/AnalysisStepNavigator.jsx @@ -5,7 +5,7 @@ import { IconAlertCircle, IconCheck, IconUpload, IconCircleCheck } from '@tabler import { useMediaPermissions } from '../../contexts/MediaPermissionsContext'; import apiClient from '../../config/API/axiosConfig.mjs'; -export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisEntryPresignedUploadUrl }) => { +export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisId, analysisEntryPresignedUploadUrl }) => { const { hasPermissions, permissionStatus, @@ -67,6 +67,7 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys // Step 5: Upload recording using presigned URL const uploadSuccess = await uploadRecording( recordingData.blob, + analysisId, analysisEntryId, analysisEntryPresignedUploadUrl ); @@ -87,6 +88,8 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys try { await apiClient.patch('/api/v1/analysisEntry', { analysisEntryId, + analysisEntryStatus: 'submitted', + analysisId }); } catch (patchErr) { setFinishError('Failed to update analysis entry after upload.'); @@ -236,5 +239,6 @@ AnalysisStepNavigator.propTypes = { onExit: PropTypes.func, analysisData: PropTypes.object, analysisEntryId: PropTypes.string, + analysisId: PropTypes.string, analysisEntryPresignedUploadUrl: PropTypes.string }; \ No newline at end of file diff --git a/src/contexts/MediaPermissionsContext.jsx b/src/contexts/MediaPermissionsContext.jsx index fedadb6..55d4051 100644 --- a/src/contexts/MediaPermissionsContext.jsx +++ b/src/contexts/MediaPermissionsContext.jsx @@ -198,7 +198,7 @@ export const MediaPermissionsProvider = ({ children }) => { }, []); // Upload recording - const uploadRecording = useCallback(async (blob, analysisEntryId, presignedUrl) => { + const uploadRecording = useCallback(async (blob, analysisId, analysisEntryId, presignedUrl) => { if (!blob) { setUploadError('Missing recording data'); return false; diff --git a/src/pages/participate/ParticipateStepRouter.jsx b/src/pages/participate/ParticipateStepRouter.jsx index 515381c..3ca7104 100644 --- a/src/pages/participate/ParticipateStepRouter.jsx +++ b/src/pages/participate/ParticipateStepRouter.jsx @@ -11,6 +11,7 @@ export const ParticipateStepRouter = ({ currentStep, setCurrentStep, analysisData, + analysisId, analysisEntryId, analysisEntryPresignedUploadUrl, error, @@ -83,6 +84,7 @@ export const ParticipateStepRouter = ({ { currentStep={currentStep} setCurrentStep={setCurrentStep} analysisData={analysisData} + analysisId={analysisId} analysisEntryId={analysisEntryId} analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} error={error} diff --git a/src/pages/participate/steps/RecordingStep.jsx b/src/pages/participate/steps/RecordingStep.jsx index 6123142..859fd1f 100644 --- a/src/pages/participate/steps/RecordingStep.jsx +++ b/src/pages/participate/steps/RecordingStep.jsx @@ -8,6 +8,7 @@ import { useMediaPermissions } from "../../../contexts/MediaPermissionsContext"; export const RecordingStep = ({ analysisData, analysisEntryId, + analysisId, analysisEntryPresignedUploadUrl, onExit, buildAnalysisSteps @@ -41,6 +42,7 @@ export const RecordingStep = ({ onExit={onExit} analysisData={analysisData} analysisEntryId={analysisEntryId} + analysisId={analysisId} analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} /> From 5be9f73ba6b99833fbed9c0b4e19b91c840ecb27 Mon Sep 17 00:00:00 2001 From: Sergio N Date: Sat, 13 Dec 2025 01:00:24 +0100 Subject: [PATCH 6/8] remove unneeded analysisEntryStatus attribute - will be handled in BE --- src/components/partials/AnalysisStepNavigator.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/partials/AnalysisStepNavigator.jsx b/src/components/partials/AnalysisStepNavigator.jsx index 8b0baf9..b2991c2 100644 --- a/src/components/partials/AnalysisStepNavigator.jsx +++ b/src/components/partials/AnalysisStepNavigator.jsx @@ -88,7 +88,6 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys try { await apiClient.patch('/api/v1/analysisEntry', { analysisEntryId, - analysisEntryStatus: 'submitted', analysisId }); } catch (patchErr) { From 013799c4a9e2afd7c3fbc1977a5340def0d46f77 Mon Sep 17 00:00:00 2001 From: Sergio N Date: Sun, 21 Dec 2025 12:45:26 +0100 Subject: [PATCH 7/8] Reapply "REMOVE references to analysisId & analysisStatus in /api/v1/analysisEntry" This reverts commit 394f3a2c6b17788a513cab887b238a0a5b61e871. --- src/components/partials/AnalysisStepNavigator.jsx | 5 +---- src/contexts/MediaPermissionsContext.jsx | 2 +- src/pages/participate/ParticipateStepRouter.jsx | 2 -- src/pages/participate/ParticipateWrapper.jsx | 1 - src/pages/participate/steps/RecordingStep.jsx | 2 -- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/partials/AnalysisStepNavigator.jsx b/src/components/partials/AnalysisStepNavigator.jsx index b2991c2..89d211e 100644 --- a/src/components/partials/AnalysisStepNavigator.jsx +++ b/src/components/partials/AnalysisStepNavigator.jsx @@ -5,7 +5,7 @@ import { IconAlertCircle, IconCheck, IconUpload, IconCircleCheck } from '@tabler import { useMediaPermissions } from '../../contexts/MediaPermissionsContext'; import apiClient from '../../config/API/axiosConfig.mjs'; -export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisId, analysisEntryPresignedUploadUrl }) => { +export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analysisEntryId, analysisEntryPresignedUploadUrl }) => { const { hasPermissions, permissionStatus, @@ -67,7 +67,6 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys // Step 5: Upload recording using presigned URL const uploadSuccess = await uploadRecording( recordingData.blob, - analysisId, analysisEntryId, analysisEntryPresignedUploadUrl ); @@ -88,7 +87,6 @@ export const AnalysisStepNavigator = ({ steps = [], onExit, analysisData, analys try { await apiClient.patch('/api/v1/analysisEntry', { analysisEntryId, - analysisId }); } catch (patchErr) { setFinishError('Failed to update analysis entry after upload.'); @@ -238,6 +236,5 @@ AnalysisStepNavigator.propTypes = { onExit: PropTypes.func, analysisData: PropTypes.object, analysisEntryId: PropTypes.string, - analysisId: PropTypes.string, analysisEntryPresignedUploadUrl: PropTypes.string }; \ No newline at end of file diff --git a/src/contexts/MediaPermissionsContext.jsx b/src/contexts/MediaPermissionsContext.jsx index 55d4051..fedadb6 100644 --- a/src/contexts/MediaPermissionsContext.jsx +++ b/src/contexts/MediaPermissionsContext.jsx @@ -198,7 +198,7 @@ export const MediaPermissionsProvider = ({ children }) => { }, []); // Upload recording - const uploadRecording = useCallback(async (blob, analysisId, analysisEntryId, presignedUrl) => { + const uploadRecording = useCallback(async (blob, analysisEntryId, presignedUrl) => { if (!blob) { setUploadError('Missing recording data'); return false; diff --git a/src/pages/participate/ParticipateStepRouter.jsx b/src/pages/participate/ParticipateStepRouter.jsx index 3ca7104..515381c 100644 --- a/src/pages/participate/ParticipateStepRouter.jsx +++ b/src/pages/participate/ParticipateStepRouter.jsx @@ -11,7 +11,6 @@ export const ParticipateStepRouter = ({ currentStep, setCurrentStep, analysisData, - analysisId, analysisEntryId, analysisEntryPresignedUploadUrl, error, @@ -84,7 +83,6 @@ export const ParticipateStepRouter = ({ { currentStep={currentStep} setCurrentStep={setCurrentStep} analysisData={analysisData} - analysisId={analysisId} analysisEntryId={analysisEntryId} analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} error={error} diff --git a/src/pages/participate/steps/RecordingStep.jsx b/src/pages/participate/steps/RecordingStep.jsx index 859fd1f..6123142 100644 --- a/src/pages/participate/steps/RecordingStep.jsx +++ b/src/pages/participate/steps/RecordingStep.jsx @@ -8,7 +8,6 @@ import { useMediaPermissions } from "../../../contexts/MediaPermissionsContext"; export const RecordingStep = ({ analysisData, analysisEntryId, - analysisId, analysisEntryPresignedUploadUrl, onExit, buildAnalysisSteps @@ -42,7 +41,6 @@ export const RecordingStep = ({ onExit={onExit} analysisData={analysisData} analysisEntryId={analysisEntryId} - analysisId={analysisId} analysisEntryPresignedUploadUrl={analysisEntryPresignedUploadUrl} /> From ae4ead322748cc49efdec69413136b07374b2044 Mon Sep 17 00:00:00 2001 From: Sergio N Date: Fri, 26 Dec 2025 13:27:14 +0100 Subject: [PATCH 8/8] UPDATE github actions to create dated image to be able to rollback --- .github/workflows/docker:build&push.yaml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker:build&push.yaml b/.github/workflows/docker:build&push.yaml index b80d3c9..f0d24bd 100644 --- a/.github/workflows/docker:build&push.yaml +++ b/.github/workflows/docker:build&push.yaml @@ -24,6 +24,19 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - + name: Set date + id: date + run: echo "date=$(date +'%Y-%m-%d')" >> "$GITHUB_OUTPUT" + - + name: Generate Docker metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: sergion14/uxcaptain-webapp + tags: | + type=raw,value=${{ github.ref_name }} + type=raw,value=${{ github.ref_name }}-${{ steps.date.outputs.date }} - name: Build and push uses: docker/build-push-action@v6 @@ -31,7 +44,7 @@ jobs: context: . platforms: linux/amd64 #,linux/arm64 - Not building for ARM, since ubuntu server is just amd64 push: true - tags: sergion14/uxcaptain:webapp-${{ github.ref_name }} + tags: ${{ steps.meta.outputs.tags }} build-args: | VITE_API_BASE_URL=${{ vars.VITE_API_BASE_URL }} VITE_PUBLIC_POSTHOG_KEY=${{ secrets.VITE_PUBLIC_POSTHOG_KEY }}