+ {getExtensionRequestDetails(request, styles).map(
+ (item, idx) => (
+
+
+ {item.label}
+
+
+ {item.value}
+
+
+ )
+ )}
+
+ {request.reviewedBy &&
+ (request.status === 'APPROVED' ||
+ request.status === 'DENIED') && (
+
+ Your request was{' '}
+ {request.status.toLowerCase()} by{' '}
+ {request.reviewedBy}{' '}
+ {request.reviewedAt
+ ? formatToRelativeTime(
+ request.reviewedAt
+ )
+ : ''}
+
+ )}
+
+ ))}
+ >
+ );
+ };
diff --git a/src/components/ExtensionRequest/ExtensionStatusModal.module.scss b/src/components/ExtensionRequest/ExtensionStatusModal.module.scss
new file mode 100644
index 000000000..a6e5f659b
--- /dev/null
+++ b/src/components/ExtensionRequest/ExtensionStatusModal.module.scss
@@ -0,0 +1,127 @@
+@import '../../styles/variables.scss';
+
+.extensionModalOverlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: rgba($black, 0.7);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 1000;
+}
+
+.extensionModal {
+ background-color: $white;
+ padding: 1.9rem;
+ border-radius: 0.6rem;
+ width: 90%;
+ max-width: 48rem;
+ max-height: 90vh;
+ overflow-y: auto;
+ box-shadow: 0 1.3rem 3.1rem rgba($black, 0.7);
+ font-family: 'Segoe UI', sans-serif;
+ font-size: 1rem;
+}
+
+.extensionModal h2 {
+ text-align: center;
+ margin-bottom: 1.9rem;
+ font-size: 2rem;
+ font-weight: 500;
+ color: rgba($black, 0.9);
+}
+
+.extensionDetailRow {
+ display: flex;
+ flex-wrap: wrap;
+ margin-bottom: 1rem;
+ line-height: 1.5;
+}
+
+.extensionLabel {
+ font-weight: bold;
+ width: 10rem;
+ color: rgba($black, 0.9);
+ flex-shrink: 0;
+}
+
+.extensionValue {
+ flex: 1;
+ color: rgba($black, 0.9);
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ word-break: break-word;
+}
+
+.extensionApprovalInfo,
+.extensionRejectionInfo {
+ margin-top: 0.6rem;
+ font-style: italic;
+ color: $black;
+ text-align: center;
+}
+
+.extensionButtonContainer {
+ display: flex;
+ justify-content: center;
+ gap: 1rem;
+ margin-top: 1.9rem;
+}
+
+.extensionCloseButton,
+.extensionRequestButton {
+ padding: 0.8rem 0;
+ border: none;
+ border-radius: 0.4rem;
+ cursor: pointer;
+ width: 40%;
+ font-weight: bold;
+ font-size: 1rem;
+}
+
+.extensionCloseButton {
+ background-color: $red;
+ color: $white;
+}
+
+.extensionRequestButton {
+ background-color: $green;
+ color: $white;
+}
+
+.extensionApproved {
+ font-weight: bold;
+ color: $green;
+}
+
+.extensionPending,
+.extensionDenied {
+ font-weight: bold;
+ color: $orange;
+}
+
+.extensionModalLoading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ z-index: 1100;
+ background-color: $white;
+ padding: 1.5rem;
+ border-radius: 0.5rem;
+ max-width: 18.8rem;
+}
+
+.extensionNoRequests {
+ text-align: center;
+}
+
+.spinnerContainer {
+ display: flex;
+ justify-content: center;
+ width: 100%;
+ margin: 1rem 0;
+}
diff --git a/src/components/ExtensionRequest/ExtensionStatusModal.tsx b/src/components/ExtensionRequest/ExtensionStatusModal.tsx
new file mode 100644
index 000000000..516ee89ac
--- /dev/null
+++ b/src/components/ExtensionRequest/ExtensionStatusModal.tsx
@@ -0,0 +1,185 @@
+import React, { useRef, useEffect } from 'react';
+import styles from './ExtensionStatusModal.module.scss';
+import { useGetSelfExtensionRequestsQuery } from '@/app/services/tasksApi';
+import { SmallSpinner } from '../tasks/card/SmallSpinner';
+import moment from 'moment';
+import { ExtensionRequestDetails } from './ExtensionRequestDetails';
+import { ExtensionRequest, ExtensionDetailItem } from '@/interfaces/task.type';
+
+type ExtensionStatusModalProps = {
+ isOpen: boolean;
+ onClose: () => void;
+ taskId: string;
+ dev: boolean;
+ assignee: string;
+};
+
+const formatToDateTime = (timestamp: number) => {
+ const timestampMs = timestamp < 1e12 ? timestamp * 1000 : timestamp;
+ return moment(timestampMs).format('MM/DD/YYYY, h:mm:ss A');
+};
+
+export const formatToRelativeTime = (timestamp: number) => {
+ const timestampMs = timestamp < 1e12 ? timestamp * 1000 : timestamp;
+ return moment(timestampMs).fromNow();
+};
+
+const getStatusClass = (status: string, styles: any) => {
+ switch (status) {
+ case 'APPROVED':
+ return styles.extensionApproved;
+ case 'DENIED':
+ return styles.extensionDenied;
+ default:
+ return styles.extensionPending;
+ }
+};
+
+const getExtensionRequestDetails = (
+ request: ExtensionRequest,
+ styles: Record