refactor: Update API response handling to access nested data structure

This commit is contained in:
Yusuf İpek
2026-02-07 17:59:37 +03:00
parent 49c3ac61ea
commit f6044f3c24
14 changed files with 45 additions and 37 deletions
@@ -68,8 +68,8 @@ export default function ProjectMembersPage() {
return; return;
} }
const data = await res.json(); const data = await res.json();
setMembers(data.members); setMembers(data.data.members);
setOwner(data.owner); setOwner(data.data.owner);
} catch { } catch {
setError('Failed to load members'); setError('Failed to load members');
} finally { } finally {
@@ -89,10 +89,11 @@ export default function ProjectSettingsPage({ params }: ProjectSettingsPageProps
if (data.error) { if (data.error) {
setError(data.error); setError(data.error);
} else { } else {
const project = data.data;
setFormData({ setFormData({
name: data.name || '', name: project.name || '',
description: data.description || '', description: project.description || '',
visibility: data.visibility || 'PRIVATE', visibility: project.visibility || 'PRIVATE',
}); });
} }
}) })
@@ -103,8 +104,8 @@ export default function ProjectSettingsPage({ params }: ProjectSettingsPageProps
fetch(`/api/projects/${id}/tags`) fetch(`/api/projects/${id}/tags`)
.then((res) => res.json()) .then((res) => res.json())
.then((data) => { .then((data) => {
if (Array.isArray(data)) { if (Array.isArray(data.data)) {
setTags(data); setTags(data.data);
} }
}) })
.catch(() => { /* Silent fail - tags are optional */ }); .catch(() => { /* Silent fail - tags are optional */ });
@@ -150,7 +151,8 @@ export default function ProjectSettingsPage({ params }: ProjectSettingsPageProps
body: JSON.stringify({ name: newTagName.trim(), color: newTagColor }), body: JSON.stringify({ name: newTagName.trim(), color: newTagColor }),
}); });
if (res.ok) { if (res.ok) {
const newTag = await res.json(); const data = await res.json();
const newTag = data.data;
setTags([...tags, newTag]); setTags([...tags, newTag]);
setNewTagName(''); setNewTagName('');
setNewTagColor('#3B82F6'); setNewTagColor('#3B82F6');
@@ -171,7 +173,8 @@ export default function ProjectSettingsPage({ params }: ProjectSettingsPageProps
body: JSON.stringify({ name: editTagName.trim(), color: editTagColor }), body: JSON.stringify({ name: editTagName.trim(), color: editTagColor }),
}); });
if (res.ok) { if (res.ok) {
const updated = await res.json(); const data = await res.json();
const updated = data.data;
setTags(tags.map((t) => (t.id === tagId ? updated : t))); setTags(tags.map((t) => (t.id === tagId ? updated : t)));
setEditingTagId(null); setEditingTagId(null);
} }
@@ -45,9 +45,10 @@ export default function ProjectSharePage({ params }: ProjectSharePageProps) {
if (data.error) { if (data.error) {
setError(data.error); setError(data.error);
} else { } else {
setProjectName(data.name || ''); const project = data.data;
setProjectVisibility(data.visibility || 'PRIVATE'); setProjectName(project.name || '');
setMembers(data.members || []); setProjectVisibility(project.visibility || 'PRIVATE');
setMembers(project.members || []);
} }
}) })
.catch(() => setError('Failed to load project')) .catch(() => setError('Failed to load project'))
@@ -79,7 +79,8 @@ export default function CompareVersionsPage() {
setLoading(false); setLoading(false);
return; return;
} }
const data = await res.json(); const response = await res.json();
const data = response.data;
setVideo(data); setVideo(data);
// Set initial versions from query params or defaults // Set initial versions from query params or defaults
@@ -240,7 +240,8 @@ export default function VideoPage() {
try { try {
const res = await fetch(`/api/projects/${projectId}/tags`); const res = await fetch(`/api/projects/${projectId}/tags`);
if (res.ok) { if (res.ok) {
const tags = await res.json(); const data = await res.json();
const tags = data.data || [];
setAvailableTags(tags); setAvailableTags(tags);
// Auto-select first tag (Feedback) as default // Auto-select first tag (Feedback) as default
if (tags.length > 0 && !selectedTagId) { if (tags.length > 0 && !selectedTagId) {
@@ -1165,7 +1166,7 @@ export default function VideoPage() {
const res = await fetch(`/api/projects/${projectId}/videos/${videoId}`); const res = await fetch(`/api/projects/${projectId}/videos/${videoId}`);
if (res.ok) { if (res.ok) {
const data = await res.json(); const data = await res.json();
setVideo(data); setVideo(data.data);
} }
} catch { /* silent */ } } catch { /* silent */ }
}, 10000); }, 10000);
+2 -2
View File
@@ -67,7 +67,7 @@ export default function NewProjectPage() {
const res = await fetch('/api/workspaces'); const res = await fetch('/api/workspaces');
if (res.ok) { if (res.ok) {
const data = await res.json(); const data = await res.json();
const workspacesData = data.workspaces || []; const workspacesData = data.data.workspaces || [];
setWorkspaces(workspacesData); setWorkspaces(workspacesData);
// Auto-select if only one workspace and none preselected // Auto-select if only one workspace and none preselected
if (!preselectedWorkspace && workspacesData.length === 1) { if (!preselectedWorkspace && workspacesData.length === 1) {
@@ -106,7 +106,7 @@ export default function NewProjectPage() {
return; return;
} }
router.push(`/projects/${data.id}`); router.push(`/projects/${data.data.id}`);
} catch { } catch {
setError('Something went wrong. Please try again.'); setError('Something went wrong. Please try again.');
} finally { } finally {
+5 -5
View File
@@ -102,9 +102,9 @@ export default function SettingsPage() {
const res = await fetch('/api/settings/notifications'); const res = await fetch('/api/settings/notifications');
if (res.ok) { if (res.ok) {
const data = await res.json(); const data = await res.json();
setSettings(data); setSettings(data.data);
setTelegramToken(data.telegramBotToken || ''); setTelegramToken(data.data.telegramBotToken || '');
setTelegramChatId(data.telegramChatId || ''); setTelegramChatId(data.data.telegramChatId || '');
} }
} catch { } catch {
console.error('Failed to fetch notification settings'); console.error('Failed to fetch notification settings');
@@ -135,7 +135,7 @@ export default function SettingsPage() {
if (res.ok) { if (res.ok) {
const data = await res.json(); const data = await res.json();
setSettings(data); setSettings(data.data);
showMessage('success', 'Settings saved'); showMessage('success', 'Settings saved');
} else { } else {
const data = await res.json(); const data = await res.json();
@@ -163,7 +163,7 @@ export default function SettingsPage() {
}); });
const data = await res.json(); const data = await res.json();
if (res.ok) { if (res.ok) {
showMessage('success', data.message); showMessage('success', data.data.message);
} else { } else {
showMessage('error', data.error || 'Test failed'); showMessage('error', data.error || 'Test failed');
} }
@@ -68,8 +68,8 @@ export default function WorkspaceMembersPage() {
return; return;
} }
const data = await res.json(); const data = await res.json();
setMembers(data.members); setMembers(data.data.members);
setOwner(data.owner); setOwner(data.data.owner);
} catch { } catch {
setError('Failed to load members'); setError('Failed to load members');
} finally { } finally {
@@ -63,7 +63,7 @@ export default function NewWorkspaceProjectPage({ params }: { params: Promise<{
return; return;
} }
router.push(`/projects/${data.id}`); router.push(`/projects/${data.data.id}`);
} catch { } catch {
setError('Something went wrong. Please try again.'); setError('Something went wrong. Please try again.');
} finally { } finally {
@@ -40,10 +40,11 @@ export default function WorkspaceSettingsPage() {
return; return;
} }
const data = await res.json(); const data = await res.json();
setWorkspace(data); const workspace = data.data;
setWorkspace(workspace);
setFormData({ setFormData({
name: data.name, name: workspace.name,
description: data.description || '', description: workspace.description || '',
}); });
} catch { } catch {
setError('Failed to load workspace'); setError('Failed to load workspace');
+1 -1
View File
@@ -38,7 +38,7 @@ export default function NewWorkspacePage() {
return; return;
} }
router.push(`/workspaces/${data.id}`); router.push(`/workspaces/${data.data.id}`);
} catch { } catch {
setError('Something went wrong. Please try again.'); setError('Something went wrong. Please try again.');
} finally { } finally {
@@ -38,14 +38,14 @@ export async function GET(request: NextRequest, { params }: RouteParams) {
const members = await db.projectMember.findMany({ const members = await db.projectMember.findMany({
where: { projectId }, where: { projectId },
include: { include: {
user: { select: { id: true, name: true, image: true } }, user: { select: { id: true, name: true, email: true, image: true } },
}, },
orderBy: { createdAt: 'asc' }, orderBy: { createdAt: 'asc' },
}); });
const owner = await db.user.findUnique({ const owner = await db.user.findUnique({
where: { id: project.ownerId }, where: { id: project.ownerId },
select: { id: true, name: true, image: true }, select: { id: true, name: true, email: true, image: true },
}); });
const response = successResponse({ members, owner }); const response = successResponse({ members, owner });
@@ -127,7 +127,7 @@ export async function POST(request: NextRequest, { params }: RouteParams) {
role: memberRole as ProjectMemberRole, role: memberRole as ProjectMemberRole,
}, },
include: { include: {
user: { select: { id: true, name: true, image: true } }, user: { select: { id: true, name: true, email: true, image: true } },
}, },
}); });
@@ -38,7 +38,7 @@ export async function GET(request: NextRequest, { params }: RouteParams) {
const members = await db.workspaceMember.findMany({ const members = await db.workspaceMember.findMany({
where: { workspaceId }, where: { workspaceId },
include: { include: {
user: { select: { id: true, name: true, image: true } }, user: { select: { id: true, name: true, email: true, image: true } },
}, },
orderBy: { createdAt: 'asc' }, orderBy: { createdAt: 'asc' },
}); });
@@ -46,7 +46,7 @@ export async function GET(request: NextRequest, { params }: RouteParams) {
// Include the owner as well // Include the owner as well
const owner = await db.user.findUnique({ const owner = await db.user.findUnique({
where: { id: workspace.ownerId }, where: { id: workspace.ownerId },
select: { id: true, name: true, image: true }, select: { id: true, name: true, email: true, image: true },
}); });
const response = successResponse({ members, owner }); const response = successResponse({ members, owner });
@@ -128,7 +128,7 @@ export async function POST(request: NextRequest, { params }: RouteParams) {
role: memberRole as WorkspaceMemberRole, role: memberRole as WorkspaceMemberRole,
}, },
include: { include: {
user: { select: { id: true, name: true, image: true } }, user: { select: { id: true, name: true, email: true, image: true } },
}, },
}); });
+3 -2
View File
@@ -222,7 +222,8 @@ export default function WatchPage() {
try { try {
const res = await fetch(`/api/projects/${projectId}/tags`); const res = await fetch(`/api/projects/${projectId}/tags`);
if (res.ok) { if (res.ok) {
const tags = await res.json(); const data = await res.json();
const tags = data.data || [];
setAvailableTags(tags); setAvailableTags(tags);
// Auto-select first tag (Feedback) as default // Auto-select first tag (Feedback) as default
if (tags.length > 0 && !selectedTagId) { if (tags.length > 0 && !selectedTagId) {
@@ -1118,7 +1119,7 @@ export default function WatchPage() {
const res = await fetch(`/api/watch/${videoId}`); const res = await fetch(`/api/watch/${videoId}`);
if (res.ok) { if (res.ok) {
const data = await res.json(); const data = await res.json();
setVideo(data); setVideo(data.data);
} }
} catch { /* silent */ } } catch { /* silent */ }
}, 10000); }, 10000);