# Authentication
This guide covers the three steps to get to the checkout screen:
- Store lookup: "Enter store name"
- Clerk login: "Enter your employee PIN"
- Customer lookup: "Enter customer phone number"
# Clerk Login
Relevant Files
StoreLookupScreen.js
ClerkLoginScreen.js
# Step 1: Store Lookup
# State
stores
: All stores in the databasestore
: The selected store from the dropdown menutextFieldBlur
: Indicating that a store has been selected, so the user can go to the next pagesearchStr
: Text string entered to search for a store
# Overview
In componentDidMount
, all stores are loaded into the state. The dropdown menu is a ScrollView
component containing filtered stores based on the searchStr
provided by the user. The "Next" button is disabled until the user selects a store from the dropdown (via textFieldBlur
).
# Relevant Methods
_devBypass
: Sets pre-defined clerk and customer information into AsyncStorage
, skipping all login steps and navigating to the checkout screen, for testing purposes
_devConfirmBypass
: Skips all login and checkout steps to the confirmation page with a pre-defined transaction
onSearchElementPress
: Sets the selected store in state and displays the store name in the search bar
handleNavigate
: Sets trainingMode
, if applicable, and navigates to the next screen — ClerkLogin
# Step 2: Clerk Login
# State
password
: The clerk's store pinerrorMsg
: Displays an error message on screen if there are problems logging inerrorShown
: Boolean indicating whether an error message should be displayed
# Overview
The clerk uses the TextField
component to enter a clerk PIN. This component is currently configured to only accept four numerical values:
<TextField
autoFocus
clearButtonMode="always"
style={{ marginTop: 32 }}
error={this.state.errorShown}
selectionColor={Colors.primaryGreen}
placeholder="ex. 1234"
keyboardType="number-pad"
maxLength={4}
onChangeText={(text) => this.setState({ password: text, errorShown: false })}
value={this.state.password}
/>
# Relevant Methods
handleSubmit
: Performs a clerk lookup using lookupClerk
. lookupResult
comes with a status
, record
, and errorMsg
.
If a clerk record is found corresponding to the given store name and clerk PIN, the clerk and store information is stored in AsyncStorage
via _asyncLoginClerk
. The app then navigates to the CustomerLoginScreen
.
If no clerk record is found, the lookupResult.errorMsg
is displayed.
# Customer Lookup
Relevant Files
CustomerLookupScreen.js
# State
clerkName
: The clerk name is displayed on the screen following a successful clerk login (see: Clerk Login (opens new window))
phoneNumber
: The customer's phone number, entered by the clerk
errorMsg
: An error message to display on the screen given that there was a problem retrieving the customer, if applicable
errorShown
: Boolean indicating whether errorMsg
should be shown
# Overview
The clerk enters a ten-digit phone number into the TextField
component.
//Source: CustomerLookupScreen.js
<TextField
clearButtonMode="always"
selectionColor={Colors.primaryGreen}
style={{ marginTop: 32 }}
error={this.state.errorShown}
placeholder="ex. 1234567890"
keyboardType="number-pad"
maxLength={10}
onChangeText={(text) => this.setState({ phoneNumber: text, errorShown: false })}
value={this.state.phoneNumber}
/>
Once there are ten digits inputted, as checked by the const customerPermission
, the "Next" button becomes clickable, allowing you to call handleSubmit
.
An error message is displayed if the customer is not found in the database. Otherwise, we proceed to the checkout screen.
# Relevant Methods
# componentDidMount
_reset
: The logged in clerk's name and an empty string phone number are set in the state. If this is training mode, a pre-defined clerk name and phone number are provided to the state.
# _asyncCustomerFound
Stores the customer ID in AsyncStorage
and logs successful lookup in Analytics. Navigates to the checkout screen.
# _formatPhoneNumber
Takes a ten-digit phone number string and reformats it into the format (xxx) xxx-xxxx. This is used for consistent phone number lookup in the Customers table because numbers are stored in this format.
# handleSubmit
Formats the phone number and performs a customer lookup using lookupCustomer
. The result, lookupResult
, comes with attributes status
, record
, and errorMsg
. If the customer is not found, the appropriate error message is displayed on the screen. Otherwise, the customer record is stored using _asyncCustomerFound
.