diff --git a/api/main_endpoints/routes/PermissionRequest.js b/api/main_endpoints/routes/PermissionRequest.js index 935148acf..26baa6fbe 100644 --- a/api/main_endpoints/routes/PermissionRequest.js +++ b/api/main_endpoints/routes/PermissionRequest.js @@ -17,12 +17,12 @@ router.post('/create', async (req, res) => { } try { - await PermissionRequest.create({ + const created = await PermissionRequest.create({ userId: decoded.token._id, type, status: 'PENDING', }); - res.sendStatus(OK); + res.status(OK).send(created.toJSON()); } catch (error) { if (error.code === 11000) return res.sendStatus(CONFLICT); logger.error('Failed to create permission request:', error); @@ -121,4 +121,3 @@ router.post('/approve', async (req, res) => { }); module.exports = router; - diff --git a/src/APIFunctions/PermissionRequest.js b/src/APIFunctions/PermissionRequest.js index 335cbbf77..77199a577 100644 --- a/src/APIFunctions/PermissionRequest.js +++ b/src/APIFunctions/PermissionRequest.js @@ -40,11 +40,17 @@ export async function createPermissionRequest(type, token) { body: JSON.stringify({ type }), }); - status.error = !res.ok; - if (res.ok || res.status === 409) { - // Backend sends 200 with no body on success, so fetch the created request - const existingRequest = await getPermissionRequests(type, token); - status.responseData = existingRequest.responseData; + const data = await res.json(); + + if (res.ok) { + status.responseData = data; + status.error = false; + return status; + } + status.error = true; + if (res.status === 409) { + // user already has a pending/approved request. + status.responseData = data; } } catch (err) { status.responseData = err; diff --git a/src/Pages/LedSign/LedSign.js b/src/Pages/LedSign/LedSign.js index 261bed294..6c195f792 100644 --- a/src/Pages/LedSign/LedSign.js +++ b/src/Pages/LedSign/LedSign.js @@ -3,6 +3,7 @@ import { healthCheck, updateSignText } from '../../APIFunctions/LedSign'; import { getPermissionRequests, createPermissionRequest, + deletePermissionRequest, }from '../../APIFunctions/PermissionRequest'; import { useSCE } from '../../Components/context/SceContext'; import { membershipState } from '../../Enums'; @@ -259,37 +260,51 @@ function LedSign() { const result = await createPermissionRequest('LED_SIGN', user.token); if (!result.error) { setPermissionRequest({ + _id: result.responseData._id, status: 'PENDING', }); } setRequestingPermission(false); } - function renderPermissionRequestUI() { - if (user.accessLevel >= membershipState.OFFICER) { - return null; + async function handleCancelRequest() { + setRequestingPermission(true); + const result = await deletePermissionRequest(permissionRequest._id, user.token); + if (!result.error) { + setPermissionRequest(null); } + setRequestingPermission(false); + } + + function renderPermissionRequestUI() { + if (user.accessLevel >= membershipState.OFFICER) return null; + + // Mobile-friendly container: using max-w-md for better card feel on mobile + const containerClasses = 'w-11/12 sm:w-2/3 lg:w-1/2 text-center p-6 bg-white dark:bg-gray-800 rounded-xl shadow-md space-y-4 fade-in border border-gray-200 dark:border-gray-700'; if (checkingPermission || requestingPermission) { return ( -
-

Loading...

+
+
+
+

Processing...

+
); } if (!permissionRequest) { return ( -
-

- You need permission to access the LED sign. +

+

Access Required

+

+ You currently do not have permission to update the LED sign. Would you like to request access?

); @@ -297,18 +312,31 @@ function LedSign() { if (permissionRequest.status === 'PENDING') { return ( -
+
+
+ Pending Approval +

- You requested access to the sign on {getFormattedTime(permissionRequest.createdAt)}. + Requested on {getFormattedTime(permissionRequest.createdAt)}

-

- Drop a message in Discord to speed up the process! +

+ Check back soon! You can also message us on Discord to speed this up.

+ + {/* Mobile-friendly Button Stack */} +
+ +
); } - return

{JSON.stringify(permissionRequest)}

; + return null; } function renderSignControls() {