Skip to content

Commit 026b4b5

Browse files
hh
1 parent afed7bc commit 026b4b5

6 files changed

Lines changed: 92 additions & 45 deletions

File tree

components.json

Lines changed: 0 additions & 25 deletions
This file was deleted.

components/Yugioh/GridView.js

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,40 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
114114

115115
const getFullImagePath = useCallback( ( cardId ) => `/images/yugiohImages/${ String( cardId ) }.jpg`, [] );
116116

117+
const getCardImageSources = useCallback(
118+
( card ) => {
119+
const localImageSrc = card?.cardId ? getFullImagePath( card.cardId ) : null;
120+
const remoteImageSrc = typeof card?.remoteImageUrl === "string" && card.remoteImageUrl.trim()
121+
? card.remoteImageUrl.trim()
122+
: null;
123+
const primaryImageSrc = remoteImageSrc || localImageSrc || FALLBACK_IMAGE;
124+
const secondaryImageSrc = primaryImageSrc === remoteImageSrc ? localImageSrc : remoteImageSrc;
125+
126+
return {
127+
primaryImageSrc,
128+
secondaryImageSrc: secondaryImageSrc && secondaryImageSrc !== primaryImageSrc ? secondaryImageSrc : null,
129+
};
130+
},
131+
[ getFullImagePath ],
132+
);
133+
134+
const handleCardImageError = useCallback( ( event ) => {
135+
const image = event.currentTarget;
136+
const nextSrc = image.dataset.nextSrc;
137+
const fallbackSrc = image.dataset.fallbackSrc;
138+
139+
if ( nextSrc ) {
140+
image.src = nextSrc;
141+
image.dataset.nextSrc = "";
142+
return;
143+
}
144+
145+
if ( fallbackSrc ) {
146+
image.src = fallbackSrc;
147+
image.dataset.fallbackSrc = "";
148+
image.onerror = null;
149+
}
150+
}, [] );
117151

