<?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>Forem: haider mukhtar</title>
    <description>The latest articles on Forem by haider mukhtar (@haider_mukhtar).</description>
    <link>https://forem.com/haider_mukhtar</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%2F3506309%2F9acfd8dd-644d-41aa-a71c-1deff8ce47d0.png</url>
      <title>Forem: haider mukhtar</title>
      <link>https://forem.com/haider_mukhtar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/haider_mukhtar"/>
    <language>en</language>
    <item>
      <title>Stop Typing JSON Manually: The VS Code Extension That Makes TypeScript Fast ⚡</title>
      <dc:creator>haider mukhtar</dc:creator>
      <pubDate>Thu, 30 Oct 2025 07:34:02 +0000</pubDate>
      <link>https://forem.com/haider_mukhtar/stop-typing-json-manually-the-vs-code-extension-that-makes-typescript-fast-32dc</link>
      <guid>https://forem.com/haider_mukhtar/stop-typing-json-manually-the-vs-code-extension-that-makes-typescript-fast-32dc</guid>
      <description>&lt;p&gt;If you work with React, React Native, or any large-scale TypeScript project, you understand that strong typing is mandatory for maintainability and preventing bugs.&lt;/p&gt;

&lt;p&gt;But every time your application talks to an API, you hit the same bottleneck: converting a complex, deeply-nested JSON response into a set of structured TypeScript interfaces. Manually translating raw API payloads into types like &lt;code&gt;IUserProfile&lt;/code&gt;, &lt;code&gt;IResourceArray&lt;/code&gt;, and nested sub-interfaces is tedious, slow, and prone to human error—slowing down feature development.&lt;/p&gt;

&lt;p&gt;This is where the &lt;a href="https://github.com/MariusAlch/vscode-json-to-ts" rel="noopener noreferrer"&gt;JSON to TS&lt;/a&gt; VS Code extension by &lt;a href="https://github.com/MariusAlch" rel="noopener noreferrer"&gt;MariusAlchimavicius&lt;/a&gt; steps in as a critical velocity multiplier. With over 720,000 installs, it’s the definitive solution to instantly translate chaotic JSON into clean, reusable TypeScript code, eliminating manual transcription entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✨ Instant Interfaces: The High-Speed Workflow&lt;/strong&gt;&lt;br&gt;
The power of this extension lies in its lack of friction. You never leave your editor, turning a multi-minute task into a quick keyboard command.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⬇️ Installation
&lt;/h2&gt;

&lt;p&gt;Search the VS Code Extensions: Marketplace for &lt;strong&gt;“JSON to TS”&lt;/strong&gt; or use the unique identifier &lt;code&gt;MariusAlchimavicius.json-to-ts&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌨️ How to Use: Two Essential Shortcuts
&lt;/h2&gt;

