actual/packages/loot-core/src/client/data-hooks/schedules.js
Tom French 9c0df36e16
Sort import in alphabetical order (#238)
* style: enforce sorting of imports

* style: alphabetize imports

* style: merge duplicated imports
2022-09-02 15:07:24 +01:00

69 lines
1.6 KiB
JavaScript

import React, { useEffect, useState, useContext } from 'react';
import q, { liveQuery } from 'loot-core/src/client/query-helpers';
import {
getStatus,
getHasTransactionsQuery
} from 'loot-core/src/shared/schedules';
function loadStatuses(schedules, onData) {
return liveQuery(getHasTransactionsQuery(schedules), onData, {
mapper: data => {
let hasTrans = new Set(data.filter(Boolean).map(row => row.schedule));
return new Map(
schedules.map(s => [
s.id,
getStatus(s.next_date, s.completed, hasTrans.has(s.id))
])
);
}
});
}
export function useSchedules({ transform } = {}) {
let [data, setData] = useState(null);
useEffect(() => {
let query = q('schedules').select('*');
let scheduleQuery, statusQuery;
scheduleQuery = liveQuery(
transform ? transform(query) : query,
async schedules => {
if (scheduleQuery) {
if (statusQuery) {
statusQuery.unsubscribe();
}
statusQuery = loadStatuses(schedules, statuses =>
setData({ schedules, statuses })
);
}
}
);
return () => {
if (scheduleQuery) {
scheduleQuery.unsubscribe();
}
if (statusQuery) {
statusQuery.unsubscribe();
}
};
}, [transform]);
return data;
}
let SchedulesContext = React.createContext(null);
export function SchedulesProvider({ transform, children }) {
let data = useSchedules({ transform });
return <SchedulesContext.Provider value={data} children={children} />;
}
export function useCachedSchedules() {
return useContext(SchedulesContext);
}