feat: SEO SPA Sites, Articles and Integration (4/4)

This commit is contained in:
Florian Sylvain committed 2026-10-18 15:51:28 +02:00
1 parent cb737b7ae3
commit 02fb8751fd
47 files changed
+3218 -227

No files matched your search

+31 -2
View File
@@ -1,7 +1,8 @@
import type { SuggestionCode } from '@/lib/seoTypes'
import type { ArticleSeo } from '@/lib/articleSeo'
import { useApi } from '@/composables/useApi'
import type { Byline } from '@/lib/articleTypes'
import type { ArticleStatus } from '@/lib/articleListQuery'
import type { ArticleStatus, SEO_FILTER } from '@/lib/articleListQuery'
export type { Byline }
@@ -14,6 +15,9 @@ export interface Article extends Partial<ArticleSeo> {
authors?: Byline[]
created_at: string
updated_at: string
seo_status?: string
seo_dismissed?: SuggestionCode[]
seo_suggestions?: number
}
export type { ArticleStatus }
@@ -39,6 +43,13 @@ export interface ListArticlesParams {
status?: ArticleStatus | ''
sort?: string
site?: string
seo?: '' | typeof SEO_FILTER
}
export interface CountNeedsAttentionParams {
q?: string
status?: ArticleStatus | ''
site?: string
}
export function useArticles() {
@@ -62,8 +73,26 @@ export function useArticles() {
if (params.site) {
query.set('site', params.site)
}
if (params.seo) {
query.set('seo', params.seo)
}
return request<ArticlePage>(`/v1/article/?${query.toString()}`)
}
return { listArticles }
async function countNeedsAttention(params: CountNeedsAttentionParams): Promise<number> {
const query = new URLSearchParams({ seo: 'suggestions', page: '1', size: '5' })
if (params.q) {
query.set('q', params.q)
}
if (params.status) {
query.set('status', params.status)
}
if (params.site) {
query.set('site', params.site)
}
const page = await request<Pick<ArticlePage, 'total'>>(`/v1/article/?${query.toString()}`)
return page.total
}
return { listArticles, countNeedsAttention }
}