{"id":49666789,"url":"https://github.com/rahmanabdur1/taskreactnative","last_synced_at":"2026-05-06T17:04:25.338Z","repository":{"id":346750111,"uuid":"1191430552","full_name":"rahmanabdur1/taskreactnative","owner":"rahmanabdur1","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-25T08:41:49.000Z","size":612,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T12:32:32.525Z","etag":null,"topics":["firebase-auth","reactnativeandroid","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rahmanabdur1.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-25T08:32:49.000Z","updated_at":"2026-03-25T08:41:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rahmanabdur1/taskreactnative","commit_stats":null,"previous_names":["rahmanabdur1/taskreactnative"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rahmanabdur1/taskreactnative","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahmanabdur1%2Ftaskreactnative","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahmanabdur1%2Ftaskreactnative/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahmanabdur1%2Ftaskreactnative/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahmanabdur1%2Ftaskreactnative/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rahmanabdur1","download_url":"https://codeload.github.com/rahmanabdur1/taskreactnative/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahmanabdur1%2Ftaskreactnative/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32703533,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T08:33:17.875Z","status":"ssl_error","status_checked_at":"2026-05-06T08:33:17.221Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["firebase-auth","reactnativeandroid","typescript"],"created_at":"2026-05-06T17:04:23.996Z","updated_at":"2026-05-06T17:04:25.332Z","avatar_url":"https://github.com/rahmanabdur1.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📱 ReactNative Task App\r\n\r\nA modern mobile application built with **React Native (Expo)** demonstrating clean architecture, reusable components, Firebase authentication, and REST API integration.\r\n\r\n---\r\n\r\n## 🚀 Features\r\n\r\n* 🔐 Email \u0026 Password Authentication (Firebase)\r\n* 🔑 Google Sign-In (Firebase)\r\n* 💾 Persistent Login Session (Local Storage)\r\n* 📰 Posts List from JSONPlaceholder API\r\n* 📄 Post Detail Screen\r\n* ❤️ Like / Unlike Posts (stored locally)\r\n* 💬 Comment on Posts (stored locally)\r\n* 📡 Offline-aware UI\r\n* 🔄 Pull to Refresh\r\n* ⚠️ Error Handling \u0026 Loading States\r\n\r\n---\r\n\r\n## 🧠 Architecture\r\n\r\nThis project follows a **Feature-Based Modular Architecture** with strict separation of concerns.\r\n\r\n### 📌 Layer Responsibilities\r\n\r\n| Layer      | Location               | Responsibility                  |\r\n| ---------- | ---------------------- | ------------------------------- |\r\n| UI         | `features/*/screens/`  | Render only (no business logic) |\r\n| Components | `src/components/`      | Reusable UI                     |\r\n| Hooks      | `features/*/hooks/`    | Business logic                  |\r\n| Services   | `features/*/services/` | API \u0026 Firebase calls            |\r\n| Store      | `src/store/`           | Global state (Zustand)          |\r\n| Types      | `src/types/`           | TypeScript interfaces           |\r\n| Theme      | `src/theme/`           | Design system                   |\r\n\r\n---\r\n\r\n## 🔄 Data Flow\r\n\r\n```\r\nScreen → Hook → Service → API/Firebase → Store → UI Re-render\r\n```\r\n\r\n---\r\n\r\n## 📁 Project Structure\r\n\r\n```\r\ntaskreactnative/\r\n│\r\n├── App.tsx\r\n├── index.ts\r\n├── app.json\r\n├── tsconfig.json\r\n├── package.json\r\n│\r\n├── assets/\r\n│   └── images/\r\n│\r\n└── src/\r\n    ├── features/\r\n    │   ├── auth/\r\n    │   │   ├── screens/\r\n    │   │   ├── hooks/\r\n    │   │   ├── services/\r\n    │   │   └── components/\r\n    │   │\r\n    │   └── posts/\r\n    │       ├── screens/\r\n    │       ├── hooks/\r\n    │       ├── services/\r\n    │       └── components/\r\n    │\r\n    ├── components/\r\n    ├── navigation/\r\n    ├── services/\r\n    ├── store/\r\n    ├── hooks/\r\n    ├── types/\r\n    └── theme/\r\n```\r\n\r\n---\r\n\r\n## ⚙️ Tech Stack\r\n\r\n| Technology       | Version | Purpose              |\r\n| ---------------- | ------- | -------------------- |\r\n| React Native     | 0.81.x  | Mobile framework     |\r\n| Expo             | 54      | Development platform |\r\n| TypeScript       | 5.x     | Type safety          |\r\n| Firebase         | ^10.x   | Authentication       |\r\n| Axios            | ^1.x    | API calls            |\r\n| Zustand          | ^5.x    | State management     |\r\n| React Query      | ^5.x    | Server state         |\r\n| AsyncStorage     | ^2.x    | Local storage        |\r\n| React Navigation | ^7.x    | Navigation           |\r\n| NetInfo          | ^11.x   | Network detection    |\r\n\r\n---\r\n\r\n## 🛠 Setup Instructions\r\n\r\n### ✅ Prerequisites\r\n\r\n* Node.js (v18+)\r\n* npm (v9+)\r\n* VS Code\r\n* Expo Go (Mobile App)\r\n\r\n---\r\n\r\n### 📥 Step 1 — Clone Project\r\n\r\n```bash\r\ngit clone https://github.com/rahmanabdur1/taskreactnative.git\r\ncd taskreactnative\r\n```\r\n\r\n---\r\n\r\n### 📦 Step 2 — Install Dependencies\r\n\r\n```bash\r\nnpm install --legacy-peer-deps\r\n```\r\n\r\n---\r\n\r\n### 🔥 Step 3 — Firebase Setup\r\n\r\n1. Go to Firebase Console\r\n2. Create project\r\n3. Enable:\r\n\r\n   * Email/Password\r\n   * Google Sign-In\r\n4. Copy config\r\n\r\n---\r\n\r\n### ⚙️ Step 4 — Add Firebase Config\r\n\r\nUpdate:\r\n\r\n```\r\nsrc/services/firebase.ts\r\n```\r\n\r\n```ts\r\nconst firebaseConfig = {\r\n  apiKey: \"\",\r\n  authDomain: \"\",\r\n  projectId: \"\",\r\n  storageBucket: \"\",\r\n  messagingSenderId: \"\",\r\n  appId: \"\",\r\n  measurementId: \"\",\r\n};\r\n```\r\n\r\n---\r\n\r\n### ▶️ Step 5 — Run App\r\n\r\n```bash\r\nnpx expo start --clear\r\n```\r\n\r\n---\r\n\r\n### 📱 Step 6 — Open on Device\r\n\r\n* Open **Expo Go**\r\n* Scan QR Code\r\n\r\n👉 If network issue:\r\n\r\n```bash\r\nnpx expo start --tunnel\r\n```\r\n\r\n---\r\n\r\n## 📱 Emulator\r\n\r\n```bash\r\nnpx expo start\r\n```\r\n\r\n---\r\n\r\n## 🧩 Reusable Components\r\n\r\n### Button\r\n\r\n```tsx\r\n\u003cButton label=\"Sign In\" onPress={handleLogin} /\u003e\r\n```\r\n\r\n### Card\r\n\r\n```tsx\r\n\u003cCard\u003eContent\u003c/Card\u003e\r\n```\r\n\r\n---\r\n\r\n## 🪝 Custom Hooks\r\n\r\n### useAuth\r\n\r\n```ts\r\nconst { user, login, register, logout } = useAuth();\r\n```\r\n\r\n### usePosts\r\n\r\n```ts\r\nconst { posts, refetch } = usePosts();\r\n```\r\n\r\n---\r\n\r\n## ⚠️ Best Practices Used\r\n\r\n| Bad Practice ❌ | Solution ✅      |\r\n| -------------- | --------------- |\r\n| API in UI      | Service layer   |\r\n| Firebase in UI | authService     |\r\n| Repeated logic | Reusable hooks  |\r\n| No structure   | Feature-based   |\r\n| No types       | Full TypeScript |\r\n\r\n---\r\n\r\n## 🧠 Evaluation Notes\r\n\r\nThis project demonstrates:\r\n\r\n* Clean architecture\r\n* Scalable folder structure\r\n* Separation of concerns\r\n* Reusable components \u0026 hooks\r\n* Offline-first thinking\r\n\r\n---\r\n\r\n## 👨‍💻 Author\r\n\r\n**Abdur Rahman**\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frahmanabdur1%2Ftaskreactnative","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frahmanabdur1%2Ftaskreactnative","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frahmanabdur1%2Ftaskreactnative/lists"}