Files
erika/lib/form/form-answer-values.ts
T

58 lines
1.4 KiB
TypeScript

import type { QuestionType } from "@/db/schema/form";
export type FormAnswerValue = string | string[];
export type FormAnswerPayload = {
questionId: string;
value: FormAnswerValue;
imageCdnId?: string | null;
};
export function decodeCheckboxAnswer(value: FormAnswerValue | undefined): string[] {
if (Array.isArray(value)) {
return value.filter((item): item is string => typeof item === "string");
}
if (!value) {
return [];
}
try {
const parsed: unknown = JSON.parse(value);
if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
return parsed;
}
} catch {
// Older checkbox answers were stored as comma-separated text.
}
return value.split(", ").filter(Boolean);
}
export function encodeAnswerValue(value: FormAnswerValue): string {
return Array.isArray(value) ? JSON.stringify(value) : value;
}
export function formatStoredAnswer(
value: string | undefined,
questionType: QuestionType | string
): string {
if (!value) {
return "";
}
return questionType === "checkbox"
? decodeCheckboxAnswer(value).join(", ")
: value;
}
export function answerCellValue(
value: string | undefined,
questionType: QuestionType | string,
imageCdnId?: string | null,
) {
const text = formatStoredAnswer(value, questionType);
const imageUrl = imageCdnId ? `/cdn/${imageCdnId}` : "";
if (text && imageUrl) return `${text}\n${imageUrl}`;
return text || imageUrl;
}