Skip to content

Commit 1e10e2f

Browse files
committed
Update index.js
1 parent 4b973ca commit 1e10e2f

File tree

1 file changed

+23
-17
lines changed
  • src/components/ConcurrencySimulator

1 file changed

+23
-17
lines changed

src/components/ConcurrencySimulator/index.js

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ export default function WorkflowSimulator({
153153
let currentGroupIndex = 0;
154154
let groupStartTime = performance.now();
155155

156-
// Track progress for activities with subgroups (series within parallel)
157-
const subgroupProgress = {};
156+
// Track cumulative time spent on completed activities in each subgroup
157+
const subgroupCompletedTime = {};
158158

159159
const animate = (timestamp) => {
160160
if (currentGroupIndex >= groupKeys.length) {
@@ -207,34 +207,40 @@ export default function WorkflowSimulator({
207207
const subgroupActivities = withSubgroups[subgroupKey];
208208
const trackKey = `${currentGroupIndex}-${subgroupKey}`;
209209

210-
if (!subgroupProgress[trackKey]) {
211-
subgroupProgress[trackKey] = { currentIndex: 0, startTime: groupStartTime };
210+
// Initialize cumulative completed time for this subgroup
211+
if (subgroupCompletedTime[trackKey] === undefined) {
212+
subgroupCompletedTime[trackKey] = 0;
212213
}
213214

214-
const track = subgroupProgress[trackKey];
215-
let subgroupElapsed = timestamp - track.startTime;
215+
// Calculate which activity is currently running based on elapsed time
216+
let remainingTime = elapsed;
217+
let currentActivityIndex = 0;
216218

217-
// Process activities in this subgroup sequentially
219+
// Find which activity should be running
220+
for (let i = 0; i < subgroupActivities.length; i++) {
221+
if (remainingTime >= subgroupActivities[i].duration) {
222+
remainingTime -= subgroupActivities[i].duration;
223+
currentActivityIndex = i + 1;
224+
} else {
225+
break;
226+
}
227+
}
228+
229+
// Update states for all activities in this subgroup
218230
for (let i = 0; i < subgroupActivities.length; i++) {
219231
const activity = subgroupActivities[i];
220232

221-
if (i < track.currentIndex) {
233+
if (i < currentActivityIndex) {
222234
// Already completed
223235
newStates[activity.originalIndex] = { status: ActivityStatus.COMPLETED, progress: 100 };
224-
} else if (i === track.currentIndex) {
236+
} else if (i === currentActivityIndex) {
225237
// Currently running
226-
const progress = Math.min((subgroupElapsed / activity.duration) * 100, 100);
238+
const progress = Math.min((remainingTime / activity.duration) * 100, 100);
227239
newStates[activity.originalIndex] = {
228240
status: progress >= 100 ? ActivityStatus.COMPLETED : ActivityStatus.RUNNING,
229241
progress: progress,
230242
};
231-
232-
if (progress >= 100) {
233-
track.currentIndex++;
234-
track.startTime = timestamp;
235-
} else {
236-
groupComplete = false;
237-
}
243+
if (progress < 100) groupComplete = false;
238244
} else {
239245
// Not started yet
240246
newStates[activity.originalIndex] = { status: ActivityStatus.PENDING, progress: 0 };

0 commit comments

Comments
 (0)