&lt;p&gt;The extension is designed around two global keyboard commands, allowing you to generate interfaces exactly where you need them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From Clipboard (API Responses): 📋&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: Copy your raw JSON response (from a browser console, Postman, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shortcut&lt;/strong&gt;: Shift + Ctrl +Alt +V&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: The TypeScript interfaces are instantly inserted at your cursor.3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;From Selection (Inline JSON): ✍️&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: Highlight a JSON object directly in your current file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shortcut&lt;/strong&gt;: Shift + Ctrl + Alt + S&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: The selected JSON is replaced with the generated TypeScript interfaces.3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&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%2F47mn8mhdgd63e2do8221.gif" 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%2F47mn8mhdgd63e2do8221.gif" alt="How to use demo video" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Intelligence: Why This Tool Is So Good for React/RN
&lt;/h2&gt;

&lt;p&gt;The extension doesn’t just convert strings to types; it intelligently structures the code for long-term use in component-based frameworks. This intelligence is crucial for complex data consumed by React state and component props.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Array Type Merging (The “Huge Deal”):&lt;/strong&gt; 📐 The most common problem with API data is that arrays of objects are often inconsistent (e.g., one item has an optional field, the next doesn’t). The converter analyzes all objects in an array and merges them into a single, clean, normalized interface. This feature ensures you only generate one reusable type for your data: IItem and eliminates the need for manual cleanup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional and Union Types:&lt;/strong&gt; ❓ It correctly infers optional properties by adding the ? modifier to fields that are sometimes missing. It can also generate union types (e.g., &lt;code&gt;field: string | null&lt;/code&gt; or &lt;code&gt;status: string | number&lt;/code&gt;) to handle polymorphic or sparse data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Conclusion: Faster Component Development
&lt;/h2&gt;

&lt;p&gt;For modern React and React Native development, typing is often the bottleneck. By instantly generating normalized interfaces, the &lt;a href="https://github.com/MariusAlch/vscode-json-to-ts" rel="noopener noreferrer"&gt;JSON to TS&lt;/a&gt; extension provides immediate type safety for your custom data fetching hooks and component props.&lt;/p&gt;

&lt;p&gt;You eliminate hours of manual transcription and debugging, allowing you to focus purely on business logic. This tool is not a luxury; it is an essential productivity multiplier that directly translates to faster feature delivery and higher quality, type-safe code.&lt;/p&gt;

&lt;h2&gt;
  
  
  📬 Stay Connected
&lt;/h2&gt;

&lt;p&gt;Want more React Native tutorials and tips?&lt;/p&gt;

&lt;p&gt;🌐 Website: &lt;a href="https://haidermukhtar.vercel.app/" rel="noopener noreferrer"&gt;haidermukhtar.vercel.app&lt;/a&gt;&lt;br&gt;
💼 LinkedIn: &lt;a href="https://www.linkedin.com/in/haider-mukhtar/" rel="noopener noreferrer"&gt;Haider Mukhtar&lt;/a&gt;&lt;br&gt;
🌎 Github: &lt;a href="https://github.com/Haider-Mukhtar" rel="noopener noreferrer"&gt;Haider-Mukhtar&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Happy Coding! 🚀💻
&lt;/h2&gt;

</description>
      <category>typescript</category>
      <category>vscode</category>
      <category>json</category>
      <category>extensions</category>
    </item>
    <item>
      <title>Migrating to React Native 0.82: Unlocking the Full Power of the New Architecture in Expo Apps</title>
      <dc:creator>haider mukhtar</dc:creator>
      <pubDate>Tue, 28 Oct 2025 10:30:39 +0000</pubDate>
      <link>https://forem.com/haider_mukhtar/migrating-to-react-native-082-unlocking-the-full-power-of-the-new-architecture-in-expo-apps-2ca7</link>
      <guid>https://forem.com/haider_mukhtar/migrating-to-react-native-082-unlocking-the-full-power-of-the-new-architecture-in-expo-apps-2ca7</guid>
      <description>&lt;p&gt;As of October 8, 2025, React Native 0.82 has officially landed, marking a pivotal shift in cross-platform mobile development. This release isn’t just another incremental update; it’s the dawn of a “new era” where the New Architecture becomes the default and only option, phasing out legacy systems for good. For Expo users, this means enhanced performance, better tooling, and future-proofing your apps, but it also requires a thoughtful migration strategy. [&lt;a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82" rel="noopener noreferrer"&gt;reactnative.dev&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;In this guide, we’ll dive into what’s new in 0.82, why the New Architecture matters (especially for Expo workflows), and a step-by-step migration process drawn from official docs and community insights. Whether you’re building a simple prototype or a production-scale app, upgrading unlocks smoother animations, faster renders, and access to cutting-edge features like React 19 integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s New in React Native 0.82?
&lt;/h2&gt;

&lt;p&gt;React Native 0.82 builds on the foundation laid in previous versions, with over 868 commits from 93 contributors. Here’s a breakdown of the headline features:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. New Architecture as Default:
&lt;/h3&gt;

&lt;p&gt;No more toggling 0.82 enforces the New Architecture, ignoring any disable flags. This refactor addresses long-standing limitations, enabling synchronous execution, better concurrency, and improved native module interactions via Fabric (renderer) and TurboModules (native modules).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Experimental Hermes V1:
&lt;/h3&gt;

&lt;p&gt;A major evolution of the Hermes JS engine, offering up to 9% faster bundle loads and 7.6% quicker Time to Interactive (TTI) on Android low-end devices. It’s experimental and requires building from source, but early benchmarks show real-world gains.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. React 19.1.1 Integration:
&lt;/h3&gt;

&lt;p&gt;Full support for owner stacks in error reporting and fixed behaviors for useDeferredValue and startTransition in Suspense boundaries, aligning React Native more closely with web paradigms.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. DOM Node APIs:
&lt;/h3&gt;

&lt;p&gt;Refs now expose DOM-like nodes for UI tree traversal, layout measurement, and more think parentNode, getBoundingClientRect(), and text node access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Enhancements:
&lt;/h3&gt;

&lt;p&gt;Canary support for web performance APIs (e.g., performance.now()), an optimized Android debug build variant for smoother dev iterations, and breaking changes like uncaught promise rejections now log errors.&lt;/p&gt;

&lt;p&gt;For Expo specifically, 0.82 is available via expo@canary releases, with the upcoming SDK 55 set to include React Native 0.83. If you’re on SDK 54 (which ships with 0.81), it’s the last version supporting the legacy architecture, perfect as a stepping stone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the New Architecture
&lt;/h2&gt;

&lt;p&gt;The New Architecture is a ground-up refactor of React Native’s internals, born from years of production learnings at Meta and beyond. It replaces the old bridge-based system with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fabric: A new renderer that enables synchronous execution between JS and native, reducing jank and supporting advanced features like concurrent rendering.&lt;/li&gt;
&lt;li&gt;TurboModules: On-demand loading of native modules, cutting startup times and allowing typed interfaces for better dev ergonomics.&lt;/li&gt;
&lt;li&gt;Codegen: Automated code generation for seamless JS-native interop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&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%2F2g6aozm0k6htfvnwu96a.webp" 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%2F2g6aozm0k6htfvnwu96a.webp" alt="Benchmark showing CPU usage improvements with the New Architecture enabled" width="680" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Expo, this translates to broader compatibility; all expo-* packages support it since SDK 53, and about 75% of SDK 52+ projects on EAS Build already use it. The legacy architecture may be fully removed by late 2025, so migrating now ensures you can leverage new React features like full Suspense support and enhanced styling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits for Expo Apps
&lt;/h2&gt;

&lt;p&gt;Upgrading isn’t just about compliance; it’s about gains:&lt;/p&gt;

&lt;p&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%2F94gr4ievryqgopcsfsl8.webp" 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%2F94gr4ievryqgopcsfsl8.webp" alt="Benefits for Expo Apps" width="720" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hermes V1 adds another layer, with benchmarks showing 2.5–9% TTI improvements. For Expo users, the managed workflow makes enabling this straightforward, minimizing native code hassles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites for Migration
&lt;/h2&gt;

&lt;p&gt;Before diving in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade to a Compatible Version&lt;/strong&gt;: Start with React Native 0.81 or Expo SDK 54 if you’re not on the New Architecture yet — these are the last to support legacy mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check Dependencies&lt;/strong&gt;: Run npx expo-doctor@latest to validate compatibility via React Native Directory. Exclude or update incompatible libs (e.g., replace react-native-maps with expo-maps if needed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup Your Project&lt;/strong&gt;: Git commit or branch before changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expo-Specific&lt;/strong&gt;: Use SDK 53+ for default New Arch support; for SDK 52, manual config required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Migration Guide
&lt;/h2&gt;

&lt;p&gt;Follow these steps to migrate your Expo app to React Native 0.82 with the New Architecture:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable New Architecture in Current Version:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;code&gt;app.json&lt;/code&gt; or &lt;code&gt;app.config.js&lt;/code&gt;, add &lt;code&gt;“expo”: { “newArchEnabled”: true }&lt;/code&gt; (or platform-specific).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx expo prebuild --clean&lt;/code&gt; to generate native projects.&lt;/li&gt;
&lt;li&gt;Build and test: &lt;code&gt;npx expo run:android&lt;/code&gt; or npx expo &lt;code&gt;run:ios&lt;/code&gt; (or use EAS: &lt;code&gt;eas build -p all&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Verify functionality; fix any native module issues using interop layers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Upgrade to React Native 0.82:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update &lt;code&gt;package.json&lt;/code&gt;: Set &lt;code&gt;“react-native”: “0.82.0”&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For Expo, install canary: &lt;code&gt;npm install expo@canary&lt;/code&gt; (until SDK 55 releases).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx expo install --fix&lt;/code&gt; to align dependencies.&lt;/li&gt;
&lt;li&gt;Use the Upgrade Helper tool for diff: &lt;a href="https://react-native-community.github.io/upgrade-helper/?from=0.81.0&amp;amp;to=0.82.0." rel="noopener noreferrer"&gt;https://react-native-community.github.io/upgrade-helper/?from=0.81.0&amp;amp;to=0.82.0.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Handle Breaking Changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update promise handling for new error logging.&lt;/li&gt;
&lt;li&gt;Migrate any custom native code to TurboModules/Fabric.&lt;/li&gt;
&lt;li&gt;For Hermes V1 (optional): Add resolutions in &lt;code&gt;package.json&lt;/code&gt; and configure builds as per the docs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Test Thoroughly:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run unit/integration tests.&lt;/li&gt;
&lt;li&gt;Profile performance with new APIs.&lt;/li&gt;
&lt;li&gt;On iOS/Android emulators, check for jank or crashes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deploy and Monitor:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build with EAS or locally.&lt;/li&gt;
&lt;li&gt;Monitor crashes via tools like Sentry, watching for New Arch-specific issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If using bare React Native (outside Expo), set flags in &lt;code&gt;gradle.properties&lt;/code&gt; (Android) and &lt;code&gt;Podfile.properties.json&lt;/code&gt; (iOS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issues and Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Incompatible Libraries&lt;/strong&gt;: Use React Native Directory to check; fall back to interop or forks. Common culprits: react-native-fs, react-native-geolocation-service, swap with Expo alternatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Failures&lt;/strong&gt;: Update to the latest lib versions; clean caches with npx expo prebuild clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Regressions&lt;/strong&gt;: Rare, but test on low-end devices. Enable Hermes V1 for boosts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expo Go Limitations&lt;/strong&gt;: It only supports the New Arch use development builds for testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Report bugs to React Native or Expo repos with minimal repros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Migrating to React Native 0.82 in Expo is more than an upgrade; it’s an investment in faster, more reliable apps. By enforcing the New Architecture, this release paves the way for innovation while shedding legacy baggage. Start with SDK 54 if needed, enable the New Arch, and leverage canary for 0.82 today. Your users (and your dev team) will thank you.&lt;/p&gt;

&lt;p&gt;Have questions or hit a snag? Drop a comment below, I’d love to hear your migration stories! For more, check the official RN blog and Expo docs. 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  📬 Stay Connected
&lt;/h2&gt;

&lt;p&gt;Want more React Native tutorials and tips?&lt;/p&gt;

&lt;p&gt;🌐 Website: &lt;a href="https://haidermukhtar.vercel.app/" rel="noopener noreferrer"&gt;haidermukhtar.vercel.app&lt;/a&gt;&lt;br&gt;
💼 LinkedIn: &lt;a href="https://www.linkedin.com/in/haider-mukhtar/" rel="noopener noreferrer"&gt;Haider Mukhtar&lt;/a&gt;&lt;br&gt;
🌎 Github: &lt;a href="https://github.com/Haider-Mukhtar" rel="noopener noreferrer"&gt;Haider-Mukhtar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding! 🚀💻&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>programming</category>
      <category>typescript</category>
      <category>react</category>
    </item>
    <item>
      <title>Interactive Resizable Split View in React Native</title>
      <dc:creator>haider mukhtar</dc:creator>
      <pubDate>Thu, 02 Oct 2025 05:47:06 +0000</pubDate>
      <link>https://forem.com/haider_mukhtar/interactive-resizable-split-view-in-react-native-58bk</link>
      <guid>https://forem.com/haider_mukhtar/interactive-resizable-split-view-in-react-native-58bk</guid>
      <description>&lt;p&gt;In modern mobile UI development, responsive layouts help make an app feel vibrant and alive. Static screens can feel rigid, but interactive layouts that adapt dynamically to user input create a noticeable sense of control and polish. This guide walks you through building an interactive, resizable split-screen view in React Native using popular libraries such as &lt;strong&gt;React Native Reanimated&lt;/strong&gt; and &lt;strong&gt;Gesture Handler&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Why Micro-animations Matter:
&lt;/h2&gt;

&lt;p&gt;Micro-animations are small, functional animations that make a big difference in user experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provide Feedback:&lt;/strong&gt; Instantly Confirm User Actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guide the User:&lt;/strong&gt; Direct attention and maintain spatial awareness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Polish:&lt;/strong&gt; Make the UI feel crafted and deliberate.
These animations only truly shine when paired with a consistent, well-designed UI foundation. Even the best animations can’t elevate an unpolished interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏗️ Setting Up the Layout:
&lt;/h2&gt;

&lt;p&gt;The screen splits into two sections: a top and a bottom pane. Using React Native Reanimated’s sharedValue,The height of the top section changes dynamically as the user drags a divider. Shared values update on the UI thread smoothly, without triggering costly re-renders.&lt;/p&gt;

&lt;p&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%2F8adgtomsqz2x0oime5km.webp" 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%2F8adgtomsqz2x0oime5km.webp" alt="Screen split layout" width="292" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const HEADER_HEIGHT = 60;
const MIN_SECTION_HEIGHT = 100;
const MAX_TOP_SECTION_HEIGHT = SCREEN_HEIGHT * 0.7;
const DEFAULT_TOP_SECTION_HEIGHT = SCREEN_HEIGHT * 0.45;

export default function Index() {
  const topSectionHeight = useSharedValue(DEFAULT_TOP_SECTION_HEIGHT);

  const topSectionAnimatedStyle = useAnimatedStyle(() =&amp;gt; ({
    height: topSectionHeight.value,
  }));

  return (
    &amp;lt;GestureHandlerRootView style={{ flex: 1 }}&amp;gt;
      &amp;lt;SafeAreaView style={styles.container}&amp;gt;

        {/* Top Section - Resizable */}
        &amp;lt;Animated.View style={[styles.topSection, topSectionAnimatedStyle]}&amp;gt;
        &amp;lt;/Animated.View&amp;gt;

        {/* Bottom Section - Auto-adjusting */}
        &amp;lt;View style={styles.bottomSection}&amp;gt;
        &amp;lt;/View&amp;gt;

      &amp;lt;/SafeAreaView&amp;gt;
    &amp;lt;/GestureHandlerRootView&amp;gt;
  )
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✋ Draggable with Gesture Handler:
&lt;/h2&gt;

&lt;p&gt;Using the powerful gesture system from React Native Gesture Handler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;onStart&lt;/strong&gt; records the starting height of the top section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onStart&lt;/strong&gt; records the starting height of the top section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onUpdate&lt;/strong&gt; adjusts the height dynamically, clamping it within min and max bounds to keep the UI stable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onEnd&lt;/strong&gt; snaps the height to the closest preset point (minimum, default, or maximum height) to optimize usability and predictability.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const ANIMATION_CONFIG = { damping: 25, stiffness: 300, mass: 0.8 };
const VELOCITY_THRESHOLD = 800;

const startY = useSharedValue(0);
const isDragging = useSharedValue(false);

const panGesture = Gesture.Pan()
  .onStart(() =&amp;gt; {
    startY.value = topSectionHeight.value;
    isDragging.value = true;
  })
  .onUpdate((event) =&amp;gt; {
    const newHeight = startY.value + event.translationY;
    topSectionHeight.value = Math.max(
      MIN_SECTION_HEIGHT,
      Math.min(newHeight, MAX_TOP_SECTION_HEIGHT)
    );
  })
  .onEnd((event) =&amp;gt; {
    isDragging.value = false;
    const velocity = event.velocityY;
    let targetHeight;

    if (Math.abs(velocity) &amp;gt; VELOCITY_THRESHOLD) {
      targetHeight =
        velocity &amp;gt; 0 ? DEFAULT_TOP_SECTION_HEIGHT : MAX_TOP_SECTION_HEIGHT;
    } else {
      const distances = [
        {
          h: MIN_SECTION_HEIGHT,
          d: Math.abs(topSectionHeight.value - MIN_SECTION_HEIGHT),
        },
        {
          h: DEFAULT_TOP_SECTION_HEIGHT,
          d: Math.abs(topSectionHeight.value - DEFAULT_TOP_SECTION_HEIGHT),
        },
        {
          h: MAX_TOP_SECTION_HEIGHT,
          d: Math.abs(topSectionHeight.value - MAX_TOP_SECTION_HEIGHT),
        },
      ];
      targetHeight = distances.sort((a, b) =&amp;gt; a.d - b.d)[0].h;
    }

    topSectionHeight.value = withSpring(targetHeight, ANIMATION_CONFIG);
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subtle handle scaling during drag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const dragHandleAnimatedStyle = useAnimatedStyle(() =&amp;gt; ({
  transform: [
    {
      scale: withSpring(isDragging.value ? 1.2 : 1, ANIMATION_CONFIG),
    },
  ],
}));

const dragHandleContainerAnimatedStyle = useAnimatedStyle(() =&amp;gt; ({
  top: topSectionHeight.value - DRAG_HANDLE_HEIGHT / 2,
}));

{/* Drag Handle - Positioned at boundary */}
&amp;lt;GestureDetector gesture={panGesture}&amp;gt;
  &amp;lt;Animated.View
    style={[
      styles.dragHandleContainer,
      dragHandleContainerAnimatedStyle,
    ]}
  &amp;gt;
    &amp;lt;Animated.View
      style={[styles.dragHandle, dragHandleAnimatedStyle]}
    /&amp;gt;
  &amp;lt;/Animated.View&amp;gt;
&amp;lt;/GestureDetector&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📂 Code &amp;amp; GitHub Repository:
&lt;/h2&gt;

&lt;p&gt;Check out the full source code on GitHub for hands-on exploration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/Haider-Mukhtar/ReactNative-Animated-Components/tree/main/Interactive-Resizable-Split-View" rel="noopener noreferrer"&gt;Interactive-Resizable-Split-View&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📄 Key Dependencies:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-native-reanimated&lt;/code&gt;: For shared values and animations.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-native-gesture-handler&lt;/code&gt;: For pan gesture handling.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-native-safe-area-context&lt;/code&gt;: For safe area handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎯 Conclusion:&lt;br&gt;
A resizable split view with smooth, responsive animations enhances your app’s interactivity and polish. Utilizing shared values improves performance, while snap points create predictable, user-friendly behavior. Carefully crafted micro-animations add meaningful feedback, transforming a static UI into one that truly feels alive.&lt;/p&gt;

&lt;p&gt;Polishing the core layout and motion together delivers a compelling mobile experience that users appreciate.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.linkedin.com/in/haider-mukhtar/" rel="noopener noreferrer"&gt;Haider Mukhtar on LinkedIn&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://bento.me/haider-mukhtar" rel="noopener noreferrer"&gt;Haider Mukhtar on Bento&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>reactnative</category>
      <category>typescript</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Stunning Animated Drawer Navigation in Expo React Native</title>
      <dc:creator>haider mukhtar</dc:creator>
      <pubDate>Tue, 23 Sep 2025 11:55:26 +0000</pubDate>
      <link>https://forem.com/haider_mukhtar/stunning-animated-drawer-navigation-in-expo-react-native-1013</link>
      <guid>https://forem.com/haider_mukhtar/stunning-animated-drawer-navigation-in-expo-react-native-1013</guid>
      <description>&lt;h2&gt;
  
  
  💡 Why I Built This
&lt;/h2&gt;

&lt;p&gt;While React Navigation’s standard drawer works, I wanted to create a &lt;strong&gt;visually immersive experience&lt;/strong&gt; where screens dynamically respond to drawer interactions. The goal? An iOS-style navigation with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smooth 3D rotations&lt;/li&gt;
&lt;li&gt;Scale/perspective animations&lt;/li&gt;
&lt;li&gt;Custom profile integration&lt;/li&gt;
&lt;li&gt;Seamless gesture control&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 Key Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;expo-router&lt;/code&gt; (File-based routing)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-native-reanimated&lt;/code&gt; (Animations)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@react-navigation/drawer&lt;/code&gt; (Core navigation)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;react-native-gesture-handler&lt;/code&gt; (Swipe gestures)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Step-by-Step Implementatio
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Core Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-expo-app@latest
npx expo install @react-navigation/drawer react-native-gesture-handler react-native-reanimated

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Magic Animation Wrapper (&lt;code&gt;drawer-scene-wrapper.tsx&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;This component makes screens dance when the drawer opens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const DrawerSceneWrapper = ({ children }: { children: ReactNode }) =&amp;gt; {
  const progress = useDrawerProgress();

  const animatedStyled = useAnimatedStyle(() =&amp;gt; ({
    transform: [
      { scale: interpolate(progress.value, [0, 1], [1, 0.8]) },
      { translateX: interpolate(progress.value, [0, 1], [0, 170]) },
      { rotateY: `${interpolate(progress.value, [0, 1], [0, -25])}deg` }
    ],
    borderRadius: 20
  }));

  return &amp;lt;Animated.View style={[styles.container, animatedStyled]}&amp;gt;
    {children}
  &amp;lt;/Animated.View&amp;gt;;
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Custom Drawer UI (&lt;code&gt;custom-drawer-content.tsx&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Added user profile + logout button:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;SafeAreaView style={{ flex: 1, backgroundColor: "transparent" }}&amp;gt;
  {/* Profile Section */}
  &amp;lt;TouchableOpacity style={styles.userContainer}&amp;gt;
    &amp;lt;Image source={{ uri: "USER_AVATAR_URL" }} style={styles.userImage} /&amp;gt;
    &amp;lt;View&amp;gt;
      &amp;lt;Text style={styles.userName}&amp;gt;Haider Mukhtar&amp;lt;/Text&amp;gt;
      &amp;lt;Text style={styles.userEmail}&amp;gt;haider@example.com&amp;lt;/Text&amp;gt;
    &amp;lt;/View&amp;gt;
  &amp;lt;/TouchableOpacity&amp;gt;

  {/* Navigation Items */}
  &amp;lt;DrawerContentScrollView {...props}&amp;gt;
    &amp;lt;DrawerItemList {...props} /&amp;gt;
  &amp;lt;/DrawerContentScrollView&amp;gt;

  {/* Logout Button */}
  &amp;lt;TouchableOpacity style={styles.logoutButton}&amp;gt;
    &amp;lt;Ionicons name="log-out" size={24} color="#FFFFFF" /&amp;gt;
    &amp;lt;Text style={styles.logoutText}&amp;gt;Logout&amp;lt;/Text&amp;gt;
  &amp;lt;/TouchableOpacity&amp;gt;
&amp;lt;/SafeAreaView&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Drawer Configuration (&lt;code&gt;_layout.tsx&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Styled the drawer with effects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;GestureHandlerRootView style={{ flex: 1 }}&amp;gt;
  &amp;lt;Drawer
    drawerContent={(props) =&amp;gt; &amp;lt;CustomDrawerContent {...props} /&amp;gt;}
    screenOptions={{
      headerShown: false,
      drawerActiveBackgroundColor: "#33b3a6",
      drawerInactiveBackgroundColor: "transparent",
      drawerActiveTintColor: "#FFFFFF",
      drawerInactiveTintColor: "#FFFFFF",
      overlayColor: "transparent",
      drawerStyle: {
        backgroundColor: "transparent",
        width: "60%",
        paddingTop: 40,
      },
      drawerLabelStyle: {
        marginLeft: -6,
        fontSize: 18,
        fontFamily: "PoppinsMedium500",
        color: "#FFFFFF",
      },
      drawerItemStyle: {
        marginLeft: -16,
        marginRight: 35,
        borderTopLeftRadius: 0,
        borderBottomLeftRadius: 0,
        borderTopRightRadius: 50,
        borderBottomRightRadius: 50,
      },
      sceneStyle: {
        backgroundColor: "#26867C",
      },
      // drawerType: 'front',
    }}
  &amp;gt;
    &amp;lt;Drawer.Screen 
      name="index" 
      options={{ 
        title: "Home",
        drawerIcon: ({ color }) =&amp;gt; &amp;lt;Ionicons name="home" color={color} /&amp;gt;
      }} 
    /&amp;gt;
    {/* Add other screens here */}
  &amp;lt;/Drawer&amp;gt;
&amp;lt;/GestureHandlerRootView&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Screen Implementation (&lt;code&gt;index.tsx&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Wrapped every screen in &lt;code&gt;DrawerSceneWrapper&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const HomeScreen = () =&amp;gt; {
  const navigation = useNavigation();
  return (
    &amp;lt;DrawerSceneWrapper&amp;gt;
      &amp;lt;View style={styles.header}&amp;gt;
        &amp;lt;TouchableOpacity 
          onPress={() =&amp;gt; navigation.dispatch(DrawerActions.openDrawer())}
        &amp;gt;
          &amp;lt;Ionicons name="menu" size={28} color="#000" /&amp;gt;
        &amp;lt;/TouchableOpacity&amp;gt;
        &amp;lt;Text style={styles.headerTitle}&amp;gt;Home&amp;lt;/Text&amp;gt;
      &amp;lt;/View&amp;gt;
      {/* Screen content */}
    &amp;lt;/DrawerSceneWrapper&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  👀 Demo Time!
&lt;/h2&gt;

&lt;p&gt;Here’s what it looks like in action:&lt;/p&gt;

&lt;p&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%2Fzmnukx6g13y4kx0a5byk.gif" 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%2Fzmnukx6g13y4kx0a5byk.gif" alt="Animated Drawer Navigation Demo" width="400" height="889"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Design Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Animated Perspective
3D rotation + scaling synchronized with drawer gestures.&lt;/li&gt;
&lt;li&gt;Bubble Menu Items
Rounded active-state highlights with &lt;code&gt;borderTopRightRadius: 50&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚫 Common Pitfalls Solved
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gesture Conflicts: Wrapped root in &lt;code&gt;&amp;lt;GestureHandlerRootView&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Animation Jank: Used &lt;code&gt;Extrapolation.CLAMP&lt;/code&gt; for smooth interpolation.&lt;/li&gt;
&lt;li&gt;Safe Areas: Leveraged &lt;code&gt;react-native-safe-area-context&lt;/code&gt; for notch support.&lt;/li&gt;
&lt;li&gt;TypeScript: Strict typing for drawer props (&lt;code&gt;DrawerContentComponentProps&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📱 Try It Yourself!
&lt;/h2&gt;

&lt;p&gt;Clone the full project:&lt;/p&gt;

&lt;p&gt;👉 Github Repo: &lt;a href="https://github.com/Haider-Mukhtar/ReactNative-Animated-Components/tree/main/Animated-Drawer-Navigation-Expo" rel="noopener noreferrer"&gt;Animated-Drawer-Navigation-Expo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This implementation proves that with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reanimated’s interpolation magic ✨&lt;/li&gt;
&lt;li&gt;Expo’s zero-config tooling 🧰&lt;/li&gt;
&lt;li&gt;Strategic styling 🎨&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;… you can create navigation that delights users while maintaining code simplicity. What would you add to this? Share your ideas below! 👇&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.linkedin.com/in/haider-mukhtar/" rel="noopener noreferrer"&gt;Haider Mukhtar on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>typescript</category>
      <category>mobile</category>
      <category>android</category>
    </item>
    <item>
      <title>My First Expo Experience as a React Native CLI Developer: What Impressed Me Most</title>
      <dc:creator>haider mukhtar</dc:creator>
      <pubDate>Thu, 18 Sep 2025 06:31:54 +0000</pubDate>
      <link>https://forem.com/haider_mukhtar/my-first-expo-experience-as-a-react-native-cli-developer-what-impressed-me-most-4g0i</link>
      <guid>https://forem.com/haider_mukhtar/my-first-expo-experience-as-a-react-native-cli-developer-what-impressed-me-most-4g0i</guid>
      <description>&lt;p&gt;Having built apps with the &lt;strong&gt;React Native CLI&lt;/strong&gt;, I finally decided to try Expo on a new project. I’d always heard mixed opinions: some praised its simplicity, others warned of limitations. But after diving in, I found myself genuinely impressed, especially by &lt;strong&gt;file-based routing&lt;/strong&gt;, &lt;strong&gt;automatic native module handling&lt;/strong&gt;, the quality of &lt;strong&gt;Expo’s documentation&lt;/strong&gt;, and the &lt;strong&gt;Expo Application Services (EAS)&lt;/strong&gt;. Here’s what stood out from a seasoned React Native CLI developer’s perspective.&lt;/p&gt;




&lt;h2&gt;
  
  
  📄 File-Based Routing:
&lt;/h2&gt;

&lt;p&gt;One of the first things that caught my attention was Expo Router’s file-based routing. Coming from the traditional navigation setup, where you manually configure stacks and screens, Expo’s approach felt refreshingly simple. You create files and folders in the &lt;code&gt;app&lt;/code&gt; directory, and each file becomes a route, mirroring the way modern web frameworks like Next.js work.&lt;/p&gt;

&lt;p&gt;For example, adding a &lt;code&gt;app/settings/index.tsx&lt;/code&gt; file instantly creates a &lt;code&gt;/settings&lt;/code&gt; route. No more tedious route registration or navigation boilerplate. This not only speeds up development but also keeps your project structure clear and maintainable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.expo.dev/develop/file-based-routing/" rel="noopener noreferrer"&gt;“Expo Router is a routing framework for React Native and web applications. It allows you to manage navigation between screens in your app and use the same components on multiple platforms (Android, iOS and web). It uses a file-based method to determine routes inside your app.”&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📦 Automatic Native Module Handling:
&lt;/h2&gt;

&lt;p&gt;If you’ve ever spent hours fiddling with &lt;code&gt;Podfile&lt;/code&gt;, &lt;code&gt;build.gradle&lt;/code&gt;, or troubleshooting native dependency issues, Expo’s autolinking feels like magic. With Expo, you install a package, and the platform takes care of the native linking behind the scenes. No more manual edits to native configuration files, just install and go.&lt;/p&gt;

&lt;p&gt;This is a huge relief, especially when working with third-party libraries that require native modules. The Expo autolinking system ensures your dependencies are correctly integrated, dramatically reducing setup time and potential errors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.expo.dev/modules/autolinking/" rel="noopener noreferrer"&gt;“Expo Autolinking is a mechanism that automates this process and reduces the library installation process to the minimum — usually just installing the package from npm and re-running pod install.”&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📚 Expo Documentation:
&lt;/h2&gt;

&lt;p&gt;As a developer, I live and die by documentation. Expo’s docs are some of the best I’ve used in the mobile ecosystem. Whether you’re looking up how to use a specific API, troubleshoot a build, or implement advanced features, the guides are detailed, well-organized, and regularly updated.&lt;/p&gt;

&lt;p&gt;I found answers to nearly every question I had, often with clear examples and explanations. Compared to piecing together information from scattered blog posts or outdated Stack Overflow threads, Expo’s documentation is a breath of fresh air.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙ Expo Application Services (EAS):
&lt;/h2&gt;

&lt;p&gt;Building and deploying mobile apps can be a headache, especially when dealing with certificates, provisioning profiles, and different build environments. Expo Application Services (EAS) takes care of all this in the cloud. With a few commands, you can build your app for iOS and Android, manage credentials, and even submit directly to the app stores.&lt;/p&gt;

&lt;p&gt;For someone used to wrestling with Xcode and Android Studio, this was a game-changer. EAS abstracts away the complexity, letting you focus on your app instead of the build process.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.reddit.com/r/reactnative/comments/kdqejq/expo_application_services_eas_build_and_submit/" rel="noopener noreferrer"&gt;“The new EAS Build service will let you make pretty much any app you want for iOS and Android by writing just React JS/TS code. Expo can build your app in the cloud for you, including any native libraries you need.”&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  👉 Thoughts:
&lt;/h2&gt;

&lt;p&gt;I started this project skeptically, but Expo quickly won me over with its developer experience and thoughtful tooling. File-based routing, autolinking, stellar documentation, and EAS have made mobile development smoother and more enjoyable than I expected.&lt;/p&gt;

&lt;p&gt;If you’re a React Native CLI developer on the fence about Expo, give it a try. You might be as pleasantly surprised as I was.&lt;/p&gt;

&lt;p&gt;📌 Let’s connect and collaborate!&lt;br&gt;
🔗 &lt;a href="https://www.linkedin.com/in/haider-mukhtar/" rel="noopener noreferrer"&gt;Haider Mukhtar on LinkedIn&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/Haider-Mukhtar" rel="noopener noreferrer"&gt;Haider Mukhtar on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding with React Native! 🚀&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>React Native (CLI) Firebase Push Notifications for Android 📱🔔</title>
      <dc:creator>haider mukhtar</dc:creator>
      <pubDate>Tue, 16 Sep 2025 11:20:45 +0000</pubDate>
      <link>https://forem.com/haider_mukhtar/react-native-cli-firebase-push-notifications-for-android-3h4l</link>
      <guid>https://forem.com/haider_mukhtar/react-native-cli-firebase-push-notifications-for-android-3h4l</guid>
      <description>&lt;p&gt;If you’re building a React Native CLI app and want to integrate Firebase push notifications for Android, you’re in the right place. This guide walks you through every step I took while implementing push notifications in my own project — from setting up Firebase to handling foreground and background notifications with Notifee.&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 1. Create a Firebase Project
&lt;/h2&gt;

&lt;p&gt;Start by heading to Firebase Console and creating a new project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set your project name.&lt;/li&gt;
&lt;li&gt;Register your Android app with the correct package name (e.g., com.yourappname).&lt;/li&gt;
&lt;li&gt;Download the &lt;code&gt;google-services.json&lt;/code&gt; file and place it into your Android app folder: &lt;code&gt;android/app/google-services.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ 2. Firebase SDK Integration for Android
&lt;/h2&gt;

&lt;p&gt;Modify your Android project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;android/build.gradle&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buildscript {
  dependencies {
    classpath("com.google.gms:google-services:4.4.2") // Make sure this is up to date
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;android/app/build.gradle&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: "com.google.gms.google-services"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    // your code
    implementation(platform("com.google.firebase:firebase-bom:33.11.0"))
    implementation("com.google.firebase:firebase-analytics")
    // your code
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📦 3. Install Firebase Packages
&lt;/h2&gt;

&lt;p&gt;Install Firebase libraries using npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save @react-native-firebase/app
npm install --save @react-native-firebase/messaging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, rebuild your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx react-native run-android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔐 4. Request Notification Permission (Android 13+)
&lt;/h2&gt;

&lt;p&gt;Since Android 13 requires runtime permission for notifications:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {PermissionsAndroid} from 'react-native';

const requestPermissionAndroid = async () =&amp;gt; {
  const granted = await PermissionsAndroid.request(
    PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS,
  );

  console.log(granted === PermissionsAndroid.RESULTS.GRANTED
    ? '✔ Permissions Granted'
    : '❌ Permissions Denied');
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call this inside useEffect on app load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  useEffect(() =&amp;gt; {
    if (Platform.OS === 'android') {
      requestPermissionAndroid();
    } else {
      console.log('This OS not supported.');
    }
  }, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 5. Get FCM Token
&lt;/h2&gt;

&lt;p&gt;This token uniquely identifies the device. You can send notifications to this token using Firebase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import messaging from '@react-native-firebase/messaging';

const getFCMToken = async () =&amp;gt; {
  const token = await messaging().getToken();
  console.log('FCM Token:', token);
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧩 6. Handle Foreground Notifications
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;useEffect(() =&amp;gt; {
  const unsubscribe = messaging().onMessage(async remoteMessage =&amp;gt; {
    Alert.alert('New FCM Message', JSON.stringify(remoteMessage));
  });

  return unsubscribe;
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📲 7. Setup Notifee for Foreground Notification Display
&lt;/h2&gt;

&lt;p&gt;Install Notifee:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save @notifee/react-native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Display foreground notifications using Notifee:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import notifee from '@notifee/react-native';

const onDisplayNotification = async (remoteMessage) =&amp;gt; {
  const channelId = await notifee.createChannel({
    id: 'default',
    name: 'Default Channel',
  });

  await notifee.displayNotification({
    title: remoteMessage.notification.title,
    body: remoteMessage.notification.body,
    android: {
      channelId,
      pressAction: { id: 'default' },
    },
  });
};

useEffect(() =&amp;gt; {
    const unsubscribe = messaging().onMessage(async remoteMessage =&amp;gt; {
    onDisplayNotification(remoteMessage);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📳 8. Background &amp;amp; Quit State Notifications
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;index.js&lt;/code&gt;, register the background message handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import messaging from '@react-native-firebase/messaging';

messaging().setBackgroundMessageHandler(async remoteMessage =&amp;gt; {
  console.log('Background message:', remoteMessage);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, even when the app is killed or in the background, it captures and logs the message.&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 9. Sending Notifications via Postman
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Get your Firebase project’s Access Token using a service account JSON.&lt;/li&gt;
&lt;li&gt;Hit this endpoint from Postman:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://fcm.googleapis.com/v1/projects/&amp;lt;project-id&amp;gt;/messages:send
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use the FCM token in your request body to target your device.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Summary
&lt;/h2&gt;

&lt;p&gt;You’ve now successfully integrated Firebase push notifications in a React Native CLI app for Android. From requesting permissions and getting tokens to handling notifications in all states (foreground, background, quit), everything is covered in this guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  📄 Source Code on GitHub
&lt;/h2&gt;

&lt;p&gt;Want to explore the full code implementation of Firebase Push Notifications in React Native CLI?&lt;/p&gt;

&lt;p&gt;Check out the complete project on GitHub:&lt;br&gt;
&lt;a href="https://github.com/Haider-Mukhtar/ReactNative-Push-Notification" rel="noopener noreferrer"&gt;👉 GitHub Repository: React Native Firebase Notifications&lt;/a&gt;&lt;br&gt;
Feel free to star ⭐ the repo if it helps you!&lt;/p&gt;

&lt;h2&gt;
  
  
  📺Live Demo: Receiving Firebase Push Notifications on Android
&lt;/h2&gt;

&lt;p&gt;Want to see it in action? Here’s a screen recording showing how Firebase push notifications are delivered to an Android device using React Native CLI. The video demonstrates:&lt;br&gt;
-Receiving a notification while the app is in the foreground.&lt;br&gt;
-Handling notifications in the background and the quit state.&lt;br&gt;
-Custom notification appearance using Notifee.&lt;br&gt;
Watch how seamlessly the integration works in a real scenario:&lt;/p&gt;

&lt;p&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%2Fho9u9b4552sizplqfo4c.gif" 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%2Fho9u9b4552sizplqfo4c.gif" alt=" " width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Pro Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Notifee for better control over notification appearance and behavior.&lt;/li&gt;
&lt;li&gt;Test in both the emulator and physical devices&lt;/li&gt;
&lt;li&gt;Make sure your AndroidManifest has the required services and permissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✉️ Happy coding with React Native and Firebase!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>firebase</category>
      <category>typescript</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
