Implement ST-401 activity status flows

This commit is contained in:
Janpeter Visser 2026-04-19 09:35:05 +02:00
parent 4966d493cc
commit d0739736aa
7 changed files with 228 additions and 5 deletions

View file

@ -5,9 +5,16 @@ import { buildPathWithQuery } from "@/lib/auth/navigation";
import {
ACTIVITY_IMPACT_LEVEL_VALUES,
ACTIVITY_PRIORITY_LEVEL_VALUES,
ACTIVITY_STATUS_VALUES,
} from "@/lib/planning/options";
import { createActivityForTodayForCurrentUser } from "@/lib/planning/service";
import type { CreateActivitySubmission } from "@/lib/planning/types";
import {
createActivityForTodayForCurrentUser,
updateActivityStatusForTodayForCurrentUser,
} from "@/lib/planning/service";
import type {
CreateActivitySubmission,
UpdateActivityStatusSubmission,
} from "@/lib/planning/types";
import {
assertMaxLength,
FormDataValidationError,
@ -48,6 +55,20 @@ function buildCreateActivitySubmission(formData: FormData): CreateActivitySubmis
};
}
function buildUpdateActivityStatusSubmission(
formData: FormData,
): UpdateActivityStatusSubmission {
return {
activityId: getUuidValue(formData, "activityId", "invalid-activity-status"),
status: getEnumValue(
formData,
"status",
ACTIVITY_STATUS_VALUES,
"invalid-activity-status",
),
};
}
export async function createActivityAction(
_previousState: null,
formData: FormData,
@ -69,3 +90,27 @@ export async function createActivityAction(
redirect(buildPathWithQuery("/planning", { status: "activity-saved" }));
return null;
}
export async function updateActivityStatusAction(
_previousState: null,
formData: FormData,
): Promise<null> {
try {
await updateActivityStatusForTodayForCurrentUser(
buildUpdateActivityStatusSubmission(formData),
);
} catch (error) {
if (error instanceof FormDataValidationError) {
redirect(buildPathWithQuery("/planning", { error: error.code }));
}
if (error instanceof Error && error.message === "Ongeldige of niet-beschikbare activiteit.") {
redirect(buildPathWithQuery("/planning", { error: "invalid-activity-status" }));
}
redirect(buildPathWithQuery("/planning", { error: "activity-status-failed" }));
}
redirect(buildPathWithQuery("/planning", { status: "activity-status-saved" }));
return null;
}