GjirafaMall — Mobile App
The GjirafaMall e-commerce app, built from the ground up in React Native — I was a core contributor to its screens, interactions, and implementation. It serves customers across multiple countries with full shopping, checkout, and account management.
The Brief
I was a core contributor to building the GjirafaMall app from the ground up — screens, interactions, and the React Native implementation behind them.
GjirafaMall is a multi-country e-commerce platform: different currencies, languages, delivery and payment landscapes per region, one shared app. I've maintained it through its growth from single-country to multi-country.
My primary work is the purchase experience — cart, checkout, the One-Click flow, and the post-purchase surfaces. It's where small friction compounds into abandoned orders, and where implementation quality matters as much as the design.
The App in Hand

Home
The full shopping experience — home, product details, and cart on iOS and Android
Live in Production
What I Owned
I implemented these flows from the product designer's handoffs. My job wasn't to draw the screens — it was to build them so they felt the way the design intended.
That meant noticing when something didn't translate cleanly from Figma to a real device, raising friction points, suggesting micro-adjustments, and refusing to ship anything that looked right on the canvas but felt wrong in the hand.
Reusable Primitives
Before I touched One-Click Buy or Checkout, I built a custom Form library — inputs, selects, validators, error states — so every form in the app could share the same primitives instead of re-implementing the same logic.
It paid back immediately: One-Click Buy and Checkout were built on top of it, and the team kept reusing it as new flows landed.
- Form library — fields, validation, error states; the base the entire purchase flow is built on.
- CustomSlider — a reusable slider primitive; every slider in the app is an instance of it.
Product Page
I authored the first version of the product page end-to-end — the layout, the image gallery, and the buying actions.
It set the structure later contributors built on as the page grew: variant selection, pricing, and the entry points into the cart and One-Click Buy. It's the screen shoppers spend the most time on — the bridge between browsing and buying.

The Cart
The cart is where buying intent turns into a decision, so I built it to feel trustworthy and effortless. It stays in sync with the server, so what you see is what you'll pay, and changes like quantity respond instantly.
It handles variants, gift cards, and discounts, with pricing laid out clearly. Items that are out of stock or slower to arrive are flagged early, so problems surface in the cart, not at payment.
One-Click Buy
For a returning user who already knows what they want, the full cart-and-checkout journey is overhead. One-Click Buy opens as a modal straight from the product page — no navigation, no tab switches.
The rule: the fewest possible taps between "I want this" and "it's ordered." Returning users see saved preferences pre-filled; new users get a lightweight path that doesn't punish them for not having an account yet.

Checkout
I built the full checkout — the last and most important step. It's for signed-in customers, so saved addresses and cards are ready to reuse, and it guides them through delivery, payment, and confirmation one step at a time.
It covers home delivery or in-store pickup, a range of payment options, and personal or company orders, with a live summary of the total. Before placing the order it checks everything, flags anything out of stock, and recovers gracefully if a payment fails.
Payment Integrations
I integrated the app's payment flows end-to-end — including OneFor and NLB card-on-file — wiring each provider into the same checkout so the user never feels the seams.
Across Kosovo, Albania, and North Macedonia, the app supports cash on delivery, online card payments through the major regional banks, in-store terminal, bank transfer, and installments.
My focus was the experience around it: a one-tap saved card for returning customers, clear success and failure screens, payment locked until an address is set, and a gentle nudge toward online payment.
Post-Purchase
The success and failure screens are where the customer learns whether the order went through. I built both, sharing one reassuring design.
Success greets the customer by name and confirms the order number, estimated delivery, and where the confirmation email went — with next steps, a built-in FAQ, and context-aware extras like a free eSIM gift or nearby pickup.
Failure stays just as honest: a calm notice, the order number kept for reference, and the same recovery buttons and FAQ.

Success

Failure

Live Customer Support — Freshchat
I integrated Freshchat so customers can reach support without leaving the app. It opens in-app from order screens and account settings, and carries the user's identity and recent order into the conversation so agents don't start from zero.
The harder part was making the chat respect the app's navigation, keyboard, and safe areas so it felt native, not embedded.
Adapting to Multi-Country
The purchase flow was originally built for a single market. When the product expanded internationally, I contributed to the frontend adaptation: currencies, localized pricing, and region-specific delivery and payment options.
The challenge was making every branch, validation, and fallback behave correctly across regions without forking the codebase.
What I Left Behind
The features will keep changing; the pieces underneath are what I'm proudest of. The Form library and CustomSlider became shared building blocks the team builds new flows on, the same way I built One-Click Buy and Checkout on them.
Reusable foundations are how one engineer's work compounds: the next feature ships faster because the base is already there and trusted.
What This Taught Me
This is the project that made me a mobile engineer rather than a web developer using React Native — gesture expectations, navigation patterns, the user on a bus with three bars of signal.
The app serves real customers every day: bug reports come from actual carts, and the right call is often the boring one. Implementation craft is hardest to see when it works — it shows up as the absence of friction.
Next project
Advent Calendar — Seasonal Feature
A date-driven Advent Calendar in the GjirafaMall app — each day of December, customers tear open a wrapped door to reveal an exclusive product deal, with a celebratory burst to mark the moment.