import { httpClient } from './base/http-client'; import { DailyCheckbox, DailyView, CreateDailyCheckboxData, UpdateDailyCheckboxData } from '@/lib/types'; export interface DailyHistoryFilters { limit?: number; } export interface DailySearchFilters { query: string; limit?: number; } export interface ReorderCheckboxesData { date: Date; checkboxIds: string[]; } export class DailyClient { /** * Récupère la vue daily d'aujourd'hui (hier + aujourd'hui) */ async getTodaysDailyView(): Promise { return httpClient.get('/daily'); } /** * Récupère la vue daily pour une date donnée */ async getDailyView(date: Date): Promise { const dateStr = this.formatDateForAPI(date); return httpClient.get(`/daily?date=${dateStr}`); } /** * Récupère l'historique des checkboxes */ async getCheckboxHistory(filters?: DailyHistoryFilters): Promise<{ date: Date; checkboxes: DailyCheckbox[] }[]> { const params = new URLSearchParams({ action: 'history' }); if (filters?.limit) params.append('limit', filters.limit.toString()); return httpClient.get(`/daily?${params}`); } /** * Recherche dans les checkboxes */ async searchCheckboxes(filters: DailySearchFilters): Promise { const params = new URLSearchParams({ action: 'search', q: filters.query }); if (filters.limit) params.append('limit', filters.limit.toString()); return httpClient.get(`/daily?${params}`); } /** * Ajoute une checkbox */ async addCheckbox(data: CreateDailyCheckboxData): Promise { return httpClient.post('/daily', { ...data, date: this.formatDateForAPI(data.date) }); } /** * Ajoute une checkbox pour aujourd'hui */ async addTodayCheckbox(text: string, taskId?: string): Promise { return this.addCheckbox({ date: new Date(), text, taskId }); } /** * Ajoute une checkbox pour hier */ async addYesterdayCheckbox(text: string, taskId?: string): Promise { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); return this.addCheckbox({ date: yesterday, text, taskId }); } /** * Met à jour une checkbox */ async updateCheckbox(checkboxId: string, data: UpdateDailyCheckboxData): Promise { return httpClient.patch(`/daily/checkboxes/${checkboxId}`, data); } /** * Supprime une checkbox */ async deleteCheckbox(checkboxId: string): Promise { return httpClient.delete(`/daily/checkboxes/${checkboxId}`); } /** * Réordonne les checkboxes d'une date */ async reorderCheckboxes(data: ReorderCheckboxesData): Promise { return httpClient.post('/daily/checkboxes', { date: this.formatDateForAPI(data.date), checkboxIds: data.checkboxIds }); } /** * Coche/décoche une checkbox (raccourci) */ async toggleCheckbox(checkboxId: string, isChecked: boolean): Promise { return this.updateCheckbox(checkboxId, { isChecked }); } /** * Formate une date pour l'API (évite les décalages timezone) */ formatDateForAPI(date: Date): string { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; // YYYY-MM-DD } /** * Récupère la vue daily d'une date relative (hier, aujourd'hui, demain) */ async getDailyViewByRelativeDate(relative: 'yesterday' | 'today' | 'tomorrow'): Promise { const date = new Date(); switch (relative) { case 'yesterday': date.setDate(date.getDate() - 1); break; case 'tomorrow': date.setDate(date.getDate() + 1); break; // 'today' ne change rien } return this.getDailyView(date); } /** * Récupère toutes les dates qui ont des dailies */ async getDailyDates(): Promise { const response = await httpClient.get<{ dates: string[] }>('/daily/dates'); return response.dates; } } // Instance singleton du client export const dailyClient = new DailyClient();