| |
| |
| |
| |
|
|
| import * as d3 from 'd3'; |
| import type { TextAnalysisAPI, AnalysisData } from '../../shared/api/GLTR_API'; |
| import { createRawSnapshot } from '../cross/tokenUtils'; |
| import { extractErrorMessage } from '../core/errorUtils'; |
| import { DEMO_FILE_ENDPOINT } from '../api/apiConfig'; |
|
|
| |
|
|
| export interface SaveOptions { |
| name: string; |
| path?: string; |
| overwrite?: boolean; |
| } |
|
|
| export interface SaveResult { |
| success: boolean; |
| message?: string; |
| exists?: boolean; |
| file?: string; |
| hash?: string; |
| } |
|
|
| export interface LoadResult { |
| success: boolean; |
| data?: AnalysisData; |
| message?: string; |
| } |
|
|
| |
| |
| |
| export interface IDemoStorage { |
| save(data: AnalysisData, options: SaveOptions): Promise<SaveResult>; |
| load(path?: string): Promise<LoadResult>; |
| readonly type: 'local' | 'server'; |
| } |
|
|
| |
| |
|
|
| |
|
|
| |
| |
| |
| export class ServerStorage implements IDemoStorage { |
| readonly type = 'server' as const; |
| |
| constructor(private api: TextAnalysisAPI) {} |
| |
| async save(data: AnalysisData, options: SaveOptions): Promise<SaveResult> { |
| try { |
| const payload = createRawSnapshot(data); |
| const result = await this.api.save_demo( |
| options.name.trim(), |
| payload, |
| options.path || '/', |
| options.overwrite || false |
| ); |
| |
| return { |
| success: result.success, |
| message: result.message, |
| exists: result.exists, |
| file: result.file |
| }; |
| } catch (error) { |
| return { |
| success: false, |
| message: extractErrorMessage(error, '保存失败') |
| }; |
| } |
| } |
| |
| async load(path: string): Promise<LoadResult> { |
| if (!path) { |
| return { success: false, message: 'Demo path is missing' }; |
| } |
| |
| try { |
| |
| const data = await d3.json(`${DEMO_FILE_ENDPOINT}${path}`); |
| |
| |
| return { success: true, data: data as AnalysisData }; |
| } catch (error) { |
| return { |
| success: false, |
| message: extractErrorMessage(error, '加载失败') |
| }; |
| } |
| } |
| } |
|
|
|
|