BarsAppAmplify
React Native Bars App: AWS Amplify, AWS AppSync, AWS Cognito, Google Places, Mapbox
Install / Use
/learn @pjay79/BarsAppAmplifyREADME
BarsAppAmplify
React Native, AWS Amplify, AWS AppSync, AWS Cognito, Google Places, Mapbox. Please note: this is a work still in progress, and many features are not fully developed yet.
Update 1st Dec 2018, MapBox has been removed from this app as Google Places API terms require data to be place on Google Maps only
This app is being prepared for deployment
ToDo
- enable offline support
- add pagination
Folder structure:

Screenshots
iOS
Technology stack:
- @mapbox/react-native-mapbox-gl
- aws-amplify
- aws-amplify-react-native
- aws-appsync
- aws-appsync-react
- aws-sdk
- axios
- babel-plugin-transform-remove-console
- geolib
- graphql-tag
- lodash
- moment
- react-apollo
- react-native-app-intro-slider
- react-native-collapsible
- react-native-config
- react-native-elements
- react-native-geolocation-service
- react-native-keyboard-aware-scroll-view"
- react-native-map-link
- react-native-modal
- react-native-splash-screen
- react-native-swipeout
- react-native-vector-icons
- react-navigation
- uuid
Installation
React Native setup:
Install Node.js:
https://nodejs.org/en/download/
brew install watchman
npm install -g react-native-cli
And also install Xcode for iOS simulator + Android Studio / Genymotion for Android simulator. Preferably connect up a hardware device for this particular app to access geolocation, maps + directions, and phone connection.
Project setup:
Clone the repo:
git clone https://github.com/pjay79/BarsAppAmplify.git
Change to the project folder:
cd BarsAppAmplify
Add dependencies:
npm install or yarn
Amazon
Sign up to AWS Free Tier:
https://aws.amazon.com/free/
AWS Amplify CLI setup
npm install -g @aws-amplify/cli
amplify configure
This command will direct you to create a new IAM user, when prompted enter the accessKeyId and secretAccessKey, store these in a safe place, you can also assign this user an AWS Profile Name:

amplify init (in the project folder)

amplify add auth (update: I have now set MFA to optional to get the password reset functionality working)

amplify add api

The base schema.graphql file looks like this:
type Bar @model {
id: ID!
title: String!
content: String!
price: Int
rating: Float
}
This app will have a many-to-many connection between type Bar and type User. Currently AWS Amplify does not yet support many-to-many connections, hence the @connection directive which is used for specifying relationships between @model object types cannot be used. Update the schema.graphql file to look as follows.
type Bar @model {
id: ID!
createdAt: String
updatedAt: String
name: String!
phone: String
location: String
lat: String
lng: String
url: AWSURL
addedBy: ID!
users(first: Int, after: String): [Bar]
}
type BarMember @model {
id: ID!
createdAt: String
updatedAt: String
userId: ID!
barId: ID!
}
type User @model {
id: ID!
createdAt: String
updatedAt: String
username: String!
bars(first: Int, after: String): [Bar]
}
Important Step
amplify push
This command will update your cloud resources and add an aws-exports.js file to your project root directory. In your App.js file make sure this file is imported from the correct location.
Other directives
Note: AWS Amplify has has the following directives that can be used with AppSync:
@model: Used for storing types in Amazon DynamoDB.
@connection: Used to define different authorization strategies.
@auth: Used for specifying relationships between @model object types.
@searchable: Used for streaming the data of an @model object type to Amazon ElasticSearch Service.
AWS AppSync Codegen
AWS Amplify can generate types, as well as query, mutation, and subscription files based on your schema. In this project you will not need to do this as the relevant files have already been created in this repository. See the video below for an example:
https://www.youtube.com/watch?v=r0PbwDoNMcY
AWS AppSync Schema
Go to the AWS Console and AWS AppSync under Services. Select the API that has been generated API for this app and go to the schema.

The schema that has been created needs some modification to allow for the many-to-many relationship between Bars and Users to work. Modify the schema as follows:
type Bar {
id: ID!
createdAt: String
updatedAt: String
name: String!
phone: String
location: String
lat: String
lng: String
url: AWSURL
website: AWSURL
addedBy: ID!
users(first: Int, after: String): BarUsersConnection
}
type BarMember {
id: ID
createdAt: String
updatedAt: String
userId: ID!
barId: ID!
}
type BarUsersConnection {
items: [User]
nextToken: String
}
input CreateBarInput {
id: ID!
name: String!
phone: String
location: String
lat: String
lng: String
url: AWSURL
website: AWSURL
addedBy: ID!
}
input CreateBarMemberInput {
userId: ID!
barId: ID!
}
input CreateUserInput {
id: ID!
username: String!
}
input DeleteBarInput {
id: ID
}
input DeleteBarMemberInput {
id: ID
}
input DeleteUserInput {
id: ID
}
type ModelBarConnection {
items: [Bar]
nextToken: String
}
input ModelBarFilterInput {
id: ModelIDFilterInput
createdAt: ModelStringFilterInput
name: ModelStringFilterInput
phone: ModelStringFilterInput
location: ModelStringFilterInput
lat: ModelStringFilterInput
lng: ModelStringFilterInput
url: ModelStringFilterInput
website: ModelStringFilterInput
addedBy: ModelIDFilterInput
and: [ModelBarFilterInput]
or: [ModelBarFilterInput]
not: ModelBarFilterInput
}
type ModelBarMemberConnection {
items: [BarMember]
nextToken: String
}
input ModelBarMemberFilterInput {
id: ModelIDFilterInput
createdAt: ModelStringFilterInput
userId: ModelIDFilterInput
barId: ModelIDFilterInput
and: [ModelBarMemberFilterInput]
or: [ModelBarMemberFilterInput]
not: ModelBarMemberFilterInput
}
input ModelBooleanFilterInput {
ne: Boolean
eq: Boolean
}
input ModelFloatFilterInput {
ne: Float
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
contains: Float
notContains: Float
between: [Float]
}
input ModelIDFilterInput {
ne: ID
eq: ID
le: ID
lt: ID
ge: ID
gt: ID
contains: ID
notContains: ID
between: [ID]
beginsWith: ID
}
input ModelIntFilterInput {
ne: Int
eq: Int
le: Int
lt: Int
ge: Int
gt: Int
contains: Int
notContains: Int
between: [Int]
}
enum ModelSortDirection {
ASC
DESC
}
input ModelStringFilterInput {
ne: String
eq: String
le: String
lt: String
ge: String
gt: String
contains: String
notContains: String
between: [String]
beginsWith: String
}
type ModelUserConnection {
items: [User]
nextToken: String
}
input ModelUserFilterInput {
id: ModelIDFilterInput
createdAt: ModelStringFilterInput
username: ModelStringFilterInput
and: [ModelUserFilterInput]
or: [ModelUserFilterInput]
not: ModelUserFilterInput
}
type Mutation {
createBar(input: CreateBarInput!): Bar
updateBar(input: UpdateBarInput!): Bar
deleteBar(input: DeleteBarInput!): Bar
creat
Related Skills
tmux
344.4kRemote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
claude-opus-4-5-migration
99.2kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
terraform-provider-genesyscloud
Terraform Provider Genesyscloud
blogwatcher
344.4kMonitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.
