Nicholai 1378bff909 updated the following components to use the API instead of hardcoded data:
### 1. __artists-grid.tsx__ (Main Artist Browsing)

- Uses  hook from
- Fetches from  endpoint
- Includes loading states, error handling, and filtering
- __Impact:__ Primary artist browsing experience now fully API-driven

### 2. __artist-portfolio.tsx__ (Individual Artist Pages)

- Uses  hook
- Fetches from  endpoint
- Fixed all TypeScript errors (changed image ID from number to string)
- Added loading/error states
- __Impact:__ Artist detail pages now fully API-driven

### 3. __booking-form.tsx__ (Artist Selection Dropdown)

- Uses  hook for artist selection
- Updated to use API data structure ( array, , etc.)
- Added loading state for dropdown
- __Impact:__ Booking flow now uses real artist data

## ⚠️ REMAINING (Decorative/Marketing Components)

Two complex components still use hardcoded :

### 4. __artists-section.tsx__ (Homepage Hero - 348 lines)

- Homepage marketing section with complex parallax scrolling
- Uses hardcoded artist data for visual cards
- __Non-blocking:__ This is a decorative homepage element

### 5. __artists-page-section.tsx__ (Artists Page Section - 413 lines)

- Full-page artists showcase with parallax effects
- Uses hardcoded artist data for visual layout
- __Non-blocking:__ Alternative to artists-grid.tsx (which IS using API)

##
2025-10-06 04:44:08 -06:00

1 line
5.3 KiB
JavaScript

"use strict";(()=>{var e={};e.id=5998,e.ids=[5998],e.modules={72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},27790:e=>{e.exports=require("assert")},78893:e=>{e.exports=require("buffer")},84770:e=>{e.exports=require("crypto")},17702:e=>{e.exports=require("events")},32615:e=>{e.exports=require("http")},35240:e=>{e.exports=require("https")},86624:e=>{e.exports=require("querystring")},17360:e=>{e.exports=require("url")},21764:e=>{e.exports=require("util")},71568:e=>{e.exports=require("zlib")},27588:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>h,patchFetch:()=>b,requestAsyncStorage:()=>m,routeModule:()=>x,serverHooks:()=>j,staticGenerationAsyncStorage:()=>v});var o={};r.r(o),r.d(o,{DELETE:()=>y,GET:()=>g,POST:()=>f,dynamic:()=>c});var n=r(73278),s=r(45002),a=r(54877),i=r(71309),u=r(18445),p=r(33897),l=r(69518),d=r(1035);let c="force-dynamic";async function f(e,{params:t}={},r){try{let t=await (0,u.getServerSession)(p.Lz);if(!t?.user)return i.NextResponse.json({error:"Unauthorized"},{status:401});let o=await e.formData(),n=o.get("file"),s=o.get("key"),a=o.get("artistId"),c=o.get("caption"),f=o.get("tags");if(!n)return i.NextResponse.json({error:"No file provided"},{status:400});let y=(0,l.Jw)(n,{maxSize:10485760,allowedTypes:["image/jpeg","image/png","image/webp","image/gif"]},r?.env);if(!y.valid)return i.NextResponse.json({error:y.error},{status:400});let g=await (0,l.fo)(n,s,{contentType:n.type,metadata:{uploadedBy:t.user.id,uploadedAt:new Date().toISOString(),originalName:n.name,artistId:a||"",caption:c||"",tags:f||""}},r?.env);if(!g.success)return i.NextResponse.json({error:g.error||"Upload failed"},{status:500});if(a&&g.url)try{let e=f?JSON.parse(f):[];await (0,d.xd)(a,{url:g.url,caption:c||void 0,tags:e,orderIndex:0,isPublic:!0},r?.env)}catch(e){console.error("Failed to save portfolio image to database:",e)}return i.NextResponse.json({success:!0,url:g.url,key:g.key,filename:n.name,size:n.size,type:n.type})}catch(e){return console.error("Upload error:",e),i.NextResponse.json({error:"Upload failed"},{status:500})}}async function y(e,{params:t}={},o){try{let t=await (0,u.getServerSession)(p.Lz);if(!t?.user)return i.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:n}=new URL(e.url),s=n.get("key");if(!s)return i.NextResponse.json({error:"File key is required"},{status:400});let{deleteFromR2:a}=await Promise.resolve().then(r.bind(r,69518));if(!await a(s,o?.env))return i.NextResponse.json({error:"Failed to delete file"},{status:500});return i.NextResponse.json({success:!0,message:"File deleted successfully"})}catch(e){return console.error("Delete error:",e),i.NextResponse.json({error:"Delete failed"},{status:500})}}async function g(e,{params:t}={},r){try{let e=await (0,u.getServerSession)(p.Lz);if(!e?.user)return i.NextResponse.json({error:"Unauthorized"},{status:401});return i.NextResponse.json({error:"Presigned URLs not implemented yet. Use direct upload via POST."},{status:501})}catch(e){return console.error("Presigned URL error:",e),i.NextResponse.json({error:"Failed to generate presigned URL"},{status:500})}}let x=new n.AppRouteRouteModule({definition:{kind:s.x.APP_ROUTE,page:"/api/upload/route",pathname:"/api/upload",filename:"route",bundlePath:"app/api/upload/route"},resolvedPagePath:"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/api/upload/route.ts",nextConfigOutput:"standalone",userland:o}),{requestAsyncStorage:m,staticGenerationAsyncStorage:v,serverHooks:j}=x,h="/api/upload/route";function b(){return(0,a.patchFetch)({serverHooks:j,staticGenerationAsyncStorage:v})}},32482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},18445:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0});var o={};Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s.default}});var n=r(32482);Object.keys(n).forEach(function(e){!("default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(o,e))&&(e in t&&t[e]===n[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return n[e]}}))});var s=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=a(void 0);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in e)if("default"!==s&&({}).hasOwnProperty.call(e,s)){var i=n?Object.getOwnPropertyDescriptor(e,s):null;i&&(i.get||i.set)?Object.defineProperty(o,s,i):o[s]=e[s]}return o.default=e,r&&r.set(e,o),o}(r(4128));function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(a=function(e){return e?r:t})(e)}Object.keys(s).forEach(function(e){!("default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(o,e))&&(e in t&&t[e]===s[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return s[e]}}))})}};var t=require("../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),o=t.X(0,[9379,3670,4128,4833,3811],()=>r(27588));module.exports=o})();