From ffb23070662c27162f8874465c10e9f1f963b187 Mon Sep 17 00:00:00 2001 From: Satyam Rastogi Date: Fri, 29 May 2026 17:26:40 +0530 Subject: [PATCH] feat(store): add lifecycle/inspection/estimate-version mutators --- src/data/mockStore.jsx | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/data/mockStore.jsx b/src/data/mockStore.jsx index c6b4929..bdb7366 100644 --- a/src/data/mockStore.jsx +++ b/src/data/mockStore.jsx @@ -1,6 +1,7 @@ import React, { createContext, useContext, useState, useEffect, useMemo } from 'react'; import { toast } from 'sonner'; import { logger } from '../utils/logger'; +import { STAGE_PROGRESS } from './lifecycle'; // Fixed "today" for the demo so seeded dates never go stale or land in the future. export const DEMO_TODAY = new Date('2026-05-29T12:00:00'); @@ -8485,6 +8486,43 @@ export const MockStoreProvider = ({ children }) => { updateProject: (projectId, data) => { setProjects(prev => prev.map(p => p.id === projectId ? { ...p, ...data } : p)); }, + // Lifecycle: set stage, log the transition, sync completionPercentage from the stage map. + advanceLifecycleStage: (projectId, stage, note, by) => { + setProjects(prev => prev.map(p => p.id === projectId ? { + ...p, + lifecycleStage: stage, + completionPercentage: stage === 'Work In Progress' + ? Math.max(p.completionPercentage || 0, 55) // WIP is milestone-driven; never regress within it + : (STAGE_PROGRESS[stage] ?? p.completionPercentage), + stageHistory: [...(p.stageHistory || []), { stage, date: new Date().toISOString().slice(0, 10), by: by || 'Owner', note: note || '' }], + } : p)); + }, + addInspection: (projectId, inspection) => { + setProjects(prev => prev.map(p => p.id === projectId + ? { ...p, inspections: [...(p.inspections || []), { ...inspection, id: inspection.id || `insp_${Date.now()}` }] } + : p)); + }, + addInspectionIssue: (projectId, inspectionId, issue) => { + setProjects(prev => prev.map(p => p.id === projectId ? { + ...p, + inspections: (p.inspections || []).map(ins => ins.id === inspectionId + ? { ...ins, issues: [...(ins.issues || []), { ...issue, id: issue.id || `iss_${Date.now()}`, status: 'open' }] } + : ins), + } : p)); + }, + resolveInspectionIssue: (projectId, inspectionId, issueId) => { + setProjects(prev => prev.map(p => p.id === projectId ? { + ...p, + inspections: (p.inspections || []).map(ins => ins.id === inspectionId + ? { ...ins, issues: (ins.issues || []).map(iss => iss.id === issueId ? { ...iss, status: 'fixed' } : iss) } + : ins), + } : p)); + }, + addEstimateVersion: (projectId, version) => { + setProjects(prev => prev.map(p => p.id === projectId + ? { ...p, estimateVersions: [...(p.estimateVersions || []), version] } + : p)); + }, addJobTeamMember: (projectId, member) => { setProjects(prev => prev.map(p => p.id === projectId ? { ...p, teamMembers: [...(p.teamMembers || []), { ...member, id: `jtm_${Date.now()}` }] }