fix(web): connect project context in media flow
CI/CD Pipeline / Validate Code Quality And Tests (push) Has been cancelled
Deploy / Deploy Staging (push) Has been cancelled
Deploy / Deploy Production (push) Has been cancelled

This commit is contained in:
Xiaoxia AI
2026-06-21 21:48:21 +08:00
parent 1a9d862584
commit 59291b0e8f
7 changed files with 238 additions and 43 deletions
+7 -1
View File
@@ -12,6 +12,10 @@ export interface AssetItem {
storage_key: string;
mime_type: string;
metadata: Record<string, unknown>;
file_size?: number;
status?: string;
classification_status?: string | null;
quality_score?: number | null;
}
export interface AssetLibraryItem {
@@ -20,6 +24,8 @@ export interface AssetLibraryItem {
project_id: string;
name: string;
kind: 'video' | 'voice' | 'image';
asset_count?: number;
total_size?: number;
}
export interface IngestJob {
@@ -55,7 +61,7 @@ export const createAssetLibrary = async (data: {
workspace_id: string;
project_id: string;
name: string;
kind: 'video' | 'voice';
kind: 'video' | 'voice' | 'image';
}): Promise<AssetLibraryItem> => {
const response = await apiClient.post('/asset-libraries', data);
return response.data;
+3 -3
View File
@@ -5,12 +5,12 @@ export interface GenerationTaskItem {
workspace_id: string;
project_id: string;
asset_library_id: string;
strategy_id: string;
voice_library_id: string;
strategy_id?: string | null;
voice_library_id?: string | null;
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
progress: number;
result_count: number;
error_message: string;
error_message?: string | null;
}
export interface GeneratedVideoItem {
+24
View File
@@ -0,0 +1,24 @@
import apiClient from './client';
export interface ProjectItem {
id: string;
workspace_id: string;
name: string;
description: string;
}
export interface CreateProjectRequest {
workspace_id: string;
name: string;
description?: string;
}
export const getProjects = async (workspaceId: string): Promise<ProjectItem[]> => {
const response = await apiClient.get('/projects', { params: { workspace_id: workspaceId } });
return response.data.items;
};
export const createProject = async (data: CreateProjectRequest): Promise<ProjectItem> => {
const response = await apiClient.post('/projects', data);
return response.data;
};
+16 -11
View File
@@ -39,6 +39,13 @@ export interface InviteMemberRequest {
role: 'admin' | 'member' | 'viewer';
}
export interface InviteMemberResponse {
invitation_id: string;
invitee_email: string;
role: 'admin' | 'member' | 'viewer';
expires_at: string;
}
type WorkspaceApiResponse = Omit<Workspace, 'id' | 'workspace_id'> & {
id?: string;
workspace_id?: string;
@@ -60,10 +67,10 @@ const normalizeWorkspace = (workspace: WorkspaceApiResponse): Workspace => {
};
const normalizeMember = (member: WorkspaceMemberApiResponse): WorkspaceMember => {
const memberId = member.id || member.member_id || member.user_id || '';
const memberId = member.member_id || member.id || '';
return {
...member,
id: memberId,
id: member.user_id || memberId,
member_id: memberId,
};
};
@@ -97,7 +104,7 @@ export const getMembers = async (workspaceId: string): Promise<WorkspaceMember[]
export const inviteMember = async (
workspaceId: string,
data: InviteMemberRequest
): Promise<{ message: string }> => {
): Promise<InviteMemberResponse> => {
const response = await apiClient.post(`/workspaces/${workspaceId}/members/invite`, data);
return response.data;
};
@@ -105,23 +112,21 @@ export const inviteMember = async (
export const removeMember = async (
workspaceId: string,
memberId: string
): Promise<{ message: string }> => {
const response = await apiClient.delete(`/workspaces/${workspaceId}/members/${memberId}`);
return response.data;
): Promise<void> => {
await apiClient.delete(`/workspaces/${workspaceId}/members/${memberId}`);
};
export const updateMemberRole = async (
workspaceId: string,
memberId: string,
role: 'admin' | 'member' | 'viewer'
): Promise<{ message: string }> => {
const response = await apiClient.patch(`/workspaces/${workspaceId}/members/${memberId}`, {
): Promise<{ user_id: string; old_role: string; new_role: string }> => {
const response = await apiClient.patch(`/workspaces/${workspaceId}/members/${memberId}/role`, {
role,
});
return response.data;
};
export const leaveWorkspace = async (workspaceId: string): Promise<{ message: string }> => {
const response = await apiClient.post(`/workspaces/${workspaceId}/leave`);
return response.data;
export const leaveWorkspace = async (_workspaceId: string): Promise<{ message: string }> => {
throw new Error('主动退出工作空间暂未开放');
};