From 8d223dc8758fe97f648214d02627465c2ae580f7 Mon Sep 17 00:00:00 2001 From: vsxd Date: Thu, 12 Mar 2026 02:45:32 +0800 Subject: [PATCH] fix(web): use plain fetch for Phase 2 API hooks --- .../features/namespace/use-my-namespaces.ts | 13 ++++---- .../namespace/use-namespace-detail.ts | 19 ++++-------- .../namespace/use-namespace-members.ts | 19 ++++-------- web/src/features/publish/use-publish-skill.ts | 21 +++++-------- web/src/features/skill/use-search-skills.ts | 30 ++++++++----------- web/src/features/skill/use-skill-detail.ts | 20 ++++--------- web/src/features/skill/use-skill-files.ts | 21 ++++--------- web/src/features/skill/use-skill-versions.ts | 20 ++++--------- 8 files changed, 49 insertions(+), 114 deletions(-) diff --git a/web/src/features/namespace/use-my-namespaces.ts b/web/src/features/namespace/use-my-namespaces.ts index ac05fd2a..812a433f 100644 --- a/web/src/features/namespace/use-my-namespaces.ts +++ b/web/src/features/namespace/use-my-namespaces.ts @@ -1,19 +1,16 @@ import { useQuery } from '@tanstack/react-query' import type { Namespace } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useMyNamespaces() { return useQuery({ queryKey: ['my-namespaces'], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/namespaces' as any, {}) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const res = await fetch('/api/v1/namespaces') + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as Namespace[] + const json = await res.json() + return json as Namespace[] }, }) } diff --git a/web/src/features/namespace/use-namespace-detail.ts b/web/src/features/namespace/use-namespace-detail.ts index 8891fffa..e3a770d7 100644 --- a/web/src/features/namespace/use-namespace-detail.ts +++ b/web/src/features/namespace/use-namespace-detail.ts @@ -1,25 +1,16 @@ import { useQuery } from '@tanstack/react-query' import type { Namespace } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useNamespaceDetail(slug: string) { return useQuery({ queryKey: ['namespace', slug], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/namespaces/{slug}' as any, { - params: { - path: { - slug, - }, - }, - }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const res = await fetch(`/api/v1/namespaces/${slug}`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as Namespace + const json = await res.json() + return json as Namespace }, enabled: !!slug, }) diff --git a/web/src/features/namespace/use-namespace-members.ts b/web/src/features/namespace/use-namespace-members.ts index 1e972998..4ae193f7 100644 --- a/web/src/features/namespace/use-namespace-members.ts +++ b/web/src/features/namespace/use-namespace-members.ts @@ -1,25 +1,16 @@ import { useQuery } from '@tanstack/react-query' import type { NamespaceMember } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useNamespaceMembers(slug: string) { return useQuery({ queryKey: ['namespace-members', slug], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/namespaces/{slug}/members' as any, { - params: { - path: { - slug, - }, - }, - }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const res = await fetch(`/api/v1/namespaces/${slug}/members`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as NamespaceMember[] + const json = await res.json() + return json as NamespaceMember[] }, enabled: !!slug, }) diff --git a/web/src/features/publish/use-publish-skill.ts b/web/src/features/publish/use-publish-skill.ts index 2f351a41..3107aacd 100644 --- a/web/src/features/publish/use-publish-skill.ts +++ b/web/src/features/publish/use-publish-skill.ts @@ -1,9 +1,5 @@ import { useMutation } from '@tanstack/react-query' import type { PublishResult } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) function getCsrfToken(): string | null { const match = document.cookie.match(/(?:^|; )XSRF-TOKEN=([^;]+)/) @@ -26,21 +22,18 @@ export function usePublishSkill() { ...(csrfToken && { 'X-XSRF-TOKEN': csrfToken }), } - const { data, error, response } = await client.POST('/api/v1/skills/{namespace}/publish' as any, { - params: { - path: { - namespace, - }, - }, - body: formData as any, + const res = await fetch(`/api/v1/skills/${namespace}/publish`, { + method: 'POST', headers, + body: formData, }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as PublishResult + const json = await res.json() + return json as PublishResult }, }) } diff --git a/web/src/features/skill/use-search-skills.ts b/web/src/features/skill/use-search-skills.ts index b50b9ec8..b0b50a59 100644 --- a/web/src/features/skill/use-search-skills.ts +++ b/web/src/features/skill/use-search-skills.ts @@ -1,29 +1,23 @@ import { useQuery } from '@tanstack/react-query' import type { SearchParams, PagedResponse, SkillSummary } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useSearchSkills(params: SearchParams) { return useQuery({ queryKey: ['skills', params], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/skills' as any, { - params: { - query: { - q: params.q, - namespace: params.namespace, - sort: params.sort, - page: params.page, - size: params.size, - }, - }, - }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const queryParams = new URLSearchParams() + if (params.q) queryParams.append('q', params.q) + if (params.namespace) queryParams.append('namespace', params.namespace) + if (params.sort) queryParams.append('sort', params.sort) + if (params.page !== undefined) queryParams.append('page', String(params.page)) + if (params.size !== undefined) queryParams.append('size', String(params.size)) + + const res = await fetch(`/api/v1/skills?${queryParams.toString()}`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as PagedResponse + const json = await res.json() + return json as PagedResponse }, }) } diff --git a/web/src/features/skill/use-skill-detail.ts b/web/src/features/skill/use-skill-detail.ts index f06fbbc7..be94657c 100644 --- a/web/src/features/skill/use-skill-detail.ts +++ b/web/src/features/skill/use-skill-detail.ts @@ -1,26 +1,16 @@ import { useQuery } from '@tanstack/react-query' import type { SkillDetail } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useSkillDetail(namespace: string, slug: string) { return useQuery({ queryKey: ['skill', namespace, slug], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/skills/{namespace}/{slug}' as any, { - params: { - path: { - namespace, - slug, - }, - }, - }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const res = await fetch(`/api/v1/skills/${namespace}/${slug}`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as SkillDetail + const json = await res.json() + return json as SkillDetail }, enabled: !!namespace && !!slug, }) diff --git a/web/src/features/skill/use-skill-files.ts b/web/src/features/skill/use-skill-files.ts index 15467147..f92219f2 100644 --- a/web/src/features/skill/use-skill-files.ts +++ b/web/src/features/skill/use-skill-files.ts @@ -1,27 +1,16 @@ import { useQuery } from '@tanstack/react-query' import type { SkillFile } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useSkillFiles(namespace: string, slug: string, version: string) { return useQuery({ queryKey: ['skill-files', namespace, slug, version], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/skills/{namespace}/{slug}/versions/{version}/files' as any, { - params: { - path: { - namespace, - slug, - version, - }, - }, - }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const res = await fetch(`/api/v1/skills/${namespace}/${slug}/versions/${version}/files`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as SkillFile[] + const json = await res.json() + return json as SkillFile[] }, enabled: !!namespace && !!slug && !!version, }) diff --git a/web/src/features/skill/use-skill-versions.ts b/web/src/features/skill/use-skill-versions.ts index c81be46b..306828c7 100644 --- a/web/src/features/skill/use-skill-versions.ts +++ b/web/src/features/skill/use-skill-versions.ts @@ -1,26 +1,16 @@ import { useQuery } from '@tanstack/react-query' import type { SkillVersion } from '@/api/types' -import createClient from 'openapi-fetch' -import type { paths } from '@/api/generated/schema' - -const client = createClient({ baseUrl: '' }) export function useSkillVersions(namespace: string, slug: string) { return useQuery({ queryKey: ['skill-versions', namespace, slug], queryFn: async () => { - const { data, error, response } = await client.GET('/api/v1/skills/{namespace}/{slug}/versions' as any, { - params: { - path: { - namespace, - slug, - }, - }, - }) - if (error || !data) { - throw new Error(`HTTP ${response.status}`) + const res = await fetch(`/api/v1/skills/${namespace}/${slug}/versions`) + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) } - return data as unknown as SkillVersion[] + const json = await res.json() + return json as SkillVersion[] }, enabled: !!namespace && !!slug, })