118152
const getFolderLabels = useCallback(
119153
( card ) => ( Array.isArray( card?.folderIds ) ? card.folderIds : [] )
@@ -217,8 +251,7 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
217251
{ memoizedAggregatedData.map( ( card ) => {
218252
if ( !card ) return null;
219253

220-
const cardIdImage = card.cardId ? getFullImagePath( card.cardId ) : null;
221-
const imageSrc = cardIdImage || card.remoteImageUrl || FALLBACK_IMAGE;
254+
const { primaryImageSrc, secondaryImageSrc } = getCardImageSources( card );
222255
const cardId = String( card._id ?? "" );
223256
const isSelected = isSelectionEnabled && selectedCardIds.has( cardId );
224257
const isFlipped = Boolean( flippedCards[ card._id ] );
@@ -345,9 +378,12 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
345378
<div className="relative flex aspect-[260/360] h-full max-h-[31rem] w-full items-center justify-center overflow-hidden rounded-[6px] border border-white/10 bg-black/40 transition duration-300 group-hover:border-indigo-400/60 dark:border-white/20 dark:bg-gray-900/60">
346379
<img
347380
className="mx-auto h-full w-full object-top object-cover"
348-
src={ imageSrc }
381+
src={ primaryImageSrc }
349382
alt={ `Card Image - ${ card.productName }` }
350383
loading="lazy"
384+
data-next-src={ secondaryImageSrc || "" }
385+
data-fallback-src={ FALLBACK_IMAGE }
386+
onError={ handleCardImageError }
351387
/>
352388
<div
353389
aria-hidden="true"

next.config.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
const path = require("path");
2+
const ignoredAssetWatchPattern = /[\\/]public[\\/]images[\\/]yugiohImages(?:Cropped)?[\\/]/;
23

4+
const mergeWebpackIgnoredPaths = ( ignored ) => {
5+
if ( !ignored ) {
6+
return [ ignoredAssetWatchPattern ];
7+
}
8+
9+
return Array.isArray( ignored )
10+
? [ ...ignored, ignoredAssetWatchPattern ]
11+
: [ ignored, ignoredAssetWatchPattern ];
12+
};
313
/** @type {import('next').NextConfig} */
414
const nextConfig = {
515
reactStrictMode: true,
@@ -8,6 +18,17 @@ const nextConfig = {
818
root: path.join(__dirname),
919
},
1020

21+
webpack: ( config, { dev } ) => {
22+
if ( dev ) {
23+
config.watchOptions = {
24+
...( config.watchOptions || {} ),
25+
ignored: mergeWebpackIgnoredPaths( config.watchOptions?.ignored ),
26+
};
27+
}
28+
29+
return config;
30+
},
31+
1132
async headers() {
1233
return [
1334
{
@@ -43,4 +64,4 @@ const nextConfig = {
4364
},
4465
};
4566

46-
module.exports = nextConfig;
67+
module.exports = nextConfig;

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
"version": "0.1.0",
44
"private": true,
55
"scripts": {
6-
"dev": "next dev --webpack",
6+
"dev": "next dev --turbopack",
77
"dev:turbo": "next dev --turbopack",
8-
"build": "next build --webpack",
8+
"dev:webpack": "next dev --webpack",
9+
"build": "next build --turbopack",
10+
"build:webpack": "next build --webpack",
911
"start": "next start",
1012
"lint": "next lint",
1113
"refresh:sports-cache": "node scripts/refresh-sports-cache.js"

pages/yugioh/my-collection.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useEffect, useMemo, useState } from "react";
1+
import { useCallback, useEffect, useMemo, useState } from "react";
22
import Head from "next/head";
33
import dynamic from "next/dynamic";
44
import { useRouter } from "next/router";
@@ -54,12 +54,27 @@ const ALL_FOLDERS_ID = "all";
5454
const UNCATEGORIZED_FOLDER_ID = "uncategorized";
5555

5656
const getCardFolderIds = ( card ) => (
57-
Array.isArray( card?.folderIds ) ? card.folderIds.map( ( folderId ) => String( folderId ) ) : []
57+
Array.isArray( card?.folderIds )
58+
? card.folderIds
59+
.map( ( folderId ) => String( folderId ?? "" ).trim() )
60+
.filter( Boolean )
61+
: []
5862
);
5963

6064
const normalizeFolder = ( folder ) => ( {
6165
...folder,
6266
_id: String( folder?._id ?? "" ),
67+
name: String( folder?.name ?? "" ).trim(),
68+
} );
69+
70+
const normalizeCollectionCard = ( card ) => ( {
71+
...card,
72+
_id: String( card?._id ?? "" ),
73+
cardId: card?.cardId === null || card?.cardId === undefined ? null : String( card.cardId ).trim(),
74+
remoteImageUrl: typeof card?.remoteImageUrl === "string" && card.remoteImageUrl.trim()
75+
? card.remoteImageUrl.trim()
76+
: null,
77+
folderIds: getCardFolderIds( card ),
6378
} );
6479

6580
const MyCollection = ( { initialAuthState = false } ) => {
@@ -103,7 +118,7 @@ const MyCollection = ( { initialAuthState = false } ) => {
103118
}
104119

105120
const data = await response.json();
106-
return Array.isArray( data ) ? data : [];
121+
return Array.isArray( data ) ? data.map( normalizeCollectionCard ).filter( ( card ) => card._id ) : [];
107122
}, [] );
108123

109124
const fetchFolders = useCallback( async () => {
@@ -119,7 +134,7 @@ const MyCollection = ( { initialAuthState = false } ) => {
119134
}
120135

121136
const data = await response.json();
122-
return Array.isArray( data ) ? data.map( normalizeFolder ).filter( ( folder ) => folder._id ) : [];
137+
return Array.isArray( data ) ? data.map( normalizeFolder ).filter( ( folder ) => folder._id && folder.name ) : [];
123138
}, [] );
124139

125140
useEffect( () => {

tsconfig.json

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"compilerOptions": {
3-
"target": "ES2017",
3+
"target": "es2025",
44
"lib": [
55
"dom",
66
"dom.iterable",
@@ -11,28 +11,26 @@
1111
"./*"
1212
]
1313
},
14-
"allowJs": false,
14+
"allowJs": true,
1515
"skipLibCheck": true,
1616
"strict": true,
1717
"noEmit": true,
1818
"incremental": true,
19-
"module": "esnext",
19+
"module": "nodenext",
2020
"esModuleInterop": true,
21-
"moduleResolution": "bundler",
21+
"moduleResolution": "nodenext",
2222
"resolveJsonModule": true,
2323
"isolatedModules": true,
2424
"jsx": "react-jsx",
2525
"forceConsistentCasingInFileNames": true
2626
},
2727
"include": [
2828
"next-env.d.ts",
29-
".next/types/**/*.ts",
30-
".next/dev/types/**/*.ts",
3129
"**/*.ts",
32-
"**/*.tsx"
30+
"**/*.tsx",
31+
"**/*.js"
3332
],
3433
"exclude": [
35-
"node_modules",
36-
".next/cache"
34+
"node_modules"
3735
]
38-
}
36+
}

0 commit comments

Comments
 (0)