Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
a3ec50a
Updated logic for moving fields
Tarun-Nagesh Feb 8, 2026
f4a22c2
Added/changed tests
Tarun-Nagesh Feb 8, 2026
bb71e3e
Some scuffed workaround, unsure if it has any other implications
Tarun-Nagesh Feb 8, 2026
4dd7a44
cleanup and comments
Tarun-Nagesh Feb 19, 2026
aee1b48
merging main
Tarun-Nagesh Feb 20, 2026
fda0ece
linting
Tarun-Nagesh Feb 20, 2026
4b16f21
fixed test
Tarun-Nagesh Feb 20, 2026
e1dc7c0
Added status back to FoodRequest
Tarun-Nagesh Feb 20, 2026
e210752
order management frontend
Juwang110 Feb 23, 2026
f2d5e75
confirm delivery modal
Juwang110 Feb 23, 2026
198de70
finishing touches, file upload confirmation functionality
Juwang110 Feb 25, 2026
904d839
Merge branch 'main' into jw/order-management-homepage
Juwang110 Feb 25, 2026
f63a269
Merge branch 'main' into jw/order-management-homepage
Juwang110 Feb 26, 2026
b11aa32
cleanup
Juwang110 Feb 26, 2026
179b6b6
minor changes
Juwang110 Feb 27, 2026
5c381f1
Merge branch 'main' into jw/order-management-homepage
Juwang110 Mar 7, 2026
53251c0
adding order details modal
Juwang110 Mar 8, 2026
414be55
comments
Juwang110 Mar 9, 2026
1ee908e
removing usage of confirmdelivery
Juwang110 Mar 9, 2026
b5c8d8b
Merge branch 'main' into jw/order-management-homepage
Juwang110 Mar 9, 2026
8b4da4c
rendering modals once
Juwang110 Mar 9, 2026
d93c28c
Merge branch 'main' into jw/order-management-homepage
Juwang110 Mar 10, 2026
d2cfa1a
Merge branch 'main' into jw/order-management-homepage
Juwang110 Mar 12, 2026
49758fd
comments
Juwang110 Mar 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 25 additions & 5 deletions apps/backend/src/orders/order.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
ValidationPipe,
UploadedFiles,
UseInterceptors,
PayloadTooLargeException,
} from '@nestjs/common';
import { ApiBody } from '@nestjs/swagger';
import { OrdersService } from './order.service';
Expand Down Expand Up @@ -164,16 +165,35 @@ export class OrdersController {
},
})
@UseInterceptors(
FilesInterceptor('photos', 10, { storage: multer.memoryStorage() }),
FilesInterceptor('photos', 10, {
storage: multer.memoryStorage(),
limits: {
fileSize: 5 * 1024 * 1024, // 5 MB in bytes
},
}),
)
async confirmDelivery(
@Param('orderId', ParseIntPipe) orderId: number,
@Body() body: ConfirmDeliveryDto,
@UploadedFiles() photos?: Express.Multer.File[],
): Promise<Order> {
const uploadedPhotoUrls =
photos && photos.length > 0 ? await this.awsS3Service.upload(photos) : [];

return this.ordersService.confirmDelivery(orderId, body, uploadedPhotoUrls);
try {
const uploadedPhotoUrls =
photos && photos.length > 0
? await this.awsS3Service.upload(photos)
: [];
return this.ordersService.confirmDelivery(
orderId,
body,
uploadedPhotoUrls,
);
} catch (err: any) {
if (err.code === 'LIMIT_FILE_SIZE') {
throw new PayloadTooLargeException(
'Each photo must be 5 MB or smaller',
);
}
throw err;
}
}
}
62 changes: 37 additions & 25 deletions apps/frontend/src/api/apiClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@ import {
OrderSummary,
UserDto,
OrderDetails,
ConfirmDeliveryDto,
OrderWithoutRelations,
Assignments,
FoodRequestSummaryDto,
OrderWithoutFoodManufacturer,
} from 'types/types';

const defaultBaseUrl =
Expand Down Expand Up @@ -168,6 +171,14 @@ export class ApiClient {
.then((response) => response.data);
}

