1- import { useState } from "react" ;
2- import { Form , useNavigation } from "react-router" ;
1+ import { useEffect , useState } from "react" ;
2+ import { Form , useNavigation , useSearchParams } from "react-router" ;
33
44import { VariantSelector } from "@/components/product/VariantSelector" ;
55import { Button , Container , Separator } from "@/components/ui" ;
@@ -22,17 +22,41 @@ export async function loader({ params }: Route.LoaderArgs) {
2222export default function Product ( { loaderData } : Route . ComponentProps ) {
2323 const { product } = loaderData ;
2424 const navigation = useNavigation ( ) ;
25+ const [ searchParams ] = useSearchParams ( ) ;
2526 const cartLoading = navigation . state === "submitting" ;
2627
27- // Si el producto tiene variantes, selecciona la primera por defecto
28- const [ selectedSize , setSelectedSize ] = useState (
29- product ?. variants ?. [ 0 ] ?. size ?? ""
30- ) ;
28+ const getInitialSize = ( ) => {
29+ const isValidSize = ( size : string | null ) => {
30+ return size === "small" || size === "medium" || size === "large" ;
31+ } ;
32+ const sizeFromUrl = searchParams . get ( "size" ) ;
33+ const availableSizes = product ?. variants ?. map ( ( v ) => v . size ) || [ ] ;
34+ if ( isValidSize ( sizeFromUrl ) && availableSizes . includes ( sizeFromUrl ) ) {
35+ return sizeFromUrl ;
36+ }
37+ return product ?. variants ?. [ 0 ] ?. size ?? "" ;
38+ } ;
3139
32- // Si el producto tiene variantes de stickers, selecciona la primera por defecto
33- const [ selectedMeasure , setSelectedMeasure ] = useState (
34- product ?. stickersVariants ?. [ 0 ] ?. measure ?? ""
35- ) ;
40+ const getInitialMeasure = ( ) => {
41+ const isValidMeasure = ( measure : string | null ) => {
42+ return measure === "3*3" || measure === "5*5" || measure === "10*10" ;
43+ } ;
44+ const measureFromUrl = searchParams . get ( "measure" ) ;
45+ const availableMeasures =
46+ product ?. stickersVariants ?. map ( ( v ) => v . measure ) || [ ] ;
47+ if ( isValidMeasure ( measureFromUrl ) && availableMeasures . includes ( measureFromUrl ) ) {
48+ return measureFromUrl ;
49+ }
50+ return product ?. stickersVariants ?. [ 0 ] ?. measure ?? "" ;
51+ } ;
52+
53+ const [ selectedSize , setSelectedSize ] = useState ( getInitialSize ) ;
54+ const [ selectedMeasure , setSelectedMeasure ] = useState ( getInitialMeasure ) ;
55+
56+ useEffect ( ( ) => {
57+ setSelectedSize ( getInitialSize ) ;
58+ setSelectedMeasure ( getInitialMeasure ) ;
59+ } , [ searchParams , product ?. id ] ) ;
3660
3761 if ( ! product ) {
3862 return < NotFound /> ;
0 commit comments