fix: Resolve merge conflicts in workflowStore.ts by combining normalization and fallback logic (PR #387)

This commit is contained in:
ajaysi
2026-03-07 12:08:29 +05:30
3 changed files with 171 additions and 157 deletions

View File

@@ -10,7 +10,7 @@ import {
WorkflowError
} from '../types/workflow';
import { taskWorkflowOrchestrator } from '../services/TaskWorkflowOrchestrator';
import { apiClient } from '../api/client';
import { apiClient, ConnectionError, NetworkError } from '../api/client';
const isServerWorkflowId = (workflowId: string) => workflowId.startsWith('daily-');
@@ -47,6 +47,21 @@ const normalizeServerWorkflow = (workflow: DailyWorkflow): DailyWorkflow => ({
: [],
});
const isServerUnavailableError = (error: unknown): boolean =>
error instanceof ConnectionError || error instanceof NetworkError;
const toWorkflowError = (error: unknown, fallbackMessage: string): WorkflowError => {
if (error instanceof WorkflowError) return error;
const message = error instanceof Error ? error.message : fallbackMessage;
return {
code: 'WORKFLOW_ERROR',
message,
timestamp: new Date(),
recoverable: false,
};
};
const computeProgressAndNavigation = (workflow: DailyWorkflow): { progress: WorkflowProgress; navigation: NavigationState } => {
const tasks = Array.isArray(workflow.tasks) ? workflow.tasks : [];
const totalTasks = tasks.length;
@@ -102,6 +117,8 @@ interface WorkflowState {
isWorkflowModalOpen: boolean;
isLoading: boolean;
error: WorkflowError | null;
isDegradedMode: boolean;
degradedModeReason: string | null;
// Actions
generateDailyWorkflow: (userId: string, date?: string) => Promise<void>;
@@ -141,37 +158,67 @@ export const useWorkflowStore = create<WorkflowState>()(
isWorkflowModalOpen: false,
isLoading: false,
error: null,
isDegradedMode: false,
degradedModeReason: null,
// Generate daily workflow
generateDailyWorkflow: async (userId: string, date?: string) => {
set({ isLoading: true, error: null });
try {
try {
const resp = await apiClient.get('/api/today-workflow', { params: date ? { date } : {} });
const serverWorkflow = resp?.data?.data?.workflow as DailyWorkflow | undefined;
if (serverWorkflow && Array.isArray(serverWorkflow.tasks)) {
const normalizedWorkflow = normalizeServerWorkflow(serverWorkflow);
const derived = computeProgressAndNavigation(normalizedWorkflow);
set({
currentWorkflow: normalizedWorkflow,
workflowProgress: derived.progress,
navigationState: derived.navigation,
isLoading: false
});
return;
}
} catch {}
try {
const resp = await apiClient.get('/api/today-workflow', { params: date ? { date } : {} });
const serverWorkflow = resp?.data?.data?.workflow as DailyWorkflow | undefined;
if (!serverWorkflow || !Array.isArray(serverWorkflow.tasks)) {
throw new WorkflowError({
code: 'WORKFLOW_SCHEMA_INVALID',
message: 'Server workflow response is missing a valid tasks array.',
timestamp: new Date(),
recoverable: false,
suggestedAction: 'Refresh and try again. If this persists, contact support.'
});
}
const normalizedWorkflow = normalizeServerWorkflow(serverWorkflow);
const derived = computeProgressAndNavigation(normalizedWorkflow);
set({
currentWorkflow: normalizedWorkflow,
workflowProgress: derived.progress,
navigationState: derived.navigation,
isLoading: false,
isDegradedMode: false,
degradedModeReason: null,
});
return;
} catch (error) {
if (!isServerUnavailableError(error)) {
set({
error: toWorkflowError(error, 'Failed to load workflow from server.'),
isLoading: false,
isDegradedMode: false,
degradedModeReason: null,
});
return;
}
}
try {
const workflow = await taskWorkflowOrchestrator.generateDailyWorkflow(userId, date);
const progress = taskWorkflowOrchestrator.getWorkflowProgress(workflow.id);
const navigation = taskWorkflowOrchestrator.getNavigationState(workflow.id);
set({ currentWorkflow: workflow, workflowProgress: progress, navigationState: navigation, isLoading: false });
set({
currentWorkflow: workflow,
workflowProgress: progress,
navigationState: navigation,
isLoading: false,
isDegradedMode: true,
degradedModeReason: 'Server workflow unavailable. Using local fallback workflow.',
error: null,
});
} catch (error) {
const workflowError = error as WorkflowError;
set({
error: workflowError,
isLoading: false
set({
error: toWorkflowError(error, 'Failed to generate local fallback workflow.'),
isLoading: false,
});
}
},