public async getPantryOrders(
pantryId: number,
): Promise<OrderWithoutFoodManufacturer[]> {
return this.axiosInstance
.get(`/api/pantries/${pantryId}/orders`)
.then((response) => response.data);
}

public async getPantry(pantryId: number): Promise<Pantry> {
return this.get(`/api/pantries/${pantryId}`) as Promise<Pantry>;
}
Expand Down Expand Up @@ -225,6 +236,32 @@ export class ApiClient {
.then((response) => response.data);
}

public async confirmOrderDelivery(
orderId: number,
dto: ConfirmDeliveryDto,
photos: File[],
): Promise<OrderWithoutRelations> {
const formData = new FormData();

// DTO fields
formData.append('dateReceived', dto.dateReceived);
if (dto.feedback) {
formData.append('feedback', dto.feedback);
}

// files (must be key = "photos")
for (const file of photos) {
formData.append('photos', file);
}

const { data } = await this.axiosInstance.patch(
`/api/orders/${orderId}/confirm-delivery`,
formData,
);

return data;
}

public async postManufacturer(
data: ManufacturerApplicationDto,
): Promise<AxiosResponse<void>> {
Expand Down Expand Up @@ -293,31 +330,6 @@ export class ApiClient {
return data as FoodRequest[];
}

public async confirmDelivery(
requestId: number,
data: FormData,
): Promise<void> {
try {
const response = await this.axiosInstance.post(
`/api/requests/${requestId}/confirm-delivery`,
data,
);

if (response.status === 200) {
alert('Delivery confirmation submitted successfully');
if (this.navigate) {
this.navigate('/request-form');
} else {
window.location.href = '/request-form';
}
} else {
alert(`Failed to submit: ${response.statusText}`);
}
} catch (error) {
alert(`Error submitting delivery confirmation: ${error}`);
}
}

public async getCurrentUserPantryId(): Promise<number> {
const data = await this.get('/api/pantries/my-id');
return data as number;
Expand Down
10 changes: 7 additions & 3 deletions apps/frontend/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import PantryPastOrders from '@containers/pantryPastOrders';
import Pantries from '@containers/pantries';
import Orders from '@containers/orders';
import PantryDashboard from '@containers/pantryDashboard';
import { submitDeliveryConfirmationFormModal } from '@components/forms/deliveryConfirmationModal';
import FormRequests from '@containers/formRequests';
import PantryApplication from '@containers/pantryApplication';
import ApplicationSubmitted from '@containers/applicationSubmitted';
Expand All @@ -25,6 +24,7 @@ import ForgotPasswordPage from '@containers/forgotPasswordPage';
import ProtectedRoute from '@components/protectedRoute';
import Unauthorized from '@containers/unauthorized';
import { Authenticator } from '@aws-amplify/ui-react';
import PantryOrderManagement from '@containers/pantryOrderManagement';
import FoodManufacturerApplication from '@containers/foodManufacturerApplication';
import { submitManufacturerApplicationForm } from '@components/forms/manufacturerApplicationForm';
import AssignedPantries from '@containers/volunteerAssignedPantries';
Expand Down Expand Up @@ -162,8 +162,12 @@ const router = createBrowserRouter([
),
},
{
path: '/confirm-delivery',
action: submitDeliveryConfirmationFormModal,
path: '/pantry-order-management',
element: (
<ProtectedRoute>
<PantryOrderManagement />
</ProtectedRoute>
),
},
{
path: '/approve-pantries',
Expand Down
4 changes: 4 additions & 0 deletions apps/frontend/src/chakra-ui.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ declare module '@chakra-ui/react' {
extends ComponentPropsStrictChildren {}
export interface MenuRadioItemProps extends ComponentPropsLenientChildren {}

// FileUpload components
export interface FileUploadDropzoneProps
extends ComponentPropsLenientChildren {}

// Dialog components
export interface DialogCloseTriggerProps
extends ComponentPropsStrictChildren {}
Expand Down
192 changes: 0 additions & 192 deletions apps/frontend/src/components/forms/deliveryConfirmationModal.tsx

This file was deleted.

Loading
Loading