{"id":13819393,"url":"https://github.com/tylerreichle/GetOut","last_synced_at":"2025-05-16T04:33:42.622Z","repository":{"id":22573389,"uuid":"96719391","full_name":"tylerreichle/GetOut","owner":"tylerreichle","description":"React Native App to meet and chat with nearby people who share similar interests","archived":false,"fork":false,"pushed_at":"2023-01-19T05:01:13.000Z","size":28502,"stargazers_count":4,"open_issues_count":22,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-14T08:34:39.542Z","etag":null,"topics":["ios","mobile","pusher","rails","react-native"],"latest_commit_sha":null,"homepage":"","language":"Ruby","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/tylerreichle.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}},"created_at":"2017-07-10T00:18:24.000Z","updated_at":"2021-11-29T22:47:24.000Z","dependencies_parsed_at":"2023-02-10T20:30:35.249Z","dependency_job_id":null,"html_url":"https://github.com/tylerreichle/GetOut","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerreichle%2FGetOut","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerreichle%2FGetOut/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerreichle%2FGetOut/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tylerreichle%2FGetOut/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tylerreichle","download_url":"https://codeload.github.com/tylerreichle/GetOut/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254470153,"owners_count":22076565,"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":["ios","mobile","pusher","rails","react-native"],"created_at":"2024-08-04T08:00:46.848Z","updated_at":"2025-05-16T04:33:39.041Z","avatar_url":"https://github.com/tylerreichle.png","language":"Ruby","funding_links":[],"categories":["Happy Exploring 🤘"],"sub_categories":[],"readme":"# GetOut\n\n Finding new people around you to discuss similar interests can be difficult. GetOut allows users to discover new places and new people with similar interests in their area. Users will be able to find people based on location, search by category, and schedule a meet up with chat functionality.\n\nGetOut is a collaborative project by [Tyler Reichle](https://github.com/tylerreichle), [Jill de los Angeles](https://github.com/jilldela), and [Eric Adams](https://github.com/eadams17).\n\n\u003cimg src=\"docs/images/getout.gif\" alt=\"chat\" width=\"290\" height=\"500\"/\u003e\n\n## Features\n\n- Create user accounts with secure authentication\n- Find people around you with similar interests using geolocation\n- Filter users by interests and conversational topics\n- Chat with other users to schedule meetups\n\n## Implementation\n\nUser's session tokens are stored in AsyncStorage allowing them to persist after app close. When returning to GetOut the session token is authenticated using a custom route then redirected to the home page. This takes advantage af ES7's new async and await functions.\n\n```javascript\nasync verifyToken(token) {\n  const sessionToken = token;\n\n  try {\n    const response = await fetch(`http://localhost:3000/api/verify?session%5Bsession_token%5D=${sessionToken}`);\n    const res = await response.text();\n    if (response.status \u003e= 200 \u0026\u0026 response.status \u003c 300) {\n      const currentUserID = await AsyncStorage.getItem('id');\n      Actions.CategoriesIndex(currentUserID);\n    } else {\n      const error = res;\n      throw error;\n    }\n  } catch (error) {\n    console.log(`Error: ${error}`);\n  }\n}\n```\n\n\u003cimg src=\"docs/images/splash.png\" alt=\"splash page\" width=\"290\" height=\"500\"/\u003e \u003cimg src=\"docs/images/categories.png\" alt=\"categories list\" width=\"290\" height=\"500\"/\u003e\n\nCateogories are rendered using React Native's included classes TouchableHighlight and ListView, allowing the app to respond to user touch.\n\n```javascript\n\u003cListView\n  enableEmptySections\n  style={styles.categoriesList}\n  dataSource={categories}\n  renderRow={category =\u003e (\n    \u003cTouchableHighlight onPress={val =\u003e this.handlePress(val, category.id)}\u003e\n      \u003cView style={styles.categoriesItem}\u003e\n        \u003cImage source={{ uri: `${category.img_url}` }} style={styles.categoryPic}\u003e\n          \u003cText style={styles.categoryTitle}\u003e{category.title}\u003c/Text\u003e\n        \u003c/Image\u003e\n      \u003c/View\u003e\n    \u003c/TouchableHighlight\u003e\n  )}\n/\u003e\n```\n\nWhile viewing all users interested in a selected category the currently sign in user is not shown among the results using filtering in the jBuilder response from Rails.\n\n```ruby\njson.users @category.users do |user|\n  if current_user != user\n    json.partial! 'api/users/user', user: user\n  end\nend\n```\n\n\u003cimg src=\"docs/images/users.png\" alt=\"category detail\" width=\"290\" height=\"500\"/\u003e\n\nReal time updates while chatting accomplished with the Pusher gem and pusher-js package. When a chat component mounts it begins listenening for a new message event through a dedicated websocket port.\n\nWhen a message is sent and saved into the database Rails will use Pusher to trigger a new message event notifying the chat component to request new messages from the backend.\n\n```ruby\ndef create\n  @message = Message.new(message_params)\n  @message.user_id = current_user.id\n\n  if @message.save\n    render 'api/messages/show'\n    # broadcast message after save to DB\n    Pusher.trigger('chats', 'new-message', {\n      message: @message.body\n    })\n  end\nend\n```\n\n```javascript\nexport default class ChatroomShow extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.pusher = new Pusher('a82f64a23895b9cddd1a', {\n      cluster: 'us2',\n      encrypted: true,\n    });\n\n    this.chatroom = this.pusher.subscribe('chats');\n  }\n\n  componentDidMount() {\n    const self = this;\n    this.chatroom.bind('new-message', function (data) {\n      self.props.fetchMessages(self.props.data);\n    });\n  }\n```\n\u003cimg src=\"docs/images/profile.png\" alt=\"user profile\" width=\"290\" height=\"500\"/\u003e \u003cimg src=\"docs/images/chat.png\" alt=\"chat\" width=\"290\" height=\"500\"/\u003e\n\n## Technology\n\n### Frontend\n\nGetOut follows the Redux implementation of the Flux design pattern, using a single store to manage the state of the application and enforce an unidirectional data flow. React Native is used to render React components in a mobile application. Components throughout the app are styled using React Native's integrated stylesheet system with pure JavaScript.\n\nWe used npm to manage all of the JavaScript packages, and the Babel transpiler to convert ES6 to ES5 and bundle it into a single file.\n\n### Backend\n\nWe used Ruby on Rails to handle our backend and RESTful API requests along with PostgreSQL running the database.\n\n## Future Implementaion\n\n- Additional secure login options with OAuth and Faceboook/Google logins\n- Add search functionality for users and categories\n- Google Maps integration allowing users to receive directions to meet up\n- Yelp API integration used to offer meeting place suggestions\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylerreichle%2FGetOut","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftylerreichle%2FGetOut","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylerreichle%2FGetOut/lists"}