Skip to content

Commit dd4aec5

Browse files
authored
Merge pull request #73 from jackmisner/misc-ux-fixes
Make star ratings tappable and misc ux improvements
2 parents e3e1d10 + d43bc00 commit dd4aec5

37 files changed

+1264
-784
lines changed

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ android {
9292
applicationId 'com.brewtracker.android'
9393
minSdkVersion rootProject.ext.minSdkVersion
9494
targetSdkVersion rootProject.ext.targetSdkVersion
95-
versionCode 132
96-
versionName "2.3.6"
95+
versionCode 138
96+
versionName "2.3.12"
9797

9898
buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
9999
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<resources>
22
<string name="app_name">BrewTracker</string>
33
<string name="expo_system_ui_user_interface_style" translatable="false">automatic</string>
4-
<string name="expo_runtime_version">2.3.6</string>
4+
<string name="expo_runtime_version">2.3.12</string>
55
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
66
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
77
</resources>

app.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "BrewTracker",
44
"slug": "brewtracker-android",
55
"orientation": "portrait",
6-
"version": "2.3.6",
6+
"version": "2.3.12",
77
"icon": "./assets/images/BrewTrackerAndroidLogo.png",
88
"scheme": "brewtracker",
99
"userInterfaceStyle": "automatic",
@@ -16,7 +16,7 @@
1616
},
1717
"edgeToEdgeEnabled": true,
1818
"package": "com.brewtracker.android",
19-
"versionCode": 132,
19+
"versionCode": 138,
2020
"permissions": [
2121
"CAMERA",
2222
"VIBRATE",
@@ -57,7 +57,7 @@
5757
}
5858
},
5959
"owner": "jackmisner",
60-
"runtimeVersion": "2.3.6",
60+
"runtimeVersion": "2.3.12",
6161
"updates": {
6262
"url": "https://u.expo.dev/edf222a8-b532-4d12-9b69-4e7fbb1d41c2"
6363
}

