feat: 完善中文心理测评平台
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
const RESULT_STORAGE_KEY = 'questionnaire_result';
|
||||
|
||||
interface StoredResult {
|
||||
answers: string[];
|
||||
savedAt: string;
|
||||
}
|
||||
|
||||
function resultKey(questionnaireId: string) {
|
||||
return `${RESULT_STORAGE_KEY}_${questionnaireId}`;
|
||||
}
|
||||
|
||||
export function saveResult(questionnaireId: string, answers: string[]) {
|
||||
try {
|
||||
const result: StoredResult = {
|
||||
answers,
|
||||
savedAt: new Date().toISOString(),
|
||||
};
|
||||
sessionStorage.setItem(resultKey(questionnaireId), JSON.stringify(result));
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Failed to save result:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function loadResult(questionnaireId: string): string[] | null {
|
||||
try {
|
||||
const raw = sessionStorage.getItem(resultKey(questionnaireId));
|
||||
if (!raw) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const parsed = JSON.parse(raw) as Partial<StoredResult>;
|
||||
return Array.isArray(parsed.answers) ? parsed.answers : null;
|
||||
} catch (error) {
|
||||
console.error('Failed to load result:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
const STORAGE_KEY = 'questionnaire';
|
||||
|
||||
function save(
|
||||
usage: string,
|
||||
questionnaireType: string,
|
||||
answers: { [key: number]: string },
|
||||
) {
|
||||
try {
|
||||
const drafts = JSON.parse(
|
||||
localStorage.getItem(`${STORAGE_KEY}_${usage}`) || '{}',
|
||||
);
|
||||
drafts[questionnaireType] = {
|
||||
answers,
|
||||
savedAt: new Date().toISOString(),
|
||||
};
|
||||
localStorage.setItem(`${STORAGE_KEY}_${usage}`, JSON.stringify(drafts));
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Failed to save draft:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function load(
|
||||
usage: string,
|
||||
questionnaireType: string,
|
||||
): { [key: number]: string } | null {
|
||||
try {
|
||||
const drafts = JSON.parse(
|
||||
localStorage.getItem(`${STORAGE_KEY}_${usage}`) || '{}',
|
||||
);
|
||||
return drafts[questionnaireType]?.answers || null;
|
||||
} catch (error) {
|
||||
console.error('Failed to load draft:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function clear(usage: string, questionnaireType: string) {
|
||||
try {
|
||||
const key = `${STORAGE_KEY}_${usage}`;
|
||||
const drafts = JSON.parse(localStorage.getItem(key) || '{}');
|
||||
|
||||
if (!(questionnaireType in drafts)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
delete drafts[questionnaireType];
|
||||
|
||||
if (Object.keys(drafts).length === 0) {
|
||||
localStorage.removeItem(key);
|
||||
} else {
|
||||
localStorage.setItem(key, JSON.stringify(drafts));
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('Failed to clear draft:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function saveDraft(
|
||||
questionnaireType: string,
|
||||
answers: { [key: number]: string },
|
||||
) {
|
||||
return save('draft', questionnaireType, answers);
|
||||
}
|
||||
|
||||
export function loadDraft(
|
||||
questionnaireType: string,
|
||||
): { [key: number]: string } | null {
|
||||
return load('draft', questionnaireType);
|
||||
}
|
||||
|
||||
export function clearDraft(questionnaireType: string) {
|
||||
return clear('draft', questionnaireType);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import { clsx, type ClassValue } from "clsx"
|
||||
import { twMerge } from "tailwind-merge"
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs))
|
||||
}
|
||||
Reference in New Issue
Block a user