<?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: Abdelhak Hichour</title>
    <description>The latest articles on DEV Community by Abdelhak Hichour (@abdelhakh71).</description>
    <link>https://dev.to/abdelhakh71</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%2F3898098%2Fd27449d8-ea4f-47fc-a3cd-a55f2419e40a.jpg</url>
      <title>DEV Community: Abdelhak Hichour</title>
      <link>https://dev.to/abdelhakh71</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdelhakh71"/>
    <language>en</language>
    <item>
      <title>I Built a Full E-Commerce Platform for Algerian Perfume Boutique — Here's How</title>
      <dc:creator>Abdelhak Hichour</dc:creator>
      <pubDate>Sat, 25 Apr 2026 23:06:23 +0000</pubDate>
      <link>https://dev.to/abdelhakh71/i-built-a-full-e-commerce-platform-for-algerian-perfume-boutique-heres-how-5a1l</link>
      <guid>https://dev.to/abdelhakh71/i-built-a-full-e-commerce-platform-for-algerian-perfume-boutique-heres-how-5a1l</guid>
      <description>&lt;p&gt;A few months ago, I set out to build a complete, production-ready e-commerce &lt;br&gt;
platform for a luxury perfume boutique in Algeria. Not a tutorial clone — a &lt;br&gt;
real, deployed, fully functional storefront with a custom admin dashboard, &lt;br&gt;
live shipping integrations, and a premium UI.&lt;/p&gt;

&lt;p&gt;Here's what I built and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Live Demo
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://com2-65de5.web.app" rel="noopener noreferrer"&gt;https://com2-65de5.web.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Source Code
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/abdouh071/perfume-ecommerce-store-dashboard" rel="noopener noreferrer"&gt;https://github.com/abdouh071/perfume-ecommerce-store-dashboard&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4m6uggzkkpcnzp1f7ee7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4m6uggzkkpcnzp1f7ee7.jpg" alt=" " width="590" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4awceq3lgpsblmmuy47.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4awceq3lgpsblmmuy47.jpg" alt=" " width="590" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h1oqbm3hcwttufyaqiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h1oqbm3hcwttufyaqiw.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ks2ktpjgk70uy4ar1td.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ks2ktpjgk70uy4ar1td.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgo3tnwuml9f1edo9gz1a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgo3tnwuml9f1edo9gz1a.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 The Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React.js + Vite&lt;/strong&gt; — Fast, modern frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TailwindCSS&lt;/strong&gt; — Utility-first styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; — Firestore (database), Auth, Cloud Functions, Hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; — Smooth animations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ImgBB API&lt;/strong&gt; — Dynamic image hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✨ The Design: Liquid Glass UI
&lt;/h2&gt;

&lt;p&gt;The biggest design challenge was making something that feels genuinely &lt;br&gt;
premium — not just another e-commerce template. I went with a "Liquid Glass" &lt;br&gt;
aesthetic: glassmorphism panels, smooth Ken Burns hero carousel, and subtle &lt;br&gt;
micro-animations on every interactive element.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚚 The Hard Part: Algerian Courier Integrations
&lt;/h2&gt;

&lt;p&gt;This is where things got interesting. Algeria has its own local delivery &lt;br&gt;
ecosystem: Yalidine, Maystro, Ecotrack, ZR Express, and about 15 others. &lt;br&gt;
None of them have great documentation.&lt;/p&gt;

&lt;p&gt;I built a unified shipping layer that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetches live shipping rates per wilaya (province)&lt;/li&gt;
&lt;li&gt;Loads available StopDesk pickup points at checkout&lt;/li&gt;
&lt;li&gt;Dispatches orders to the courier with one click&lt;/li&gt;
&lt;li&gt;Downloads official shipping labels as PDF&lt;/li&gt;
&lt;li&gt;Auto-updates order status via webhooks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The CORS Problem (and how I solved it)
&lt;/h3&gt;

&lt;p&gt;Calling courier APIs directly from the browser causes CORS errors and exposes &lt;br&gt;
your API keys publicly. My solution: &lt;strong&gt;Firebase Cloud Functions as a proxy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every shipping API call goes through a Cloud Function. The frontend never &lt;br&gt;
touches the API keys — they live securely on the server and are fetched &lt;br&gt;
directly from Firestore when needed.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
// Frontend — no credentials needed!
const rates = await fetchRates(null, null, '16');

// Cloud Function — reads keys from DB securely
const snap = await admin.firestore()
  .collection('settings').doc('shipping').get();
const credentials = { token: snap.data().apiToken, ... };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>ui</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
