{"id":17503888,"url":"https://github.com/dab0mb/hotncold","last_synced_at":"2025-10-20T08:02:27.746Z","repository":{"id":66209498,"uuid":"208354124","full_name":"DAB0mB/HotnCold","owner":"DAB0mB","description":null,"archived":false,"fork":false,"pushed_at":"2021-05-27T11:29:44.000Z","size":149940,"stargazers_count":22,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-08T16:54:46.859Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/DAB0mB.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}},"created_at":"2019-09-13T22:08:59.000Z","updated_at":"2024-10-05T16:01:03.000Z","dependencies_parsed_at":"2023-04-18T23:32:11.170Z","dependency_job_id":null,"html_url":"https://github.com/DAB0mB/HotnCold","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/DAB0mB/HotnCold","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DAB0mB%2FHotnCold","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DAB0mB%2FHotnCold/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DAB0mB%2FHotnCold/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DAB0mB%2FHotnCold/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DAB0mB","download_url":"https://codeload.github.com/DAB0mB/HotnCold/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DAB0mB%2FHotnCold/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273077227,"owners_count":25041358,"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","status":"online","status_checked_at":"2025-09-01T02:00:09.058Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2024-10-19T23:52:00.103Z","updated_at":"2025-10-20T08:02:22.711Z","avatar_url":"https://github.com/DAB0mB.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hot\u0026Cold\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"540\" alt=\"hotncold-screenshot\" src=\"https://user-images.githubusercontent.com/7648874/119815095-88d51980-bf2e-11eb-955e-311b3b943e4f.png\"\u003e\n\u003c/p\u003e\n\nHot\u0026Cold is an open source, full-stack, heatmap-based social chat app. Featuring:\n\n- [React-Native](https://reactnative.dev/)\n- [PostgresSQL](https://www.postgresql.org/)\n- [Apollo GraphQL (Client + Server)](https://www.apollographql.com/)\n- [MapBox](https://www.mapbox.com/)\n- [FireBase](https://firebase.google.com/)\n- [Twillio](https://www.twilio.com/)\n- [Cloudinary](https://cloudinary.com/)\n\nThis is the main repository of the app, but only includes the front-end part of it; [please see its complient back-end project](https://github.com/DAB0mB/HotnCold-server). The app should be working on both Android and iOS, but was developed mostly with Android in mind.\n\n[**The app is currently available for Android on PlayStore**](https://play.google.com/store/apps/details?id=com.hotncold\u0026hl=en_US\u0026gl=US).\n\n## Setup\n\nConfigure the following services:\n\n- [MapBox](https://www.mapbox.com/).\n- [Firebase](firebase.google.com).\n- [Hot\u0026Cold Server](https://github.com/DAB0mB/HotnCold-server).\n\nAdd the following fields to `gradle.properties`:\n\n    # See the following guide for further info: https://reactnative.dev/docs/signed-apk-android.html\n    MYAPP_RELEASE_STORE_FILE\n    MYAPP_RELEASE_KEY_ALIAS\n    MYAPP_RELEASE_STORE_PASSWORD\n    MYAPP_RELEASE_KEY_PASSWORD\n    android.useAndroidX=true\n    android.enableJetifier=true\n    FLIPPER_VERSION=0.37.0\n\nIf you're developing for iOS, from XCode, go to `product \u003e schema \u003e edit schema \u003e build (hotncold) \u003e pre-actions' and add the following script:\n\n```sh\nENVFILE=.env.development\necho $ENVFILE \u003e /tmp/envfile\n```\n\nDefine environment variables in `.env.$ENVNAME` file (NEVER COMMIT):\n\n    # A public access token to MapBox's API\n    MAPBOX_ACCESS_TOKEN\n    # The map style URL given by MapBox's API\n    MAPBOX_STYLE_URL\n    # URL to Hot\u0026Cold's server\n    SERVER_URI\n    # URL to Hot\u0026Cold's server GraphQL endpoint\n    GRAPHQL_ENDPOINT\n    # If specified, pressed notifications will remain\n    PERSIST_NOTIFICATIONS\n    # The maximum creation distance of statuses from GPS location in meters\n    STATUS_CREATION_RADIUS\n    # Run app with Robot. Robot files will not be bundled if this var is provided\n    USE_ROBOT\n\nTo enable push notifications, download `google-services.json` and `GoogleService-Info.plist` from Firebase console to `android/app` and `ios/hotncold` directories respectively. See [further instructions](https://support.google.com/firebase/answer/7015592?hl=en).\n\nRun the following commands in series:\n\n    $ yarn\n    $ yarn codegen\n\nMake sure you have a device connected with `adb devices`.\n\n## Dev\n\nRun the packager in one tab:\n\n    $ yarn start\n\nTrigger the app on a second tab:\n\n    $ yarn android\n\nYou can also bundle a debug-apk file with warnings remaining (Android only, useful for troubleshooting issues). First, make sure that you have the following extension defined in your `android/app/build.gradle` file:\n\n```gradle\nproject.ext.react = [\n    // ...\n    bundleInDebug: true\n]\n```\n\nAnd then run the following:\n\n    # Output: android/app/build/outputs/apk/debug/app-debug.apk\n    $ yarn bundledebug\n    $ android/gradlew assembleDebug\n\n*Make sure to remove `bundleInDebug` option from your `build.gradle` file for continues work!*\n\n## Test\n\n### Hidden inputs\n\nWhen signing-in, you can unlock test mode by spam-tapping on the country code field. At some point you it should turn into `-0`, which indicates you've just activated test mode successfully.\n\nThere's 2 methods to proceed from this point on: The first one is by filling-out the phone field with 0s, or you can select your country code and fill-out your real number. With the first method you won't receive any text message, authentication will only be done locally, and with the second method, you'll receive an actual text message. Either way, the verification code will appear on screen for testing purposes. Once you continue, the app should function normally; only difference you'll be able to see users-mocks only.\n\nEach supported geographical area should have at least 1 user-mock that should be detectable on the map or by the radar.To get a feedback from a fake user when chatting with it, you can send the word `echo` to get a response. Alternatively, you can specify a delay time (in seconds) by concatenating a parameter e.g. `echo 5`.\n\n### E2E\n\nHot\u0026Cold uses [Firebase Test Lab](https://firebase.google.com/docs/test-lab/) in conjunction with an internal module called [Robot](./src/robot). The paradigm is that [Robo](https://firebase.google.com/docs/test-lab/android/robo-ux-test) (notice the lack of T), a tool that Firebase uses to simulate input on real Android devices, doesn't work with React-Native. This is because React-Native wraps native Android view elements in a unique way that is not accessible to Robo, hence Robot was created. See this [Meidum post](https://medium.com/@eytanmanor/4bc475f4bb2) about Bobcat (aka Robot) for further info.\n\nRoboT scripts are located under the [`robot/scopes`](./src/robot/scopes) and have direct control over React elements. In addition to having Robot scripts, you need to record a [Robo script](https://firebase.google.com/docs/test-lab/android/robo-ux-test) with Android-Studio, so you can press native modals, such as alerts, date-time pickers, and permissions. *It's required* that the RoboT script will end end with any native modal, so it will be used as an anchor for Robo, otherwise the tests will be aborted mid-session.\n\nRobot `.apk` can be assembled with `yarn assembleRobot` and it will override the `app-release.apk` file.\n\n## Prod\n\nFirst, follow these instructions:\n\n- [Generate an upload key](https://facebook.github.io/react-native/docs/signed-apk-android#generating-an-upload-key).\n- [Setup gradle variables](https://facebook.github.io/react-native/docs/signed-apk-android#setting-up-gradle-variables).\n- [Add signing config to gradle config](https://facebook.github.io/react-native/docs/signed-apk-android#adding-signing-config-to-your-apps-gradle-config).\n\nAssemble an `.apk` file:\n\n    # Output: android/app/build/outputs/apk/release/app-release.apk\n    $ android/gradlew assembleRelease\n\nThe app can be distributed as is or installed with `adb`:\n\n    $ adb install \u003cpath\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdab0mb%2Fhotncold","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdab0mb%2Fhotncold","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdab0mb%2Fhotncold/lists"}