- Add "Additional items to manually check" collapsed section - Replace triangle/square severity icons with consistent filled circles - Empty circle (border only) for informative/unscored audits
97 lines
2.9 KiB
TypeScript
97 lines
2.9 KiB
TypeScript
import apiRequest from './client'
|
|
|
|
// * Types for PageSpeed Insights monitoring
|
|
|
|
export interface PageSpeedConfig {
|
|
site_id: string
|
|
enabled: boolean
|
|
frequency: 'daily' | 'weekly' | 'monthly'
|
|
url: string | null
|
|
next_check_at: string | null
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface AuditSummary {
|
|
id: string
|
|
title: string
|
|
description: string
|
|
score: number | null
|
|
display_value?: string
|
|
savings_ms?: number
|
|
category: 'opportunity' | 'diagnostic' | 'passed' | 'manual'
|
|
group?: string // "performance", "accessibility", "best-practices", "seo"
|
|
sub_group?: string // "a11y-names-labels", "a11y-contrast", etc.
|
|
sub_group_title?: string // "Names and Labels", "Contrast", etc.
|
|
details?: AuditDetailItem[]
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
export type AuditDetailItem = Record<string, any>
|
|
|
|
export interface FilmstripFrame {
|
|
timing: number
|
|
data: string
|
|
}
|
|
|
|
export interface PageSpeedCheck {
|
|
id: string
|
|
site_id: string
|
|
strategy: 'mobile' | 'desktop'
|
|
performance_score: number | null
|
|
accessibility_score: number | null
|
|
best_practices_score: number | null
|
|
seo_score: number | null
|
|
lcp_ms: number | null
|
|
cls: number | null
|
|
tbt_ms: number | null
|
|
fcp_ms: number | null
|
|
si_ms: number | null
|
|
tti_ms: number | null
|
|
audits: AuditSummary[] | null
|
|
screenshot?: string | null
|
|
filmstrip?: FilmstripFrame[] | null
|
|
triggered_by: 'scheduled' | 'manual'
|
|
checked_at: string
|
|
}
|
|
|
|
export async function getPageSpeedConfig(siteId: string): Promise<PageSpeedConfig> {
|
|
return apiRequest<PageSpeedConfig>(`/sites/${siteId}/pagespeed/config`)
|
|
}
|
|
|
|
export async function updatePageSpeedConfig(
|
|
siteId: string,
|
|
config: { enabled: boolean; frequency: string; url?: string }
|
|
): Promise<PageSpeedConfig> {
|
|
return apiRequest<PageSpeedConfig>(`/sites/${siteId}/pagespeed/config`, {
|
|
method: 'PUT',
|
|
body: JSON.stringify(config),
|
|
})
|
|
}
|
|
|
|
export async function getPageSpeedLatest(siteId: string): Promise<PageSpeedCheck[]> {
|
|
const res = await apiRequest<{ checks: PageSpeedCheck[] }>(`/sites/${siteId}/pagespeed/latest`)
|
|
return res?.checks ?? []
|
|
}
|
|
|
|
export async function getPageSpeedHistory(
|
|
siteId: string,
|
|
strategy: 'mobile' | 'desktop' = 'mobile',
|
|
days = 90
|
|
): Promise<PageSpeedCheck[]> {
|
|
const res = await apiRequest<{ checks: PageSpeedCheck[] }>(
|
|
`/sites/${siteId}/pagespeed/history?strategy=${strategy}&days=${days}`
|
|
)
|
|
return res?.checks ?? []
|
|
}
|
|
|
|
export async function getPageSpeedCheck(siteId: string, checkId: string): Promise<PageSpeedCheck> {
|
|
return apiRequest<PageSpeedCheck>(`/sites/${siteId}/pagespeed/checks/${checkId}`)
|
|
}
|
|
|
|
// * Triggers an async PageSpeed check. Returns immediately (202).
|
|
// * Caller should poll getPageSpeedLatest() for results.
|
|
export async function triggerPageSpeedCheck(siteId: string): Promise<void> {
|
|
await apiRequest(`/sites/${siteId}/pagespeed/check`, { method: 'POST' })
|
|
}
|