From 2966e3e003820367687ea2f4903ed77fcf36a70f Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Fri, 13 Feb 2026 12:47:13 -0700 Subject: [PATCH] Add PayPal/nodemailer deps and Order/OrderItem types - Add @paypal/react-paypal-js, nodemailer, @types/nodemailer to package.json - Add Order and OrderItem TypeScript interfaces to directus.ts - These were part of the checkout implementation but missed in the initial commit Co-Authored-By: Claude Opus 4.6 --- frontend/package-lock.json | 66 ++++++++++++++++++++++++++++++++++++ frontend/package.json | 3 ++ frontend/src/lib/directus.ts | 34 +++++++++++++++++++ 3 files changed, 103 insertions(+) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1a7e3e6..f5811c1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,14 +9,17 @@ "version": "0.1.0", "dependencies": { "@directus/sdk": "^21.0.0", + "@paypal/react-paypal-js": "^8.9.2", "@tailwindcss/typography": "^0.5.19", "next": "16.1.6", + "nodemailer": "^8.0.1", "react": "19.2.3", "react-dom": "19.2.3" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", + "@types/nodemailer": "^7.0.9", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", @@ -1428,6 +1431,38 @@ "node": ">=12.4.0" } }, + "node_modules/@paypal/paypal-js": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@paypal/paypal-js/-/paypal-js-9.2.0.tgz", + "integrity": "sha512-bYud4/ibSSLsUspruhTrCxuznVY0O23XWwdbI6Wcf45c+1tpYW8BijHJ1/YoWYxslTvJODKHZ8UZWIVkI1pe3g==", + "license": "Apache-2.0", + "dependencies": { + "promise-polyfill": "^8.3.0" + } + }, + "node_modules/@paypal/react-paypal-js": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/@paypal/react-paypal-js/-/react-paypal-js-8.9.2.tgz", + "integrity": "sha512-z1GoA7KAkhFCSmpIsRxe9aseXRvfOMgF6vCJ2Mym0VOSYJm8bZSC3Ui4SjONnglfV8S4P8djpe5QB7FtKsDXrQ==", + "license": "Apache-2.0", + "dependencies": { + "@paypal/paypal-js": "^9.0.0", + "@paypal/sdk-constants": "^1.0.122" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19", + "react-dom": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/@paypal/sdk-constants": { + "version": "1.0.157", + "resolved": "https://registry.npmjs.org/@paypal/sdk-constants/-/sdk-constants-1.0.157.tgz", + "integrity": "sha512-BjxWT9rK6dM1AOffSpvHYY47/8BY775jgEYYiwH6eL4YaqU5Epcw7zOtwQ8L4UaEn4FCAjZ2EWxaS83dCN7SpA==", + "license": "Apache-2.0", + "dependencies": { + "hi-base32": "^0.5.0" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1769,6 +1804,16 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/nodemailer": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.9.tgz", + "integrity": "sha512-vI8oF1M+8JvQhsId0Pc38BdUP2evenIIys7c7p+9OZXSPOH5c1dyINP1jT8xQ2xPuBUXmIC87s+91IZMDjH8Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/react": { "version": "19.2.10", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", @@ -4220,6 +4265,12 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hi-base32": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", + "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==", + "license": "MIT" + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -5474,6 +5525,15 @@ "dev": true, "license": "MIT" }, + "node_modules/nodemailer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.1.tgz", + "integrity": "sha512-5kcldIXmaEjZcHR6F28IKGSgpmZHaF1IXLWFTG+Xh3S+Cce4MiakLtWY+PlBU69fLbRa8HlaGIrC/QolUpHkhg==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5799,6 +5859,12 @@ "node": ">= 0.8.0" } }, + "node_modules/promise-polyfill": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz", + "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==", + "license": "MIT" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index c189174..8a6f8b3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,14 +10,17 @@ }, "dependencies": { "@directus/sdk": "^21.0.0", + "@paypal/react-paypal-js": "^8.9.2", "@tailwindcss/typography": "^0.5.19", "next": "16.1.6", + "nodemailer": "^8.0.1", "react": "19.2.3", "react-dom": "19.2.3" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", + "@types/nodemailer": "^7.0.9", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", diff --git a/frontend/src/lib/directus.ts b/frontend/src/lib/directus.ts index 842da5a..79ee202 100644 --- a/frontend/src/lib/directus.ts +++ b/frontend/src/lib/directus.ts @@ -136,6 +136,40 @@ export interface SiteSettings { store_enabled?: boolean; } +export interface Order { + id: number; + status: string; + customer_email: string; + customer_first_name?: string; + customer_last_name?: string; + shipping_address?: string; + shipping_city?: string; + shipping_postcode?: string; + shipping_country?: string; + phone?: string; + notes?: string; + subtotal?: number; + shipping_cost?: number; + total?: number; + currency?: string; + paypal_order_id?: string; + paypal_capture_id?: string; + paypal_payer_email?: string; + date_created?: string; + date_updated?: string; +} + +export interface OrderItem { + id: number; + order_id: number; + artwork_id?: number; + artwork_name?: string; + price?: number; + currency?: string; + quantity?: number; + date_created?: string; +} + export interface DirectusFile { id: string; title?: string;