From 094f7b24401780fc8c2d9791f7de55942a00728b Mon Sep 17 00:00:00 2001 From: Fadhli Date: Thu, 10 Oct 2024 13:53:01 +0800 Subject: [PATCH 1/6] SCRUM-143 Created skeleton for Settings --- .../app/screens/Settings.tsx | 99 +++++++++++------- .../cbcddad7-609d-4691-a812-4ac8b50f01fa.jpg | Bin 0 -> 48030 bytes .../components/CustomButton.tsx | 2 +- .../components/CustomSwitch.tsx | 74 +++++++++++++ .../iQMA-Skills-Builder/package-lock.json | 7 ++ frontend/iQMA-Skills-Builder/package.json | 1 + 6 files changed, 143 insertions(+), 40 deletions(-) create mode 100644 frontend/iQMA-Skills-Builder/assets/images/cbcddad7-609d-4691-a812-4ac8b50f01fa.jpg create mode 100644 frontend/iQMA-Skills-Builder/components/CustomSwitch.tsx diff --git a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx index 712a3bc..8bb2174 100644 --- a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx +++ b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx @@ -1,47 +1,68 @@ -import {Button, StyleSheet, Text, View} from 'react-native'; - -import React from 'react'; -import {LogoutButton} from '@/components/LogoutButton'; +import {Button, StyleSheet, Text, View, Switch} from 'react-native'; +import React, {useContext, useState} from 'react'; import {router} from 'expo-router'; +import CustomSwitch from '@/components/CustomSwitch'; +import {CustomButton} from '@/components/CustomButton'; +import {AuthContext} from '@/context/AuthContext'; + +export default function Settings() { + const {logOut, currentUser} = useContext(AuthContext); + + const [isSoundEffectsEnabled, setIsSoundEffectsEnabled] = useState(false); + const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(false); + + const toggleSoundEffects = (value: boolean) => { + setIsSoundEffectsEnabled(value); + }; + + const toggleNotifications = (value: boolean) => { + setIsNotificationsEnabled(value); + }; -const testLesson = () => { - router.push('SectionIntroduction'); -}; - -const testQuiz = () => { - router.push('VideoQuiz'); -}; - -const testAsssessment = () => { - router.push('Assessment'); -}; - -const assessmentIntro = () => { - router.push('AssessmentIntroduction'); -}; - -const SettingPage: React.FC = () => ( - - Settings Screen - - - - - - - - - - - -); + return ( + + GENERAL + + Sound Effects + + + NOTIFICATIONS + + All Notifications + + + + + + + + + + + ); +} const styles = StyleSheet.create({ container: { flex: 1, - justifyContent: 'center', - alignItems: 'center', + padding: 20, + }, + textHeading: { + color: '#7654F2', + fontWeight: 'bold', }, }); - -export default SettingPage; diff --git a/frontend/iQMA-Skills-Builder/assets/images/cbcddad7-609d-4691-a812-4ac8b50f01fa.jpg b/frontend/iQMA-Skills-Builder/assets/images/cbcddad7-609d-4691-a812-4ac8b50f01fa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe54e9d9c8a17e0d612d147b1399cfc0a472bae1 GIT binary patch literal 48030 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 literal 0 HcmV?d00001 diff --git a/frontend/iQMA-Skills-Builder/components/CustomButton.tsx b/frontend/iQMA-Skills-Builder/components/CustomButton.tsx index 3a1cbea..402abf3 100644 --- a/frontend/iQMA-Skills-Builder/components/CustomButton.tsx +++ b/frontend/iQMA-Skills-Builder/components/CustomButton.tsx @@ -61,7 +61,7 @@ const styles = StyleSheet.create({ // paddingBottom: 20, }, button: { - width: screenWidth * 0.8, + width: screenWidth * 0.9, marginVertical: 10, padding: 15, borderRadius: 10, diff --git a/frontend/iQMA-Skills-Builder/components/CustomSwitch.tsx b/frontend/iQMA-Skills-Builder/components/CustomSwitch.tsx new file mode 100644 index 0000000..2af5b38 --- /dev/null +++ b/frontend/iQMA-Skills-Builder/components/CustomSwitch.tsx @@ -0,0 +1,74 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { View, TouchableOpacity, Animated, StyleSheet } from 'react-native'; + +interface CustomSwitchProps { + isEnabled: boolean; + onToggle: (value: boolean) => void; +} + +const CustomSwitch: React.FC = ({ isEnabled, onToggle }) => { + + const animationValue = useRef(new Animated.Value(isEnabled ? 1 : 0)).current; + + // Update the animation when isEnabled changes + useEffect(() => { + Animated.timing(animationValue, { + toValue: isEnabled ? 1 : 0, + duration: 300, + useNativeDriver: false, + }).start(); + }, [isEnabled]); + + const interpolateBackgroundColor = animationValue.interpolate({ + inputRange: [0, 1], + outputRange: ['#ddd', '#7654F2'], // Off state to On state colors + }); + + const knobPosition = animationValue.interpolate({ + inputRange: [0, 1], + outputRange: [0, 21], // Left position for 'Off' and 'On' + }); + + return ( + onToggle(!isEnabled)} + style={styles.container} + activeOpacity={0.8} // Prevent quick double-taps causing issues + > + + + + + ); + }; + + const styles = StyleSheet.create({ + container: { + padding: 10, + }, + switchBackground: { + width: 50, + height: 30, + borderRadius: 15, + justifyContent: 'center', + padding: 2, + }, + switchKnob: { + width: 26, + height: 26, + borderRadius: 13, + backgroundColor: '#fff', + }, + }); + + export default CustomSwitch; diff --git a/frontend/iQMA-Skills-Builder/package-lock.json b/frontend/iQMA-Skills-Builder/package-lock.json index 43e2fab..846f1ad 100644 --- a/frontend/iQMA-Skills-Builder/package-lock.json +++ b/frontend/iQMA-Skills-Builder/package-lock.json @@ -42,6 +42,7 @@ "react-native-safe-area-context": "^4.10.1", "react-native-screens": "^3.31.1", "react-native-svg": "^15.6.0", + "react-native-toggle-input": "^1.0.12", "react-native-vector-icons": "^10.1.0", "react-native-web": "~0.19.10", "react-native-webview": "^13.12.0", @@ -16804,6 +16805,12 @@ "react-native": "*" } }, + "node_modules/react-native-toggle-input": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/react-native-toggle-input/-/react-native-toggle-input-1.0.12.tgz", + "integrity": "sha512-pqywtDnGkrxnQivGh92O2ymkkIeSXmiWFJn77U9xjTSvh8b83fjcW+DoDiOFnxFtv0sB9EZBLBtnBN/ITRnkjA==", + "license": "MIT" + }, "node_modules/react-native-vector-icons": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.1.0.tgz", diff --git a/frontend/iQMA-Skills-Builder/package.json b/frontend/iQMA-Skills-Builder/package.json index dcb6e5f..b0f6e49 100644 --- a/frontend/iQMA-Skills-Builder/package.json +++ b/frontend/iQMA-Skills-Builder/package.json @@ -49,6 +49,7 @@ "react-native-safe-area-context": "^4.10.1", "react-native-screens": "^3.31.1", "react-native-svg": "^15.6.0", + "react-native-toggle-input": "^1.0.12", "react-native-vector-icons": "^10.1.0", "react-native-web": "~0.19.10", "react-native-webview": "^13.12.0", From 1d045baac3eb428928a2eac0f79ce027cd27be3e Mon Sep 17 00:00:00 2001 From: Fadhli Date: Thu, 10 Oct 2024 13:54:31 +0800 Subject: [PATCH 2/6] Commented out Help Center and Feedback Buttons --- frontend/iQMA-Skills-Builder/app/screens/Settings.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx index 8bb2174..8944e84 100644 --- a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx +++ b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx @@ -43,9 +43,9 @@ export default function Settings() { - + {/* - + */} Date: Thu, 10 Oct 2024 14:35:47 +0800 Subject: [PATCH 3/6] SCRUM-143 Add Autosave feature --- .../app/screens/Settings.tsx | 99 +++++++++++++------ .../components/CustomSwitch.tsx | 2 +- .../iQMA-Skills-Builder/package-lock.json | 7 -- frontend/iQMA-Skills-Builder/package.json | 1 - 4 files changed, 71 insertions(+), 38 deletions(-) diff --git a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx index 8944e84..efdf79e 100644 --- a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx +++ b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx @@ -1,51 +1,83 @@ -import {Button, StyleSheet, Text, View, Switch} from 'react-native'; -import React, {useContext, useState} from 'react'; -import {router} from 'expo-router'; +import { StyleSheet, Text, View } from 'react-native'; +import React, { useContext, useEffect, useState } from 'react'; import CustomSwitch from '@/components/CustomSwitch'; -import {CustomButton} from '@/components/CustomButton'; -import {AuthContext} from '@/context/AuthContext'; +import { CustomButton } from '@/components/CustomButton'; +import { AuthContext } from '@/context/AuthContext'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { LoadingIndicator } from '@/components/LoadingIndicator'; export default function Settings() { - const {logOut, currentUser} = useContext(AuthContext); + const { logOut } = useContext(AuthContext); const [isSoundEffectsEnabled, setIsSoundEffectsEnabled] = useState(false); const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(false); + const [isLoading, setIsLoading] = useState(true); - const toggleSoundEffects = (value: boolean) => { + // Get Settings from AsyncStorage + const getSettingsData = async () => { + try { + const soundEffects = await AsyncStorage.getItem('soundEffects'); + const notifications = await AsyncStorage.getItem('notifications'); + + if (soundEffects !== null) { + const parsedSoundEffects = JSON.parse(soundEffects); + setIsSoundEffectsEnabled(parsedSoundEffects); + } + if (notifications !== null) { + const parsedNotifications = JSON.parse(notifications); + setIsNotificationsEnabled(parsedNotifications); + } + } catch (e) { + console.error('Error reading AsyncStorage values:', e); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + getSettingsData(); + }, []); + + // Auto save to AsyncStorage when user make changes + const toggleSoundEffects = async (value: boolean) => { setIsSoundEffectsEnabled(value); + try { + await AsyncStorage.setItem('soundEffects', JSON.stringify(value)); + console.log('Sound Effects setting saved!'); + } catch (e) { + console.error('Error saving sound effects setting:', e); + } }; - const toggleNotifications = (value: boolean) => { + // Auto save to AsyncStorage when user make changes + const toggleNotifications = async (value: boolean) => { setIsNotificationsEnabled(value); + try { + await AsyncStorage.setItem('notifications', JSON.stringify(value)); + console.log('Notifications setting saved!'); + } catch (e) { + console.error('Error saving notifications setting:', e); + } }; + // If still loading, show the loading indicator + if (isLoading) { + return ; + } + return ( GENERAL - - Sound Effects - + + Sound Effects + + NOTIFICATIONS - - All Notifications - + + All Notifications + - - - {/* - - */} = ({ isEnabled, onToggle }) => { const knobPosition = animationValue.interpolate({ inputRange: [0, 1], - outputRange: [0, 21], // Left position for 'Off' and 'On' + outputRange: [0, 20], // Left position for 'Off' and 'On' }); return ( diff --git a/frontend/iQMA-Skills-Builder/package-lock.json b/frontend/iQMA-Skills-Builder/package-lock.json index 846f1ad..43e2fab 100644 --- a/frontend/iQMA-Skills-Builder/package-lock.json +++ b/frontend/iQMA-Skills-Builder/package-lock.json @@ -42,7 +42,6 @@ "react-native-safe-area-context": "^4.10.1", "react-native-screens": "^3.31.1", "react-native-svg": "^15.6.0", - "react-native-toggle-input": "^1.0.12", "react-native-vector-icons": "^10.1.0", "react-native-web": "~0.19.10", "react-native-webview": "^13.12.0", @@ -16805,12 +16804,6 @@ "react-native": "*" } }, - "node_modules/react-native-toggle-input": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/react-native-toggle-input/-/react-native-toggle-input-1.0.12.tgz", - "integrity": "sha512-pqywtDnGkrxnQivGh92O2ymkkIeSXmiWFJn77U9xjTSvh8b83fjcW+DoDiOFnxFtv0sB9EZBLBtnBN/ITRnkjA==", - "license": "MIT" - }, "node_modules/react-native-vector-icons": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.1.0.tgz", diff --git a/frontend/iQMA-Skills-Builder/package.json b/frontend/iQMA-Skills-Builder/package.json index b0f6e49..dcb6e5f 100644 --- a/frontend/iQMA-Skills-Builder/package.json +++ b/frontend/iQMA-Skills-Builder/package.json @@ -49,7 +49,6 @@ "react-native-safe-area-context": "^4.10.1", "react-native-screens": "^3.31.1", "react-native-svg": "^15.6.0", - "react-native-toggle-input": "^1.0.12", "react-native-vector-icons": "^10.1.0", "react-native-web": "~0.19.10", "react-native-webview": "^13.12.0", From 41c9ea064272d48b8dd83468f7094835951bc3fa Mon Sep 17 00:00:00 2001 From: Fadhli Date: Thu, 10 Oct 2024 14:37:11 +0800 Subject: [PATCH 4/6] SCRUM-143 Add Loading Indicator when fetching data --- frontend/iQMA-Skills-Builder/app/screens/Settings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx index efdf79e..d9d6f53 100644 --- a/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx +++ b/frontend/iQMA-Skills-Builder/app/screens/Settings.tsx @@ -62,7 +62,7 @@ export default function Settings() { // If still loading, show the loading indicator if (isLoading) { - return ; + return ; } return ( From f4d8b26f1afb2b2da45fdfb334ee3bc6367274fc Mon Sep 17 00:00:00 2001 From: Fadhli Date: Thu, 10 Oct 2024 18:05:32 +0800 Subject: [PATCH 5/6] SCRUM-143 Change Header Title Color to White --- frontend/iQMA-Skills-Builder/app/(tabs)/_layout.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/iQMA-Skills-Builder/app/(tabs)/_layout.tsx b/frontend/iQMA-Skills-Builder/app/(tabs)/_layout.tsx index 38dfbab..3004246 100644 --- a/frontend/iQMA-Skills-Builder/app/(tabs)/_layout.tsx +++ b/frontend/iQMA-Skills-Builder/app/(tabs)/_layout.tsx @@ -69,6 +69,7 @@ export default function AppTabs() { tabBarIcon: ({color, size}) => ( ), + headerTintColor: '#fff' }} /> ( ), + headerTintColor: '#fff' }} /> From a182c98b9edb65e5604d588edfffdb3e639224b2 Mon Sep 17 00:00:00 2001 From: Fadhli Date: Thu, 10 Oct 2024 18:11:29 +0800 Subject: [PATCH 6/6] SCRUM-143 Add SafeAreaView to Home Screen --- frontend/iQMA-Skills-Builder/app/screens/Home.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/iQMA-Skills-Builder/app/screens/Home.tsx b/frontend/iQMA-Skills-Builder/app/screens/Home.tsx index b21ae92..0729400 100644 --- a/frontend/iQMA-Skills-Builder/app/screens/Home.tsx +++ b/frontend/iQMA-Skills-Builder/app/screens/Home.tsx @@ -15,6 +15,7 @@ import * as unitEndpoints from '@/helpers/unitEndpoints'; import * as lessonEndpoints from '@/helpers/lessonEndpoints'; import * as resultEndpoints from '@/helpers/resultEndpoints'; import { LoadingIndicator } from '@/components/LoadingIndicator'; +import { SafeAreaView } from 'react-native-safe-area-context'; function calculateTotalProgress(i: number, totalUnits: number, getLessonIds: any[]) { const uniqueAlphabets = new Set(getLessonIds); @@ -396,6 +397,7 @@ const HomeScreen: React.FC = () => { } return ( + {/* Top Stats */} @@ -417,6 +419,7 @@ const HomeScreen: React.FC = () => { No sections available )} + ); }; @@ -424,7 +427,6 @@ const styles = StyleSheet.create({ container: { padding: 20, backgroundColor: '#F5F5F5', - marginTop: 10, }, lineSeparator: { height: 1,