<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muhammad Usman</title>
    <description>The latest articles on DEV Community by Muhammad Usman (@muhammad_usman_279dbe6379).</description>
    <link>https://dev.to/muhammad_usman_279dbe6379</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1642951%2Fa94150a4-9386-4a1c-8037-2171e3a2b4ab.jpg</url>
      <title>DEV Community: Muhammad Usman</title>
      <link>https://dev.to/muhammad_usman_279dbe6379</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhammad_usman_279dbe6379"/>
    <language>en</language>
    <item>
      <title>Unhandled Runtime Error TypeError: Cannot read properties of undefined (reading 'sizes')</title>
      <dc:creator>Muhammad Usman</dc:creator>
      <pubDate>Tue, 18 Jun 2024 04:39:36 +0000</pubDate>
      <link>https://dev.to/muhammad_usman_279dbe6379/unhandled-runtime-errortypeerror-cannot-read-properties-of-undefined-reading-sizes-4071</link>
      <guid>https://dev.to/muhammad_usman_279dbe6379/unhandled-runtime-errortypeerror-cannot-read-properties-of-undefined-reading-sizes-4071</guid>
      <description>&lt;p&gt;Unhandled Runtime Error&lt;br&gt;
TypeError: Cannot read properties of undefined (reading 'sizes')&lt;/p&gt;

&lt;p&gt;Source&lt;br&gt;
src\app\admin-view\add-product\page.js (164:34) @ sizes&lt;/p&gt;

&lt;p&gt;162 |             Available sizes&lt;br&gt;
  163 |             &amp;lt;TileComponent&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;164 |               selected={formData.sizes}&lt;br&gt;
      |                                  ^&lt;br&gt;
  165 |               onClick={handleTileClick}&lt;br&gt;
  166 |               data={AvailableSizes}&lt;br&gt;
  167 |             /&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"use client";&lt;/p&gt;

&lt;p&gt;import InputComponent from "@/components/FormElements/InputComponent";&lt;br&gt;
import SelectComponent from "@/components/FormElements/SelectComponent";&lt;br&gt;
import TileComponent from "@/components/FormElements/TileComponent";&lt;br&gt;
import ComponentLevelLoader from "@/components/Loader/componentlevel";&lt;br&gt;
import Notification from "@/components/Notification";&lt;br&gt;
import { GlobalContext } from "@/context";&lt;br&gt;
import { addNewProduct, updateAProduct } from "@/app/services/product";&lt;br&gt;
import {&lt;br&gt;
  AvailableSizes,&lt;br&gt;
  adminAddProductformControls,&lt;br&gt;
  firebaseConfig,&lt;br&gt;
  firebaseStorageURL,&lt;br&gt;
} from "@/utils";&lt;br&gt;
import { initializeApp } from "firebase/app";&lt;br&gt;
import {&lt;br&gt;
  getDownloadURL,&lt;br&gt;
  getStorage,&lt;br&gt;
  ref,&lt;br&gt;
  uploadBytesResumable,&lt;br&gt;
} from "firebase/storage";&lt;br&gt;
import { useRouter } from "next/navigation";&lt;br&gt;
import { useContext, useEffect, useState } from "react";&lt;br&gt;
import { toast } from "react-toastify";&lt;br&gt;
import { resolve } from "styled-jsx/css";&lt;/p&gt;

&lt;p&gt;const app = initializeApp(firebaseConfig);&lt;br&gt;
const storage = getStorage(app, firebaseStorageURL);&lt;/p&gt;

