Implement sku check page

This commit is contained in:
Samantha Kellow 2023-09-13 22:21:46 +01:00
parent f571d7fab3
commit 6af647043e
7 changed files with 162 additions and 3202 deletions

72
app/skus/page.tsx Normal file
View File

@ -0,0 +1,72 @@
import { createProductSKUs } from 'lib/helpers/skus';
import { getProducts } from 'lib/shopify';
import { Dropbox } from 'dropbox';
export default async function SKUCheckPage() {
const products = await getProducts({});
const dbx = new Dropbox({
accessToken: process.env.DROPBOX_TOKEN
});
const dbxFiles = await dbx.filesListFolder({
path: '/scape squared/004 print ready - print files'
});
// sabotage?
// dbxFiles.result.entries.splice(5, 1);
return (
<div>
{products.map((product) => {
const skus = createProductSKUs(product.title);
// sabotage?
// product.variants[3]!.sku = 'SCSQ10001_STTU781_M_C002_B_NT';
const productFiles = dbxFiles.result.entries
.filter((file) => file.name.startsWith(skus[0]!.split('_')[0]!))
return (
<div key={product.id} className="mt-10 lg:grid lg:grid-cols-12 gap-x-4 gap-y-1">
<h1 className="text-2xl lg:col-span-10 lg:col-start-3">{product.title}</h1>
<div
className={
'mb-4 lg:col-span-4 lg:col-start-3 rounded ' +
(productFiles.length !== 2 ? 'bg-amber-300' : '')
}
>
Dropbox: {productFiles?.map(file => file.name).join(", ")}
</div>
{product.variants.map((variant, i) => (
<>
<div className="lg:col-span-1 lg:col-start-2 text-right">
{variant.selectedOptions[0]?.value}
</div>
<div
className={
'tabular-nums lg:col-span-4 rounded ' +
(variant.sku === skus[i] ? '' : 'bg-amber-300')
}
>
{variant.sku.split('').map((letter, lIdx) => (
<span className="relative">
{letter}
{letter === skus[i]![lIdx] ? null : (
<div className="absolute left-0 right-0 top-0 bottom-0 bg-red-500 animate-ping rounded" />
)}
</span>
))}{' '}
(Shopify)
<br />
{skus[i]} (Expected)
</div>
</>
))}
</div>
);
})}
</div>
);
}

View File

@ -29,6 +29,7 @@ const productFragment = /* GraphQL */ `
node {
id
title
sku
availableForSale
selectedOptions {
name

View File

@ -75,6 +75,7 @@ export type ProductOption = {
export type ProductVariant = {
id: string;
title: string;
sku: string;
availableForSale: boolean;
selectedOptions: {
name: string;

View File

@ -28,6 +28,7 @@
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"cmdk": "^0.2.0",
"dropbox": "^10.34.0",
"lucide-react": "^0.263.1",
"next": "13.4.13-canary.15",
"react": "18.2.0",

87
pnpm-lock.yaml generated
View File

@ -32,6 +32,9 @@ dependencies:
cmdk:
specifier: ^0.2.0
version: 0.2.0(@types/react@18.2.16)(react-dom@18.2.0)(react@18.2.0)
dropbox:
specifier: ^10.34.0
version: 10.34.0(@types/node-fetch@2.6.4)
lucide-react:
specifier: ^0.263.1
version: 0.263.1(react@18.2.0)
@ -1114,9 +1117,15 @@ packages:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true
/@types/node-fetch@2.6.4:
resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==}
dependencies:
'@types/node': 20.4.4
form-data: 3.0.1
dev: false
/@types/node@20.4.4:
resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==}
dev: true
/@types/normalize-package-data@2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@ -1378,6 +1387,10 @@ packages:
engines: {node: '>=8'}
dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/autoprefixer@10.4.14(postcss@8.4.27):
resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
engines: {node: ^10 || ^12 || >=14}
@ -1625,6 +1638,13 @@ packages:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
dev: true
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/command-score@0.1.2:
resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==}
dev: false
@ -1720,6 +1740,11 @@ packages:
object-keys: 1.1.1
dev: true
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
@ -1756,6 +1781,18 @@ packages:
esutils: 2.0.3
dev: true
/dropbox@10.34.0(@types/node-fetch@2.6.4):
resolution: {integrity: sha512-5jb5/XzU0fSnq36/hEpwT5/QIep7MgqKuxghEG44xCu7HruOAjPdOb3x0geXv5O/hd0nHpQpWO+r5MjYTpMvJg==}
engines: {node: '>=0.10.3'}
peerDependencies:
'@types/node-fetch': ^2.5.7
dependencies:
'@types/node-fetch': 2.6.4
node-fetch: 2.7.0
transitivePeerDependencies:
- encoding
dev: false
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: true
@ -2290,6 +2327,15 @@ packages:
is-callable: 1.2.7
dev: true
/form-data@3.0.1:
resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/fraction.js@4.2.0:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true
@ -2936,6 +2982,18 @@ packages:
braces: 3.0.2
picomatch: 2.3.1
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
dev: false
/mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@ -3024,6 +3082,18 @@ packages:
- babel-plugin-macros
dev: false
/node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
dependencies:
whatwg-url: 5.0.0
dev: false
/node-releases@2.0.13:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
dev: true
@ -4015,6 +4085,10 @@ packages:
dependencies:
is-number: 7.0.0
/tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: false
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
@ -4195,6 +4269,17 @@ packages:
graceful-fs: 4.2.11
dev: false
/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false
/whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
dev: false
/which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:

View File

@ -6,5 +6,5 @@ module.exports = {
tabWidth: 2,
// pnpm doesn't support plugin autoloading
// https://github.com/tailwindlabs/prettier-plugin-tailwindcss#installation
plugins: [require('prettier-plugin-tailwindcss')]
// plugins: [require('prettier-plugin-tailwindcss')]
};

3200
yarn.lock

File diff suppressed because it is too large Load Diff