├── src ├── App.css ├── index.css ├── App.jsx ├── components │ ├── Banner │ │ └── Banner.jsx │ ├── ErrorPage │ │ └── ErrorPage.jsx │ ├── CategoryList │ │ └── CategoryList.jsx │ ├── Home │ │ └── Home.jsx │ ├── Root │ │ └── Root.jsx │ ├── FeaturedJobs │ │ └── FeaturedJobs.jsx │ ├── JobDetails │ │ └── JObDetails.jsx │ ├── Job │ │ └── Job.jsx │ ├── Header │ │ └── Header.jsx │ ├── Footer │ │ └── Footer.jsx │ └── AppliedJobs │ │ └── AppliedJobs.jsx ├── utility │ └── localstorage.js ├── main.jsx └── assets │ └── react.svg ├── public ├── _redirects ├── categories.json ├── vite.svg └── jobs.json ├── postcss.config.js ├── vite.config.js ├── tailwind.config.js ├── .gitignore ├── index.html ├── README.md ├── .eslintrc.cjs └── package.json /src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import './App.css' 2 | 3 | function App() { 4 | 5 | return ( 6 | <> 7 | 8 |

Vite + React

9 | 10 | 11 | ) 12 | } 13 | 14 | export default App 15 | -------------------------------------------------------------------------------- /src/components/Banner/Banner.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | const Banner = () => { 4 | return ( 5 |
6 |

Home page Banner

7 |
8 | ); 9 | }; 10 | 11 | export default Banner; -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [require("daisyui")], 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/components/ErrorPage/ErrorPage.jsx: -------------------------------------------------------------------------------- 1 | import { Link } from "react-router-dom"; 2 | 3 | 4 | const ErrorPage = () => { 5 | return ( 6 |
7 |

Oops!!!

8 | Go back to home 9 |
10 | ); 11 | }; 12 | 13 | export default ErrorPage; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/components/CategoryList/CategoryList.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | const CategoryList = () => { 4 | return ( 5 |
6 |

Job Category List

7 |

Explore thousands of job opportunities with all the information you need. Its your future

8 |
9 | ); 10 | }; 11 | 12 | export default CategoryList; -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Home/Home.jsx: -------------------------------------------------------------------------------- 1 | import Banner from "../Banner/Banner"; 2 | import CategoryList from "../CategoryList/CategoryList"; 3 | import FeaturedJobs from "../FeaturedJobs/FeaturedJobs"; 4 | 5 | 6 | const Home = () => { 7 | return ( 8 |
9 | 10 | 11 | 12 |
13 | ); 14 | }; 15 | 16 | export default Home; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | -------------------------------------------------------------------------------- /src/components/Root/Root.jsx: -------------------------------------------------------------------------------- 1 | 2 | import { Outlet } from 'react-router-dom'; 3 | import Footer from '../Footer/Footer'; 4 | import Header from '../Header/Header'; 5 | 6 | const Root = () => { 7 | return ( 8 |
9 |
10 |
11 | 12 |
13 | 14 |
15 | ); 16 | }; 17 | 18 | export default Root; -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true, node: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:react/recommended', 7 | 'plugin:react/jsx-runtime', 8 | 'plugin:react-hooks/recommended', 9 | ], 10 | ignorePatterns: ['dist', '.eslintrc.cjs'], 11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 12 | settings: { react: { version: '18.2' } }, 13 | plugins: ['react-refresh'], 14 | rules: { 15 | 'react-refresh/only-export-components': [ 16 | 'warn', 17 | { allowConstantExport: true }, 18 | ], 19 | }, 20 | } 21 | -------------------------------------------------------------------------------- /src/utility/localstorage.js: -------------------------------------------------------------------------------- 1 | const getStoredJobApplication = () =>{ 2 | const storedJobApplication = localStorage.getItem('job-applications'); 3 | if(storedJobApplication){ 4 | return JSON.parse(storedJobApplication); 5 | } 6 | return []; 7 | } 8 | 9 | 10 | const saveJobApplication = id =>{ 11 | const storedJobApplications = getStoredJobApplication(); 12 | const exists = storedJobApplications.find(jobId => jobId === id); 13 | if(!exists){ 14 | storedJobApplications.push(id); 15 | localStorage.setItem('job-applications', JSON.stringify(storedJobApplications)) 16 | } 17 | } 18 | 19 | export { getStoredJobApplication, saveJobApplication} -------------------------------------------------------------------------------- /public/categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id":1, 4 | "logo":"https://i.ibb.co/NyW6vSW/accounts-1.png", 5 | "category_name":"Account & Finance", 6 | "availability":"300 Jobs Available" 7 | 8 | }, 9 | { 10 | "id":2, 11 | "logo":"https://i.ibb.co/PC8JwL3/chip-1.png", 12 | "category_name":"Creative Design", 13 | "availability":"100+ Jobs Available" 14 | 15 | }, 16 | { 17 | "id":3, 18 | "logo":"https://i.ibb.co/H4f5ZCp/Group-13.png", 19 | "category_name":"Marketing & Sales", 20 | "availability":"150 Jobs Available" 21 | 22 | }, 23 | { 24 | "id":4, 25 | "logo":"https://i.ibb.co/72841P4/social-media-1.png", 26 | "category_name":"Engineering Job", 27 | "availability":"224 Jobs Available" 28 | 29 | } 30 | 31 | ] -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-career-hub", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "localforage": "^1.10.0", 14 | "match-sorter": "^6.3.1", 15 | "react": "^18.2.0", 16 | "react-dom": "^18.2.0", 17 | "react-icons": "^4.11.0", 18 | "react-router-dom": "^6.16.0", 19 | "react-toastify": "^9.1.3", 20 | "sort-by": "^1.2.0" 21 | }, 22 | "devDependencies": { 23 | "@types/react": "^18.2.15", 24 | "@types/react-dom": "^18.2.7", 25 | "@vitejs/plugin-react": "^4.0.3", 26 | "autoprefixer": "^10.4.15", 27 | "daisyui": "^3.7.6", 28 | "eslint": "^8.45.0", 29 | "eslint-plugin-react": "^7.32.2", 30 | "eslint-plugin-react-hooks": "^4.6.0", 31 | "eslint-plugin-react-refresh": "^0.4.3", 32 | "postcss": "^8.4.30", 33 | "tailwindcss": "^3.3.3", 34 | "vite": "^4.4.5" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/components/FeaturedJobs/FeaturedJobs.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import Job from "../Job/Job"; 3 | 4 | 5 | const FeaturedJobs = () => { 6 | const [jobs, setJobs] = useState([]); 7 | // this is not the best way to load show all data 8 | const [dataLength, setDataLength] = useState(4); 9 | 10 | useEffect(() => { 11 | fetch('jobs.json') 12 | .then(res => res.json()) 13 | .then(data => setJobs(data)); 14 | }, []) 15 | 16 | 17 | return ( 18 |
19 |
20 |

