React-based frontend application for managing notes and receipts with PocketBase authentication.
The frontend uses a generic resource management pattern to eliminate code duplication between similar resources:
useResourceManager.tsx - Generic hook for CRUD operations and state managementResourceManager.tsx - Generic UI component for resource management pagesresource-configs.tsx - Resource-specific configurationsNotesManager.tsx - Notes management interface (uses generic components)ReceiptsManager.tsx - Receipts management interface (uses generic components)NoteForm.tsx / ReceiptForm.tsx - Resource-specific formsNoteList.tsx / ReceiptList.tsx - Resource-specific listsNoteItem.tsx / ReceiptItem.tsx - Individual item componentsApp.tsx - Main application component with authentication state managementHomePage.tsx - Landing page with navigationLoginForm.tsx - User login formuseGeolocation.tsx - Geolocation hook for receiptsTo add a new resource type (e.g., tasks, bookmarks):
shared/types.tsresource-configs.tsxResourceManagerExample:
// In resource-configs.tsx
export const tasksResourceConfig: ResourceManagerConfig<Task, CreateTaskRequest, UpdateTaskRequest> = {
apiPath: "/api/tasks",
resourceName: "task",
resourceNamePlural: "tasks",
mapCreateRequest: (data) => ({ title: data.title }),
mapUpdateRequest: (data) => data,
updateItemInList: (items, id, updatedItem) =>
items.map((item) => item.id === id ? updatedItem : item),
};
// In TasksManager.tsx
export default function TasksManager({ user, onLogout }) {
const resourceManager = useResourceManager(tasksResourceConfig);
return (
<ResourceManager
{...resourceManager}
user={user}
onLogout={onLogout}
title="Tasks Manager"
FormComponent={TaskForm}
ListComponent={TaskList}
// ... other props
/>
);
}