File size: 2,682 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | /**
* Stage API - Default Content & Utility Functions
*
* Shared utility functions for ID generation, scene validation,
* and default content creation.
*/
import { nanoid } from 'nanoid';
import type {
Scene,
SceneType,
SceneContent,
SlideContent,
QuizContent,
InteractiveContent,
PBLContent,
} from '@/lib/types/stage';
// ==================== Utility Functions ====================
/**
* Generate a unique ID
*/
export function generateId(prefix?: string): string {
return prefix ? `${prefix}_${nanoid(10)}` : nanoid(10);
}
/**
* Validate whether a Scene ID exists
*/
export function validateSceneId(scenes: Scene[], sceneId: string): boolean {
return scenes.some((s) => s.id === sceneId);
}
/**
* Get a Scene
*/
export function getScene(scenes: Scene[], sceneId: string): Scene | null {
return scenes.find((s) => s.id === sceneId) || null;
}
/**
* Create default SlideContent
*/
export function createDefaultSlideContent(): SlideContent {
return {
type: 'slide',
canvas: {
id: generateId('slide'),
viewportSize: 1000,
viewportRatio: 0.5625, // 16:9
theme: {
backgroundColor: '#ffffff',
themeColors: ['#5b9bd5', '#ed7d31', '#a5a5a5', '#ffc000', '#4472c4'],
fontColor: '#333333',
fontName: 'Microsoft YaHei',
outline: {
color: '#d14424',
width: 2,
style: 'solid',
},
shadow: {
h: 0,
v: 0,
blur: 10,
color: '#000000',
},
},
elements: [],
},
};
}
/**
* Create default QuizContent
*/
export function createDefaultQuizContent(): QuizContent {
return {
type: 'quiz',
questions: [],
};
}
/**
* Create default InteractiveContent
*/
export function createDefaultInteractiveContent(): InteractiveContent {
return {
type: 'interactive',
url: '',
};
}
/**
* Create default PBLContent
*/
export function createDefaultPBLContent(): PBLContent {
return {
type: 'pbl',
projectConfig: {
projectInfo: { title: '', description: '' },
agents: [],
issueboard: { agent_ids: [], issues: [], current_issue_id: null },
chat: { messages: [] },
},
};
}
/**
* Create default Content based on type
*/
export function createDefaultContent(type: SceneType): SceneContent {
switch (type) {
case 'slide':
return createDefaultSlideContent();
case 'quiz':
return createDefaultQuizContent();
case 'interactive':
return createDefaultInteractiveContent();
case 'pbl':
return createDefaultPBLContent();
default:
throw new Error(`Unknown scene type: ${type}`);
}
}
|