app/(auth)/forgotPassword.tsx

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,13 @@ import {
4141
import { router } from "expo-router";
4242
import { MaterialIcons } from "@expo/vector-icons";
4343
import { useAuth } from "@contexts/AuthContext";
44+
import { useTheme } from "@contexts/ThemeContext";
4445
import { loginStyles } from "@styles/auth/loginStyles";
4546

4647
const ForgotPasswordScreen: React.FC = () => {
4748
const { forgotPassword, isLoading, error, clearError } = useAuth();
49+
const { colors } = useTheme();
50+
const styles = loginStyles(colors);
4851
const [email, setEmail] = useState<string>("");
4952
const [emailSent, setEmailSent] = useState<boolean>(false);
5053

@@ -103,36 +106,34 @@ const ForgotPasswordScreen: React.FC = () => {
103106

104107
if (emailSent) {
105108
return (
106-
<KeyboardAvoidingView style={loginStyles.container} behavior={"height"}>
107-
<ScrollView contentContainerStyle={loginStyles.scrollContainer}>
108-
<View style={loginStyles.formContainer}>
109-
<View style={loginStyles.header}>
109+
<KeyboardAvoidingView style={styles.container} behavior={"height"}>
110+
<ScrollView contentContainerStyle={styles.scrollContainer}>
111+
<View style={styles.formContainer}>
112+
<View style={styles.header}>
110113
<MaterialIcons name="mail-outline" size={64} color="#2563eb" />
111-
<Text style={loginStyles.title}>Check Your Email</Text>
112-
<Text style={loginStyles.subtitle}>
114+
<Text style={styles.title}>Check Your Email</Text>
115+
<Text style={styles.subtitle}>
113116
If an account with that email exists, you should receive a
114117
password reset link shortly.
115118
</Text>
116119
</View>
117120

118-
<View style={loginStyles.successContainer}>
119-
<Text style={loginStyles.successText}>
121+
<View style={styles.successContainer}>
122+
<Text style={styles.successText}>
120123
Please check your email inbox and spam folder for the password
121124
reset link.
122125
</Text>
123-
<Text style={loginStyles.successSubtext}>
126+
<Text style={styles.successSubtext}>
124127
The reset link will expire in 1 hour for security reasons.
125128
</Text>
126129
</View>
127130

128-
<View style={loginStyles.buttonContainer}>
131+
<View style={styles.buttonContainer}>
129132
<TouchableOpacity
130-
style={loginStyles.resetPrimaryButton}
133+
style={styles.resetPrimaryButton}
131134
onPress={handleBackToLogin}
132135
>
133-
<Text style={loginStyles.resetPrimaryButtonText}>
134-
Back to Login
135-
</Text>
136+
<Text style={styles.resetPrimaryButtonText}>Back to Login</Text>
136137
</TouchableOpacity>
137138
</View>
138139
</View>
@@ -142,38 +143,46 @@ const ForgotPasswordScreen: React.FC = () => {
142143
}
143144

144145
return (
145-
<KeyboardAvoidingView style={loginStyles.container} behavior={"height"}>
146-
<ScrollView contentContainerStyle={loginStyles.scrollContainer}>
147-
<View style={loginStyles.formContainer}>
148-
<View style={loginStyles.header}>
149-
<MaterialIcons name="lock-outline" size={64} color="#2563eb" />
150-
<Text style={loginStyles.title}>Forgot Password</Text>
151-
<Text style={loginStyles.subtitle}>
146+
<KeyboardAvoidingView style={styles.container} behavior={"height"}>
147+
<ScrollView contentContainerStyle={styles.scrollContainer}>
148+
<View style={styles.formContainer}>
149+
<View style={styles.header}>
150+
<MaterialIcons
151+
name="lock-outline"
152+
size={64}
153+
color={colors.primary}
154+
/>
155+
<Text style={styles.title}>Forgot Password</Text>
156+
<Text style={styles.subtitle}>
152157
{
153158
"Enter your email address and we'll send you a link to reset your password."
154159
}
155160
</Text>
156161
</View>
157162

158163
{error ? (
159-
<View style={loginStyles.errorContainer}>
160-
<MaterialIcons name="error-outline" size={20} color="#dc2626" />
161-
<Text style={loginStyles.errorText}>{error}</Text>
164+
<View style={styles.errorContainer}>
165+
<MaterialIcons
166+
name="error-outline"
167+
size={20}
168+
color={colors.error}
169+
/>
170+
<Text style={styles.errorText}>{error}</Text>
162171
</View>
163172
) : null}
164173

165-
<View style={loginStyles.inputContainer}>
166-
<View style={loginStyles.inputWrapper}>
174+
<View style={styles.inputContainer}>
175+
<View style={styles.inputWrapper}>
167176
<MaterialIcons
168177
name="email"
169178
size={20}
170-
color="#6b7280"
171-
style={loginStyles.inputIcon}
179+
color={colors.textMuted}
180+
style={styles.inputIcon}
172181
/>
173182
<TextInput
174-
style={loginStyles.input}
183+
style={styles.input}
175184
placeholder="Enter your email address"
176-
placeholderTextColor="#9ca3af"
185+
placeholderTextColor={colors.textMuted}
177186
value={email}
178187
onChangeText={text => {
179188
setEmail(text);
@@ -192,12 +201,12 @@ const ForgotPasswordScreen: React.FC = () => {
192201
</View>
193202
</View>
194203

195-
<View style={loginStyles.buttonContainer}>
204+
<View style={styles.buttonContainer}>
196205
<TouchableOpacity
197206
style={[
198-
loginStyles.resetPrimaryButton,
207+
styles.resetPrimaryButton,
199208
(isLoading || !email.trim() || !validateEmail(email.trim())) &&
200-
loginStyles.primaryButtonDisabled,
209+
styles.primaryButtonDisabled,
201210
]}
202211
onPress={handleForgotPassword}
203212
disabled={
@@ -206,25 +215,25 @@ const ForgotPasswordScreen: React.FC = () => {
206215
>
207216
<Text
208217
style={[
209-
loginStyles.resetPrimaryButtonText,
218+
styles.resetPrimaryButtonText,
210219
(isLoading ||
211220
!email.trim() ||
212221
!validateEmail(email.trim())) &&
213-
loginStyles.primaryButtonTextDisabled,
222+
styles.primaryButtonTextDisabled,
214223
]}
215224
>
216225
{isLoading ? "Sending..." : "Send Reset Link"}
217226
</Text>
218227
</TouchableOpacity>
219228
</View>
220229

221-
<View style={loginStyles.footerLinks}>
230+
<View style={styles.footerLinks}>
222231
<TouchableOpacity onPress={handleBackToLogin}>
223-
<Text style={loginStyles.linkText}>Back to Login</Text>
232+
<Text style={styles.linkText}>Back to Login</Text>
224233
</TouchableOpacity>
225-
<Text style={loginStyles.linkSeparator}></Text>
234+
<Text style={styles.linkSeparator}></Text>
226235
<TouchableOpacity onPress={handleCreateAccount}>
227-
<Text style={loginStyles.linkText}>Create Account</Text>
236+
<Text style={styles.linkText}>Create Account</Text>
228237
</TouchableOpacity>
229238
</View>
230239
</View>

app/(auth)/login.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import {
3131
} from "react-native";
3232
import { useRouter } from "expo-router";
3333
import { useAuth } from "@contexts/AuthContext";
34-
import { loginStyles as styles } from "@styles/auth/loginStyles";
34+
import { useTheme } from "@contexts/ThemeContext";
35+
import { loginStyles } from "@styles/auth/loginStyles";
3536

3637
export default function LoginScreen() {
3738
const [username, setUsername] = useState("");
@@ -40,6 +41,8 @@ export default function LoginScreen() {
4041

4142
const { login, error, clearError } = useAuth();
4243
const router = useRouter();
44+
const { colors } = useTheme();
45+
const styles = loginStyles(colors);
4346

4447
const handleLogin = async () => {
4548
if (!username || !password) {
@@ -87,7 +90,8 @@ export default function LoginScreen() {
8790
<View style={styles.inputContainer}>
8891
<TextInput
8992
style={styles.input}
90-
placeholder="Username or Email"
93+
placeholder="Username"
94+
placeholderTextColor={colors.textMuted}
9195
value={username}
9296
onChangeText={setUsername}
9397
autoCapitalize="none"
@@ -100,6 +104,7 @@ export default function LoginScreen() {
100104
<TextInput
101105
style={styles.input}
102106
placeholder="Password"
107+
placeholderTextColor={colors.textMuted}
103108
value={password}
104109
onChangeText={setPassword}
105110
secureTextEntry

app/(auth)/register.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* - Error handling with user-friendly messages
3838
* - Authentication context integration for state management
3939
*/
40-
import React, { useState } from "react";
40+
import React, { useState, useMemo } from "react";
4141
import {
4242
View,
4343
Text,
@@ -50,7 +50,8 @@ import {
5050
} from "react-native";
5151
import { useRouter } from "expo-router";
5252
import { useAuth } from "@contexts/AuthContext";
53-
import { registerStyles as styles } from "@styles/auth/registerStyles";
53+
import { useTheme } from "@contexts/ThemeContext";
54+
import { registerStyles } from "@styles/auth/registerStyles";
5455
import { TEST_IDS } from "@src/constants/testIDs";
5556

5657
export default function RegisterScreen() {
@@ -62,6 +63,8 @@ export default function RegisterScreen() {
6263

6364
const { register, error, clearError } = useAuth();
6465
const router = useRouter();
66+
const { colors } = useTheme();
67+
const styles = useMemo(() => registerStyles(colors), [colors]);
6568

6669
const validateForm = () => {
6770
if (!username || !email || !password || !confirmPassword) {
@@ -136,6 +139,7 @@ export default function RegisterScreen() {
136139
<TextInput
137140
style={styles.input}
138141
placeholder="Username"
142+
placeholderTextColor={colors.textMuted}
139143
value={username}
140144
onChangeText={setUsername}
141145
autoCapitalize="none"
@@ -148,6 +152,7 @@ export default function RegisterScreen() {
148152
<TextInput
149153
style={styles.input}
150154
placeholder="Email"
155+
placeholderTextColor={colors.textMuted}
151156
value={email}
152157
onChangeText={setEmail}
153158
keyboardType="email-address"
@@ -161,6 +166,7 @@ export default function RegisterScreen() {
161166
<TextInput
162167
style={styles.input}
163168
placeholder="Password"
169+
placeholderTextColor={colors.textMuted}
164170
value={password}
165171
onChangeText={setPassword}
166172
secureTextEntry
@@ -173,6 +179,7 @@ export default function RegisterScreen() {
173179
<TextInput
174180
style={styles.input}
175181
placeholder="Confirm Password"
182+
placeholderTextColor={colors.textMuted}
176183
value={confirmPassword}
177184
onChangeText={setConfirmPassword}
178185
secureTextEntry

0 commit comments

Comments
 (0)