46 lines
1.2 KiB
JavaScript
46 lines
1.2 KiB
JavaScript
import { useState, useEffect } from 'react';
|
|||
|
|
import { getCategories, isLoggedIn } from '../lib/api';
|
||
|
|
import { DEFAULT_CATEGORIES } from '../lib/categories';
|
||
|
|
|
||
|
|
export function useCategories() {
|
||
|
|
const [categories, setCategories] = useState(DEFAULT_CATEGORIES);
|
||
|
|
const [loading, setLoading] = useState(true);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
if (!isLoggedIn()) {
|
||
|
|
setLoading(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const loadCategories = async () => {
|
||
|
|
try {
|
||
|
|
const categoriesData = await getCategories();
|
||
|
|
if (categoriesData) {
|
||
|
|
setCategories({
|
||
|
|
expense: [
|
||
|
|
...DEFAULT_CATEGORIES.expense,
|
||
|
|
...(categoriesData.expense || []).filter(
|
||
|
|
c => !DEFAULT_CATEGORIES.expense.some(d => d.name === c.name)
|
||
|
|
)
|
||
|
|
],
|
||
|
|
income: [
|
||
|
|
...DEFAULT_CATEGORIES.income,
|
||
|
|
...(categoriesData.income || []).filter(
|
||
|
|
c => !DEFAULT_CATEGORIES.income.some(d => d.name === c.name)
|
||
|
|
)
|
||
|
|
],
|
||
|
|
});
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.error(err);
|
||
|
|
} finally {
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
loadCategories();
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
return { categories, loading };
|
||
|
|
}
|