/ chandeskpro / src / utils / apiClient.ts
swadhinbiswas Initial release v0.1.0 · 1/16/2026
ed7a4e4
91 lines · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import { invoke } from '@tauri-apps/api/core'
import type { BoardInfo } from '../types/boards'
import type { Thread, Catalog } from '../types/api'

export async function fetchAllBoardsWithMetadata(): Promise<BoardInfo[]> {
    return await invoke<BoardInfo[]>('fetch_all_boards_with_metadata')
}

export async function searchBoards(query: string): Promise<BoardInfo[]> {
    return await invoke<BoardInfo[]>('search_boards', { query })
}

export async function fetchCatalog(board: string): Promise<Catalog> {
    return await invoke<Catalog>('fetch_catalog', { board })
}

export async function fetchThread(board: string, threadId: number): Promise<Thread> {
    return await invoke<Thread>('fetch_thread', { board, threadId })
}

// Image proxy to bypass CORS
export async function fetchImageWithProxy(url: string): Promise<string> {
    return await invoke<string>('fetch_image_with_cors_bypass', { url })
}

export async function clearImageCache(): Promise<void> {
    return await invoke('clear_image_cache')
}

// Media caching
export async function downloadMedia(url: string, board: string, threadId: number): Promise<string> {
    return await invoke<string>('download_media', { url, board, threadId })
}

export async function getCachedMediaPath(board: string, threadId: number, filename: string): Promise<string | null> {
    return await invoke<string | null>('get_cached_media_path', { board, threadId, filename })
}

export async function clearMediaCache(): Promise<void> {
    return await invoke('clear_media_cache')
}

export async function getCacheSize(): Promise<number> {
    return await invoke<number>('get_cache_size')
}

// Posting functions
export interface PostRequest {
    board: string
    resto?: number
    name?: string
    email?: string
    subject?: string
    comment: string
    file_path?: string
    file_name?: string
}

export interface PostResponse {
    success: boolean
    thread_id?: number
    post_id?: number
    error?: string
}

export async function submitPost(request: PostRequest, passToken?: string | null): Promise<PostResponse> {
    return await invoke<PostResponse>('submit_post', { request, passToken })
}

export async function getPostCooldown(): Promise<number> {
    return await invoke<number>('get_post_cooldown')
}

export async function validatePassToken(token: string): Promise<boolean> {
    return await invoke<boolean>('validate_pass_token', { token })
}

// Helper functions for image URLs
export function getImageUrl(board: string, tim: number, ext: string): string {
    return `https://i.4cdn.org/${board}/${tim}${ext}`
}

export function getThumbnailUrl(board: string, tim: number): string {
    return `https://i.4cdn.org/${board}/${tim}s.jpg`
}

export function getThreadUrl(board: string, threadId: number): string {
    return `https://boards.4channel.org/${board}/thread/${threadId}`
}