<?xml version="1.0" encoding="UTF-8"?>
        <rss version="2.0"
          xmlns:content="http://purl.org/rss/1.0/modules/content/"
          xmlns:atom="http://www.w3.org/2005/Atom"
        >
        <channel>
          <title><![CDATA[مُركَّز]]></title>
          <description><![CDATA[
        مقالات تقنية مبسطة بدون حشو.
          ]]></description>
          <link>https://murakkaz.vercel.app/</link>
          <language>ar</language>
          <lastBuildDate>Sun, 24 May 2026 07:01:55 GMT</lastBuildDate>
          <generator>Murakkaz RSS Engine</generator>
          <atom:link href="https://murakkaz.vercel.app//rss.xml" rel="self" type="application/rss+xml" />
          
        <item>
          <title><![CDATA[ماهو <Activity /> في عالم react؟]]></title>
          <link>https://murakkaz.vercel.app//article/activity-component-react</link>
          <guid isPermaLink="false">69d8f872b462f2a74b60b330</guid>
          <pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate>
          <description><![CDATA[ميزة جديدة وجميلة من react للتعامل مع اظهار واخفاء المكونات وتحسين الاداء]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1766838129/tufr9mwxi9yvfsmzkmnl.png" type="image/png" />
          <content:encoded><![CDATA[
        <h2>ماهو &lt;Activity /&gt;</h2>
<p>تم اطلاق Activity component في react 19.2 للتعامل مع اخفاء واظهار العناصر بشكل مناسب للاداء ولتقليل العمليات الغير ضرورية اثناء تصفح موقعك المبني باستخدام react وما يتبعها.</p>

<hr/>

<h2>ما علاقته بتحسين الاداء؟</h2>
<p>عند الاغلاق باستخدام useState او باستخدام الشروط عموما (if - else) يتم اعادة تصفير قيم الجزء المخفي وهذا لوحده يعتبر اداء اضافي على موارد الجهاز وسرعة الموقع
واذا قمت بالاخفاء عبر css باستخدام display: none; فكانك يابو زيد ما غزيت لأن انت نعم اخفيت العنصر ولكن كامل العنصر مازال شغال بكامل عملياته في الخلفية وهذا حمل على الذاكره وعلى موارد الجهاز</p>

<hr/>

<h2>ماهي فكرته؟</h2>
<p>وهنا فكرة Activity component تظهر بقوة بحيث انه يمكنك من اخفاء العنصر بالاضافة لايقاف عملياته بشكل حرفي يعني حتى تصفير القيم لن يتم، يعني لو كان عندك input مكتوب بداخله “السلام عليكم ورحمة الله وبركاته” واغلقت الفورم او الـinput ورجعت فتحته رح تلاقي “السلام عليكم ورحمة الله وبركاته” موجودة كما هي وهنا استفدنا امرين

اولا ما سببنا حمل اضافي على الموقع
ثانيا حافظنا على البيانات للرجوع لها (لأن في بعض الحالات نحتاج هذا الموضوع)</p>

<hr/>

<h2>شكل استخدامه</h2>

          <p>tsx</p>
          <pre><code>import { Activity, useState } from &apos;react&apos;;
import AdminSettings from &apos;./_components/AdminSettings&apos;;
const page = () =&gt; {
  const [IsOpen, setIsOpen] = useState&lt;boolean&gt;(false);
  return (
    &lt;div&gt;
      &lt;Activity mode={IsOpen ? &apos;visible&apos;: &apos;hidden&apos;}&gt;
        &lt;AdminSettings /&gt;
      &lt;/Activity&gt;
    &lt;/div&gt;
  );
};
export default page;</code></pre>
          ]]></content:encoded>
        </item>
        <item>
          <title><![CDATA[الفرق بين middleware و proxy بعد اخر تحديث في nextjs]]></title>
          <link>https://murakkaz.vercel.app//article/proxy-vs-middleware</link>
          <guid isPermaLink="false">69d8f798b462f2a74b60b32c</guid>
          <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
          <description><![CDATA[بعد نسخة nextjs 16 اكيد انك لاحظت ظهور رسالة في الترمنال تقول “The 'middleware' file convention is deprecated. Please use 'proxy' instead.”]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1765900435/elwnby9rkuznoiyus0zc.png" type="image/png" />
          <content:encoded><![CDATA[
        <h2>بكل اختصار</h2>
<p>هو فرق تسميات لا اكثر، السبب يعود إلى ان الفريق المطور لـnextjs رأى ان اسم middleware لا يعبر عن مهمة الملف او انه اسم كبير على ما يقوم به الملف بشكل فعلي من تنفيذ بعض المهام البسيطة عند فتح الموقع مثل التحقق من بعض الشروط الحساسة بحكم ان nextjs تعتبر full stack framework بحيث تستطيع عمل back end و front end (مع انه ليس شيء صحيح الاعتماد عليه في الباك اند خاصة اذا كان موقع فيه بيانات حساسة) فتم تحويله إلى proxy لأنه يعبر عن مهمة الملف الفعلية بحيث يكون عبارة عن طبقة اثناء تنفيذ البرنامج او جزء من البرنامج.</p>

<hr/>

<p>فقط قم بتغيير اسم ملف middleware.ts إلى proxy.ts</p>

<hr/>

<p>[https://nextjs.org/docs/messages/middleware-to-proxy](https://nextjs.org/docs/messages/middleware-to-proxy)</p>
          ]]></content:encoded>
        </item>
        <item>
          <title><![CDATA[ماهو React Design Patterns?]]></title>
          <link>https://murakkaz.vercel.app//article/react-design-patterns</link>
          <guid isPermaLink="false">69d8f637b462f2a74b60b32a</guid>
          <pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate>
          <description><![CDATA[طرق أو أساليب احترافية لتنظيم وكتابة الكود في React/Nextjs، بحيث يكون الكود نظيف، قابل لإعادة الاستخدام، وسهل الصيانة مع نمو المشروع.]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1760987592/yu0d9111zjoc7bq1q3fr.png" type="image/png" />
          <content:encoded><![CDATA[
        <h2>اهمية استخدام Design Patterns</h2>
<p>الـDesign Patterns هي طرق أو أساليب احترافية لتنظيم وكتابة الكود في React، بحيث يكون الكود نظيف، قابل لإعادة الاستخدام، وسهل الصيانة مع نمو المشروع.

لما مشروعك يبدأ يكبر، الكود بيبدأ &apos;يتعقد&apos; — تلاقي نفسك تكرر منطق، تعمل تغييرات كثيرة في أماكن مختلفة، أو تضيف ميزة فتتكسر مية حاجة بعدها.
هنا تأتي الـDesign Patterns كمنقذ، بتعطيك حلول ذكية ومنظّمة للمشاكل هذه؛ فالـDesign Patterns ليست مجرد قواعد أو طريقة كتابة، هي &lt;strong&gt;خطة واضحة&lt;/strong&gt; تساعدك تتعامل مع المشاكل اللي تواجهك يوميًا في تطوير

خلينا من الكلام النظري وندخل في الامثلة العملية لأن الدزاين باترنس اما انك تتعلمها بشكل عملي او انك رح تواجه صعوبة في استخدامها فيما بعد او حتى معرفة اهميتها…..</p>

<hr/>

<h2>Compound Components Pattern</h2>
<p>قبل ما اعرف عن هذا النمط رح اقلك ان هذا النمط هو اللي جذبني لموضوع الـDesign Patterns اما عن تعريفه فهو نمط فكرته تكمن في امكانية استخدام عدة مكونات من من مكون واحد بمعنى لو عندك Card.tsx انت يمكن في مكان ما في الموقع تريد عرض كامل الـCard وفي مكان آخر تريد عرض مثلا الـCard بدون صورة وفي مكان آخر مع فيديو فمن غير الاحترافي انك تمرر prop لكل ميزة وبنفس الوقت من اهم قواعد البرمجة عدم تكرار الكود اللي تسويه فما رح يكون امر احترافي انك تسوي component منفصل لكل ميزة فهنا تأتي جمايلة Compound Components Pattern 
(وطبعا المثال السابق هو احد استخداماته لأن يمكن استخدامه بفكرة رح اشير لها في الاسفل بعد ما اعرضلك كود عن هذا الـPattern الجميل)</p>

          <p>tsx</p>
          <pre><code> // app/_components/Card.tsx
export default function Card({ children }: { children: React.ReactNode }) {
  return &lt;div className=&apos;card rounded-md&apos;&gt;{children}&lt;/div&gt;;
}
Card.Title = function Title() {
  return (
    &lt;div&gt;
      &lt;h3&gt;Card Title&lt;/h3&gt;
    &lt;/div&gt;
  );
};
Card.Content = function Content({ children }: { children: React.ReactNode }) {
  return (
    &lt;div&gt;
      &lt;p&gt;{children}&lt;/p&gt;
    &lt;/div&gt;
  );
};
Card.Action = function Action() {
  return (
    &lt;div&gt;
      &lt;button&gt;Action&lt;/button&gt;
    &lt;/div&gt;
  );
};
Card.Footer = function Footer() {
  return (
    &lt;div&gt;
      &lt;p&gt;Card footer&lt;/p&gt;
    &lt;/div&gt;
  );
};</code></pre>

<hr/>

<p>النتيجة او آلية الاستخدام...</p>

          <p>tsx</p>
          <pre><code> // app/page.tsx
&lt;Card&gt;
  &lt;Card.Title /&gt;
  &lt;Card.Content&gt;123&lt;/Card.Content&gt;
  &lt;Card.Action /&gt;
  &lt;Card.Footer /&gt;
&lt;/Card&gt;;</code></pre>

<hr/>

<p>اما الفكرة اللي قلت اني رح اشير لها بخصوص هذا النمط هي استخدام هذا النمط لعرض مثلا رسائل الركويستات او حتى التنبيهات اللي تظهر بشكل عائم امام اليوزر في حال ما حبيت تستخدم مكاتب جاهزة</p>

          <p>tsx</p>
          <pre><code> // app/_Articles/_components/ArticlesState.tsx
import React from &apos;react&apos;;
const ArticlesState = ({ children }: { children: React.ReactNode }) =&gt; {
  return &lt;div&gt;{children}&lt;/div&gt;;
};
ArticlesState.loading = function Loading() {
  return (
    &lt;div&gt;
      &lt;h2&gt; جار تحميل المقالات&lt;/h2&gt;
    &lt;/div&gt;
  );
};
ArticlesState.error = function Error() {
  return (
    &lt;div&gt;
      &lt;h2&gt;حدث خطأ في تحميل المقالات&lt;/h2&gt;
    &lt;/div&gt;
  );
};
ArticlesState.empty = function empty() {
  return (
    &lt;section&gt;
      &lt;h2&gt;لا يوجد مقالات بعد...&lt;/h2&gt;
    &lt;/section&gt;
  );
};
export default ArticlesState;</code></pre>

<hr/>

<p>احد اشكال الاستدعاء</p>

          <p>tsx</p>
          <pre><code> // app/page.tsx
const Articles = dynamic(() =&gt; import(&apos;./_Articles/Articles&apos;), {
  loading: () =&gt; (
    &lt;ArticlesState&gt;
      &lt;ArticlesState.loading /&gt;
    &lt;/ArticlesState&gt;
  ),
});</code></pre>

<hr/>

<h2>Container-Presentational Pattern</h2>
<p>وهنا جينا لعنوان رنان في عالم البرمجة وهو الـclean code او الكود النظيف لأن هذا النمط او الـPattern رح يساعدك في هذا الامر؛ الـContainer Presentational Pattern هو نمط يقلك تعلم انك تفصل المنطق البرمجي عن اجزاء العرض حتى يكون الكود سهل الفهم والتتبع والتصحيح او التعديل بمعنى تخيل مثلا عندك صفحة تحتوي على ارسال واستقبال وتعديل وحذف بيانات (جميع العمليات التي تندرج تحت مفهوم CRUD) بالاضافة للكود اللي يعرض نتيجة هذه العمليات... هنا هل تشوف ان الكود رح يكون مقبول شكليا او على الاقل سهل التعامل معاه؟ خاصة عند محاولة اضافة او تغيير ميزة هنا رح تشوف المعنى الحرفي لمصطلح الـspaghetti code

وهنا يأتي دور الـContainer Presentational Pattern بحيث ينبهك إلى ان تقوم بفصل كود او واجهة العرض عن المنطق البرمجي</p>

<hr/>

<p>المنطق البرمجي</p>

          <p>tsx</p>
          <pre><code> // app/_Articles/Articles.tsx
&apos;use client&apos;;
import axios from &apos;axios&apos;;
import { useInfiniteQuery } from &apos;@tanstack/react-query&apos;;
import { useEffect } from &apos;react&apos;;
import { useInView } from &apos;react-intersection-observer&apos;;
import PresentationalArticles from &apos;./PresentationalArticles&apos;;
import { ArticlesResponse } from &apos;@/types/Articles&apos;;
export default function Articles({
  initialArticles,
  tag,
}: {
  initialArticles: ArticlesResponse;
  tag?: string;
}) {
  const {
    data,
    fetchNextPage,
    hasNextPage,
    isFetchingNextPage,
    isLoading,
    isError,
  } = useInfiniteQuery({
    queryKey: [&apos;articles&apos;, tag],
    queryFn: ({ pageParam = 1 }) =&gt;
      axios
        .get(
          !tag
            ? `/api/articles?page=${pageParam}&amp;limit=6`
            : `/api/tags/${tag}?page=${pageParam}&amp;limit=6`
        )
        .then((res) =&gt; res.data as ArticlesResponse),
    getNextPageParam: (lastPage) =&gt;
      lastPage.pagination?.hasMore ? lastPage.pagination.page + 1 : undefined,
    initialData: {
      pages: [initialArticles!],
      pageParams: [1],
    },
    initialPageParam: 1,
  });
  const { ref, inView } = useInView({
    threshold: 0,
    rootMargin: &apos;1000px&apos;,
  });
  useEffect(() =&gt; {
    if (inView &amp;&amp; hasNextPage &amp;&amp; !isFetchingNextPage) {
      fetchNextPage();
    }
  }, [inView, hasNextPage, isFetchingNextPage, fetchNextPage]);
  const articles =
    data?.pages
      .flatMap((page) =&gt; page.articles)
      .filter((article) =&gt; article?._id &amp;&amp; article?.slug)
      .filter(
        (article, index, self) =&gt;
          index === self.findIndex((a) =&gt; a?._id === article?._id)
      ) || [];
  return (
    &lt;PresentationalArticles
      isLoading={isLoading}
      isError={isError}
      articles={articles}
      hasNextPage={hasNextPage}
      inViewRef={ref}
    /&gt;
  );
}</code></pre>

<hr/>

<p>منطق عرض نتائج محتوى الكود</p>

          <p>tsx</p>
          <pre><code> // app/_Articles/PresentationalArticles.tsx
import { PresentationalArticlesProps } from &apos;@/types/Articles&apos;;
import dynamic from &apos;next/dynamic&apos;;
import Link from &apos;next/link&apos;;
import React from &apos;react&apos;;
import ArticlesState from &apos;./_components/ArticlesState&apos;;
const ArticleImage = dynamic(() =&gt; import(&apos;./_components/ArticleImage&apos;), {
  ssr: false,
  loading: () =&gt; (
    &lt;div className=&apos; w-full h-[300px] rounded-2xl aspect-[16/9] bg-gray-600 animate-pulse&apos; /&gt;
  ),
});
const PresentationalArticles: React.FC&lt;PresentationalArticlesProps&gt; = ({
  isError,
  isLoading,
  articles,
  hasNextPage,
  inViewRef,
}) =&gt; {
  return (
    &lt;&gt;
      {isLoading &amp;&amp; (
        &lt;ArticlesState&gt;
          &lt;ArticlesState.loading /&gt;
        &lt;/ArticlesState&gt;
      )}
      {isError &amp;&amp; (
        &lt;ArticlesState&gt;
          &lt;ArticlesState.error /&gt;
        &lt;/ArticlesState&gt;
      )}
      {articles.length === 0 &amp;&amp; !isLoading &amp;&amp; (
        &lt;ArticlesState&gt;
          &lt;ArticlesState.empty /&gt;
        &lt;/ArticlesState&gt;
      )}
      &lt;section className=&apos;grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 px-0 py-5 sm:p-5 gap-x-10 gap-y-16&apos;&gt;
        {articles.map((article, i: number) =&gt; (
          &lt;div key={article._id} className=&apos;space-y-4&apos;&gt;
            &lt;Link href={`/article/${article.slug}`} className=&apos;block&apos;&gt;
              &lt;ArticleImage banner={article.banner} i={i} /&gt;
            &lt;/Link&gt;
            &lt;p className=&apos;flex justify-center items-center gap-5&apos;&gt;
              &lt;span className=&apos;text-secondary/75&apos;&gt;
                {new Date(article.createdAt).toLocaleDateString(&apos;en-GB&apos;)}
              &lt;/span&gt;
              &lt;Link
                href={`/tags/${article.tag}`}
                className=&apos;capitalize truncate max-w-32 text-secondary bg-[#1e293999] hover:bg-[#1e2939] py-1 px-4 rounded-2xl transition-all&apos;
              &gt;
                {article.tag}
              &lt;/Link&gt;
            &lt;/p&gt;
            &lt;Link href={`/article/${article.slug}`}&gt;
              &lt;h2 className=&apos;text-xl font-bold mt-2 mb-4 truncate max-w-full&apos;&gt;
                {article.title}
              &lt;/h2&gt;
              &lt;p className=&apos;line-clamp-3 text-secondary max-w-full&apos;&gt;
                {article.description}
              &lt;/p&gt;
            &lt;/Link&gt;
          &lt;/div&gt;
        ))}
      &lt;/section&gt;
      {hasNextPage &amp;&amp; (
        &lt;div ref={inViewRef} className=&apos;w-full h-40&apos;&gt;
          {/* {isFetchingNextPage ? (
            &lt;div className=&apos;flex items-center gap-2&apos;&gt;
              &lt;div className=&apos;animate-spin rounded-full h-6 w-6 border-b-2 border-primary&apos;&gt;&lt;/div&gt;
              &lt;span className=&apos;text-secondary&apos;&gt;جاري تحميل المزيد...&lt;/span&gt;
            &lt;/div&gt;
          ) : (
            &lt;div className=&apos;text-secondary&apos;&gt;اسحب لأسفل لتحميل المزيد&lt;/div&gt;
          )} */}
        &lt;/div&gt;
      )}
    &lt;/&gt;
  );
};
export default PresentationalArticles;</code></pre>

<hr/>

<h2>Custom Hooks Pattern</h2>
<p>هنا لا تخاف ما رح اتكلم كثير بس رح اشوفك كيف ان ممكن تحويل منطق برمجي على شكل hook او component منفصل امر ممتع.....</p>

<hr/>

<p>الـhook ومنطقها البرمجي</p>

          <p>tsx</p>
          <pre><code>// app/_Articles/_components/initialArticlesHook.tsx
import { ArticlesResponse } from &apos;@/types/Articles&apos;;
import ArticlesState from &apos;./ArticlesState&apos;;
const initialArticlesHook = async ({ tag }: { tag?: string } = {}) =&gt; {
  const res = await fetch(
    !tag
      ? `${process.env.url}/api/articles?page=1&amp;limit=6`
      : `${process.env.url}/api/tags/${tag}?page=1&amp;limit=6`,
    {
      next: { revalidate: !tag ? 1000 * 60 * 5 : 0 },
    }
  );
  if (!res.ok) {
    &lt;ArticlesState&gt;
      &lt;ArticlesState.error /&gt;
    &lt;/ArticlesState&gt;;
  }
  const initialArticles: ArticlesResponse = await res.json();
  if (initialArticles.articles?.length === 0) {
    &lt;ArticlesState&gt;
      &lt;ArticlesState.empty /&gt;
    &lt;/ArticlesState&gt;;
  }
  return { initialArticles };
};
export default initialArticlesHook;</code></pre>

<hr/>

<p>الاستفادة</p>

          <p>tsx</p>
          <pre><code> // app/page.tsx
import React from &apos;react&apos;;
import ArticlesState from &apos;./_Articles/_components/ArticlesState&apos;;
import dynamic from &apos;next/dynamic&apos;;
import initialArticlesHook from &apos;./_Articles/_components/initialArticlesHook&apos;;
const Articles = dynamic(() =&gt; import(&apos;./_Articles/Articles&apos;), {
  loading: () =&gt; (
    &lt;ArticlesState&gt;
      &lt;ArticlesState.loading /&gt;
    &lt;/ArticlesState&gt;
  ),
});
const page = async () =&gt; {
  const { initialArticles } = await initialArticlesHook();
  return (
    &lt;div className=&apos;p-5 space-y-4&apos;&gt;
      &lt;h1 className=&apos;text-3xl md:text-4xl text-center font-bold&apos;&gt;مُركَّز&lt;/h1&gt;
      &lt;p className=&apos;text-center text-xl md:text-2xl text-secondary max-w-4xl m-auto&apos;&gt;
        مُركَّز منصة اجمع فيها مقالاتي التي تكون عبارة عن ملخص لمعلومة برمجية
        بدون كثرة مقدمات او تمطيط للكلام....
      &lt;/p&gt;
      &lt;Articles initialArticles={initialArticles} /&gt;
    &lt;/div&gt;
  );
};
export default page;</code></pre>

<hr/>

<p>وبهذا الشكل اصبح بامكانك الاستفادة من هذا المنطق البرمجي في اي مكان في الموقع وبدون تكرار وتكون طبقت مصطلح don&quot;t repeat yourself في عالم البرمجة</p>

<hr/>

<h2>Higher-Order Components (HOCs)</h2>
<p>اذا عندك خواص عامة مشتركة بين عدة مكونات او تريد تنفيذ شرط معين على عدة مكونات فهذا النمط يخليك تحدد هذا المنطق او الخواص من مكان محدد ثم كل عنصر جديد يمر بداخله يحصل على هذه الميزات وهو شبيه بنمط الـCustom Hooks Pattern إلى حد ما، ولكن ركز معي لأني رح اضيف شكلين لطريقة استخدامه والشكل الثاني مهم في عالم الحماية من ناحية الفرونت اند</p>

<hr/>

<p>اولا- اعطاء خواص معينة لعدة عناصر (وهنا كما قلت يشبه موضوع الـCustom Hooks Pattern إلى حد ما)</p>

          <p>tsx</p>
          <pre><code>import React from &apos;react&apos;;
export default function WithStyles(Component: React.ComponentType&lt;any&gt;) {
  return (props: {[key: string]: any }) =&gt; {
    const style = { padding: 10, margin: 10 };
    return &lt;Component style={style} {...props} /&gt;;
};
}
 // الاستخدام
import { ButtonHTMLAttributes } from &apos;react&apos;;
import WithStyles from &apos;./WithStyles&apos;;
export default function Button(props: {
  props: ButtonHTMLAttributes&lt;HTMLButtonElement&gt;;
}) {
  return &lt;button {...props}&gt;Click Me!&lt;/button&gt;;
}
export const StyledButton = WithStyles(Button);</code></pre>

<hr/>

<p>ثانيا- استخدامه في عمليات التحقق من تسجيل دخول المستخدم على سبيل المثال (Authorization/Authentication)، الفكرة انه قبل ما تعرض الـComponent يتحقق من شرط معين (مثلاً حالة تسجيل الدخول أو صلاحيات المستخدم)</p>

          <p>tsx</p>
          <pre><code>&apos;use client&apos;
import { useEffect, useState } from &apos;react&apos;;
import { useRouter } from &apos;next/navigation&apos;;
import { ComponentType } from &apos;react&apos;;
function withAuth&lt;P&gt;(WrappedComponent: ComponentType&lt;P&gt;) {
  const ComponentWithAuth = (props: P) =&gt; {
    const router = useRouter();
    const [isAuthorized, setIsAuthorized] = useState&lt;boolean | null&gt;(null);
    useEffect(() =&gt; {
      const token = localStorage.getItem(&apos;token&apos;);
      if (token) setIsAuthorized(true);
},[router]);
    if (isAuthorized === null) return null;
    return &lt;WrappedComponent {...props} /&gt;;
};
  return ComponentWithAuth;
}</code></pre>

<hr/>

<p>لن يتم عرض العناصر المررة إلى &apos;withAuth&apos; في حال كان المستخدم لم يسجل الدخول بعد</p>

          <p>tsx</p>
          <pre><code>const DeleteItem = () =&gt; &lt;div&gt;🗑️ حذف العنصر&lt;/div&gt;;
const ProtectedDeleteItem = withAuth(DeleteItem);
export default function Page() {
  return &lt;ProtectedDeleteItem /&gt;;
}</code></pre>

<hr/>

<p>اعلم انه في nextjs وما شابه يمكن منع المستخد من الوصول لبعض الصفحات عبر ملف middleware.ts ولكن تذكر انه للصفحات وليس للمكونات اما الـHOCs هذا النمط يساعدك على التحكم في امكانية الوصول للمكونات وبدون وضع شروط لكل مكون او تكرار نفس الكود (فعاليته تظهر في المشاريع الكبيرة لأنه يختصر امور كثيرة ويقلل الوقت وهذا الهدف من استخدام كل او جل الـPatterns)
 
(&lt;strong&gt;تنويه:&lt;/strong&gt; يتم في كل مرة إنشاء وإرجاع عنصر جديد أو منفصل عن الأصل، بمعنى انه بإمكانك استخدام أكثر من HOC واحد مع نفس المكوّن، لأن التأثير يُطبَّق على النسخة الناتجة من التغليف، وليس على المكوّن الأصلي نفسه)</p>

          <p>tsx</p>
          <pre><code>const A = withLogger(Button);
const B = withAuth(Button);</code></pre>

<hr/>

<h2>Portal Pattern</h2>
<p>هو نمط وخاصية بنفس الوقت وفكرة الـPortal Pattern هي وضع بعض العناصر خارج ترتيبها الطبيعي في الـDOM مثلا لو عندك اي شيء يعرض على الشاشة فبطبيعة الحال هو رح يكون داخل الـroot فسيتم تطبيق عليه جميع تأثيرات العنصر الاساسي اللي هو فيه (مثل الـoverflow أو z-index أو position) ولكن احيانا تريد عرض مثلا قائمة منسدلة او نافذة عائمة فتحتاج اولا انها تكون فوق جميع العناصر ثانيا انها ما تتأثر بمكان العنصر الاساسي اللي يحتويه وبنفس الوقت تحتاج ان تأخذ بيانات من هذا العنصر الاساسي كـprops، فهنا يكمن دور هذا النمط حيث يمكنك من انشاء عنصر في اي مكان في الـDOM اين ما كان موضعه الاساسي عبر خاصية createPortal من react-dom ثم تحديد المكان الذي تريد عرضه فيه مع الحفاظ على الاتصال من ناحية المنطق البرمجي مع العنصر الاساسي او كما يطلق عليه العنصر الاب (parent element)</p>

          <p>tsx</p>
          <pre><code>import React from &apos;react&apos;;
import { createPortal } from &apos;react-dom&apos;;
interface ModalProps {
  isOpen: boolean;
  handleClose: () =&gt; void;
  children: React.ReactNode;
}
export default function Modal({ isOpen, handleClose, children }: ModalProps) {
  if (isOpen === false) return null;
  return createPortal(
    &lt;div
      style={{
        position: &apos;fixed&apos;,
        inset: 0,
        background: &apos;aqua&apos;,
        display: &apos;flex&apos;,
        flexDirection: &apos;column&apos;,
        placeItems: &apos;center&apos;,
        justifyContent: &apos;center&apos;,
}}
    &gt;
      &lt;div&gt;{children}&lt;/div&gt;
      &lt;div&gt;
        &lt;button onClick={handleClose}&gt;close modal&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;,
    document.body
  );
}</code></pre>

<hr/>

<p>الان اصبح يعرض خارج وفوق الـroot element ومع هذا ما زال يملك صلاحية الوصول للبيانات المشاركة من قبل العنصر الاب والتعديل عليها وارجاعها للاب وكأنه عنصر داخل شجرة العنصر الاب</p>

<hr/>

<h2>Variant Props Pattern</h2>
<p>احيانا يكون عندك عنصر محدد ومستخدم في عدة امكان في الموقع ولكن له انماط متعددة او تريد انشاء ثييم موحد في الموقع فنمط Variant Props Pattern يتيح لك هذا الامر من خلال اعداد تنسيقات مسبقة ويمكن اختيار تنسيق محدد في كل مرة يتم استدعاء هذا العنصر 

والميزة في هذا الامر غير انها تساعدك على مشاركة عدة خواص للعنصر او توحيد ثييم الموقع ايضا يسهل التعديل بدل ما تعدل 12 عنصر في 10 ملفات ممكن تعدل كل هذه العناصر من ملف واحد وان تعددت تنسيقاتها</p>

          <p>tsx</p>
          <pre><code> // app/_components/Button.tsx
interface ButtonProps {
  variant?: &apos;primary&apos; | &apos;secondary&apos; | &apos;danger&apos; | &apos;success&apos; | &apos;warning&apos;;
  shadow?: &apos;one&apos; | &apos;two&apos;;
  style?: React.CSSProperties;
  children: React.ReactNode;
}
const Button = ({
  variant = &apos;primary&apos;,
  shadow = &apos;one&apos;,
  style,
  children,
}: ButtonProps) =&gt; {
  return (
    &lt;button
      style={{
        ...styles.variants[variant],
        ...styles.boxShadow[shadow],
        ...style,
      }}
    &gt;
      {children}
    &lt;/button&gt;
  );
};
const styles = {
  variants: {
    primary: { backgroundColor: &apos;blue&apos;, color: &apos;white&apos; },
    secondary: { backgroundColor: &apos;#fff&apos;, color: &apos;#000&apos; },
    danger: { backgroundColor: &apos;#f00&apos;, color: &apos;#fff&apos; },
    warning: { backgroundColor: &apos;yellow&apos;, color: &apos;#000&apos; },
    success: { backgroundColor: &apos;green&apos;, color: &apos;#fff&apos; },
  },
  boxShadow: {
    one: { boxShadow: &apos;0 4px 8px rgba(0, 0, 0, 0.3)&apos; },
  },
};
export default Button;</code></pre>

<hr/>

<p>النتيجة</p>

          <p>tsx</p>
          <pre><code>&lt;Button shadow=&apos;two&apos; variant=&apos;secondary&apos;&gt;انقر هنا&lt;/Button&gt;
&lt;Button variant=&apos;danger&apos; style={{ padding: &apos;10px&apos; }}&gt;حذف&lt;/Button&gt;
&lt;Button variant={dark ? &apos;danger&apos;: &apos;primary&apos;}&gt;حذف&lt;/Button&gt;</code></pre>

<hr/>

<h2>المصادر</h2>
<p>1- [Shadow Coding بالعربي](https://youtu.be/B09-J84p0ck?si=e53Ju2MEiPt6PUwV)
2- [github.com/Mostafashadow1](https://github.com/Mostafashadow1/Mastering-React-Design-Patterns/tree/master/src/react-desgin-patterns)
3- [انا 🙃](https://yazn-108.github.io/)</p>
          ]]></content:encoded>
        </item>
        <item>
          <title><![CDATA[حماية الـarray في JavaScript]]></title>
          <link>https://murakkaz.vercel.app//article/safe-array-methods</link>
          <guid isPermaLink="false">69d8ef84b462f2a74b60b328</guid>
          <pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate>
          <description><![CDATA[نسخ الـarrays بدل التأثيير عليها.]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1758984620/kwjihdolpzixhwpclgol.jpg" type="image/png" />
          <content:encoded><![CDATA[
        <h2>مقدمة</h2>
<p>بعد اخر تحديثات صدرت في ECMAScript 2023 (ES2023) ظهرت methods لحل مشكلة مزعجة موجودة في javascript بشكل عام وهي مشكلة تغير ترتيب قيم الـarray الاصلية في حال قمت باجراء اي تعديل على الـarray في اي جزء من كود الموقع بدل اخذ نسخة منها والتعديل عليها دون التعديل على الـarray الاصلية.</p>

<hr/>

<p>مثلا لو كتبت</p>

          <p>javascript</p>
          <pre><code>const numbers = [3,1, 2];
numbers.sort();
console.log(numbers); // [1, 2, 3]</code></pre>

<hr/>

<p>النتيجة رح تكون ان الـarray الاصلية تغير ترتيب قيمها وهنا المشكلة وتظهر بشكل اكبر في react لأن احيانا يكون معتمد على نفس الـarray  عدة اجزاء من الموقع فمن الغير المنطقي التعديل على الـarray في مكان في الموقع ثم يصل تأثير هذا التعديل لبقية اجزاء الموقع وهنا ظهر الحل وهو ان</p>

<hr/>

<h2>الـsort اصبح بديلها .toSorted()</h2>

          <p>javascript</p>
          <pre><code>const numbers = [3, 1, 2];
const sortedArray = numbers.toSorted();
console.log(sortedArray); // [1, 2, 3]
console.log(numbers); // [3, 1, 2] -&gt; لم تتغير</code></pre>

<hr/>

<h2>الـreverse اصبح بديلها .toReversed()</h2>

          <p>javascript</p>
          <pre><code>const letters = [&apos;a&apos;, &apos;b&apos;, &apos;c&apos;];
const reversedLetters = letters.toReversed();
console.log(reversedLetters); // [&apos;c&apos;, &apos;b&apos;, &apos;a&apos;]
console.log(letters); // [&apos;a&apos;, &apos;b&apos;, &apos;c&apos;] -&gt; لم تتغير</code></pre>

<hr/>

<h2>الـsplice اصبح بديلها .toSpliced()</h2>

          <p>javascript</p>
          <pre><code>const skills = [&apos;javascript&apos;, &apos;typescript&apos;, &apos;nextjs&apos;];
const removeSkill = skills.toSpliced(0, 1);
console.log(removeSkill); // [&quot;typescript&quot;, &quot;nextjs&quot;]
console.log(skills); // [&quot;javascript&quot;, &quot;typescript&quot;, &quot;nextjs&quot;] -&gt; لم تتغير
</code></pre>

<hr/>

<h2>.with()</h2>

          <p>javascript</p>
          <pre><code>const numbers = [3, 1, 2];
const updatedArray = numbers.with(0, 10);
console.log(updatedArray); // [10, 1, 2]
console.log(numbers);      // [3, 1, 2] -&gt; لم تتغير</code></pre>

<hr/>

<h2>قد يقول قائل</h2>
<p>الحل بسيط وهو ان نقوم بعمل نسخة بشكل يدوي بهذا الشكل</p>

          <p>javascript</p>
          <pre><code>const arr = [3, 1, 2];

const newArr = [...arr]; // النسخة اليدوية
newArr.sort();
console.log(newArr); // [1, 2, 3]

console.log(arr); // [3, 1, 2]</code></pre>

<hr/>

<h2>المصدر</h2>
<p>[https://allthingssmitty.com/](https://allthingssmitty.com/2025/09/08/finally-safe-array-methods-in-javascript/)</p>
          ]]></content:encoded>
        </item>
        <item>
          <title><![CDATA[الـhover والـvariables في tailwind بعد اخر تحديث]]></title>
          <link>https://murakkaz.vercel.app//article/tailwind-hover-variables</link>
          <guid isPermaLink="false">69d662ca2bb54b5c28fd5d2b</guid>
          <pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate>
          <description><![CDATA[بعد اخر تحديث في tailwind 4.1.0v تم القيام بعدة تغييرات ومن ضمن هذه التغييرات هي ازالة تأثير الـhover من الشاشات الصغيرة او المعتمدة على اللمس وايضا تم تغيير الية ادارة المتغيرات]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1757610169/r3cnbpnsx25hrgxkgopk.png" type="image/png" />
          <content:encoded><![CDATA[
        <h2>مستجدات الـhover</h2>
<p>كما ذكرت من ضمن هذه التغييرات هي ازالة تأثير الـhover من الشاشات الصغيرة او المعتمدة على اللمس وسبب الازالة يعود لوجهة نظر القائمين على الـframework ان هذا التأثير يسبب تجربة سيئة للمستخدمين بسبب ان الـhover في الهواتف يبقى موجود حتى تضغط في مكان آخر رغم ان وجهة النظر هذه قد لا تكون صحيحة 100% لأن تأثير الـhover ليس متوقف على تغيير لون او ما شابه وانما يستخدم في تأثيرات متنوعة مثل عرض بعض القوائم بشكل بسيط دون الحاجة لاستخدام javascript مثلا.</p>

<hr/>

<p>ولحل هذا الامر يتم اضافة هذا الجزء في ملف الـinput.css/globals.css</p>

          <p>css</p>
          <pre><code>@custom-variant hover (&amp;:hover);</code></pre>

<hr/>

<h2>تغييرات الـvariables</h2>
<p>تم اضافة @theme المسؤولة عن ادارة المتغيرات بعد ما تم الاستغناء عن ملف tailwind.config.js ولكن المختلف فيها انها تقوم بتخزين قيمة المتغيرات عند عملية الـbuild مما يمنعك من تغيير قيمة المتغيرات فيما بعد من خلال ملف الـcss 
(مثلا لو حاولت تعمل dark mode أو تغييرات ديناميكية، ما رح تنعكس).</p>

<hr/>

<p>لحل هذا الامر يتم الاستعانة بقيمة inline التي تقوم بربط قيم @theme مع متغيرات CSS Variables بشكل مباشر، وبالتالي تقدر تغير القيم ديناميكيًا حتى بعد الـbuild.</p>

          <p>css</p>
          <pre><code>:root {
  --primary-color: white;
}
.dark {
  --primary-color: black;
}
@theme inline {
  --color-primary: var(--primary-color);
}</code></pre>

<hr/>

<h2>تجربة نتيجة الحلول المذكورة</h2>
<p>معرض اعمالي  ([https: //yazn-108.github.io](https://yazn-108.github.io)) في اخر تحديث له قائم على هذا الامر من ناحية الـhover والـdark-mode</p>
          ]]></content:encoded>
        </item>
        <item>
          <title><![CDATA[اظهار بيانات محددة عند مشاركة رابط الموقع]]></title>
          <link>https://murakkaz.vercel.app//article/open-graph</link>
          <guid isPermaLink="false">69d6609f2bb54b5c28fd5d27</guid>
          <pubDate>Tue, 14 May 2024 00:00:00 GMT</pubDate>
          <description><![CDATA[الـOpen Graph هي مجموعة وسوم خاصة بالشبكات الاجتماعية (Facebook, LinkedIn, Twitter...). وظيفتها تحديد كيف يظهر رابط موقعك عند مشاركته (العنوان، الوصف، الصورة).]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1757258679/v3eenjpmqzuuekiw0qj1.png" type="image/png" />
          <content:encoded><![CDATA[
        <h2>ماهي نتيجة استخدام meta tags؟</h2>
<p>تستخدم لعرض بيانات عن محتويات الرابط عند مشاركته كما في الصورة وهذا الامر يرفع نسبة الثقة عند المستخدمين ويظهر موقعك بشكل احترافي.</p>
<img src="https://res.cloudinary.com/dki71zmkb/image/upload/v1757259363/eifmakyi9cmim2pbhtra.png" alt="yazn open graph in linkedin" loading="lazy" />

<hr/>

<h2>ماهو open graph؟</h2>
<p>الـOpen Graph هو بروتوكول (Open Graph Protocol) أنشأته شركة فيسبوك سنة 2010، والغرض منه هو جعل أي رابط على الانترنت يتم مشاركة مع بعض التفاصيل عن محتويات الرابط يتم تحديدها من قبل صاحب الصفحة التابع لها الرابط.</p>

          <p>html</p>
          <pre><code>&lt;!-- HTML Meta Tags --&gt;
&lt;title&gt;Front End Web Developer&lt;/title&gt;
&lt;meta name=&apos;description&apos; content=&apos;I am Yazn, a front-end web developer from Syria. I seek professionalism in the field of website interface development. This is an exhibition of my work in which I present my new works on an ongoing basis&apos;&gt;

&lt;!-- Facebook Meta Tags --&gt;
&lt;meta property=&apos;og:url&apos; content=&apos;https: //yazn-108.github.io/&apos;&gt;
&lt;meta property=&apos;og:type&apos; content=&apos;website&apos;&gt;
&lt;meta property=&apos;og:title&apos; content=&apos;Front End Web Developer&apos;&gt;
&lt;meta property=&apos;og:description&apos; content=&apos;I am Yazn, a front-end web developer from Syria. I seek professionalism in the field of website interface development. This is an exhibition of my work in which I present my new works on an ongoing basis&apos;&gt;
&lt;meta property=&apos;og:image&apos; content=&apos;https://raw.githubusercontent.com/yazn-108/yazn-108.github.io/main/imgs/open-graph-image.png&apos;&gt;

&lt;!-- Twitter Meta Tags --&gt;
&lt;meta name=&apos;twitter:card&apos; content=&apos;summary_large_image&apos;&gt;
&lt;meta property=&apos;twitter:domain&apos; content=&apos;yazn-108.github.io&apos;&gt;
&lt;meta property=&apos;twitter:url&apos; content=&apos;https://yazn-108.github.io/&apos;&gt;
&lt;meta name=&apos;twitter:title&apos; content=&apos;Front End Web Developer&apos;&gt;
&lt;meta name=&apos;twitter:description&apos; content=&apos;I am Yazn, a front-end web developer from Syria. I seek professionalism in the field of website interface development. This is an exhibition of my work in which I present my new works on an ongoing basis&apos;&gt;
&lt;meta name=&apos;twitter:image&apos; content=&apos;https://raw.githubusercontent.com/yazn-108/yazn-108.github.io/main/imgs/open-graph-image.png&apos;&gt;

&lt;!-- Meta Tags Generated via https: //www.opengraph.xyz --&gt;</code></pre>

<hr/>

<h2>كيف يمكن توليدها بشكل تلقائي؟</h2>
<p>من خلال الدخول إلى موقع [www.opengraph.xyz](https://www.opengraph.xyz) تقوم بادخل رابط موقعك وهو يعطيك الاكواد الاساسية مع اضافة البيانات التي استطاع التعرف عليها ولكن هذا لا يمنع من انك تحتاج للتعديل عليها بشكل يدوي.</p>

<hr/>

<h2>ما دور Meta Tags وOpen Graph في تحسين ظهور صفحات الويب على محركات البحث ومنصات التواصل الاجتماعي؟</h2>
<p>فعليا الـOpen Graph ليس له تدخل فعلي في ارشفة موقعك في نتائج بحث Google على سبيل المثال ولكن كثرة النقر على رابط موقعك بسبب شكلة الاحترافي يساهم في زيادة موثوقيته عند محركات بحث Google وهنا يأتي دور الـMeta Tags التي سوف اتكلم عنها بشكل بسيط لأن سيتم الحديث عنها في مقالة منفصلة إن شاء الله؛ الـMeta Tags تساعد محركات البحث (مثل Google و Bing) على فهم محتوى موقعك وبالتالي تعطيه ترتيب في نتائج البحث عندما يقوم احد المستخدمين بالبحث عن شيء موقعك له ارتباط فيه.</p>
          ]]></content:encoded>
        </item>
        <item>
          <title><![CDATA[الـDestructuring في JavaScript]]></title>
          <link>https://murakkaz.vercel.app//article/destructuring-in-javascript</link>
          <guid isPermaLink="false">69d661fe2bb54b5c28fd5d29</guid>
          <pubDate>Wed, 06 Mar 2024 00:00:00 GMT</pubDate>
          <description><![CDATA[الـDestructuring هو طريقة لاستخراج البيانات من الـArrays أو الـObjects على شكل متغيرات جديدة بطريقة مختصرة وسهلة، بدلًا من الكتابة التقليدية.]]></description>
          <enclosure url="https://res.cloudinary.com/dki71zmkb/image/upload/v1757430045/gjeer0ixjm5sr6q9y2wc.png" type="image/png" />
          <content:encoded><![CDATA[
        <h2>ما الهدف من استخدامها؟</h2>
<p>الـDestructuring في JavaScript فكرته بسيطة جدًا: يخليك تختصر وتوضح الكود بدل ما تكتب أسطر طويلة عشان توصل لقيمة من Array أو Object، يعني بدل ما تعيد وتكرر .name و .age كل شوي، تقدر تستخرج القيم مرة واحدة وتحطها في متغيرات.

الميزة الحلوة إنه مو بس يختصر الكود، كمان يخليك تتعامل مع بيانات متداخلة بسهولة، وتقدر تحط قيم افتراضية لها إذا ما تم العثور على بعض القيم لسبب ما، وهذا مهم خصوصًا لو البيانات جاية من API أو مصدر خارجي، عشان ما يحصل أخطاء غير متوقعة.

بالمختصر: الكود يصير أنظف، أسهل، وآمن.</p>

<hr/>

<h2>تأثير Destructuring على الأداء</h2>
<p>من ناحية تأثيره على الاداء فلا يوجد اي تأثير بين</p>

<hr/>

<p>الطريقة المعتادة:</p>

          <p>javascript</p>
          <pre><code>const numbers = [1, 2, 3];
const first = numbers[0];

const person = {
  name: &apos;yazn&apos;,
  age: 20
};
const name = person.name;</code></pre>

<hr/>

<p>وطريقة الـDestructuring:</p>

          <p>javascript</p>
          <pre><code>const [a, b, c] = [1, 2, 3];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

const person = {
  name: &apos;yazn&apos;,
  age: 20
};
const { name = &apos;الاسم الافتراضي&apos;, age } = person;
console.log(name); // Yazan
console.log(age);  // 22</code></pre>

<hr/>

<p>إلا في حالات محدودة جدًا يكون التأثير شبه معدوم، ويحصل هذا عند استخدام الـDestructuring بكثرة داخل نفس الـscope، وهذا يرجع لعملية التفكيك (destructuring) التي تتطلب معالجة إضافية من قبل محرك JavaScript في الخلفية. ومع هذا، مثل ماذكرت، هذا التأثير نادراً ما يكون ملحوظ ولا يؤثر على الأداء العملي للتطبيقات العادية، ولكن من باب الإشارة إلى أن هناك تكلفة صغيرة جدًا على المستوى الداخلي لمحرك اللغة عند الاستخدام المكثف للغاية. (وتقدر تعتبر هذه الجزئية غير موجودة 🙃)</p>
          ]]></content:encoded>
        </item>
        </channel>
        </rss>