feat: use unified error handler in entries store
This commit is contained in:
120
src/stores/entries.ts
Normal file
120
src/stores/entries.ts
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
import { handleInvokeError } from '../utils/errorHandler'
|
||||||
|
|
||||||
|
export interface TimeEntry {
|
||||||
|
id?: number
|
||||||
|
project_id: number
|
||||||
|
task_id?: number
|
||||||
|
description?: string
|
||||||
|
start_time: string
|
||||||
|
end_time?: string
|
||||||
|
duration: number
|
||||||
|
billable?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useEntriesStore = defineStore('entries', () => {
|
||||||
|
const entries = ref<TimeEntry[]>([])
|
||||||
|
const loading = ref(false)
|
||||||
|
const total = ref(0)
|
||||||
|
const hasMore = ref(false)
|
||||||
|
|
||||||
|
async function fetchEntriesPaginated(startDate?: string, endDate?: string) {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const result = await invoke<{ entries: TimeEntry[]; total: number; has_more: boolean }>('get_time_entries_paginated', {
|
||||||
|
startDate: startDate || null,
|
||||||
|
endDate: endDate || null,
|
||||||
|
limit: 50,
|
||||||
|
offset: 0,
|
||||||
|
})
|
||||||
|
entries.value = result.entries
|
||||||
|
total.value = result.total
|
||||||
|
hasMore.value = result.has_more
|
||||||
|
} catch (error) {
|
||||||
|
handleInvokeError(error, 'Failed to fetch time entries', () => fetchEntriesPaginated(startDate, endDate))
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchMore(startDate?: string, endDate?: string) {
|
||||||
|
try {
|
||||||
|
const result = await invoke<{ entries: TimeEntry[]; total: number; has_more: boolean }>('get_time_entries_paginated', {
|
||||||
|
startDate: startDate || null,
|
||||||
|
endDate: endDate || null,
|
||||||
|
limit: 50,
|
||||||
|
offset: entries.value.length,
|
||||||
|
})
|
||||||
|
entries.value.push(...result.entries)
|
||||||
|
total.value = result.total
|
||||||
|
hasMore.value = result.has_more
|
||||||
|
} catch (error) {
|
||||||
|
handleInvokeError(error, 'Failed to load more entries', () => fetchMore(startDate, endDate))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchEntries(startDate?: string, endDate?: string) {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
entries.value = await invoke<TimeEntry[]>('get_time_entries', {
|
||||||
|
startDate: startDate || null,
|
||||||
|
endDate: endDate || null
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
handleInvokeError(error, 'Failed to fetch time entries', () => fetchEntries(startDate, endDate))
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createEntry(entry: TimeEntry): Promise<number | null> {
|
||||||
|
try {
|
||||||
|
const id = await invoke<number>('create_time_entry', { entry })
|
||||||
|
entries.value.unshift({ ...entry, id: Number(id) })
|
||||||
|
return Number(id)
|
||||||
|
} catch (error) {
|
||||||
|
handleInvokeError(error, 'Failed to create time entry')
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateEntry(entry: TimeEntry): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
await invoke('update_time_entry', { entry })
|
||||||
|
const index = entries.value.findIndex(e => e.id === entry.id)
|
||||||
|
if (index !== -1) {
|
||||||
|
entries.value[index] = entry
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
handleInvokeError(error, 'Failed to update time entry')
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function deleteEntry(id: number): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
await invoke('delete_time_entry', { id })
|
||||||
|
entries.value = entries.value.filter(e => e.id !== id)
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
handleInvokeError(error, 'Failed to delete time entry')
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
entries,
|
||||||
|
loading,
|
||||||
|
total,
|
||||||
|
hasMore,
|
||||||
|
fetchEntries,
|
||||||
|
fetchEntriesPaginated,
|
||||||
|
fetchMore,
|
||||||
|
createEntry,
|
||||||
|
updateEntry,
|
||||||
|
deleteEntry
|
||||||
|
}
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user