&lt;p&gt;const createUniqueFileName = (getFile) =&amp;gt; {&lt;br&gt;
  const timeStamp = Date.now();&lt;br&gt;
  const randomStringValue = Math.random().toString(36).substring(2, 12);&lt;/p&gt;

&lt;p&gt;return &lt;code&gt;${getFile.name}-${timeStamp}-${randomStringValue}&lt;/code&gt;;&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;async function helperForUPloadingImageToFirebase(file) {&lt;br&gt;
  const getFileName = createUniqueFileName(file);&lt;br&gt;
  const storageReference = ref(storage, &lt;code&gt;ecommerce/${getFileName}&lt;/code&gt;);&lt;br&gt;
  const uploadImage = uploadBytesResumable(storageReference, file);&lt;/p&gt;

&lt;p&gt;return new Promise((resolve, reject) =&amp;gt; {&lt;br&gt;
    uploadImage.on(&lt;br&gt;
      "state_changed",&lt;br&gt;
      (snapshot) =&amp;gt; {},&lt;br&gt;
      (error) =&amp;gt; {&lt;br&gt;
        console.log(error);&lt;br&gt;
        reject(error);&lt;br&gt;
      },&lt;br&gt;
      () =&amp;gt; {&lt;br&gt;
        getDownloadURL(uploadImage.snapshot.ref)&lt;br&gt;
          .then((downloadUrl) =&amp;gt; resolve(downloadUrl))&lt;br&gt;
          .catch((error) =&amp;gt; reject(error));&lt;br&gt;
      }&lt;br&gt;
    );&lt;br&gt;
  });&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const initialFormData = {&lt;br&gt;
  name: "",&lt;br&gt;
  price: 0,&lt;br&gt;
  description: "",&lt;br&gt;
  category: "men",&lt;br&gt;
  sizes: [],&lt;br&gt;
  deliveryInfo: "",&lt;br&gt;
  onSale: "no",&lt;br&gt;
  imageUrl: "",&lt;br&gt;
  priceDrop: 0,&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;export default function AdminAddNewProduct() {&lt;br&gt;
  const [formData, setFormData] = useState(initialFormData);&lt;/p&gt;

&lt;p&gt;const {&lt;br&gt;
    componentLevelLoader,&lt;br&gt;
    setComponentLevelLoader,&lt;br&gt;
    currentUpdatedProduct,&lt;br&gt;
    setCurrentUpdatedProduct,&lt;br&gt;
  } = useContext(GlobalContext);&lt;/p&gt;

&lt;p&gt;console.log(currentUpdatedProduct);&lt;/p&gt;

&lt;p&gt;const router = useRouter();&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    if (currentUpdatedProduct !== null) setFormData(currentUpdatedProduct);&lt;br&gt;
  }, [currentUpdatedProduct]);&lt;/p&gt;

&lt;p&gt;async function handleImage(event) {&lt;br&gt;
    const extractImageUrl = await helperForUPloadingImageToFirebase(&lt;br&gt;
      event.target.files[0]&lt;br&gt;
    );&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (extractImageUrl !== "") {
  setFormData({
    ...formData,
    imageUrl: extractImageUrl,
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;function handleTileClick(getCurrentItem) {&lt;br&gt;
    let cpySizes = [...formData.sizes];&lt;br&gt;
    const index = cpySizes.findIndex((item) =&amp;gt; item.id === getCurrentItem.id);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (index === -1) {
  cpySizes.push(getCurrentItem);
} else {
  cpySizes = cpySizes.filter((item) =&amp;gt; item.id !== getCurrentItem.id);
}

setFormData({
  ...formData,
  sizes: cpySizes,
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;async function handleAddProduct() {&lt;br&gt;
    setComponentLevelLoader({ loading: true, id: "" });&lt;br&gt;
    const res =&lt;br&gt;
      currentUpdatedProduct !== null&lt;br&gt;
        ? await updateAProduct(formData)&lt;br&gt;
        : await addNewProduct(formData);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(res);

if (res.success) {
  setComponentLevelLoader({ loading: false, id: "" });
  toast.success(res.message, {
    position: "top-right",
  });

  setFormData(initialFormData);
  setCurrentUpdatedProduct(null);
  setTimeout(() =&amp;gt; {
    router.push("/admin-view/all-products");
  }, 1000);
} else {
  toast.error(res.message, {
    position: "top-right",
  });
  setComponentLevelLoader({ loading: false, id: "" });
  setFormData(initialFormData);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;console.log(formData);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          
            accept="image/*"&lt;br&gt;
            max="1000000"&lt;br&gt;
            type="file"&lt;br&gt;
            onChange={handleImage}&lt;br&gt;
          /&amp;gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      &amp;lt;div className="flex gap-2 flex-col"&amp;gt;
        &amp;lt;label&amp;gt;Available sizes&amp;lt;/label&amp;gt;
        &amp;lt;TileComponent
          selected={formData.sizes}
          onClick={handleTileClick}
          data={AvailableSizes}
        /&amp;gt;
      &amp;lt;/div&amp;gt;
      {adminAddProductformControls.map((controlItem) =&amp;gt;
        controlItem.componentType === "input" ? (
          &amp;lt;InputComponent
            type={controlItem.type}
            placeholder={controlItem.placeholder}
            label={controlItem.label}
            value={formData[controlItem.id]}
            onChange={(event) =&amp;gt; {
              setFormData({
                ...formData,
                [controlItem.id]: event.target.value,
              });
            }}
          /&amp;gt;
        ) : controlItem.componentType === "select" ? (
          &amp;lt;SelectComponent
            label={controlItem.label}
            options={controlItem.options}
            value={formData[controlItem.id]}
            onChange={(event) =&amp;gt; {
              setFormData({
                ...formData,
                [controlItem.id]: event.target.value,
              });
            }}
          /&amp;gt;
        ) : null
      )}
      &amp;lt;button
        onClick={handleAddProduct}
        className="inline-flex w-full items-center justify-center bg-black px-6 py-4 text-lg text-white font-medium uppercase tracking-wide"
      &amp;gt;
        {componentLevelLoader &amp;amp;&amp;amp; componentLevelLoader.loading ? (
          &amp;lt;ComponentLevelLoader
            text={
              currentUpdatedProduct !== null
                ? "Updating Product"
                : "Adding Product"
            }
            color={"#ffffff"}
            loading={componentLevelLoader &amp;amp;&amp;amp; componentLevelLoader.loading}
          /&amp;gt;
        ) : currentUpdatedProduct !== null ? (
          "Update Product"
        ) : (
          "Add Product"
        )}
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;Notification /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;);&lt;br&gt;
}&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
