From 80efb0be54e1680ffb287aedc0b2df2a57aef93f Mon Sep 17 00:00:00 2001 From: mudabbir-ahmad Date: Tue, 9 Dec 2025 14:31:38 +0000 Subject: [PATCH 1/3] Added post and put and delete functionality both to user and modules, also updated users so that it by default has the user set to registered as not registered, but gives a dropdown allowing a person to select whether they are registered or not --- src/components/entity/users/UserForm.js | 10 ++++ src/components/screens/ModuleListScreen.js | 54 +++++++++++++--------- src/components/screens/UserListScreen.js | 35 +++++++------- 3 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/components/entity/users/UserForm.js b/src/components/entity/users/UserForm.js index 6c760d0..0dc9059 100644 --- a/src/components/entity/users/UserForm.js +++ b/src/components/entity/users/UserForm.js @@ -13,6 +13,7 @@ const defaultUser = { UserYearID: null, UserLevel: null, UserImageURL: null, + UserRegistered: null, }; const UserForm = ({originalUser, onSubmit, onCancel}) => { @@ -20,6 +21,7 @@ const UserForm = ({originalUser, onSubmit, onCancel}) => { defaultUser.UserID = Math.floor(100000 + Math.random() * 900000); defaultUser.UserImageURL = 'https://images.generated.photos/tZmcC6WnzFmgAwRMsBnGYcmaj_NSktxhYzBfTqej_Lo/rs:fit:256:256/czM6Ly9pY29uczgu/Z3Bob3Rvcy1wcm9k/LnBob3Rvcy92M18w/MDE3MjYzLmpwZw.jpg'; + defaultUser.UserRegistered = 0; const userTypesEndpoint = 'https://softwarehub.uk/unibase/api/usertypes'; const yearsEndpoint = 'https://softwarehub.uk/unibase/api/years'; @@ -118,6 +120,14 @@ const UserForm = ({originalUser, onSubmit, onCancel}) => { value={user.UserImageURL} onChange={(value) => handleChange('UserImageURL', value)} /> + + handleChange('UserRegistered', value)} + prompt={'Select registered status...'} + options={registeredOptions} + /> ); }; diff --git a/src/components/screens/ModuleListScreen.js b/src/components/screens/ModuleListScreen.js index 3f5d307..a3e9f96 100644 --- a/src/components/screens/ModuleListScreen.js +++ b/src/components/screens/ModuleListScreen.js @@ -1,10 +1,11 @@ // import {useState, useEffect} from "react"; -import {LogBox, Text} from "react-native"; +import {Alert, LogBox, Text} from "react-native"; import Screen from "../layout/Screen"; import ModuleList from "../entity/modules/ModuleList"; import {Button, ButtonTray} from "../UI/Button"; import Icons from "../UI/Icons"; import useLoad from "../API/useLoad"; +import API from "../API/API"; const ModuleListScreen = ({navigation}) => { @@ -16,40 +17,49 @@ const ModuleListScreen = ({navigation}) => { // State ---------------------- - const [modules, setModules, isLoading, loadModules] = useLoad(modulesEndpoint); + const [modules, isLoading, loadModules] = useLoad(modulesEndpoint); // Handlers ------------------- - const handleDelete = (module) => - setModules(modules.filter((item) => item.ModuleID !== module.ModuleID)); - - - const onDelete = (module) => { - handleDelete(module); - navigation.goBack(); + const onDelete = async (module) => { + const deleteEndpoint = `${modulesEndpoint}/${module.ModuleID}`; + const result = await API.delete(deleteEndpoint, module); + if (result.isSuccess) { + loadModules(modulesEndpoint) + navigation.goBack(); + } else + Alert.alert(result.message); } - const handleAdd = (module) => setModules([...modules, module]); + // This code is the old handleAdd which added to local state. + // const handleAdd = (module) => setModules([...modules, module]); - const handleModify = (updatedModule) => setModules( - modules.map((module) => (module.ModuleID === updatedModule.ModuleID) ? updatedModule : module), - ); - - const onAdd = (module) => { - handleAdd(module); - navigation.goBack(); + //new handleAdd which posts to the API + const handleAdd = async (module) => { + const result = await API.post(modulesEndpoint, module); + if (result.isSuccess) { + loadModules(modulesEndpoint) + navigation.goBack(); + } else + Alert.alert(result.message); }; - const onModify = (module) => { - handleModify(module); - navigation.replace('ModuleViewScreen', {module, onDelete, onModify}); + const onModify = async (module) => { + const putEndpoint = `${modulesEndpoint}/${module.ModuleID}`; + const result = await API.put(putEndpoint, module); + if ( result.isSuccess ) { + loadModules(modulesEndpoint) + navigation.navigate('ModuleListScreen'); + } else + Alert.alert(result.message); }; + const goToViewScreen = (module) => - navigation.navigate('ModuleViewScreen', {module, onDelete, onModify}); + navigation.navigate('ModuleViewScreen', {module, onDelete, onModify }); const goToAddScreen = () => - navigation.navigate('ModuleAddScreen', {onAdd}); + navigation.navigate('ModuleAddScreen', {onAdd: handleAdd}); // View ----------------------- diff --git a/src/components/screens/UserListScreen.js b/src/components/screens/UserListScreen.js index 55adb73..3167962 100644 --- a/src/components/screens/UserListScreen.js +++ b/src/components/screens/UserListScreen.js @@ -1,9 +1,10 @@ -import {LogBox, Text} from "react-native"; +import {Alert, LogBox, Text} from "react-native"; import Screen from "../layout/Screen"; import UserList from "../entity/users/UserList"; import {Button, ButtonTray} from "../UI/Button"; import Icons from "../UI/Icons"; import useLoad from "../API/useLoad"; +import API from "../API/API"; const UserListScreen = ({navigation}) => { // Initialisation ------------- @@ -23,31 +24,31 @@ const UserListScreen = ({navigation}) => { navigation.goBack(); }; - const handleAdd = (user) => setUsers([...users, user]); - - const handleModify = (updatedUser) => setUsers( - users.map((user) => (user.UserID === updatedUser.UserID) ? updatedUser : user), - ); - - const onAdd = (user) => { - handleAdd(user); - navigation.goBack(); + const handleAdd = async (user) => { + const result = await API.post(usersEndpoint, user); + if (result.isSuccess) { + await loadUsers(usersEndpoint) + navigation.goBack(); + } else + Alert.alert(result.message); }; - const onModify = (user) => { - handleModify(user); - navigation.replace('UserViewScreen', {user, onDelete, onModify}); + const onModify = async (user) => { + const putEndpoint = `${usersEndpoint}/${user.UserID}`; + const result = await API.put(putEndpoint, user); + if ( result.isSuccess ) { + await loadUsers(usersEndpoint) + navigation.navigate('UserListScreen'); + } else + Alert.alert(result.message); }; const goToViewScreen = (user) => navigation.navigate('UserViewScreen', {user, onDelete, onModify}); const goToAddScreen = () => - navigation.navigate('UserAddScreen', {onAdd}); + navigation.navigate('UserAddScreen', {onAdd: handleAdd}); - const handleSwitchToModules = () => { - navigation.navigate("ModuleListScreen"); - }; // View ----------------------- return ( From c4880737c632d859f4af365020040975aabdd918 Mon Sep 17 00:00:00 2001 From: mudabbir-ahmad Date: Tue, 9 Dec 2025 14:40:12 +0000 Subject: [PATCH 2/3] Added the dropdown options for registered user or not, added the delete handler to delete from endpoint to users, fixing issues with module's handler's not working fine because of an issue with endpoint requesting --- src/components/entity/users/UserForm.js | 5 +++++ src/components/screens/ModuleListScreen.js | 6 +++--- src/components/screens/UserListScreen.js | 17 ++++++++++------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/components/entity/users/UserForm.js b/src/components/entity/users/UserForm.js index 0dc9059..ab6c053 100644 --- a/src/components/entity/users/UserForm.js +++ b/src/components/entity/users/UserForm.js @@ -34,6 +34,11 @@ const UserForm = ({originalUser, onSubmit, onCancel}) => { {value: 7, label: '7 (Masters)'}, ]; + const registeredOptions = [ + {value: 1, label: 'True'}, + {value: 0, label: 'False'}, + ]; + // State ---------------------- const [user, setUser] = useState(originalUser || defaultUser); diff --git a/src/components/screens/ModuleListScreen.js b/src/components/screens/ModuleListScreen.js index a3e9f96..c98377a 100644 --- a/src/components/screens/ModuleListScreen.js +++ b/src/components/screens/ModuleListScreen.js @@ -25,7 +25,7 @@ const ModuleListScreen = ({navigation}) => { const deleteEndpoint = `${modulesEndpoint}/${module.ModuleID}`; const result = await API.delete(deleteEndpoint, module); if (result.isSuccess) { - loadModules(modulesEndpoint) + await loadModules(modulesEndpoint) navigation.goBack(); } else Alert.alert(result.message); @@ -38,7 +38,7 @@ const ModuleListScreen = ({navigation}) => { const handleAdd = async (module) => { const result = await API.post(modulesEndpoint, module); if (result.isSuccess) { - loadModules(modulesEndpoint) + await loadModules(modulesEndpoint) navigation.goBack(); } else Alert.alert(result.message); @@ -48,7 +48,7 @@ const ModuleListScreen = ({navigation}) => { const putEndpoint = `${modulesEndpoint}/${module.ModuleID}`; const result = await API.put(putEndpoint, module); if ( result.isSuccess ) { - loadModules(modulesEndpoint) + await loadModules(modulesEndpoint) navigation.navigate('ModuleListScreen'); } else Alert.alert(result.message); diff --git a/src/components/screens/UserListScreen.js b/src/components/screens/UserListScreen.js index 3167962..c13c347 100644 --- a/src/components/screens/UserListScreen.js +++ b/src/components/screens/UserListScreen.js @@ -13,16 +13,19 @@ const UserListScreen = ({navigation}) => { const usersEndpoint = 'https://softwarehub.uk/unibase/api/users'; // State ---------------------- - const [users, setUsers, isLoading, loadUsers] = useLoad(usersEndpoint); + const [users, isLoading, loadUsers] = useLoad(usersEndpoint); // Handlers ------------------- - const handleDelete = (user) => - setUsers(users.filter((item) => item.UserID !== user.UserID)); - const onDelete = (user) => { - handleDelete(user); - navigation.goBack(); - }; + const onDelete = async (user) => { + const deleteEndpoint = `${usersEndpoint}/${user.UserID}`; + const result = await API.delete(deleteEndpoint, user); + if (result.isSuccess) { + loadUsers(usersEndpoint) + navigation.goBack(); + } else + Alert.alert(result.message); + } const handleAdd = async (user) => { const result = await API.post(usersEndpoint, user); From a8010b30050cbaf594c0f7ca0ef63e4d68044897 Mon Sep 17 00:00:00 2001 From: mudabbir-ahmad Date: Tue, 9 Dec 2025 15:01:00 +0000 Subject: [PATCH 3/3] Fixed issue with loading, due to a missing comma, the loadUsers/loadModules was never called, fixed syntax error with ModuleImage to ModuleImageURL so that default image url is loaded for the module Add page. --- src/components/entity/modules/moduleForm.js | 2 +- src/components/screens/ModuleListScreen.js | 29 +++++++-------- src/components/screens/UserListScreen.js | 40 ++++++++++----------- 3 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/components/entity/modules/moduleForm.js b/src/components/entity/modules/moduleForm.js index 80ed4e0..270e2f9 100644 --- a/src/components/entity/modules/moduleForm.js +++ b/src/components/entity/modules/moduleForm.js @@ -19,7 +19,7 @@ const ModuleForm = ({originalModule, onSubmit, onCancel}) => { // Initialisation ------------- defaultModule.ModuleID = Math.floor(100000 + Math.random() * 900000); - defaultModule.ModuleImage = 'https://images.freeimages.com/images/small-preview/cf5/cellphone-1313194.jpg'; + defaultModule.ModuleImageURL = 'https://images.freeimages.com/images/small-preview/cf5/cellphone-1313194.jpg'; const yearsEndpoint = 'https://softwarehub.uk/unibase/api/years'; diff --git a/src/components/screens/ModuleListScreen.js b/src/components/screens/ModuleListScreen.js index c98377a..6bae870 100644 --- a/src/components/screens/ModuleListScreen.js +++ b/src/components/screens/ModuleListScreen.js @@ -17,28 +17,14 @@ const ModuleListScreen = ({navigation}) => { // State ---------------------- - const [modules, isLoading, loadModules] = useLoad(modulesEndpoint); + const [modules, , isLoading, loadModules] = useLoad(modulesEndpoint); // Handlers ------------------- - const onDelete = async (module) => { - const deleteEndpoint = `${modulesEndpoint}/${module.ModuleID}`; - const result = await API.delete(deleteEndpoint, module); - if (result.isSuccess) { - await loadModules(modulesEndpoint) - navigation.goBack(); - } else - Alert.alert(result.message); - } - - // This code is the old handleAdd which added to local state. - // const handleAdd = (module) => setModules([...modules, module]); - - //new handleAdd which posts to the API const handleAdd = async (module) => { const result = await API.post(modulesEndpoint, module); if (result.isSuccess) { - await loadModules(modulesEndpoint) + loadModules(modulesEndpoint) navigation.goBack(); } else Alert.alert(result.message); @@ -48,12 +34,21 @@ const ModuleListScreen = ({navigation}) => { const putEndpoint = `${modulesEndpoint}/${module.ModuleID}`; const result = await API.put(putEndpoint, module); if ( result.isSuccess ) { - await loadModules(modulesEndpoint) + loadModules(modulesEndpoint) navigation.navigate('ModuleListScreen'); } else Alert.alert(result.message); }; + const onDelete = async (module) => { + const deleteEndpoint = `${modulesEndpoint}/${module.ModuleID}`; + const result = await API.delete(deleteEndpoint, module); + if (result.isSuccess) { + loadModules(modulesEndpoint) + navigation.goBack(); + } else + Alert.alert(result.message); + } const goToViewScreen = (module) => navigation.navigate('ModuleViewScreen', {module, onDelete, onModify }); diff --git a/src/components/screens/UserListScreen.js b/src/components/screens/UserListScreen.js index c13c347..a6b4287 100644 --- a/src/components/screens/UserListScreen.js +++ b/src/components/screens/UserListScreen.js @@ -13,10 +13,29 @@ const UserListScreen = ({navigation}) => { const usersEndpoint = 'https://softwarehub.uk/unibase/api/users'; // State ---------------------- - const [users, isLoading, loadUsers] = useLoad(usersEndpoint); + const [users, , isLoading, loadUsers] = useLoad(usersEndpoint); // Handlers ------------------- + const handleAdd = async (user) => { + const result = await API.post(usersEndpoint, user); + if (result.isSuccess) { + loadUsers(usersEndpoint) + navigation.goBack(); + } else + Alert.alert(result.message); + }; + + const onModify = async (user) => { + const putEndpoint = `${usersEndpoint}/${user.UserID}`; + const result = await API.put(putEndpoint, user); + if ( result.isSuccess ) { + loadUsers(usersEndpoint) + navigation.navigate('UserListScreen'); + } else + Alert.alert(result.message); + }; + const onDelete = async (user) => { const deleteEndpoint = `${usersEndpoint}/${user.UserID}`; const result = await API.delete(deleteEndpoint, user); @@ -27,25 +46,6 @@ const UserListScreen = ({navigation}) => { Alert.alert(result.message); } - const handleAdd = async (user) => { - const result = await API.post(usersEndpoint, user); - if (result.isSuccess) { - await loadUsers(usersEndpoint) - navigation.goBack(); - } else - Alert.alert(result.message); - }; - - const onModify = async (user) => { - const putEndpoint = `${usersEndpoint}/${user.UserID}`; - const result = await API.put(putEndpoint, user); - if ( result.isSuccess ) { - await loadUsers(usersEndpoint) - navigation.navigate('UserListScreen'); - } else - Alert.alert(result.message); - }; - const goToViewScreen = (user) => navigation.navigate('UserViewScreen', {user, onDelete, onModify});