{"id":16078081,"url":"https://github.com/don-phdev/ubereats-clone","last_synced_at":"2026-04-10T01:04:56.324Z","repository":{"id":89578001,"uuid":"488964870","full_name":"Don-PhDev/UberEats-clone","owner":"Don-PhDev","description":"A full-stack clone of Uber Eats built with Ruby on Rails, PostgreSQL, React and Redux.","archived":false,"fork":false,"pushed_at":"2022-05-05T12:33:34.000Z","size":15226,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-10T21:37:47.544Z","etag":null,"topics":["postgresql","react","redux","ruby-on-rails"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Don-PhDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2022-05-05T12:33:17.000Z","updated_at":"2022-05-06T11:34:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"1fa8f304-8601-4c53-bc4a-fc96f9762b55","html_url":"https://github.com/Don-PhDev/UberEats-clone","commit_stats":{"total_commits":190,"total_committers":1,"mean_commits":190.0,"dds":0.0,"last_synced_commit":"3a936a55f97998b86cd1012211b967944bf16cd3"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Don-PhDev%2FUberEats-clone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Don-PhDev%2FUberEats-clone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Don-PhDev%2FUberEats-clone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Don-PhDev%2FUberEats-clone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Don-PhDev","download_url":"https://codeload.github.com/Don-PhDev/UberEats-clone/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247325645,"owners_count":20920713,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["postgresql","react","redux","ruby-on-rails"],"created_at":"2024-10-09T10:07:02.105Z","updated_at":"2025-12-30T23:07:45.279Z","avatar_url":"https://github.com/Don-PhDev.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003eUberEats clone\u003c/h1\u003e\n\nWelcome to UberEats clone, an \u003ca href=\"http://ubereats.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\nUberEats\u003c/a\u003e inspired Full-Stack single-page website, where you can browse and order from restaurants local to Union, New Jersey[^1][^2].\n\n\u003cimg src=\"https://github.com/JonJWong/JWong-Eats/blob/main/app/assets/images/readme-main.png\"\u003e\u003c/img\u003e\n\n\u003ca href=\"https://jwong-eats.herokuapp.com/#/splash\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eLive Demo\u003c/a\u003e\n\n\u003ch2 id=\"table-of-contents\"\u003eTable of Contents\u003c/h2\u003e\n\n- [Features](#features)\n- [Technologies Used](#technologies-used)\n- [Future Plans](#future-plans)\n\n\n\u003ch2 id=\"features\"\u003eFeatures\u003c/h2\u003e\n\n### Dynamic Searching\n\nUsers can search through available restaurants as shown:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://media.giphy.com/media/SlK7350XmLG6LnUDHo/giphy.gif\" alt=\"search-gif\"\u003e\u003c/img\u003e\n\u003c/p\u003e\n\nRestaurants are fetched upon the site's initial load, and the searching is handled through JavaScript logic on the front-end. This saves time and computation, since there is no need for any AJAX requests or database queries.\n\n```javaScript\nfilterResults(value) {\n  const { restaurants } = this.props;\n  const filtered = [];\n\n  Object.keys(restaurants).forEach(id =\u003e {\n    const restaurant = restaurants[id];\n    if (restaurant.name.toLowerCase().includes(value)) {\n      filtered.push(restaurant);\n    }\n  })\n  \n  return filtered;\n}\n```\n\nThis function iterates through the available restaurants, and saves the appropriate ones to a list. This list is then returned, and iterated through in another function to render the search results.\n\n#\n### Restaurant Filtering\n\nThe filtering of restaurants on the Delivery homepage is handled differently, to show another possible approach.\n\nUsers can select icons on the top of the screen that reflect categories that the available restaurants fall into. This is then dynamically rendered onto the page by accessing the database through rails (When a button is pressed, an AJAX request is sent with a category parameter).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://media.giphy.com/media/DmZpv2ljRn4ExgZeni/giphy.gif\"\u003e\u003c/img\u003e\n\u003c/p\u003e\n\n```ruby\ndef index\n  if (params[:category])\n    @restaurants = Restaurant.where(\"description like ?\", \"%#{params[:category]}%\")\n    render :index\n  else\n    @restaurants = Restaurant.all\n    render :index\n  end\nend\n```\n\nWhen this controller action hits, it will either send back a JSON object containing the filtered results, or all restaurants. This approach allows one thunk-action to handle multiple scenarios.\n\nThe price filter works through the front-end, where the price buttons are toggle-able, to select or de-select a desired price range.\n\n```javaScript\ntogglePriceRange(option, e) {\n  e.currentTarget.classList.toggle('delivery-sort-button-selected');\n  const newState = this.state;\n  if (!newState.priceRange.some(ele =\u003e ele === option)\n    \u0026\u0026 option !== \"None\") {\n      newState.priceRange.push(option);\n  } else if (option === \"None\") {\n    newState.priceRange = [];\n  } else {\n    newState.priceRange = \n      newState.priceRange.filter(ele =\u003e ele !== option);\n  }\n  this.setState(newState);\n}\n```\n\nThe modified state is then used to filter the components accordingly:\n\n```javaScript\nsort(restaurants) {\n  let options;\n  if (this.state.priceRange.length \u003e 0) {\n    options = this.state.priceRange\n  }\n\n  const newRestaurants = {};\n  \n  Object.keys(restaurants).map(id =\u003e {\n    let restaurant = restaurants[id];\n    if (options?.includes(restaurant.price_rating)) {\n      newRestaurants[id] = restaurant\n    }\n  })\n  \n  return newRestaurants;\n}\n```\n\n#\n### Order History\n\nUsers can see their past orders, as well as a breakdown of prices and quantities through the receipt.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://media.giphy.com/media/zLaOtiz8fI7OypGpVD/giphy.gif\"\u003e\u003c/img\u003e\n\u003c/p\u003e\n\nWhen a user checks out a cart, and a transaction is processed, the current prices of items are saved as a transaction in the database, independent from what the current item's prices are. That way, if the items were ever to change prices in the future, the price change would not affect any orders retroactively, and the integrity of the transaction table would remain.\n\n#\n\u003ch2 id=\"technologies-used\"\u003eTechnologies used\u003c/h2\u003e\n\n- __Front End__: React.js, Redux\n\n  - Supports front-end handling of cart, rendering of pages, and navigation.\n\n  - Persists state to `localStorage` on crucial updates, such as adding/removing items from the cart.\n\n- __Back End__: Ruby on Rails, with PostgreSQL database\n\n  - Supports back-end server access, and acts as a middleware for the PostgreSQL database, manipulating the database where needed.\n  \n  - Handles User Authentication via session tokens which are then bootstrapped to the window and sent forward to the front-end.\n\n- __Other__: Google Maps JavaScript API, Google Places API, Amazon AWS S3, JavaScript\n\n  - Google Maps and Google Places were used to get accurate information about local restaurants, like name, address, review-count, rating, and pricing.\n  \n  - The Google Maps JavaScript API is also used to render the map with appropriate markers and infowindows on the Pickup page.\n  \n  - AWS S3 handles image hosting to allow for a more lightweight and modular implementation of the app. Images changed on the buckets will reflect on the site with no need to change the code.\n\n  - Webpack and Babel.js transpile the code\n\n- __Hosting__: JWongEats is hosted on heroku.\n\n#\n\u003ch2 id=\"future-plans\"\u003eFuture Plans\u003c/h2\u003e\n\n- Add Google Geocoding, Distance Matrix API support to allow for ETA calculation for delivery.\n- Add Omni-auth for Google and Facebook login options.\n\n#\n### Credit\n\n- Images sourced from UberEats, Red Lobster, Olive Garden are property of their respective companies.\n\n[^1]: Since there did not seem to be a consistent API to scrape menus and menu items from restaurants, all the menu and item seeding was done manually, which resulted in a limited selection (20 restaurants, 10 items each). Some of the restaurants that were brought up by the Maps API are also not available on UberEats, so the images had to be sourced directly from the restaurant, if they had any.\n\n[^2]: Bunny Cafe is an imaginary restaurant based on my household, and our bunny, Kuro!\n\n#\n\u003ch2 id=\"license-copyright\"\u003eLicense \u0026 Copyright\u003c/h2\u003e\n© 2022 Don Forrest Usbal\n\nLicensed under the [MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdon-phdev%2Fubereats-clone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdon-phdev%2Fubereats-clone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdon-phdev%2Fubereats-clone/lists"}