refactor: Remove env.example, optimize invoice calendar item selection with derived state, and enhance invoice form's default hourly rate initialization and save button loading state.

This commit is contained in:
2025-12-14 02:16:21 -05:00
parent 75c4362d97
commit 91d410cbce
3 changed files with 16 additions and 37 deletions

View File

@@ -52,9 +52,18 @@ export function InvoiceCalendarView({
const [viewDate, setViewDate] = React.useState<Date>(new Date()); // Controls the view (month/week)
const [view, setView] = React.useState<"month" | "week">("month");
const [dialogOpen, setDialogOpen] = React.useState(false);
const [selectedDateItems, setSelectedDateItems] = React.useState<{ item: InvoiceItem; index: number }[]>([]);
// Derived state for selected date items - solves cursor jumping
const selectedDateItems = React.useMemo(() => {
if (!date) return [];
return items
.map((item, index) => ({ item, index }))
.filter((wrapper) => {
const itemDate = new Date(wrapper.item.date);
return isSameDay(itemDate, date);
});
}, [items, date]);
// Function to get items for the selected date
// Helper to get items for any date (for calendar view)
const getItemsForDate = React.useCallback((targetDate: Date) => {
return items
.map((item, index) => ({ item, index }))
@@ -69,18 +78,9 @@ export function InvoiceCalendarView({
setDate(newDate);
// Optionally update viewDate to match selection if desired, but user wants them decoupled during nav
// setViewDate(newDate);
const dateItems = getItemsForDate(newDate);
setSelectedDateItems(dateItems);
setDialogOpen(true);
};
// refresh selected items when main items change
React.useEffect(() => {
if (date && dialogOpen) {
setSelectedDateItems(getItemsForDate(date));
}
}, [items, date, dialogOpen, getItemsForDate]);
const handleAddNewItem = () => {
if (date) {
onAddItem(date);