Featured Jobs: {jobs.length}

21 |

Explore thousands of job opportunities with all the information you need. Its your future

22 |
23 |
24 | { 25 | jobs.slice(0, dataLength).map(job => ) 26 | } 27 |
28 |
29 | 32 |
33 |
34 | ); 35 | }; 36 | 37 | export default FeaturedJobs; -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import './index.css' 4 | import { 5 | createBrowserRouter, 6 | RouterProvider, 7 | } from "react-router-dom"; 8 | import Root from './components/Root/Root'; 9 | import Home from './components/Home/Home'; 10 | import AppliedJobs from './components/AppliedJobs/AppliedJobs'; 11 | import ErrorPage from './components/ErrorPage/ErrorPage'; 12 | import JObDetails from './components/JobDetails/JObDetails'; 13 | 14 | const router = createBrowserRouter([ 15 | { 16 | path: "/", 17 | element: , 18 | errorElement: , 19 | children: [ 20 | { 21 | path: '/', 22 | element: 23 | }, 24 | { 25 | path: '/applied', 26 | element: , 27 | loader: () => fetch('/jobs.json') // warning: only load the data you need. do not load all the data 28 | }, 29 | { 30 | path: '/job/:id', 31 | element:, 32 | loader: () => fetch('/jobs.json') // do not load all data. load only what you need 33 | } 34 | ] 35 | }, 36 | ]); 37 | 38 | ReactDOM.createRoot(document.getElementById('root')).render( 39 | 40 | 41 | , 42 | ) 43 | -------------------------------------------------------------------------------- /src/components/JobDetails/JObDetails.jsx: -------------------------------------------------------------------------------- 1 | import { useLoaderData, useParams } from "react-router-dom"; 2 | import { ToastContainer, toast } from 'react-toastify'; 3 | import 'react-toastify/dist/ReactToastify.css'; 4 | import { saveJobApplication } from "../../utility/localstorage"; 5 | 6 | const JObDetails = () => { 7 | const jobs = useLoaderData(); 8 | const {id} = useParams(); 9 | const idInt = parseInt(id); 10 | const job = jobs.find(job => job.id === idInt); 11 | console.log(job); 12 | 13 | const handleApplyJob = () =>{ 14 | saveJobApplication(idInt); 15 | toast('You have applied successfully'); 16 | } 17 | 18 | return ( 19 |
20 | 21 |
22 |
23 |

Details coming here

24 |

Job Details of: {job.job_title}

25 |

{job.company_name}

26 |
27 |
28 |

Side things

29 | 30 |
31 |
32 | 33 |
34 | ); 35 | }; 36 | 37 | export default JObDetails; -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Job/Job.jsx: -------------------------------------------------------------------------------- 1 | import { MdLocationOn } from "react-icons/md"; 2 | import { AiOutlineDollar } from "react-icons/ai"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const Job = ({ job }) => { 6 | const { id, logo, job_title, company_name, remote_or_onsite, location, job_type, salary } = job; 7 | return ( 8 |
9 |
Shoes
10 |
11 |

{job_title}

12 |

{company_name}

13 |
14 | 15 | 16 |
17 |
18 |

{location}

19 |

{salary}

20 |
21 |
22 | 23 | 24 | 25 |
26 |
27 |
28 | ); 29 | }; 30 | 31 | export default Job; -------------------------------------------------------------------------------- /src/components/Header/Header.jsx: -------------------------------------------------------------------------------- 1 | import { NavLink } from "react-router-dom"; 2 | 3 | 4 | const Header = () => { 5 | 6 | const links = <> 7 |
  • Home
  • 8 |
  • Jobs
  • 9 |
  • Applied Jobs
  • 10 |
  • Statistics
  • 11 |
  • Blogs
  • 12 | 13 | 14 | return ( 15 |
    16 |
    17 |
    18 | 21 |
      22 | {links} 23 |
    24 |
    25 | Career Hub 26 |
    27 |
    28 | 31 |
    32 |
    33 | Apply Now 34 |
    35 |
    36 | ); 37 | }; 38 | 39 | export default Header; -------------------------------------------------------------------------------- /src/components/Footer/Footer.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | const Footer = () => { 4 | return ( 5 | 33 | ); 34 | }; 35 | 36 | export default Footer; -------------------------------------------------------------------------------- /src/components/AppliedJobs/AppliedJobs.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { useLoaderData } from "react-router-dom"; 3 | import { getStoredJobApplication } from "../../utility/localstorage"; 4 | 5 | 6 | const AppliedJobs = () => { 7 | const jobs = useLoaderData(); 8 | 9 | const [appliedJobs, setAppliedJobs] = useState([]); 10 | const [displayJobs, setDisplayJobs] = useState([]); 11 | 12 | const handleJobsFilter = filter =>{ 13 | if(filter === 'all'){ 14 | setDisplayJobs(appliedJobs); 15 | } 16 | else if (filter === 'remote'){ 17 | const remoteJobs = appliedJobs.filter(job => job.remote_or_onsite === 'Remote'); 18 | setDisplayJobs(remoteJobs); 19 | } 20 | else if(filter === 'onsite'){ 21 | const onsiteJobs = appliedJobs.filter(job => job.remote_or_onsite === 'Onsite'); 22 | setDisplayJobs(onsiteJobs); 23 | } 24 | } 25 | 26 | useEffect(() => { 27 | const storedJobIds = getStoredJobApplication(); 28 | if (jobs.length > 0) { 29 | 30 | 31 | // const jobsApplied = jobs.filter(job => storedJobIds.includes(job.id)); 32 | 33 | const jobsApplied = []; 34 | for (const id of storedJobIds) { 35 | const job = jobs.find(job => job.id === id); 36 | if (job) { 37 | jobsApplied.push(job) 38 | } 39 | } 40 | setAppliedJobs(jobsApplied); 41 | setDisplayJobs(jobsApplied); 42 | // console.log(jobs, storedJobIds, jobsApplied) 43 | } 44 | }, [jobs]) 45 | return ( 46 |
    47 |

    Jobs I applied: {appliedJobs.length}

    48 |
    49 | open or close 50 | 55 |
    56 | 63 |
    64 | ); 65 | }; 66 | 67 | export default AppliedJobs; -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/jobs.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "logo": "https://i.ibb.co/PzrbTxh/google-1-1-1.png", 5 | "job_title": "Technical Database Engineer", 6 | "company_name": "Google LLC", 7 | "remote_or_onsite": "Remote", 8 | "location": "Dhaka, Bangladesh", 9 | "job_type": "Full Time", 10 | "salary": "100k-150k", 11 | "job_description": " A UI/UX (User Interface/User Experience) designer is responsible for designing and creating engaging and effective interfaces for software and web applications. This includes designing the layout, visual design, and interactivity of the user interface.", 12 | "job_responsibility": "Collaborating with cross-functional teams: UI/UX designers often work closely with other teams, including product management, engineering, and marketing, to ensure that the user interface is aligned with business and technical requirements. You will need to be able to effectively communicate your design ideas and gather feedback from other team members.", 13 | "educational_requirements": "Bachelor degree to complete any reputational university.", 14 | "experiences": "2-3 Years in this field.", 15 | "contact_information": { 16 | "phone": "01750-00 00 00", 17 | "email": "info@gmail.com", 18 | "address": "Dhanmondi 32, Sukrabad Dhaka, Bangladesh" 19 | } 20 | }, 21 | { 22 | "id": 2, 23 | "logo": "https://i.ibb.co/H4wJGhb/netflix-4-1.png", 24 | "job_title": "Senior Product Designer", 25 | "company_name": "Netflix", 26 | "remote_or_onsite": "Onsite", 27 | "location": "Dhaka, Bangladesh", 28 | "job_type": "Full Time", 29 | "salary": "100k-150k", 30 | "job_description": "A UI/UX (User Interface/User Experience) designer is responsible for designing and creating engaging and effective interfaces for software and web applications. This includes designing the layout, visual design, and interactivity of the user interface.", 31 | "job_responsibility": "Collaborating with cross-functional teams: UI/UX designers often work closely with other teams, including product management, engineering, and marketing, to ensure that the user interface is aligned with business and technical requirements. You will need to be able to effectively communicate your design ideas and gather feedback from other team members.", 32 | "educational_requirements": "Bachelor degree to complete any reputational university.", 33 | "experiences": "2-3 Years in this field.", 34 | "contact_information": { 35 | "phone": "01750-00 00 00", 36 | "email": "info@gmail.com", 37 | "address": "Dhanmondi 32, Sukrabad Dhaka, Bangladesh" 38 | } 39 | }, 40 | { 41 | "id": 3, 42 | "logo": "https://i.ibb.co/JRXgX92/tesla-9-1.png", 43 | "job_title": "Software Engineer", 44 | "company_name": "Tesla", 45 | "remote_or_onsite": "Onsite", 46 | "location": "Dhaka, Bangladesh", 47 | "job_type": "Full Time", 48 | "salary": "100k-150k", 49 | "job_description": " A UI/UX (User Interface/User Experience) designer is responsible for designing and creating engaging and effective interfaces for software and web applications. This includes designing the layout, visual design, and interactivity of the user interface.", 50 | "job_responsibility": "Collaborating with cross-functional teams: UI/UX designers often work closely with other teams, including product management, engineering, and marketing, to ensure that the user interface is aligned with business and technical requirements. You will need to be able to effectively communicate your design ideas and gather feedback from other team members.", 51 | "educational_requirements": "Bachelor degree to complete any reputational university.", 52 | "experiences": "2-3 Years in this field.", 53 | "contact_information": { 54 | "phone": "01750-00 00 00", 55 | "email": "info@gmail.com", 56 | "address": "Dhanmondi 32, Sukrabad Dhaka, Bangladesh" 57 | } 58 | }, 59 | { 60 | "id": 4, 61 | "logo": "https://i.ibb.co/PzrbTxh/google-1-1-1.png", 62 | "job_title": "Software Engineer", 63 | "company_name": "Google LLC", 64 | "remote_or_onsite": "Onsite", 65 | "location": "Dhaka, Bangladesh", 66 | "job_type": "Full Time", 67 | "salary": "100k-150k", 68 | "job_description": "A UI/UX (User Interface/User Experience) designer is responsible for designing and creating engaging and effective interfaces for software and web applications. This includes designing the layout, visual design, and interactivity of the user interface.", 69 | "job_responsibility": "Collaborating with cross-functional teams: UI/UX designers often work closely with other teams, including product management, engineering, and marketing, to ensure that the user interface is aligned with business and technical requirements. You will need to be able to effectively communicate your design ideas and gather feedback from other team members.", 70 | "educational_requirements": "Bachelor degree to complete any reputational university.", 71 | "experiences": "2-3 Years in this field.", 72 | "contact_information": { 73 | "phone": "01750-00 00 00", 74 | "email": "info@gmail.com", 75 | "address": "Dhanmondi 32, Sukrabad Dhaka, Bangladesh" 76 | } 77 | }, 78 | { 79 | "id": 5, 80 | "logo": "https://i.ibb.co/JRXgX92/tesla-9-1.png", 81 | "job_title": "Technical Database Engineer", 82 | "company_name": "Tesla", 83 | "remote_or_onsite": "Remote", 84 | "location": "Dhaka, Bangladesh", 85 | "job_type": "Full Time", 86 | "salary": "100k-150k", 87 | "job_description": "A UI/UX (User Interface/User Experience) designer is responsible for designing and creating engaging and effective interfaces for software and web applications. This includes designing the layout, visual design, and interactivity of the user interface.", 88 | "job_responsibility": "Collaborating with cross-functional teams: UI/UX designers often work closely with other teams, including product management, engineering, and marketing, to ensure that the user interface is aligned with business and technical requirements. You will need to be able to effectively communicate your design ideas and gather feedback from other team members.", 89 | "educational_requirements": "Bachelor degree to complete any reputational university.", 90 | "experiences": "2-3 Years in this field.", 91 | "contact_information": { 92 | "phone": "01750-00 00 00", 93 | "email": "info@gmail.com", 94 | "address": "Dhanmondi 32, Sukrabad Dhaka, Bangladesh" 95 | } 96 | }, 97 | { 98 | "id": 6, 99 | "logo": "https://i.ibb.co/H4wJGhb/netflix-4-1.png", 100 | "job_title": "Senior Product Designer", 101 | "company_name": "Netflix", 102 | "remote_or_onsite": "Remote", 103 | "location": "Dhaka, Bangladesh", 104 | "job_type": "Full Time", 105 | "salary": "100k-150k", 106 | "job_description": "A UI/UX (User Interface/User Experience) designer is responsible for designing and creating engaging and effective interfaces for software and web applications. This includes designing the layout, visual design, and interactivity of the user interface.", 107 | "job_responsibility": "Collaborating with cross-functional teams: UI/UX designers often work closely with other teams, including product management, engineering, and marketing, to ensure that the user interface is aligned with business and technical requirements. You will need to be able to effectively communicate your design ideas and gather feedback from other team members.", 108 | "educational_requirements": "Bachelor degree to complete any reputational university.", 109 | "experiences": "2-3 Years in this field.", 110 | "contact_information": { 111 | "phone": "01750-00 00 00", 112 | "email": "info@gmail.com", 113 | "address": "Dhanmondi 32, Sukrabad Dhaka, Bangladesh" 114 | } 115 | } 116 | 117 | ] --------------------------------------------------------------------------------