Linux websever 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64
Apache/2.4.52 (Ubuntu)
: 192.168.3.70 | : 192.168.1.99
Cant Read [ /etc/named.conf ]
8.1.2-1ubuntu2.23
urlab
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
var /
www /
html /
coursewise /
assets /
[ HOME SHELL ]
Name
Size
Permission
Action
AcademicTools-tj30wEj0.js
7.55
KB
-rwxr-xr-x
AcademicTools-tj30wEj0.js.map
14.63
KB
-rwxr-xr-x
AddCourse-BTNu-pnI.js
10.08
KB
-rwxr-xr-x
AddCourse-BTNu-pnI.js.map
35.84
KB
-rwxr-xr-x
AdminFeedbackManagement-DsTd1C...
13.52
KB
-rwxr-xr-x
AdminFeedbackManagement-DsTd1C...
45.25
KB
-rwxr-xr-x
CourseReviews-CLlzbLuT.js
27.45
KB
-rwxr-xr-x
CourseReviews-CLlzbLuT.js.map
112.09
KB
-rwxr-xr-x
Dewan-B5d13VSK.png
819.07
KB
-rwxr-xr-x
Dewan-Bniqtmij.js
102
B
-rwxr-xr-x
Dewan-Bniqtmij.js.map
197
B
-rwxr-xr-x
EditCourse-DeWQqcol.js
9.65
KB
-rwxr-xr-x
EditCourse-DeWQqcol.js.map
34.87
KB
-rwxr-xr-x
MyCourses-BA9wctPB.js
8.48
KB
-rwxr-xr-x
MyCourses-BA9wctPB.js.map
31.95
KB
-rwxr-xr-x
Rajput-BnxWGXCy.js
104
B
-rwxr-xr-x
Rajput-BnxWGXCy.js.map
200
B
-rwxr-xr-x
Rajput-CE3gMniE.png
908.11
KB
-rwxr-xr-x
Settings-BGf6-NRc.js
2.09
KB
-rwxr-xr-x
Settings-BGf6-NRc.js.map
5.35
KB
-rwxr-xr-x
TimetableClashChecker-gskbNvYE...
32.74
KB
-rwxr-xr-x
TimetableClashChecker-gskbNvYE...
137.78
KB
-rwxr-xr-x
UserManagement-pl4YxOXe.js
2.17
KB
-rwxr-xr-x
UserManagement-pl4YxOXe.js.map
5.49
KB
-rwxr-xr-x
academic-components-DF0R8Z3x.j...
670.84
KB
-rwxr-xr-x
academic-components-DF0R8Z3x.j...
1.87
MB
-rwxr-xr-x
admin-components-DUStTukf.js
1.36
MB
-rwxr-xr-x
admin-components-DUStTukf.js.m...
5.5
MB
-rwxr-xr-x
apple-touch-icon-CvbJoadU.png
20.94
KB
-rwxr-xr-x
browser-DyVnc2OH.js
392
B
-rwxr-xr-x
browser-DyVnc2OH.js.map
404
B
-rwxr-xr-x
favicon-16x16-CXk8OJVQ.png
734
B
-rwxr-xr-x
favicon-32x32-BMg2Kocu.png
1.78
KB
-rwxr-xr-x
favicon-hhFM0i7Z.ico
15.04
KB
-rwxr-xr-x
geminiService-khxcBfs7.js
2.36
KB
-rwxr-xr-x
geminiService-khxcBfs7.js.map
6.73
KB
-rwxr-xr-x
index-BbxTXAhJ.css
45.32
KB
-rwxr-xr-x
index-DN1SJQ1D.js
73.27
KB
-rwxr-xr-x
index-DN1SJQ1D.js.map
215.58
KB
-rwxr-xr-x
index.es-B3idowhG.js
155.35
KB
-rwxr-xr-x
index.es-B3idowhG.js.map
624.87
KB
-rwxr-xr-x
kunal-UYflGF6w.jpg
9.22
MB
-rwxr-xr-x
kunal-ozIpZZVI.js
102
B
-rwxr-xr-x
kunal-ozIpZZVI.js.map
197
B
-rwxr-xr-x
pdf-vendor-Bz5wMm03.js
317.87
KB
-rwxr-xr-x
pdf-vendor-Bz5wMm03.js.map
976.2
KB
-rwxr-xr-x
purify.es-CQJ0hv7W.js
21.35
KB
-rwxr-xr-x
purify.es-CQJ0hv7W.js.map
88.01
KB
-rwxr-xr-x
react-vendor-BFYHlx6n.js
160.29
KB
-rwxr-xr-x
react-vendor-BFYHlx6n.js.map
687.16
KB
-rwxr-xr-x
sarthak-CfXTejkX.png
764.15
KB
-rwxr-xr-x
sarthak-Cq6ZcrGb.js
106
B
-rwxr-xr-x
sarthak-Cq6ZcrGb.js.map
203
B
-rwxr-xr-x
site-BwHFeIBa.webmanifest
263
B
-rwxr-xr-x
supabase-vendor-DtZyL83W.js
105.45
KB
-rwxr-xr-x
supabase-vendor-DtZyL83W.js.ma...
449.41
KB
-rwxr-xr-x
ui-vendor-DSJ4jbeb.js
44.26
KB
-rwxr-xr-x
ui-vendor-DSJ4jbeb.js.map
190.96
KB
-rwxr-xr-x
useToast-Bg1woyD1.js
414
B
-rwxr-xr-x
useToast-Bg1woyD1.js.map
1.83
KB
-rwxr-xr-x
xlsx-vendor-D_ykzFJ-.js
276.48
KB
-rwxr-xr-x
xlsx-vendor-D_ykzFJ-.js.map
1.37
MB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : index-DN1SJQ1D.js.map
{"version":3,"mappings":"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","names":["m","require$$0","client","useLoadGsiScript","options","nonce","onScriptLoadSuccess","onScriptLoadError","scriptLoadedSuccessfully","setScriptLoadedSuccessfully","useState","onScriptLoadSuccessRef","useRef","onScriptLoadErrorRef","useEffect","scriptTag","_a","GoogleOAuthContext","createContext","GoogleOAuthProvider","clientId","children","contextValue","useMemo","React","ToastContext","ToastProvider","chakraToast","useChakraToast","useToast","context","useContext","AdminLogin","email","setEmail","password","setPassword","showPassword","setShowPassword","isLoading","setIsLoading","navigate","useNavigate","toast","bgGradient","useColorModeValue","boxBg","boxShadow","handleLogin","e","data","error","supabase","jsx","Box","Container","jsxs","VStack","Heading","Text","FormControl","FormLabel","Input","InputGroup","InputRightElement","IconButton","ViewOffIcon","ViewIcon","Button","ProtectedAdminRoute","isAdmin","setIsAdmin","location","useLocation","session","Flex","Spinner","Navigate","LazyImage","src","alt","className","imageSrc","setImageSrc","loading","setLoading","module","DewanImage","__vitePreload","SharmaImage","SrivastavaImage","RajputImage","GoogleIcon","EnhancedLogin","setSession","isSessionLoading","setIsSessionLoading","redirectUrl","subscription","_event","handleGoogleLogin","authError","NavBar","BookOpen","Feature","Sparkles","Calendar","Star","Clock","Users","Shield","icon","title","description","AuthCallback","ProtectedRoute","useAuth","Center","animationStyles","HomePage","activeTestimonial","setActiveTestimonial","isVisible","setIsVisible","features","CheckSquare","TrendingUp","testimonials","interval","prev","handleGetStarted","GraduationCap","ArrowRight","star","_","i","step","index","feature","Icon","stat","Mail","Link","observerMap","RootIds","rootId","unsupportedValue","getRootId","root","optionsToId","key","createObserver","id","instance","elements","thresholds","observer","entries","entry","inView","threshold","callback","observe","element","fallbackInView","bounds","callbacks","useInView","delay","trackVisibility","rootMargin","triggerOnce","skip","initialInView","onChange","ref","setRef","React2.useState","React2.useRef","state","setState","React2.useEffect","unobserve","entryTarget","previousEntryTarget","result","float","keyframes","Brain","BarChart","offerings","Search","Award","MessageCircle","MotionDiv","motion","AboutPage","cardBg","subtitleColor","borderColor","textColor","accentColor","controls","useAnimation","Fragment","Badge","SimpleGrid","offering","HStack","FeedbackService","feedbackData","user","browserInfo","deviceInfo","feedbackId","file","fileExt","fileName","urlData","url","urlParts","fullPath","userId","status","adminResponse","updateData","feedbackService","MotionBox","feedbackTypes","Palette","Bug","Lightbulb","MessageSquare","priorityLevels","Info","CheckCircle","AlertTriangle","FeedbackForm","isOpen","onClose","onSuccess","editFeedback","formData","setFormData","isSubmitting","setIsSubmitting","selectedFile","setSelectedFile","previewUrl","setPreviewUrl","uploadingImage","setUploadingImage","existingScreenshotUrl","setExistingScreenshotUrl","fileInputRef","isEditMode","handleFileSelect","event","removeImage","handleSubmit","screenshotUrl","uploadError","handleClose","Modal","ModalOverlay","ModalContent","ModalHeader","Edit","ModalCloseButton","ModalBody","type","level","Textarea","Camera","FormHelperText","Image","X","Upload","UserFeedback","feedbacks","setFeedbacks","selectedFeedback","setSelectedFeedback","editingFeedback","setEditingFeedback","deleteId","setDeleteId","isFormOpen","onFormOpen","onFormClose","useDisclosure","isDetailOpen","onDetailOpen","onDetailClose","isDeleteOpen","onDeleteOpen","onDeleteClose","cancelRef","detailCloseRef","mutedColor","loadUserFeedback","handleViewDetails","feedback","handleEditFeedback","handleDelete","getStatusColor","getTypeColor","getCategoryColor","category","Plus","f","Card","CardBody","AlertCircle","Eye","Trash2","AlertDialog","AlertDialogOverlay","AlertDialogContent","AlertDialogHeader","AlertDialogBody","AlertDialogFooter","getCorsProxyUrl","Dashboard","userData","setUserData","academicRecords","setAcademicRecords","semesterCourses","setSemesterCourses","selectedCourses","setSelectedCourses","currentSemesterCourses","setCurrentSemesterCourses","userError","updateError","userData2","academicError","selectedCoursesError","selectedCoursesWithDetails","selectedCourse","coursesError","coursesWithDetails","semesterCourse","semester","totalCredits","sum","record","cumulativeGPA","records","Avatar","Hash","Book","Stack","ClipboardList","course","Tabs","TabList","Tab","User","Bookmark","TabPanels","TabPanel","PersonalInfoPanel","AcademicRecordsPanel","CourseHistoryPanel","AcademicTools","lazy","TimetableClashChecker","CourseRecommendation","n","AddCourse","BulkCourseUpload","MyCourses","EditCourse","UserManagement","Settings","CourseReviews","AdminFeedbackManagement","LoadingSpinner","AppContent","Suspense","Routes","Route","AdminDashboard","App","ChakraProvider","AuthProvider","CourseRecommendationProvider","Router","createRoot","StrictMode"],"ignoreList":[0,1,11],"sources":["../../node_modules/react-dom/client.js","../../node_modules/@react-oauth/google/dist/index.esm.js","../../src_new/lib/contexts/ToastContext.tsx","../../src_new/features/admin/AdminLogin.tsx","../../src_new/features/admin/components/ProtectedAdminRoute.tsx","../../src_new/assets/ProfileImages.tsx","../../src_new/assets/googleIcon.tsx","../../src_new/features/auth/components/EnhancedLogin.tsx","../../src_new/features/auth/components/AuthCallback.tsx","../../src_new/features/auth/components/ProtectedRoute.tsx","../../src_new/features/home/HomePage.tsx","../../node_modules/react-intersection-observer/dist/index.mjs","../../src_new/features/about/AboutPage.tsx","../../src_new/services/feedback.ts","../../src_new/features/feedback/FeedbackForm.tsx","../../src_new/features/users/UserFeedback.tsx","../../src_new/features/users/components/Dashboard.tsx","../../src_new/App.tsx","../../src_new/main.tsx"],"sourcesContent":["'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","'use client'\nimport React, { useState, useRef, useEffect, createContext, useMemo, useContext, useCallback } from 'react';\n\nfunction useLoadGsiScript(options = {}) {\r\n const { nonce, onScriptLoadSuccess, onScriptLoadError } = options;\r\n const [scriptLoadedSuccessfully, setScriptLoadedSuccessfully] = useState(false);\r\n const onScriptLoadSuccessRef = useRef(onScriptLoadSuccess);\r\n onScriptLoadSuccessRef.current = onScriptLoadSuccess;\r\n const onScriptLoadErrorRef = useRef(onScriptLoadError);\r\n onScriptLoadErrorRef.current = onScriptLoadError;\r\n useEffect(() => {\r\n const scriptTag = document.createElement('script');\r\n scriptTag.src = 'https://accounts.google.com/gsi/client';\r\n scriptTag.async = true;\r\n scriptTag.defer = true;\r\n scriptTag.nonce = nonce;\r\n scriptTag.onload = () => {\r\n var _a;\r\n setScriptLoadedSuccessfully(true);\r\n (_a = onScriptLoadSuccessRef.current) === null || _a === void 0 ? void 0 : _a.call(onScriptLoadSuccessRef);\r\n };\r\n scriptTag.onerror = () => {\r\n var _a;\r\n setScriptLoadedSuccessfully(false);\r\n (_a = onScriptLoadErrorRef.current) === null || _a === void 0 ? void 0 : _a.call(onScriptLoadErrorRef);\r\n };\r\n document.body.appendChild(scriptTag);\r\n return () => {\r\n document.body.removeChild(scriptTag);\r\n };\r\n }, [nonce]);\r\n return scriptLoadedSuccessfully;\r\n}\n\nconst GoogleOAuthContext = createContext(null);\r\nfunction GoogleOAuthProvider({ clientId, nonce, onScriptLoadSuccess, onScriptLoadError, children, }) {\r\n const scriptLoadedSuccessfully = useLoadGsiScript({\r\n nonce,\r\n onScriptLoadSuccess,\r\n onScriptLoadError,\r\n });\r\n const contextValue = useMemo(() => ({\r\n clientId,\r\n scriptLoadedSuccessfully,\r\n }), [clientId, scriptLoadedSuccessfully]);\r\n return (React.createElement(GoogleOAuthContext.Provider, { value: contextValue }, children));\r\n}\r\nfunction useGoogleOAuth() {\r\n const context = useContext(GoogleOAuthContext);\r\n if (!context) {\r\n throw new Error('Google OAuth components must be used within GoogleOAuthProvider');\r\n }\r\n return context;\r\n}\n\nfunction extractClientId(credentialResponse) {\r\n var _a;\r\n const clientId = (_a = credentialResponse === null || credentialResponse === void 0 ? void 0 : credentialResponse.clientId) !== null && _a !== void 0 ? _a : credentialResponse === null || credentialResponse === void 0 ? void 0 : credentialResponse.client_id;\r\n return clientId;\r\n}\n\nconst containerHeightMap = { large: 40, medium: 32, small: 20 };\r\nfunction GoogleLogin({ onSuccess, onError, useOneTap, promptMomentNotification, type = 'standard', theme = 'outline', size = 'large', text, shape, logo_alignment, width, locale, click_listener, containerProps, ...props }) {\r\n const btnContainerRef = useRef(null);\r\n const { clientId, scriptLoadedSuccessfully } = useGoogleOAuth();\r\n const onSuccessRef = useRef(onSuccess);\r\n onSuccessRef.current = onSuccess;\r\n const onErrorRef = useRef(onError);\r\n onErrorRef.current = onError;\r\n const promptMomentNotificationRef = useRef(promptMomentNotification);\r\n promptMomentNotificationRef.current = promptMomentNotification;\r\n useEffect(() => {\r\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\r\n if (!scriptLoadedSuccessfully)\r\n return;\r\n (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.initialize({\r\n client_id: clientId,\r\n callback: (credentialResponse) => {\r\n var _a;\r\n if (!(credentialResponse === null || credentialResponse === void 0 ? void 0 : credentialResponse.credential)) {\r\n return (_a = onErrorRef.current) === null || _a === void 0 ? void 0 : _a.call(onErrorRef);\r\n }\r\n const { credential, select_by } = credentialResponse;\r\n onSuccessRef.current({\r\n credential,\r\n clientId: extractClientId(credentialResponse),\r\n select_by,\r\n });\r\n },\r\n ...props,\r\n });\r\n (_f = (_e = (_d = window === null || window === void 0 ? void 0 : window.google) === null || _d === void 0 ? void 0 : _d.accounts) === null || _e === void 0 ? void 0 : _e.id) === null || _f === void 0 ? void 0 : _f.renderButton(btnContainerRef.current, {\r\n type,\r\n theme,\r\n size,\r\n text,\r\n shape,\r\n logo_alignment,\r\n width,\r\n locale,\r\n click_listener,\r\n });\r\n if (useOneTap)\r\n (_j = (_h = (_g = window === null || window === void 0 ? void 0 : window.google) === null || _g === void 0 ? void 0 : _g.accounts) === null || _h === void 0 ? void 0 : _h.id) === null || _j === void 0 ? void 0 : _j.prompt(promptMomentNotificationRef.current);\r\n return () => {\r\n var _a, _b, _c;\r\n if (useOneTap)\r\n (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.cancel();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n clientId,\r\n scriptLoadedSuccessfully,\r\n useOneTap,\r\n type,\r\n theme,\r\n size,\r\n text,\r\n shape,\r\n logo_alignment,\r\n width,\r\n locale,\r\n ]);\r\n return (React.createElement(\"div\", { ...containerProps, ref: btnContainerRef, style: { height: containerHeightMap[size], ...containerProps === null || containerProps === void 0 ? void 0 : containerProps.style } }));\r\n}\n\nfunction googleLogout() {\r\n var _a, _b, _c;\r\n (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.disableAutoSelect();\r\n}\n\n/* eslint-disable import/export */\r\nfunction useGoogleLogin({ flow = 'implicit', scope = '', onSuccess, onError, onNonOAuthError, overrideScope, state, ...props }) {\r\n const { clientId, scriptLoadedSuccessfully } = useGoogleOAuth();\r\n const clientRef = useRef();\r\n const onSuccessRef = useRef(onSuccess);\r\n onSuccessRef.current = onSuccess;\r\n const onErrorRef = useRef(onError);\r\n onErrorRef.current = onError;\r\n const onNonOAuthErrorRef = useRef(onNonOAuthError);\r\n onNonOAuthErrorRef.current = onNonOAuthError;\r\n useEffect(() => {\r\n var _a, _b;\r\n if (!scriptLoadedSuccessfully)\r\n return;\r\n const clientMethod = flow === 'implicit' ? 'initTokenClient' : 'initCodeClient';\r\n const client = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.oauth2[clientMethod]({\r\n client_id: clientId,\r\n scope: overrideScope ? scope : `openid profile email ${scope}`,\r\n callback: (response) => {\r\n var _a, _b;\r\n if (response.error)\r\n return (_a = onErrorRef.current) === null || _a === void 0 ? void 0 : _a.call(onErrorRef, response);\r\n (_b = onSuccessRef.current) === null || _b === void 0 ? void 0 : _b.call(onSuccessRef, response);\r\n },\r\n error_callback: (nonOAuthError) => {\r\n var _a;\r\n (_a = onNonOAuthErrorRef.current) === null || _a === void 0 ? void 0 : _a.call(onNonOAuthErrorRef, nonOAuthError);\r\n },\r\n state,\r\n ...props,\r\n });\r\n clientRef.current = client;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [clientId, scriptLoadedSuccessfully, flow, scope, state]);\r\n const loginImplicitFlow = useCallback((overrideConfig) => { var _a; return (_a = clientRef.current) === null || _a === void 0 ? void 0 : _a.requestAccessToken(overrideConfig); }, []);\r\n const loginAuthCodeFlow = useCallback(() => { var _a; return (_a = clientRef.current) === null || _a === void 0 ? void 0 : _a.requestCode(); }, []);\r\n return flow === 'implicit' ? loginImplicitFlow : loginAuthCodeFlow;\r\n}\n\nfunction useGoogleOneTapLogin({ onSuccess, onError, promptMomentNotification, cancel_on_tap_outside, prompt_parent_id, state_cookie_domain, hosted_domain, use_fedcm_for_prompt = false, disabled, auto_select, }) {\r\n const { clientId, scriptLoadedSuccessfully } = useGoogleOAuth();\r\n const onSuccessRef = useRef(onSuccess);\r\n onSuccessRef.current = onSuccess;\r\n const onErrorRef = useRef(onError);\r\n onErrorRef.current = onError;\r\n const promptMomentNotificationRef = useRef(promptMomentNotification);\r\n promptMomentNotificationRef.current = promptMomentNotification;\r\n useEffect(() => {\r\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\r\n if (!scriptLoadedSuccessfully)\r\n return;\r\n if (disabled) {\r\n (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.cancel();\r\n return;\r\n }\r\n (_f = (_e = (_d = window === null || window === void 0 ? void 0 : window.google) === null || _d === void 0 ? void 0 : _d.accounts) === null || _e === void 0 ? void 0 : _e.id) === null || _f === void 0 ? void 0 : _f.initialize({\r\n client_id: clientId,\r\n callback: (credentialResponse) => {\r\n var _a;\r\n if (!(credentialResponse === null || credentialResponse === void 0 ? void 0 : credentialResponse.credential)) {\r\n return (_a = onErrorRef.current) === null || _a === void 0 ? void 0 : _a.call(onErrorRef);\r\n }\r\n const { credential, select_by } = credentialResponse;\r\n onSuccessRef.current({\r\n credential,\r\n clientId: extractClientId(credentialResponse),\r\n select_by,\r\n });\r\n },\r\n hosted_domain,\r\n cancel_on_tap_outside,\r\n prompt_parent_id,\r\n state_cookie_domain,\r\n use_fedcm_for_prompt,\r\n auto_select,\r\n });\r\n (_j = (_h = (_g = window === null || window === void 0 ? void 0 : window.google) === null || _g === void 0 ? void 0 : _g.accounts) === null || _h === void 0 ? void 0 : _h.id) === null || _j === void 0 ? void 0 : _j.prompt(promptMomentNotificationRef.current);\r\n return () => {\r\n var _a, _b, _c;\r\n (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.cancel();\r\n };\r\n }, [\r\n clientId,\r\n scriptLoadedSuccessfully,\r\n cancel_on_tap_outside,\r\n prompt_parent_id,\r\n state_cookie_domain,\r\n hosted_domain,\r\n use_fedcm_for_prompt,\r\n disabled,\r\n auto_select,\r\n ]);\r\n}\n\n/**\r\n * Checks if the user granted all the specified scope or scopes\r\n * @returns True if all the scopes are granted\r\n */\r\nfunction hasGrantedAllScopesGoogle(tokenResponse, firstScope, ...restScopes) {\r\n var _a, _b, _c;\r\n if (!(window === null || window === void 0 ? void 0 : window.google))\r\n return false;\r\n return (((_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.oauth2) === null || _c === void 0 ? void 0 : _c.hasGrantedAllScopes(tokenResponse, firstScope, ...restScopes)) || false);\r\n}\n\n/**\r\n * Checks if the user granted any of the specified scope or scopes.\r\n * @returns True if any of the scopes are granted\r\n */\r\nfunction hasGrantedAnyScopeGoogle(tokenResponse, firstScope, ...restScopes) {\r\n var _a, _b, _c;\r\n if (!(window === null || window === void 0 ? void 0 : window.google))\r\n return false;\r\n return (((_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.accounts) === null || _b === void 0 ? void 0 : _b.oauth2) === null || _c === void 0 ? void 0 : _c.hasGrantedAnyScope(tokenResponse, firstScope, ...restScopes)) || false);\r\n}\n\nexport { GoogleLogin, GoogleOAuthProvider, googleLogout, hasGrantedAllScopesGoogle, hasGrantedAnyScopeGoogle, useGoogleLogin, useGoogleOAuth, useGoogleOneTapLogin };\n","import React, { createContext, useContext } from 'react';\r\nimport { useToast as useChakraToast, UseToastOptions } from '@chakra-ui/react';\r\n\r\ntype ToastContextType = (options: UseToastOptions) => void;\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const ToastProvider: React.FC<{children: React.ReactNode}> = ({ children }) => {\r\n const chakraToast = useChakraToast();\r\n\r\n return (\r\n <ToastContext.Provider value={chakraToast}>\r\n {children}\r\n </ToastContext.Provider>\r\n );\r\n};\r\n\r\nexport const useToast = (): ToastContextType => {\r\n const context = useContext(ToastContext);\r\n if (context === undefined) {\r\n throw new Error('useToast must be used within a ToastProvider');\r\n }\r\n return context;\r\n}; ","import React, { useState } from 'react';\r\nimport {\r\n Box,\r\n Container,\r\n VStack,\r\n FormControl,\r\n FormLabel,\r\n Input,\r\n Button,\r\n Heading,\r\n useToast,\r\n Text,\r\n useColorModeValue,\r\n InputGroup,\r\n InputRightElement,\r\n IconButton,\r\n} from '@chakra-ui/react';\r\nimport { ViewIcon, ViewOffIcon } from '@chakra-ui/icons';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { supabase } from '../../lib/supabase';\r\n\r\nconst AdminLogin = () => {\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const navigate = useNavigate();\r\n const toast = useToast();\r\n\r\n const bgGradient = useColorModeValue(\r\n 'linear(to-r, purple.50, purple.100)',\r\n 'linear(to-r, gray.800, purple.900)'\r\n );\r\n const boxBg = useColorModeValue('white', 'gray.800');\r\n const boxShadow = useColorModeValue('lg', 'dark-lg');\r\n\r\n const handleLogin = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n\r\n try {\r\n // Check if the email matches the admin email\r\n const adminEmail = import.meta.env.VITE_ADMIN_EMAIL;\r\n if (email !== adminEmail) {\r\n throw new Error('Invalid admin credentials');\r\n }\r\n\r\n // Attempt to sign in with Supabase\r\n const { data, error } = await supabase.auth.signInWithPassword({\r\n email,\r\n password,\r\n });\r\n\r\n if (error) throw error;\r\n\r\n // Store admin status in localStorage\r\n localStorage.setItem('isAdmin', 'true');\r\n\r\n toast({\r\n title: 'Welcome back, Admin!',\r\n description: 'Login successful',\r\n status: 'success',\r\n duration: 3000,\r\n });\r\n\r\n navigate('/admin/dashboard');\r\n } catch (error: any) {\r\n toast({\r\n title: 'Login failed',\r\n description: error.message,\r\n status: 'error',\r\n duration: 5000,\r\n });\r\n // Clear admin status on error\r\n localStorage.removeItem('isAdmin');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <Box minH=\"100vh\" bgGradient={bgGradient} py={20}>\r\n <Container maxW=\"container.sm\">\r\n <Box\r\n bg={boxBg}\r\n p={10}\r\n rounded=\"xl\"\r\n shadow={boxShadow}\r\n borderWidth=\"1px\"\r\n borderColor={useColorModeValue('gray.100', 'gray.700')}\r\n >\r\n <VStack spacing={8}>\r\n <VStack spacing={3} align=\"center\">\r\n <Heading size=\"xl\" color=\"purple.600\">Admin Portal</Heading>\r\n <Text color=\"gray.500\" fontSize=\"lg\">\r\n Welcome back! Please sign in to continue.\r\n </Text>\r\n </VStack>\r\n <form onSubmit={handleLogin} style={{ width: '100%' }}>\r\n <VStack spacing={6}>\r\n <FormControl isRequired>\r\n <FormLabel>Email</FormLabel>\r\n <Input\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n size=\"lg\"\r\n bg={useColorModeValue('white', 'gray.700')}\r\n borderColor={useColorModeValue('gray.200', 'gray.600')}\r\n _hover={{\r\n borderColor: 'purple.400',\r\n }}\r\n _focus={{\r\n borderColor: 'purple.500',\r\n boxShadow: '0 0 0 1px purple.500',\r\n }}\r\n />\r\n </FormControl>\r\n\r\n <FormControl isRequired>\r\n <FormLabel>Password</FormLabel>\r\n <InputGroup size=\"lg\">\r\n <Input\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n placeholder=\"Enter your password\"\r\n bg={useColorModeValue('white', 'gray.700')}\r\n borderColor={useColorModeValue('gray.200', 'gray.600')}\r\n _hover={{\r\n borderColor: 'purple.400',\r\n }}\r\n _focus={{\r\n borderColor: 'purple.500',\r\n boxShadow: '0 0 0 1px purple.500',\r\n }}\r\n />\r\n <InputRightElement>\r\n <IconButton\r\n aria-label={showPassword ? 'Hide password' : 'Show password'}\r\n icon={showPassword ? <ViewOffIcon /> : <ViewIcon />}\r\n onClick={() => setShowPassword(!showPassword)}\r\n variant=\"ghost\"\r\n colorScheme=\"purple\"\r\n />\r\n </InputRightElement>\r\n </InputGroup>\r\n </FormControl>\r\n\r\n <Button\r\n type=\"submit\"\r\n colorScheme=\"purple\"\r\n width=\"100%\"\r\n size=\"lg\"\r\n isLoading={isLoading}\r\n loadingText=\"Signing in...\"\r\n _hover={{\r\n transform: 'translateY(-2px)',\r\n boxShadow: 'lg',\r\n }}\r\n >\r\n Sign In\r\n </Button>\r\n </VStack>\r\n </form>\r\n </VStack>\r\n </Box>\r\n </Container>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AdminLogin; ","import React, { useEffect, useState } from 'react';\r\nimport { Navigate, useLocation } from 'react-router-dom';\r\nimport { Flex, Spinner } from '@chakra-ui/react';\r\nimport { supabase } from '../../../lib/supabase';\r\n\r\ninterface ProtectedAdminRouteProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst ProtectedAdminRoute: React.FC<ProtectedAdminRouteProps> = ({ children }) => {\r\n const [isAdmin, setIsAdmin] = useState<boolean | null>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const location = useLocation();\r\n\r\n useEffect(() => {\r\n const checkAdminStatus = async () => {\r\n try {\r\n const { data: { session } } = await supabase.auth.getSession();\r\n \r\n if (!session) {\r\n setIsAdmin(false);\r\n localStorage.removeItem('isAdmin');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Check if the user's email matches the admin email\r\n const adminEmail = import.meta.env.VITE_ADMIN_EMAIL;\r\n const isAdminUser = session.user.email === adminEmail;\r\n \r\n if (!isAdminUser) {\r\n localStorage.removeItem('isAdmin');\r\n setIsAdmin(false);\r\n } else {\r\n localStorage.setItem('isAdmin', 'true');\r\n setIsAdmin(true);\r\n }\r\n } catch (error) {\r\n console.error('Error checking admin status:', error);\r\n localStorage.removeItem('isAdmin');\r\n setIsAdmin(false);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n checkAdminStatus();\r\n }, []);\r\n\r\n if (isLoading) {\r\n return (\r\n <Flex height=\"100vh\" align=\"center\" justify=\"center\">\r\n <Spinner\r\n thickness=\"4px\"\r\n speed=\"0.65s\"\r\n emptyColor=\"gray.200\"\r\n color=\"purple.500\"\r\n size=\"xl\"\r\n />\r\n </Flex>\r\n );\r\n }\r\n\r\n if (!isAdmin) {\r\n return <Navigate to=\"/admin/login\" state={{ from: location }} replace />;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n\r\nexport default ProtectedAdminRoute; ","import React, { useState } from 'react';\r\n\r\ninterface ProfileImageProps {\r\n className?: string;\r\n}\r\n\r\n// Lazy load images to reduce initial bundle size\r\nconst LazyImage: React.FC<{ src: () => Promise<any>; alt: string; className: string }> = ({ \r\n src, \r\n alt, \r\n className \r\n}) => {\r\n const [imageSrc, setImageSrc] = useState<string>('');\r\n const [loading, setLoading] = useState(true);\r\n\r\n React.useEffect(() => {\r\n src().then((module) => {\r\n setImageSrc(module.default);\r\n setLoading(false);\r\n });\r\n }, [src]);\r\n\r\n if (loading) {\r\n return (\r\n <div className={`${className} rounded-full bg-gray-300 animate-pulse flex items-center justify-center`}>\r\n <div className=\"text-gray-500 text-xs\">Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <img \r\n src={imageSrc} \r\n alt={alt} \r\n className={`${className} rounded-full object-cover`}\r\n loading=\"lazy\"\r\n />\r\n );\r\n};\r\n\r\nexport const DewanImage: React.FC<ProfileImageProps> = ({ className = \"w-16 h-16\" }) => (\r\n <LazyImage \r\n src={() => import('./Dewan.png')} \r\n alt=\"Dhruv Dewan\" \r\n className={className}\r\n />\r\n);\r\n\r\nexport const SharmaImage: React.FC<ProfileImageProps> = ({ className = \"w-16 h-16\" }) => (\r\n <LazyImage \r\n src={() => import('./kunal.jpg')} \r\n alt=\"Kunal Sharma\" \r\n className={className}\r\n />\r\n);\r\n\r\nexport const SrivastavaImage: React.FC<ProfileImageProps> = ({ className = \"w-16 h-16\" }) => (\r\n <LazyImage \r\n src={() => import('./sarthak.png')} \r\n alt=\"Sarthak Srivastava\" \r\n className={className}\r\n />\r\n);\r\n\r\nexport const RajputImage: React.FC<ProfileImageProps> = ({ className = \"w-16 h-16\" }) => (\r\n <LazyImage \r\n src={() => import('./Rajput.png')} \r\n alt=\"Dhruv Rajput\" \r\n className={className}\r\n />\r\n); ","import React from 'react';\r\n\r\ninterface GoogleIconProps {\r\n className?: string;\r\n}\r\n\r\nconst GoogleIcon: React.FC<GoogleIconProps> = ({ className = \"w-5 h-5\" }) => (\r\n <svg \r\n xmlns=\"http://www.w3.org/2000/svg\" \r\n className={className} \r\n viewBox=\"0 0 48 48\"\r\n >\r\n <path fill=\"#FFC107\" d=\"M43.611,20.083H42V20H24v8h11.303c-1.649,4.657-6.08,8-11.303,8c-6.627,0-12-5.373-12-12c0-6.627,5.373-12,12-12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C12.955,4,4,12.955,4,24c0,11.045,8.955,20,20,20c11.045,0,20-8.955,20-20C44,22.659,43.862,21.35,43.611,20.083z\" />\r\n <path fill=\"#FF3D00\" d=\"M6.306,14.691l6.571,4.819C14.655,15.108,18.961,12,24,12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C16.318,4,9.656,8.337,6.306,14.691z\" />\r\n <path fill=\"#4CAF50\" d=\"M24,44c5.166,0,9.86-1.977,13.409-5.192l-6.19-5.238C29.211,35.091,26.715,36,24,36c-5.202,0-9.619-3.317-11.283-7.946l-6.522,5.025C9.505,39.556,16.227,44,24,44z\" />\r\n <path fill=\"#1976D2\" d=\"M43.611,20.083H42V20H24v8h11.303c-0.792,2.237-2.231,4.166-4.087,5.571c0.001-0.001,0.002-0.001,0.003-0.002l6.19,5.238C36.971,39.205,44,34,44,24C44,22.659,43.862,21.35,43.611,20.083z\" />\r\n </svg>\r\n);\r\n\r\nexport default GoogleIcon; ","import React, { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { supabase } from '../../../lib/supabase';\r\nimport {\r\n BookOpen,\r\n Calendar,\r\n Clock,\r\n Star,\r\n Users,\r\n Shield,\r\n Sparkles\r\n} from 'lucide-react';\r\nimport type { AuthError, Session } from '@supabase/supabase-js';\r\nimport { Box, Spinner, useToast } from '@chakra-ui/react';\r\nimport NavBar from '../../shared/NavBar';\r\nimport { GoogleIcon } from '../../../assets';\r\n\r\nexport default function EnhancedLogin() {\r\n const navigate = useNavigate();\r\n const toast = useToast();\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [session, setSession] = useState<Session | null>(null);\r\n const [isSessionLoading, setIsSessionLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n // Check if user is already logged in\r\n supabase.auth.getSession().then(({ data: { session } }) => {\r\n setSession(session);\r\n setIsSessionLoading(false);\r\n if (session) {\r\n // Check if there's a redirect URL in localStorage\r\n const redirectUrl = localStorage.getItem('redirectAfterLogin') || sessionStorage.getItem('redirectAfterLogin');\r\n if (redirectUrl) {\r\n localStorage.removeItem('redirectAfterLogin');\r\n sessionStorage.removeItem('redirectAfterLogin');\r\n navigate(redirectUrl);\r\n } else {\r\n navigate('/dashboard');\r\n }\r\n }\r\n });\r\n\r\n // Listen for auth state changes\r\n const {\r\n data: { subscription },\r\n } = supabase.auth.onAuthStateChange((_event, session) => {\r\n setSession(session);\r\n if (session) {\r\n // Check if there's a redirect URL in localStorage\r\n const redirectUrl = localStorage.getItem('redirectAfterLogin') || sessionStorage.getItem('redirectAfterLogin');\r\n if (redirectUrl) {\r\n localStorage.removeItem('redirectAfterLogin');\r\n sessionStorage.removeItem('redirectAfterLogin');\r\n navigate(redirectUrl);\r\n } else {\r\n navigate('/dashboard');\r\n }\r\n }\r\n });\r\n\r\n return () => subscription.unsubscribe();\r\n }, [navigate]);\r\n\r\n const handleGoogleLogin = async () => {\r\n try {\r\n setIsLoading(true);\r\n const { data, error } = await supabase.auth.signInWithOAuth({\r\n provider: 'google',\r\n options: {\r\n redirectTo: `${window.location.origin}/`,\r\n queryParams: {\r\n access_type: 'offline',\r\n prompt: 'consent',\r\n },\r\n scopes: 'email profile',\r\n },\r\n });\r\n\r\n if (error) throw error;\r\n if (!data.url) throw new Error('No authentication URL returned');\r\n\r\n // Redirect to Google OAuth\r\n window.location.href = data.url;\r\n } catch (error) {\r\n const authError = error as AuthError;\r\n console.error('Login error:', authError);\r\n toast({\r\n title: 'Authentication Error',\r\n description: authError.message || 'Failed to sign in with Google. Please try again.',\r\n status: 'error',\r\n duration: 5000,\r\n isClosable: true,\r\n });\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n // Show loading state while checking session\r\n if (isSessionLoading) {\r\n return (\r\n <Box height=\"100vh\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\" bg=\"gray.50\">\r\n <Spinner\r\n thickness=\"4px\"\r\n speed=\"0.65s\"\r\n emptyColor=\"gray.200\"\r\n color=\"purple.500\"\r\n size=\"xl\"\r\n />\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen bg-gray-50 flex flex-col\">\r\n <NavBar />\r\n <div className=\"flex-grow flex flex-col md:flex-row\">\r\n {/* Left Section - Login Form */}\r\n <div className=\"w-full md:w-1/2 p-4 md:p-0 flex items-center justify-center bg-gradient-to-br from-gray-50 to-gray-100 relative overflow-hidden\">\r\n {/* Animated Background Pattern */}\r\n <div className=\"absolute inset-0 opacity-5\">\r\n <div className=\"absolute top-0 left-0 w-full h-full\">\r\n <div className=\"w-40 h-40 bg-purple-600 rounded-full -top-20 -left-20 absolute animate-pulse\"></div>\r\n <div className=\"w-32 h-32 bg-indigo-600 rounded-full top-1/4 -right-16 absolute animate-pulse delay-300\"></div>\r\n <div className=\"w-36 h-36 bg-blue-600 rounded-full bottom-1/3 -left-16 absolute animate-pulse delay-500\"></div>\r\n <div className=\"w-28 h-28 bg-pink-600 rounded-full -bottom-14 right-1/4 absolute animate-pulse delay-700\"></div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"relative z-10 w-full max-w-md mx-4 my-8\">\r\n <div className=\"bg-white p-10 rounded-2xl shadow-xl border border-gray-100 backdrop-blur-sm\">\r\n <div className=\"text-center\">\r\n <div className=\"flex justify-center mb-6\">\r\n <div className=\"bg-gradient-to-r from-indigo-600 to-purple-600 p-3 rounded-full shadow-md transform hover:scale-105 transition-transform\">\r\n <BookOpen className=\"w-8 h-8 text-white\" />\r\n </div>\r\n </div>\r\n <h2 className=\"text-4xl font-bold mb-2 bg-gradient-to-r from-indigo-600 to-purple-600 bg-clip-text text-transparent\">Welcome Back!</h2>\r\n <p className=\"text-gray-600 mb-8\">Sign in to continue to CourseWise</p>\r\n </div>\r\n\r\n <div className=\"relative mb-8\">\r\n <div className=\"absolute inset-0 flex items-center\">\r\n <div className=\"w-full border-t border-gray-200\"></div>\r\n </div>\r\n <div className=\"relative flex justify-center\">\r\n <span className=\"px-3 bg-white text-gray-500 text-sm\">Continue with</span>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={handleGoogleLogin}\r\n className=\"w-full flex items-center justify-center gap-3 py-3 px-4 rounded-lg border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 transition-all duration-200 shadow-sm hover:shadow-md disabled:opacity-70 disabled:cursor-not-allowed\"\r\n disabled={isLoading}\r\n >\r\n <GoogleIcon className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{isLoading ? 'Signing in...' : 'Google'}</span>\r\n </button>\r\n\r\n <div className=\"text-center text-gray-500 text-sm mt-8\">\r\n <p>By signing in, you agree to our <a href=\"#\" className=\"text-indigo-600 hover:text-indigo-800 transition-colors\">Terms of Service</a> and <a href=\"#\" className=\"text-indigo-600 hover:text-indigo-800 transition-colors\">Privacy Policy</a></p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right Section - Features */}\r\n <div className=\"w-full md:w-1/2 bg-gradient-to-br from-indigo-600 to-purple-700 p-8 text-white relative overflow-hidden\">\r\n {/* Background pattern */}\r\n <div className=\"absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4wOCI+PHBhdGggZD0iTTM2IDMwaC0yVjBoMnYzMHptLTIgMEgydjJoMzJ2LTJ6bTAgMnYyOGgydi0yOGgtMnptMi0ydi0zaC0ydjNoMnptLTIgMEgwdjJoMzR2LTJ6Ii8+PC9nPjwvZz48L3N2Zz4=')] opacity-30\"></div>\r\n\r\n {/* Decorative elements */}\r\n <div className=\"absolute -right-20 -top-20 w-40 h-40 bg-white/10 rounded-full\"></div>\r\n <div className=\"absolute -left-20 -bottom-20 w-60 h-60 bg-white/10 rounded-full\"></div>\r\n\r\n <div className=\"h-full flex flex-col justify-center max-w-lg mx-auto relative z-10\">\r\n <h2 className=\"text-3xl font-bold mb-8\">Why Choose CourseWise?</h2>\r\n\r\n <div className=\"grid gap-6\">\r\n <Feature\r\n icon={<Sparkles className=\"w-6 h-6\" />}\r\n title=\"Smart Course Recommendations\"\r\n description=\"Get personalized course suggestions based on your profile and interests\"\r\n />\r\n <Feature\r\n icon={<Calendar className=\"w-6 h-6\" />}\r\n title=\"Timetable Planning\"\r\n description=\"Plan your semester schedule efficiently and avoid conflicts\"\r\n />\r\n <Feature\r\n icon={<Star className=\"w-6 h-6\" />}\r\n title=\"Course Reviews\"\r\n description=\"Access detailed course reviews from fellow students\"\r\n />\r\n <Feature\r\n icon={<Clock className=\"w-6 h-6\" />}\r\n title=\"Time Management\"\r\n description=\"Tools to help you balance your academic workload\"\r\n />\r\n </div>\r\n\r\n <div className=\"mt-12 border-t border-white/20 pt-8\">\r\n <div className=\"flex items-center gap-4 mb-4 bg-white/10 p-3 rounded-lg backdrop-blur-sm\">\r\n <Users className=\"w-5 h-5\" />\r\n <span>Join 1000+ students using CourseWise</span>\r\n </div>\r\n <div className=\"flex items-center gap-4 bg-white/10 p-3 rounded-lg backdrop-blur-sm\">\r\n <Shield className=\"w-5 h-5\" />\r\n <span>Secure & Privacy Focused</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction Feature({ icon, title, description }: { icon: React.ReactNode; title: string; description: string }) {\r\n return (\r\n <div className=\"flex gap-4 items-start bg-white/10 p-4 rounded-lg backdrop-blur-sm hover:bg-white/20 transition-colors duration-300\">\r\n <div className=\"p-2 bg-white/20 rounded-lg\">\r\n {icon}\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold mb-1\">{title}</h3>\r\n <p className=\"text-white/80 text-sm\">{description}</p>\r\n </div>\r\n </div>\r\n );\r\n} ","import React from \"react\";\r\nimport { useEffect } from \"react\";\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { supabase } from \"../../../lib/supabase\";\r\n\r\nexport default function AuthCallback() {\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n // Supabase will handle the hash fragment and set the session\r\n // You can redirect to home or dashboard after a short delay\r\n setTimeout(() => {\r\n navigate(\"/\");\r\n }, 1000);\r\n }, [navigate]);\r\n\r\n return <div>Processing login...</div>;\r\n} ","import React, { ReactNode } from 'react';\r\nimport { Navigate, useLocation } from 'react-router-dom';\r\nimport { Center, Spinner } from '@chakra-ui/react';\r\nimport { useAuth } from '../../../lib/contexts/AuthContext';\r\n\r\ninterface ProtectedRouteProps {\r\n children: ReactNode;\r\n}\r\n\r\nconst ProtectedRoute = ({ children }: ProtectedRouteProps) => {\r\n const { session, loading } = useAuth();\r\n const location = useLocation();\r\n\r\n // Store the intended destination for after login\r\n if (!loading && !session) {\r\n // Save the location they were trying to go to\r\n localStorage.setItem('redirectAfterLogin', location.pathname);\r\n return <Navigate to=\"/login\" replace />;\r\n }\r\n\r\n // Show loading state while checking authentication\r\n if (loading) {\r\n return (\r\n <Center h=\"100vh\">\r\n <Spinner size=\"xl\" color=\"purple.500\" />\r\n </Center>\r\n );\r\n }\r\n\r\n // If authenticated, render the protected content\r\n return <>{children}</>;\r\n};\r\n\r\nexport default ProtectedRoute; ","import React, { useState, useEffect } from 'react';\r\nimport { \r\n BookOpen, \r\n Users, \r\n Clock, \r\n ArrowRight, \r\n Sparkles, \r\n GraduationCap, \r\n Target, \r\n Mail, \r\n Phone,\r\n Star,\r\n Calendar,\r\n Image,\r\n FileText,\r\n CheckSquare,\r\n TrendingUp\r\n} from 'lucide-react';\r\nimport { useNavigate, Link } from 'react-router-dom';\r\nimport NavBar from '../shared/NavBar';\r\n\r\n// Import images from assets\r\nimport { \r\n DewanImage, \r\n SharmaImage, \r\n SrivastavaImage, \r\n RajputImage \r\n} from '../../assets';\r\n\r\n// Animation CSS classes\r\nconst animationStyles = `\r\n @keyframes float {\r\n 0% { transform: translateY(0px); }\r\n 50% { transform: translateY(-20px); }\r\n 100% { transform: translateY(0px); }\r\n }\r\n \r\n @keyframes pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.7; }\r\n }\r\n \r\n @keyframes spin-slow {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n }\r\n \r\n @keyframes blob {\r\n 0% { transform: scale(1) translate(0px, 0px); }\r\n 33% { transform: scale(1.1) translate(30px, -50px); }\r\n 66% { transform: scale(0.9) translate(-20px, 20px); }\r\n 100% { transform: scale(1) translate(0px, 0px); }\r\n }\r\n \r\n .animate-float {\r\n animation: float 6s ease-in-out infinite;\r\n }\r\n \r\n .animate-float-delay-1 {\r\n animation: float 6s ease-in-out 2s infinite;\r\n }\r\n \r\n .animate-float-delay-2 {\r\n animation: float 6s ease-in-out 4s infinite;\r\n }\r\n \r\n .animate-pulse-slow {\r\n animation: pulse 5s ease-in-out infinite;\r\n }\r\n \r\n .animate-spin-slow {\r\n animation: spin-slow 20s linear infinite;\r\n }\r\n \r\n .animate-blob {\r\n animation: blob 15s ease-in-out infinite;\r\n }\r\n \r\n .animation-delay-2000 {\r\n animation-delay: 2000ms;\r\n }\r\n \r\n .animation-delay-4000 {\r\n animation-delay: 4000ms;\r\n }\r\n \r\n .animation-delay-6000 {\r\n animation-delay: 6000ms;\r\n }\r\n`;\r\n\r\nexport default function HomePage() {\r\n const [activeTestimonial, setActiveTestimonial] = useState(0);\r\n const [isVisible, setIsVisible] = useState(false);\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n setIsVisible(true);\r\n }, []);\r\n\r\n const features = [\r\n {\r\n icon: BookOpen,\r\n title: 'Course Catalog',\r\n description: 'Browse and search through a comprehensive catalog of courses.',\r\n link: '/courses'\r\n },\r\n {\r\n icon: Calendar,\r\n title: 'Schedule Builder',\r\n description: 'Create conflict-free timetables with our interactive schedule builder.',\r\n link: '/schedule-builder'\r\n },\r\n {\r\n icon: CheckSquare,\r\n title: 'Degree Auditor',\r\n description: 'Track your progress towards degree requirements in real-time.',\r\n link: '/degree-audit'\r\n },\r\n {\r\n icon: TrendingUp,\r\n title: 'Personalized Recommendations',\r\n description: 'Get course suggestions tailored to your academic goals and performance.',\r\n link: '/course-recommendation'\r\n }\r\n ];\r\n\r\n const testimonials = [\r\n {\r\n name: 'Kunal Sharma',\r\n role: 'ECE Student',\r\n image: SharmaImage,\r\n text: 'CourseWise made my course selection process so much easier. The clash detection feature saved me from a lot of scheduling headaches!'\r\n },\r\n {\r\n name: 'Dhruv Dewan',\r\n role: 'Engineering Student',\r\n image: DewanImage,\r\n text: 'The personalized recommendations helped me discover courses I wouldn\\'t have considered otherwise. Highly recommended!'\r\n },\r\n {\r\n name: 'Sarthak Srivastava',\r\n role: 'EVE Student',\r\n image: SrivastavaImage,\r\n text: 'As a EVE student, I love how CourseWise helps me plan my prerequisites and stay on track with my degree requirements.'\r\n },\r\n {\r\n name: \"Dhruv Rajput\",\r\n role: \"ECE Student\",\r\n image: RajputImage,\r\n text: \"CourseWise revolutionized how I plan my academic journey. The intelligent course suggestions and conflict detection features are game-changers for students.\"\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n setActiveTestimonial((prev) => (prev + 1) % testimonials.length);\r\n }, 5000);\r\n return () => clearInterval(interval);\r\n }, [testimonials.length]);\r\n\r\n const handleGetStarted = () => {\r\n navigate('/academic-tools');\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex flex-col bg-gradient-to-br from-indigo-50 to-purple-50\">\r\n <NavBar />\r\n <div className=\"flex-grow\">\r\n {/* Hero Section - Enhanced with decorative elements and floating cards */}\r\n <section className=\"relative bg-gradient-to-br from-indigo-600 to-purple-700 text-white pt-20 pb-32 overflow-hidden transition-all duration-1000\">\r\n {/* Animated background pattern */}\r\n <div className=\"absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4xIj48cGF0aCBkPSJNMzYgMzBoLTJWMGgydjMwem0tMiAwSDJ2MmgzMnYtMnptMCAydjI4aDJ2LTI4aC0yem0yLTJ2LTNoLTJ2M2gyem0tMiAwSDB2MmgzNHYtMnoiLz48L2c+PC9nPjwvc3ZnPg==')] opacity-10\" />\r\n \r\n {/* Decorative circles */}\r\n <div className=\"absolute top-20 left-10 w-64 h-64 bg-purple-500 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob\"></div>\r\n <div className=\"absolute top-10 right-10 w-72 h-72 bg-indigo-500 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob animation-delay-2000\"></div>\r\n <div className=\"absolute bottom-10 right-1/3 w-72 h-72 bg-blue-500 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob animation-delay-4000\"></div>\r\n \r\n <div className=\"relative container mx-auto px-4\">\r\n <div className=\"flex flex-col md:flex-row items-center justify-between gap-8\">\r\n <div className=\"text-left md:w-1/2 mb-10 md:mb-0\">\r\n <GraduationCap className=\"w-16 h-16 mb-6 animate-bounce\" />\r\n <h1 className=\"text-4xl md:text-6xl font-bold mb-6\">\r\n Plan Your <span className=\"text-transparent bg-clip-text bg-gradient-to-r from-indigo-200 to-purple-200\">Academic Journey</span>\r\n </h1>\r\n <p className=\"text-xl text-indigo-100 mb-8 leading-relaxed\">\r\n Make informed decisions about your course selection with our intelligent recommendation system designed for today's students.\r\n </p>\r\n <div className=\"flex flex-wrap gap-4\">\r\n <button\r\n onClick={handleGetStarted}\r\n className=\"group relative overflow-hidden bg-white text-indigo-600 hover:text-white px-8 py-4 rounded-lg text-lg font-bold shadow-xl transition-all duration-300 hover:shadow-2xl hover:scale-105 border-2 border-white\"\r\n >\r\n <span className=\"relative z-10\">Get Started</span>\r\n <span className=\"absolute inset-0 bg-gradient-to-r from-indigo-500 to-purple-600 transform scale-x-0 group-hover:scale-x-100 transition-transform origin-left duration-300\"></span>\r\n <ArrowRight className=\"inline-block ml-2 relative z-10 group-hover:translate-x-2 transition-transform duration-300\" />\r\n </button>\r\n </div>\r\n \r\n {/* Trust indicators */}\r\n <div className=\"mt-12 flex items-center gap-6 text-indigo-100/90\">\r\n <div className=\"flex items-center\">\r\n <Users className=\"w-5 h-5 mr-2\" />\r\n <span>200+ Students</span>\r\n </div>\r\n <div className=\"flex items-center\">\r\n <BookOpen className=\"w-5 h-5 mr-2\" />\r\n <span>100+ Courses</span>\r\n </div>\r\n <div className=\"flex items-center\">\r\n <Star className=\"w-5 h-5 mr-2\" />\r\n <span>4.5/5 Rating</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n {/* Hero image/floating cards */}\r\n <div className=\"md:w-1/2 relative\">\r\n <style dangerouslySetInnerHTML={{ __html: animationStyles }} />\r\n <div className=\"relative w-full h-96\">\r\n {/* Main card */}\r\n <div className=\"absolute top-0 right-0 w-72 bg-white rounded-xl shadow-2xl p-4 z-30 transform rotate-3 transition-all duration-500 hover:-translate-y-2 hover:rotate-0 animate-float\">\r\n <div className=\"bg-indigo-50 rounded-lg p-2 mb-3\">\r\n <div className=\"flex items-center\">\r\n <div className=\"flex-shrink-0 mr-3\">\r\n <div className=\"w-10 h-10 rounded-full bg-indigo-500 flex items-center justify-center\">\r\n <BookOpen className=\"w-5 h-5 text-white\" />\r\n </div>\r\n </div>\r\n <div>\r\n <h3 className=\"text-sm font-bold text-indigo-900\">Course Recommendations</h3>\r\n <p className=\"text-xs text-indigo-600\">Personalized for your profile</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"space-y-2\">\r\n <div className=\"rounded-lg bg-indigo-100/50 h-6 w-full\"></div>\r\n <div className=\"rounded-lg bg-indigo-100/50 h-6 w-3/4\"></div>\r\n <div className=\"rounded-lg bg-indigo-100/50 h-6 w-5/6\"></div>\r\n </div>\r\n </div>\r\n \r\n {/* Secondary cards */}\r\n <div className=\"absolute top-32 left-0 w-64 bg-white rounded-xl shadow-xl p-4 z-20 transform -rotate-6 transition-all duration-500 hover:-translate-y-2 hover:rotate-0\">\r\n <div className=\"bg-amber-50 rounded-lg p-2 mb-3\">\r\n <div className=\"flex items-center\">\r\n <div className=\"flex-shrink-0 mr-3\">\r\n <div className=\"w-10 h-10 rounded-full bg-amber-500 flex items-center justify-center\">\r\n <Star className=\"w-5 h-5 text-white\" />\r\n </div>\r\n </div>\r\n <div>\r\n <h3 className=\"text-sm font-bold text-amber-900\">Course Reviews</h3>\r\n <p className=\"text-xs text-amber-600\">From verified students</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"flex\">\r\n {[1, 2, 3, 4, 5].map((star) => (\r\n <Star key={star} className=\"w-5 h-5 text-amber-400\" fill=\"#FFC107\" />\r\n ))}\r\n </div>\r\n </div>\r\n \r\n <div className=\"absolute bottom-0 right-20 w-60 bg-white rounded-xl shadow-xl p-4 z-10 transform rotate-6 transition-all duration-500 hover:-translate-y-2 hover:rotate-0\">\r\n <div className=\"bg-green-50 rounded-lg p-2 mb-3\">\r\n <div className=\"flex items-center\">\r\n <div className=\"flex-shrink-0 mr-3\">\r\n <div className=\"w-10 h-10 rounded-full bg-green-500 flex items-center justify-center\">\r\n <Calendar className=\"w-5 h-5 text-white\" />\r\n </div>\r\n </div>\r\n <div>\r\n <h3 className=\"text-sm font-bold text-green-900\">Timetable</h3>\r\n <p className=\"text-xs text-green-600\">Conflict-free scheduling</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"grid grid-cols-5 gap-1\">\r\n {Array.from({ length: 15 }).map((_, i) => (\r\n <div key={i} className={`h-3 rounded-sm ${i % 3 === 0 ? 'bg-green-200' : 'bg-gray-100'}`}></div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n {/* Wave separator - rotated */}\r\n <div className=\"absolute bottom-0 left-0 right-0\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1440 120\" fill=\"none\" style={{ transform: 'rotate(180deg)', display: 'block' }}>\r\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M0 120L60 110C120 100 240 80 360 70C480 60 600 60 720 70C840 80 960 100 1080 100C1200 100 1320 80 1380 70L1440 60V0H0V120Z\" fill=\"white\" />\r\n </svg>\r\n </div>\r\n </section>\r\n \r\n {/* How it Works - Zigzag Layout */}\r\n <section className=\"py-16\">\r\n <div className=\"container mx-auto px-6\">\r\n <div className=\"text-center mb-12\">\r\n <h2 className=\"text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-indigo-600 to-purple-600 inline-block\">How CourseWise Works</h2>\r\n <p className=\"text-gray-600 mt-3 max-w-2xl mx-auto\">Our platform simplifies academic planning through an intuitive process</p>\r\n </div>\r\n \r\n <div className=\"max-w-6xl mx-auto bg-white rounded-2xl shadow-lg border border-gray-100/60 overflow-hidden\">\r\n <div className=\"divide-y divide-gray-100\">\r\n {[\r\n {\r\n title: 'Create Profile',\r\n description: 'Sign up and tell us about your academic interests and goals. We use this information to personalize your experience and provide tailored recommendations.',\r\n icon: Users,\r\n color: 'bg-indigo-100 text-indigo-600',\r\n iconBg: 'from-indigo-500 to-blue-500'\r\n },\r\n {\r\n title: 'Get Recommendations',\r\n description: 'Receive personalized course suggestions based on your profile, interests, and academic history. Our intelligent system matches you with courses that align with your goals.',\r\n icon: Sparkles,\r\n color: 'bg-purple-100 text-purple-600',\r\n iconBg: 'from-purple-500 to-indigo-500'\r\n },\r\n {\r\n title: 'Plan Schedule',\r\n description: 'Organize your timetable without conflicts and optimize your learning path. Visualize your weekly schedule and make adjustments to find the perfect balance.',\r\n icon: Calendar,\r\n color: 'bg-green-100 text-green-600',\r\n iconBg: 'from-green-500 to-emerald-500'\r\n }\r\n ].map((step, index) => (\r\n <div key={index} className={`flex flex-col ${index % 2 === 1 ? 'md:flex-row-reverse' : 'md:flex-row'} p-6 md:p-8`}>\r\n <div className=\"md:w-1/3 flex justify-center mb-6 md:mb-0\">\r\n <div className={`w-36 h-36 rounded-2xl bg-gradient-to-br ${step.iconBg} flex items-center justify-center transform transition-all duration-300 hover:scale-110 shadow-lg`}>\r\n <step.icon className=\"w-16 h-16 text-white\" />\r\n </div>\r\n </div>\r\n <div className=\"md:w-2/3 flex flex-col justify-center md:px-8\">\r\n <h3 className=\"text-2xl font-bold text-gray-800 mb-4\">{index + 1}. {step.title}</h3>\r\n <p className=\"text-gray-600 text-lg leading-relaxed\">{step.description}</p>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {/* Enhanced Services section with feature showcase */}\r\n <section className=\"py-16 relative overflow-hidden\">\r\n {/* Decorative elements */}\r\n <div className=\"absolute top-0 right-0 w-96 h-96 bg-indigo-100 rounded-full opacity-40 -mr-32 -mt-32 blur-3xl\"></div>\r\n <div className=\"absolute bottom-0 left-0 w-96 h-96 bg-purple-100 rounded-full opacity-40 -ml-32 -mb-32 blur-3xl\"></div>\r\n <div className=\"absolute top-1/3 left-1/3 w-72 h-72 bg-blue-100 rounded-full opacity-30 blur-3xl\"></div>\r\n \r\n <div className=\"container mx-auto px-6 relative z-10\">\r\n <div className=\"flex flex-col md:flex-row items-center justify-between mb-10\">\r\n <div className=\"md:w-1/2 mb-6 md:mb-0\">\r\n <h2 className=\"text-4xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-indigo-600 to-purple-600 mb-4\">Powerful Academic Tools</h2>\r\n <p className=\"text-gray-600 text-lg max-w-lg\">Our suite of intelligent services helps you navigate your academic journey with confidence and clarity.</p>\r\n </div>\r\n <div className=\"md:w-1/2 flex justify-end\">\r\n <button \r\n onClick={() => navigate('/academic-tools')}\r\n className=\"inline-flex items-center px-6 py-3 bg-gradient-to-r from-indigo-600 to-purple-600 text-white font-medium rounded-lg\r\n shadow-lg hover:shadow-xl transition-all duration-300 hover:scale-105\"\r\n >\r\n Explore All Features\r\n <ArrowRight className=\"ml-2 h-5 w-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <div className=\"bg-white rounded-2xl shadow-lg border border-gray-100/60 p-6 md:p-8\">\r\n <div className=\"grid md:grid-cols-2 lg:grid-cols-4 gap-6\">\r\n {features.map((feature, index) => {\r\n const Icon = feature.icon;\r\n return (\r\n <div\r\n key={index}\r\n onClick={() => feature.link ? navigate(feature.link) : navigate('/academic-tools')}\r\n className={`group relative bg-gradient-to-br from-indigo-50/50 to-purple-50/50 p-6 rounded-xl overflow-hidden shadow-md cursor-pointer \r\n transform transition-all duration-300 ease-in-out hover:-translate-y-2 \r\n hover:shadow-xl border border-gray-100/80 animate-float animation-delay-${index * 2000}`}\r\n >\r\n {/* Gradient background that reveals on hover */}\r\n <div className=\"absolute inset-0 bg-gradient-to-br from-indigo-500/90 to-purple-500/90 \r\n opacity-0 group-hover:opacity-100 transition-all duration-300\"></div>\r\n \r\n {/* Top decoration */}\r\n <div className=\"absolute top-0 right-0 w-24 h-24 bg-indigo-100/80 rounded-bl-full -mt-6 -mr-6 \r\n group-hover:bg-white/10 transition-all duration-300\"></div>\r\n \r\n {/* Content */}\r\n <div className=\"relative z-10\">\r\n <div className=\"w-14 h-14 rounded-xl mb-4 flex items-center justify-center\r\n bg-gradient-to-br from-indigo-500 to-purple-600 text-white\r\n shadow-lg group-hover:scale-110 transition-all duration-300\"\r\n >\r\n <Icon className=\"w-7 h-7\" />\r\n </div>\r\n \r\n <h3 className=\"text-xl font-bold text-gray-800 mb-2 \r\n group-hover:text-white transition-colors\">\r\n {feature.title}\r\n </h3>\r\n \r\n <p className=\"text-gray-600 mb-4\r\n group-hover:text-white/90 transition-colors\">\r\n {feature.description}\r\n </p>\r\n \r\n <div className=\"flex items-center text-indigo-600 font-medium\r\n group-hover:text-white transition-colors\">\r\n <span>{feature.link ? 'Try it now' : 'Learn more'}</span>\r\n <ArrowRight className=\"ml-1 h-4 w-4 group-hover:translate-x-1 transition-transform\" />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {/* Stats Section - In a box */}\r\n <section className=\"py-16 relative overflow-hidden\">\r\n {/* Decorative elements */}\r\n <div className=\"absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiM2MzY2ZjEiIGZpbGwtb3BhY2l0eT0iMC4wNCI+PHBhdGggZD0iTTM2IDM0aDRWMGgtNHYzNHptMCAyNmg0di0yaC00djJ6bTAtMyBoNHYtMmgtNHYyem0wLTNoNHYtMmgtNHYyek0wIDRjMC0yLjIxIDEuNzktNCA0LTRoNTJjMi4yMSAwIDQgMS43OSA0IDR2NTJjMCAyLjIxLTEuNzkgNC00IDRINGMtMi4yMSAwLTQtMS43OS00LTRWNHptNCAwdjUyaDUyVjRINHoiLz48L2c+PC9nPjwvc3ZnPg==')] opacity-5\"></div>\r\n \r\n <div className=\"container mx-auto px-6 relative z-10\">\r\n <div className=\"text-center mb-10\">\r\n <h2 className=\"text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-indigo-600 to-purple-600 inline-block mb-4\">Why Students Choose CourseWise</h2>\r\n <p className=\"text-gray-600 max-w-2xl mx-auto\">Our platform has helped thousands of students make better academic choices</p>\r\n </div>\r\n \r\n <div className=\"bg-gradient-to-r from-indigo-600 to-purple-700 rounded-2xl shadow-xl overflow-hidden relative\">\r\n <div className=\"absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4xIj48cGF0aCBkPSJNMzYgMzBoLTJWMGgydjMwem0tMiAwSDJ2MmgzMnYtMnptMCAydjI4aDJ2LTI4aC0yem0yLTJ2LTNoLTJ2M2gyem0tMiAwSDB2MmgzNHYtMnoiLz48L2c+PC9nPjwvc3ZnPg==')] opacity-10\"></div>\r\n <div className=\"absolute top-0 left-0 w-full h-12 bg-gradient-to-b from-white to-transparent opacity-20\"></div>\r\n \r\n <div className=\"px-6 py-12 text-white relative\">\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-8 max-w-5xl mx-auto\">\r\n {[\r\n { number: '90%', label: 'Student Satisfaction', icon: Star },\r\n { number: '500+', label: 'Active Students', icon: Users },\r\n { number: '100+', label: 'Courses Available', icon: BookOpen },\r\n { number: '0+', label: 'Partner Colleges', icon: GraduationCap }\r\n ].map((stat, index) => (\r\n <div key={index} className=\"text-center\" style={{animationDelay: `${index * 200}ms`}}>\r\n <div className={`w-16 h-16 bg-white/10 rounded-2xl flex items-center justify-center mx-auto mb-4 transform transition-all duration-500 hover:scale-110 hover:bg-white/20 ${index % 2 === 0 ? 'animate-float' : 'animate-float-delay-2'}`}>\r\n <stat.icon className=\"w-8 h-8 text-white\" />\r\n </div>\r\n <div className=\"text-4xl font-bold mb-1 animate-pulse-slow\">{stat.number}</div>\r\n <div className=\"text-indigo-100\">{stat.label}</div>\r\n </div>\r\n ))}\r\n </div>\r\n \r\n <div className=\"mt-10 max-w-3xl mx-auto text-center\">\r\n <blockquote className=\"text-xl italic\">\r\n \"CourseWise has revolutionized how students plan their academic journey, \r\n making course selection a strategic decision rather than a guessing game.\"\r\n </blockquote>\r\n <div className=\"mt-4\">\r\n <p className=\"font-bold\">Academic Affairs Office</p>\r\n <p className=\"text-indigo-200\">Indraprastha Institue of Information & Technology, New Delhi</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n {/* Footer */}\r\n <footer className=\"bg-gradient-to-br from-indigo-600 to-purple-600 text-white w-full\">\r\n <div className=\"container mx-auto px-6 py-8\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-8 mb-8\">\r\n {/* Logo and Contact */}\r\n <div>\r\n <div className=\"flex items-center gap-2 mb-4\">\r\n <BookOpen className=\"w-8 h-8\" />\r\n <span className=\"text-2xl font-bold\">CourseWise</span>\r\n </div>\r\n <div className=\"text-indigo-200\">\r\n <p className=\"mb-2\">Empowering students with:</p>\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span>100+ Available Courses</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <span>90% Student Satisfaction</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Contact Info */}\r\n <div>\r\n <h3 className=\"font-semibold mb-4\">Contact Us</h3>\r\n <div className=\"text-indigo-200\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <Mail className=\"w-4 h-4\" />\r\n <span>support@coursewise.com</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Quick Links */}\r\n <div>\r\n <h3 className=\"font-semibold mb-4\">Quick Links</h3>\r\n <div className=\"grid gap-2\">\r\n <Link to=\"/\" className=\"text-indigo-200 hover:text-white transition-colors\">Home</Link>\r\n <Link to=\"/academic-tools\" className=\"text-indigo-200 hover:text-white transition-colors\">Academic Tools</Link>\r\n <Link to=\"/login\" className=\"text-indigo-200 hover:text-white transition-colors\">Login</Link>\r\n </div>\r\n </div>\r\n\r\n {/* Features */}\r\n <div>\r\n <h3 className=\"font-semibold mb-4\">Features</h3>\r\n <div className=\"grid gap-2\">\r\n <Link to=\"/course-recommendation\" className=\"text-indigo-200 hover:text-white transition-colors\">\r\n Course Recommendations\r\n </Link>\r\n <Link to=\"/course-reviews\" className=\"text-indigo-200 hover:text-white transition-colors\">\r\n Course Reviews\r\n </Link>\r\n <Link to=\"/tt-clash-checker\" className=\"text-indigo-200 hover:text-white transition-colors\">\r\n Clash Checker\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"border-t border-indigo-500/30 pt-8 text-center text-indigo-200\">\r\n <p>© {new Date().getFullYear()} CourseWise. All rights reserved.</p>\r\n </div>\r\n </div>\r\n </footer>\r\n </div>\r\n );\r\n} ","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","import React, { useEffect } from 'react';\r\nimport {\r\n Box,\r\n Container,\r\n Heading,\r\n Text,\r\n Flex,\r\n useColorModeValue,\r\n VStack,\r\n HStack,\r\n Badge,\r\n SimpleGrid,\r\n keyframes,\r\n Icon,\r\n} from '@chakra-ui/react';\r\nimport { motion, useAnimation } from 'framer-motion';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport NavBar from '../shared/NavBar';\r\nimport {\r\n BookOpen, \r\n Star,\r\n Users,\r\n BarChart,\r\n Brain,\r\n Calendar,\r\n Search,\r\n TrendingUp,\r\n Clock,\r\n Award,\r\n MessageCircle,\r\n} from 'lucide-react';\r\n\r\n// Animation keyframes\r\nconst float = keyframes`\r\n 0% { transform: translateY(0px); }\r\n 50% { transform: translateY(-10px); }\r\n 100% { transform: translateY(0px); }\r\n`;\r\n\r\n// Core features\r\nconst features = [\r\n {\r\n title: 'Course Insights',\r\n description: 'Comprehensive course reviews and ratings from fellow students',\r\n icon: Star,\r\n color: 'yellow.400',\r\n },\r\n {\r\n title: 'Intelligent Planning',\r\n description: 'Smart timetable planning tools to optimize your academic journey',\r\n icon: Brain,\r\n color: 'purple.400',\r\n },\r\n {\r\n title: 'Academic Tracking',\r\n description: 'Track your progress and CGPA with intuitive visualization tools',\r\n icon: BarChart,\r\n color: 'blue.400',\r\n },\r\n {\r\n title: 'Community Powered',\r\n description: 'Join thousands of students sharing knowledge and experiences',\r\n icon: Users,\r\n color: 'green.400',\r\n },\r\n];\r\n\r\n// Our offerings data\r\nconst offerings = [\r\n {\r\n title: 'Course Discovery',\r\n description: 'Find the perfect courses based on your interests, career goals, and academic requirements.',\r\n icon: Search,\r\n color: 'blue.500',\r\n },\r\n {\r\n title: 'Smart Scheduling',\r\n description: 'Automatically generate optimized timetables that fit your preferences and avoid conflicts.',\r\n icon: Calendar,\r\n color: 'green.500',\r\n },\r\n {\r\n title: 'Performance Analytics',\r\n description: 'Visualize your academic progress with detailed charts and predictive insights.',\r\n icon: TrendingUp,\r\n color: 'purple.500',\r\n },\r\n {\r\n title: 'Time Management',\r\n description: 'Track study hours, deadlines, and assignments to stay organized and productive.',\r\n icon: Clock,\r\n color: 'orange.500',\r\n },\r\n {\r\n title: 'Achievement System',\r\n description: 'Earn badges and recognition for academic milestones and consistent performance.',\r\n icon: Award,\r\n color: 'yellow.500',\r\n },\r\n {\r\n title: 'Peer Reviews',\r\n description: 'Share and read authentic course reviews from students who have taken the classes.',\r\n icon: MessageCircle,\r\n color: 'teal.500',\r\n },\r\n];\r\n\r\n// Motion components with proper typing\r\nconst MotionDiv = motion.div;\r\n\r\nconst AboutPage: React.FC = () => {\r\n // Theme colors\r\n const bgGradient = useColorModeValue(\r\n 'linear-gradient(135deg, #f9f7ff 0%, #f1eaff 25%, #ede9fe 50%, #f1eaff 75%, #f9f7ff 100%)',\r\n 'linear-gradient(135deg, #170b3b 0%, #2d1f69 50%, #170b3b 100%)'\r\n );\r\n const cardBg = useColorModeValue('white', 'gray.800');\r\n const subtitleColor = useColorModeValue('gray.600', 'gray.400');\r\n const borderColor = useColorModeValue('purple.100', 'purple.700');\r\n const textColor = useColorModeValue('gray.800', 'gray.200');\r\n const accentColor = useColorModeValue('purple.600', 'purple.300');\r\n \r\n // Animations for the sections\r\n const controls = useAnimation();\r\n const [ref, inView] = useInView({\r\n threshold: 0.1,\r\n triggerOnce: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (inView) {\r\n controls.start('visible');\r\n }\r\n }, [controls, inView]);\r\n\r\n return (\r\n <>\r\n <NavBar />\r\n <Box\r\n position=\"relative\"\r\n overflow=\"hidden\"\r\n minH=\"100vh\"\r\n bgGradient={bgGradient}\r\n pt={20}\r\n pb={20}\r\n _before={{\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundImage: useColorModeValue(\r\n 'url(\"data:image/svg+xml,%3Csvg width=\\'20\\' height=\\'20\\' viewBox=\\'0 0 20 20\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Cg fill=\\'%238b5cf6\\' fill-opacity=\\'0.05\\' fill-rule=\\'evenodd\\'%3E%3Ccircle cx=\\'3\\' cy=\\'3\\' r=\\'3\\'/%3E%3C/g%3E%3C/svg%3E\")',\r\n 'url(\"data:image/svg+xml,%3Csvg width=\\'20\\' height=\\'20\\' viewBox=\\'0 0 20 20\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Cg fill=\\'%23c4b5fd\\' fill-opacity=\\'0.1\\' fill-rule=\\'evenodd\\'%3E%3Ccircle cx=\\'3\\' cy=\\'3\\' r=\\'3\\'/%3E%3C/g%3E%3C/svg%3E\")'\r\n ),\r\n zIndex: 0,\r\n }}\r\n >\r\n {/* Background decorative elements */}\r\n <Box\r\n position=\"absolute\"\r\n top=\"10%\"\r\n right=\"10%\"\r\n w=\"400px\"\r\n h=\"400px\"\r\n borderRadius=\"full\"\r\n bgGradient=\"radial(circle, purple.400 0%, purple.500 30%, transparent 70%)\"\r\n opacity={0.1}\r\n zIndex={0}\r\n filter=\"blur(60px)\"\r\n />\r\n \r\n <Box\r\n position=\"absolute\"\r\n bottom=\"15%\"\r\n left=\"5%\"\r\n w=\"350px\"\r\n h=\"350px\"\r\n borderRadius=\"full\"\r\n bgGradient=\"radial(circle, blue.300 0%, purple.400 50%, transparent 70%)\"\r\n opacity={0.08}\r\n zIndex={0}\r\n filter=\"blur(70px)\"\r\n />\r\n \r\n <Box\r\n position=\"absolute\" \r\n top=\"40%\"\r\n left=\"20%\"\r\n w=\"250px\"\r\n h=\"250px\"\r\n borderRadius=\"full\"\r\n bgGradient=\"radial(circle, teal.300 0%, purple.300 40%, transparent 70%)\"\r\n opacity={0.05}\r\n zIndex={0}\r\n filter=\"blur(50px)\"\r\n />\r\n\r\n <Container maxW=\"container.xl\" position=\"relative\" zIndex={1}>\r\n {/* Hero Section */}\r\n <Box mb={20}>\r\n <MotionDiv\r\n initial={{ opacity: 0, y: 20 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.6 }}\r\n >\r\n <Flex \r\n direction={{ base: 'column', lg: 'row' }} \r\n align=\"center\" \r\n justify=\"space-between\"\r\n gap={10}\r\n >\r\n <VStack \r\n align={{ base: 'center', lg: 'flex-start' }} \r\n spacing={6} \r\n flex=\"1\"\r\n textAlign={{ base: 'center', lg: 'left' }}\r\n >\r\n <Badge \r\n px={3} \r\n py={1} \r\n colorScheme=\"purple\" \r\n variant=\"solid\" \r\n borderRadius=\"full\"\r\n fontSize=\"sm\"\r\n >\r\n For Students, By Students\r\n </Badge>\r\n \r\n <Heading \r\n as=\"h1\" \r\n size=\"3xl\" \r\n fontWeight=\"bold\"\r\n bgGradient=\"linear(to-r, purple.400, blue.500)\"\r\n bgClip=\"text\"\r\n lineHeight=\"1.2\"\r\n >\r\n CourseWise\r\n </Heading>\r\n \r\n <Text \r\n fontSize=\"xl\" \r\n color={subtitleColor}\r\n maxW=\"600px\"\r\n >\r\n Your intelligent companion for navigating college courses, simplifying academic planning, and making informed decisions about your education.\r\n </Text>\r\n </VStack>\r\n \r\n <Box \r\n flex=\"1\" \r\n maxW={{ base: \"300px\", lg: \"450px\" }}\r\n animation={`${float} 3s ease-in-out infinite`}\r\n >\r\n <Box\r\n position=\"relative\"\r\n borderRadius=\"2xl\"\r\n overflow=\"hidden\"\r\n boxShadow=\"2xl\"\r\n _before={{\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: '-4px',\r\n left: '-4px',\r\n right: '-4px',\r\n bottom: '-4px',\r\n borderRadius: '2xl',\r\n padding: '4px',\r\n background: 'linear-gradient(45deg, purple.400, blue.500, teal.300)',\r\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\r\n maskComposite: 'xor',\r\n zIndex: -1,\r\n }}\r\n >\r\n <Box\r\n bgColor=\"purple.50\"\r\n borderRadius=\"2xl\"\r\n p={8}\r\n textAlign=\"center\"\r\n height=\"300px\"\r\n display=\"flex\"\r\n alignItems=\"center\"\r\n justifyContent=\"center\"\r\n flexDirection=\"column\"\r\n >\r\n <Icon as={BookOpen} w={24} h={24} color=\"purple.400\" mb={4} />\r\n <Text fontSize=\"xl\" fontWeight=\"bold\" color={accentColor}>Elevating Education</Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Flex>\r\n </MotionDiv>\r\n </Box>\r\n\r\n {/* Features Section */}\r\n <Box mb={20}>\r\n <MotionDiv\r\n ref={ref}\r\n initial=\"hidden\"\r\n animate={controls}\r\n variants={{\r\n visible: { opacity: 1, y: 0, transition: { duration: 0.6, staggerChildren: 0.2 } },\r\n hidden: { opacity: 0, y: 20 }\r\n }}\r\n >\r\n <VStack spacing={12} align=\"stretch\">\r\n <VStack spacing={3} textAlign=\"center\">\r\n <Heading as=\"h2\" size=\"xl\" fontWeight=\"bold\" color={textColor}>\r\n Designed to Empower\r\n </Heading>\r\n <Text color={subtitleColor} maxW=\"600px\" mx=\"auto\">\r\n CourseWise combines powerful features with intuitive design to transform your academic planning\r\n </Text>\r\n </VStack>\r\n \r\n <SimpleGrid columns={{ base: 1, md: 2, lg: 4 }} spacing={8}>\r\n {features.map((feature, index) => (\r\n <MotionDiv\r\n key={feature.title}\r\n variants={{\r\n visible: { opacity: 1, y: 0, transition: { delay: index * 0.1 } },\r\n hidden: { opacity: 0, y: 20 }\r\n }}\r\n >\r\n <VStack\r\n p={6}\r\n h=\"full\"\r\n bg={cardBg}\r\n borderRadius=\"xl\"\r\n boxShadow=\"md\"\r\n border=\"1px\"\r\n borderColor={borderColor}\r\n spacing={4}\r\n align=\"flex-start\"\r\n transition=\"all 0.3s\"\r\n _hover={{ \r\n transform: \"translateY(-5px)\",\r\n boxShadow: \"lg\",\r\n borderColor: feature.color,\r\n }}\r\n >\r\n <Flex\r\n align=\"center\"\r\n justify=\"center\"\r\n bg={`${feature.color}20`}\r\n color={feature.color}\r\n p={3}\r\n borderRadius=\"lg\"\r\n >\r\n <Icon as={feature.icon} boxSize={6} />\r\n </Flex>\r\n <Heading as=\"h3\" size=\"md\" color={textColor}>\r\n {feature.title}\r\n </Heading>\r\n <Text color={subtitleColor} fontSize=\"sm\">\r\n {feature.description}\r\n </Text>\r\n </VStack>\r\n </MotionDiv>\r\n ))}\r\n </SimpleGrid>\r\n </VStack>\r\n </MotionDiv>\r\n </Box>\r\n\r\n {/* Our Offerings Section */}\r\n <Box>\r\n <MotionDiv\r\n initial=\"hidden\"\r\n animate={controls}\r\n variants={{\r\n visible: { opacity: 1, transition: { staggerChildren: 0.2 } },\r\n hidden: { opacity: 0 }\r\n }}\r\n >\r\n <VStack spacing={12} align=\"stretch\">\r\n <VStack spacing={3} textAlign=\"center\">\r\n <Heading as=\"h2\" size=\"xl\" fontWeight=\"bold\" color={textColor}>\r\n What We Offer\r\n </Heading>\r\n <Text color={subtitleColor} maxW=\"600px\" mx=\"auto\">\r\n Comprehensive tools and resources designed to enhance every aspect of your academic experience\r\n </Text>\r\n </VStack>\r\n\r\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={8}>\r\n {offerings.map((offering, index) => (\r\n <MotionDiv\r\n key={offering.title}\r\n variants={{\r\n visible: { opacity: 1, y: 0, transition: { delay: index * 0.1 } },\r\n hidden: { opacity: 0, y: 20 }\r\n }}\r\n >\r\n <VStack \r\n spacing={4}\r\n p={6}\r\n bg={cardBg}\r\n borderRadius=\"xl\"\r\n boxShadow=\"md\"\r\n border=\"1px\" \r\n borderColor={borderColor}\r\n transition=\"all 0.3s\"\r\n _hover={{\r\n transform: \"translateY(-5px)\",\r\n boxShadow: \"xl\",\r\n borderColor: offering.color,\r\n }}\r\n h=\"full\"\r\n align=\"flex-start\"\r\n >\r\n <Flex\r\n align=\"center\"\r\n justify=\"center\"\r\n bg={`${offering.color}20`}\r\n color={offering.color}\r\n p={3}\r\n borderRadius=\"lg\"\r\n >\r\n <Icon as={offering.icon} boxSize={6} />\r\n </Flex>\r\n \r\n <VStack spacing={2} align=\"flex-start\">\r\n <Heading as=\"h3\" size=\"md\" fontWeight=\"bold\" color={textColor}>\r\n {offering.title}\r\n </Heading>\r\n <Text fontSize=\"sm\" color={subtitleColor} textAlign=\"left\">\r\n {offering.description}\r\n </Text>\r\n </VStack>\r\n </VStack>\r\n </MotionDiv>\r\n ))}\r\n </SimpleGrid>\r\n\r\n {/* Additional value proposition */}\r\n <Box\r\n bg={cardBg}\r\n p={8}\r\n borderRadius=\"2xl\"\r\n border=\"2px\"\r\n borderColor={borderColor}\r\n textAlign=\"center\"\r\n position=\"relative\"\r\n overflow=\"hidden\"\r\n _before={{\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n bgGradient: \"linear(45deg, purple.400, blue.500, teal.300)\",\r\n opacity: 0.05,\r\n zIndex: 0,\r\n }}\r\n >\r\n <VStack spacing={4} position=\"relative\" zIndex={1}>\r\n <Heading as=\"h3\" size=\"lg\" color={accentColor}>\r\n Why Choose CourseWise?\r\n </Heading>\r\n <Text color={subtitleColor} maxW=\"800px\" mx=\"auto\">\r\n We combine cutting-edge technology with student-centric design to create a platform that truly understands your academic needs. \r\n From course selection to graduation planning, CourseWise is your trusted companion throughout your educational journey.\r\n </Text>\r\n <HStack spacing={8} justify=\"center\" wrap=\"wrap\">\r\n <VStack spacing={1}>\r\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color={accentColor}>10k+</Text>\r\n <Text fontSize=\"sm\" color={subtitleColor}>Course Reviews</Text>\r\n </VStack>\r\n <VStack spacing={1}>\r\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color={accentColor}>5k+</Text>\r\n <Text fontSize=\"sm\" color={subtitleColor}>Active Students</Text>\r\n </VStack>\r\n <VStack spacing={1}>\r\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color={accentColor}>90%</Text>\r\n <Text fontSize=\"sm\" color={subtitleColor}>User Satisfaction</Text>\r\n </VStack>\r\n </HStack>\r\n </VStack>\r\n </Box>\r\n </VStack>\r\n </MotionDiv>\r\n </Box>\r\n </Container>\r\n \r\n {/* Footer section with copyright */}\r\n <Box mt={20} py={6} textAlign=\"center\" color={subtitleColor}>\r\n <Text>© {new Date().getFullYear()} CourseWise. All rights reserved.</Text>\r\n </Box>\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default AboutPage;","import { supabase } from '../lib/supabase';\r\nimport { UserFeedback, CreateFeedbackData, FeedbackStatus } from '../types/feedback';\r\n\r\nclass FeedbackService {\r\n async createFeedback(feedbackData: CreateFeedbackData): Promise<UserFeedback> {\r\n const { data: { user } } = await supabase.auth.getUser();\r\n if (!user) throw new Error('User not authenticated');\r\n\r\n const browserInfo = {\r\n userAgent: navigator.userAgent,\r\n platform: navigator.platform,\r\n language: navigator.language,\r\n cookieEnabled: navigator.cookieEnabled,\r\n onLine: navigator.onLine,\r\n };\r\n\r\n const deviceInfo = {\r\n screenWidth: window.screen.width,\r\n screenHeight: window.screen.height,\r\n windowWidth: window.innerWidth,\r\n windowHeight: window.innerHeight,\r\n pixelRatio: window.devicePixelRatio,\r\n };\r\n\r\n const { data, error } = await supabase\r\n .from('user_feedback')\r\n .insert({\r\n ...feedbackData,\r\n user_id: user.id,\r\n page_url: feedbackData.page_url || window.location.href,\r\n browser_info: browserInfo,\r\n device_info: deviceInfo,\r\n })\r\n .select('*')\r\n .single();\r\n\r\n if (error) throw error;\r\n return data;\r\n }\r\n\r\n // Update feedback\r\n async updateFeedback(feedbackId: string, feedbackData: Partial<CreateFeedbackData>): Promise<UserFeedback> {\r\n const { data: { user } } = await supabase.auth.getUser();\r\n if (!user) throw new Error('User not authenticated');\r\n\r\n const { data, error } = await supabase\r\n .from('user_feedback')\r\n .update({\r\n ...feedbackData,\r\n updated_at: new Date().toISOString(),\r\n })\r\n .eq('id', feedbackId)\r\n .eq('user_id', user.id)\r\n .eq('status', 'open')\r\n .select('*')\r\n .single();\r\n\r\n if (error) throw error;\r\n return data;\r\n }\r\n\r\n // Upload screenshot\r\n async uploadScreenshot(file: File): Promise<string> {\r\n const { data: { user } } = await supabase.auth.getUser();\r\n if (!user) throw new Error('User not authenticated');\r\n\r\n const fileExt = file.name.split('.').pop();\r\n const fileName = `${user.id}/${Date.now()}.${fileExt}`;\r\n\r\n const { data, error } = await supabase.storage\r\n .from('feedback-screenshots')\r\n .upload(fileName, file);\r\n\r\n if (error) throw error;\r\n\r\n const { data: urlData } = supabase.storage\r\n .from('feedback-screenshots')\r\n .getPublicUrl(fileName);\r\n\r\n return urlData.publicUrl;\r\n }\r\n\r\n // Delete screenshot\r\n async deleteScreenshot(url: string): Promise<void> {\r\n try {\r\n const urlParts = url.split('/');\r\n const fileName = urlParts[urlParts.length - 1];\r\n const userFolder = urlParts[urlParts.length - 2];\r\n const fullPath = `${userFolder}/${fileName}`;\r\n\r\n await supabase.storage\r\n .from('feedback-screenshots')\r\n .remove([fullPath]);\r\n } catch (error) {\r\n console.error('Error deleting screenshot:', error);\r\n }\r\n }\r\n\r\n // Get user's own feedback\r\n async getUserFeedback(userId: string): Promise<UserFeedback[]> {\r\n try {\r\n const { data, error } = await supabase\r\n .from('user_feedback')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false });\r\n\r\n if (error) throw error;\r\n return data || [];\r\n } catch (error) {\r\n console.error('Error in getUserFeedback:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n // Get all feedback for admin (with user details) - FIXED QUERY\r\n async getAllFeedback(): Promise<UserFeedback[]> {\r\n try {\r\n const { data, error } = await supabase\r\n .from('user_feedback')\r\n .select(`\r\n *,\r\n user:users!user_feedback_user_id_fkey(\r\n full_name,\r\n email,\r\n profile_picture_url\r\n ),\r\n admin:users!user_feedback_admin_user_id_fkey(\r\n full_name,\r\n email\r\n )\r\n `)\r\n .order('created_at', { ascending: false });\r\n\r\n if (error) throw error;\r\n return data || [];\r\n } catch (error) {\r\n console.error('Error in getAllFeedback:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n // Update feedback status (admin only)\r\n async updateFeedbackStatus(\r\n feedbackId: string, \r\n status: FeedbackStatus, \r\n adminResponse?: string\r\n ): Promise<UserFeedback> {\r\n const { data: { user } } = await supabase.auth.getUser();\r\n if (!user) throw new Error('User not authenticated');\r\n\r\n const updateData: any = {\r\n status,\r\n admin_user_id: user.id,\r\n updated_at: new Date().toISOString(),\r\n };\r\n\r\n if (adminResponse) {\r\n updateData.admin_response = adminResponse;\r\n }\r\n\r\n if (status === 'resolved') {\r\n updateData.resolved_at = new Date().toISOString();\r\n }\r\n\r\n const { data, error } = await supabase\r\n .from('user_feedback')\r\n .update(updateData)\r\n .eq('id', feedbackId)\r\n .select(`\r\n *,\r\n user:users!user_feedback_user_id_fkey(\r\n full_name,\r\n email,\r\n profile_picture_url\r\n ),\r\n admin:users!user_feedback_admin_user_id_fkey(\r\n full_name,\r\n email\r\n )\r\n `)\r\n .single();\r\n\r\n if (error) throw error;\r\n return data;\r\n }\r\n\r\n // Delete feedback\r\n async deleteFeedback(feedbackId: string): Promise<void> {\r\n const { error } = await supabase\r\n .from('user_feedback')\r\n .delete()\r\n .eq('id', feedbackId);\r\n\r\n if (error) throw error;\r\n }\r\n}\r\n\r\nexport const feedbackService = new FeedbackService();","import React, { useState, useRef, useEffect } from 'react';\r\nimport {\r\n Box,\r\n Button,\r\n FormControl,\r\n FormLabel,\r\n Input,\r\n Textarea,\r\n VStack,\r\n HStack,\r\n useToast,\r\n useColorModeValue,\r\n Text,\r\n Icon,\r\n Modal,\r\n ModalOverlay,\r\n ModalContent,\r\n ModalHeader,\r\n ModalBody,\r\n ModalCloseButton,\r\n SimpleGrid,\r\n Image,\r\n IconButton,\r\n FormHelperText,\r\n} from '@chakra-ui/react';\r\nimport { motion } from 'framer-motion';\r\nimport { \r\n MessageSquare, \r\n Bug, \r\n Palette, \r\n Lightbulb, \r\n Star,\r\n AlertTriangle,\r\n Info,\r\n CheckCircle,\r\n Upload,\r\n X,\r\n Camera,\r\n Edit\r\n} from 'lucide-react';\r\nimport { feedbackService } from '../../services/feedback';\r\nimport { CreateFeedbackData, FeedbackType, FeedbackCategory, UserFeedback } from '../../types/feedback';\r\n\r\nconst MotionBox = motion(Box);\r\n\r\nconst feedbackTypes = [\r\n { value: 'ui_ux', label: 'UI/UX Improvement', icon: Star, color: 'purple.500' },\r\n { value: 'theme', label: 'Theme & Design', icon: Palette, color: 'pink.500' },\r\n { value: 'bug_report', label: 'Bug Report', icon: Bug, color: 'red.500' },\r\n { value: 'feature_request', label: 'Feature Request', icon: Lightbulb, color: 'yellow.500' },\r\n { value: 'general', label: 'General Feedback', icon: MessageSquare, color: 'blue.500' },\r\n];\r\n\r\nconst priorityLevels = [\r\n { value: 'low', label: 'Low Priority', icon: Info, color: 'gray.500' },\r\n { value: 'medium', label: 'Medium Priority', icon: CheckCircle, color: 'blue.500' },\r\n { value: 'high', label: 'High Priority', icon: AlertTriangle, color: 'orange.500' },\r\n { value: 'critical', label: 'Critical', icon: AlertTriangle, color: 'red.500' },\r\n];\r\n\r\ninterface FeedbackFormProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSuccess?: () => void;\r\n editFeedback?: UserFeedback; // New prop for editing\r\n}\r\n\r\nconst FeedbackForm: React.FC<FeedbackFormProps> = ({ \r\n isOpen, \r\n onClose, \r\n onSuccess, \r\n editFeedback \r\n}) => {\r\n const [formData, setFormData] = useState<CreateFeedbackData>({\r\n feedback_type: 'general',\r\n category: 'medium',\r\n title: '',\r\n description: '',\r\n });\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\r\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\r\n const [uploadingImage, setUploadingImage] = useState(false);\r\n const [existingScreenshotUrl, setExistingScreenshotUrl] = useState<string | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const toast = useToast();\r\n\r\n const cardBg = useColorModeValue('white', 'gray.800');\r\n const borderColor = useColorModeValue('gray.200', 'gray.600');\r\n const textColor = useColorModeValue('gray.800', 'gray.200');\r\n\r\n const isEditMode = !!editFeedback;\r\n\r\n // Populate form with existing data when editing\r\n useEffect(() => {\r\n if (editFeedback) {\r\n setFormData({\r\n feedback_type: editFeedback.feedback_type,\r\n category: editFeedback.category,\r\n title: editFeedback.title,\r\n description: editFeedback.description,\r\n });\r\n \r\n if (editFeedback.screenshot_url) {\r\n setExistingScreenshotUrl(editFeedback.screenshot_url);\r\n setPreviewUrl(editFeedback.screenshot_url);\r\n }\r\n } else {\r\n // Reset form for new feedback\r\n setFormData({\r\n feedback_type: 'general',\r\n category: 'medium',\r\n title: '',\r\n description: '',\r\n });\r\n setExistingScreenshotUrl(null);\r\n setPreviewUrl(null);\r\n setSelectedFile(null);\r\n }\r\n }, [editFeedback, isOpen]);\r\n\r\n const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (file) {\r\n // Validate file type\r\n if (!file.type.startsWith('image/')) {\r\n toast({\r\n title: 'Invalid File Type',\r\n description: 'Please select an image file (PNG, JPG, GIF, etc.)',\r\n status: 'error',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n return;\r\n }\r\n\r\n // Validate file size (5MB limit)\r\n if (file.size > 5 * 1024 * 1024) {\r\n toast({\r\n title: 'File Too Large',\r\n description: 'Please select an image smaller than 5MB',\r\n status: 'error',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n return;\r\n }\r\n\r\n setSelectedFile(file);\r\n \r\n // Create preview URL for new file\r\n const url = URL.createObjectURL(file);\r\n setPreviewUrl(url);\r\n setExistingScreenshotUrl(null); // Clear existing screenshot when new one is selected\r\n }\r\n };\r\n\r\n const removeImage = () => {\r\n setSelectedFile(null);\r\n setExistingScreenshotUrl(null);\r\n if (previewUrl && !existingScreenshotUrl) {\r\n URL.revokeObjectURL(previewUrl);\r\n }\r\n setPreviewUrl(null);\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!formData.title.trim() || !formData.description.trim()) {\r\n toast({\r\n title: 'Missing Information',\r\n description: 'Please fill in all required fields.',\r\n status: 'warning',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n return;\r\n }\r\n\r\n setIsSubmitting(true);\r\n try {\r\n let screenshotUrl = existingScreenshotUrl || '';\r\n \r\n // Handle screenshot upload/update\r\n if (selectedFile) {\r\n setUploadingImage(true);\r\n try {\r\n // Delete old screenshot if updating and there was an existing one\r\n if (isEditMode && existingScreenshotUrl) {\r\n await feedbackService.deleteScreenshot(existingScreenshotUrl);\r\n }\r\n \r\n // Upload new screenshot\r\n screenshotUrl = await feedbackService.uploadScreenshot(selectedFile);\r\n } catch (uploadError) {\r\n console.error('Error uploading screenshot:', uploadError);\r\n toast({\r\n title: 'Upload Failed',\r\n description: 'Failed to upload screenshot, but feedback will be submitted without it.',\r\n status: 'warning',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n screenshotUrl = existingScreenshotUrl || '';\r\n } finally {\r\n setUploadingImage(false);\r\n }\r\n }\r\n\r\n // Submit or update feedback\r\n if (isEditMode) {\r\n await feedbackService.updateFeedback(editFeedback.id, {\r\n ...formData,\r\n screenshot_url: screenshotUrl || undefined,\r\n });\r\n \r\n toast({\r\n title: 'Feedback Updated!',\r\n description: 'Your feedback has been successfully updated.',\r\n status: 'success',\r\n duration: 5000,\r\n isClosable: true,\r\n });\r\n } else {\r\n await feedbackService.createFeedback({\r\n ...formData,\r\n screenshot_url: screenshotUrl || undefined,\r\n });\r\n \r\n toast({\r\n title: 'Feedback Submitted!',\r\n description: selectedFile \r\n ? 'Thank you for your feedback and screenshot. We\\'ll review it soon.' \r\n : 'Thank you for your feedback. We\\'ll review it soon.',\r\n status: 'success',\r\n duration: 5000,\r\n isClosable: true,\r\n });\r\n }\r\n \r\n // Reset form only if not editing\r\n if (!isEditMode) {\r\n setFormData({\r\n feedback_type: 'general',\r\n category: 'medium',\r\n title: '',\r\n description: '',\r\n });\r\n removeImage();\r\n }\r\n \r\n onSuccess?.();\r\n onClose();\r\n } catch (error) {\r\n console.error('Error submitting feedback:', error);\r\n toast({\r\n title: isEditMode ? 'Update Failed' : 'Submission Failed',\r\n description: isEditMode \r\n ? 'Unable to update feedback. Please try again.'\r\n : 'Unable to submit feedback. Please try again.',\r\n status: 'error',\r\n duration: 5000,\r\n isClosable: true,\r\n });\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n // Clean up preview URL if it's a new file\r\n if (previewUrl && !existingScreenshotUrl) {\r\n URL.revokeObjectURL(previewUrl);\r\n }\r\n onClose();\r\n };\r\n\r\n return (\r\n <Modal isOpen={isOpen} onClose={handleClose} size=\"xl\">\r\n <ModalOverlay backdropFilter=\"blur(10px)\" />\r\n <ModalContent maxW=\"600px\" mx={4}>\r\n <ModalHeader>\r\n <HStack spacing={3}>\r\n <Icon as={isEditMode ? Edit : MessageSquare} color=\"purple.500\" boxSize={5} />\r\n <Text>{isEditMode ? 'Edit Feedback' : 'Share Your Feedback'}</Text>\r\n </HStack>\r\n </ModalHeader>\r\n <ModalCloseButton />\r\n \r\n <ModalBody pb={6}>\r\n <form onSubmit={handleSubmit}>\r\n <VStack spacing={6} align=\"stretch\">\r\n {/* Edit Mode Notice */}\r\n {isEditMode && (\r\n <Box\r\n bg=\"blue.50\"\r\n border=\"1px solid\"\r\n borderColor=\"blue.200\"\r\n borderRadius=\"md\"\r\n p={3}\r\n >\r\n <Text fontSize=\"sm\" color=\"blue.700\">\r\n 📝 You're editing your feedback. Only open feedback can be edited.\r\n </Text>\r\n </Box>\r\n )}\r\n\r\n {/* Feedback Type Selection */}\r\n <FormControl isRequired>\r\n <FormLabel fontWeight=\"semibold\">Feedback Type</FormLabel>\r\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\r\n {feedbackTypes.map((type) => (\r\n <MotionBox\r\n key={type.value}\r\n whileHover={{ scale: 1.02 }}\r\n whileTap={{ scale: 0.98 }}\r\n >\r\n <Box\r\n p={4}\r\n border=\"2px solid\"\r\n borderColor={\r\n formData.feedback_type === type.value \r\n ? type.color \r\n : borderColor\r\n }\r\n borderRadius=\"lg\"\r\n cursor=\"pointer\"\r\n transition=\"all 0.2s\"\r\n bg={\r\n formData.feedback_type === type.value \r\n ? `${type.color}10` \r\n : cardBg\r\n }\r\n onClick={() => setFormData({ ...formData, feedback_type: type.value as FeedbackType })}\r\n _hover={{ borderColor: type.color }}\r\n >\r\n <HStack spacing={3}>\r\n <Icon as={type.icon} color={type.color} boxSize={5} />\r\n <Text fontSize=\"sm\" fontWeight=\"medium\" color={textColor}>\r\n {type.label}\r\n </Text>\r\n </HStack>\r\n </Box>\r\n </MotionBox>\r\n ))}\r\n </SimpleGrid>\r\n </FormControl>\r\n\r\n {/* Priority Level */}\r\n <FormControl isRequired>\r\n <FormLabel fontWeight=\"semibold\">Priority Level</FormLabel>\r\n <HStack spacing={3} flexWrap=\"wrap\">\r\n {priorityLevels.map((level) => (\r\n <Button\r\n key={level.value}\r\n size=\"sm\"\r\n variant={formData.category === level.value ? 'solid' : 'outline'}\r\n colorScheme={formData.category === level.value ? level.color.split('.')[0] : 'gray'}\r\n onClick={() => setFormData({ ...formData, category: level.value as FeedbackCategory })}\r\n leftIcon={<Icon as={level.icon} boxSize={4} />}\r\n >\r\n {level.label}\r\n </Button>\r\n ))}\r\n </HStack>\r\n </FormControl>\r\n\r\n {/* Title */}\r\n <FormControl isRequired>\r\n <FormLabel fontWeight=\"semibold\">Title</FormLabel>\r\n <Input\r\n value={formData.title}\r\n onChange={(e) => setFormData({ ...formData, title: e.target.value })}\r\n placeholder=\"Brief summary of your feedback\"\r\n focusBorderColor=\"purple.400\"\r\n />\r\n </FormControl>\r\n\r\n {/* Description */}\r\n <FormControl isRequired>\r\n <FormLabel fontWeight=\"semibold\">Description</FormLabel>\r\n <Textarea\r\n value={formData.description}\r\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\r\n placeholder=\"Please provide detailed information about your feedback, including steps to reproduce (for bugs) or specific suggestions for improvements.\"\r\n rows={5}\r\n focusBorderColor=\"purple.400\"\r\n resize=\"vertical\"\r\n />\r\n </FormControl>\r\n\r\n {/* Screenshot Upload */}\r\n <FormControl>\r\n <FormLabel fontWeight=\"semibold\">\r\n <HStack spacing={2}>\r\n <Icon as={Camera} boxSize={4} />\r\n <Text>Screenshot (Optional)</Text>\r\n </HStack>\r\n </FormLabel>\r\n <FormHelperText mb={3}>\r\n {isEditMode \r\n ? 'Update the screenshot to replace the existing one, or remove it entirely.'\r\n : 'Add a screenshot to help us understand your feedback better. Max 5MB.'\r\n }\r\n </FormHelperText>\r\n \r\n {!previewUrl ? (\r\n <Box\r\n border=\"2px dashed\"\r\n borderColor={borderColor}\r\n borderRadius=\"lg\"\r\n p={6}\r\n textAlign=\"center\"\r\n cursor=\"pointer\"\r\n transition=\"all 0.2s\"\r\n _hover={{ borderColor: 'purple.400', bg: 'purple.50' }}\r\n onClick={() => fileInputRef.current?.click()}\r\n >\r\n <VStack spacing={3}>\r\n <Icon as={Upload} boxSize={8} color=\"gray.400\" />\r\n <VStack spacing={1}>\r\n <Text fontWeight=\"medium\" color={textColor}>\r\n Click to upload screenshot\r\n </Text>\r\n <Text fontSize=\"sm\" color=\"gray.500\">\r\n PNG, JPG, GIF up to 5MB\r\n </Text>\r\n </VStack>\r\n </VStack>\r\n <Input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={handleFileSelect}\r\n display=\"none\"\r\n />\r\n </Box>\r\n ) : (\r\n <Box position=\"relative\" display=\"inline-block\">\r\n <Image\r\n src={previewUrl}\r\n alt=\"Screenshot preview\"\r\n maxH=\"200px\"\r\n borderRadius=\"lg\"\r\n border=\"1px solid\"\r\n borderColor={borderColor}\r\n />\r\n <IconButton\r\n aria-label=\"Remove image\"\r\n icon={<Icon as={X} />}\r\n size=\"sm\"\r\n colorScheme=\"red\"\r\n position=\"absolute\"\r\n top={2}\r\n right={2}\r\n onClick={removeImage}\r\n />\r\n {existingScreenshotUrl && !selectedFile && (\r\n <Text fontSize=\"xs\" color=\"blue.500\" mt={2}>\r\n Current screenshot (click X to remove)\r\n </Text>\r\n )}\r\n </Box>\r\n )}\r\n </FormControl>\r\n\r\n {/* Submit Button */}\r\n <HStack justify=\"flex-end\" spacing={3} pt={4}>\r\n <Button variant=\"ghost\" onClick={handleClose}>\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"submit\"\r\n colorScheme=\"purple\"\r\n isLoading={isSubmitting || uploadingImage}\r\n loadingText={uploadingImage ? \"Uploading...\" : (isEditMode ? \"Updating...\" : \"Submitting...\")}\r\n leftIcon={<Icon as={isEditMode ? Edit : MessageSquare} boxSize={4} />}\r\n >\r\n {isEditMode ? 'Update Feedback' : 'Submit Feedback'}\r\n </Button>\r\n </HStack>\r\n </VStack>\r\n </form>\r\n </ModalBody>\r\n </ModalContent>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default FeedbackForm;","import React, { useState, useEffect, useRef } from 'react';\r\nimport {\r\n Box,\r\n VStack,\r\n HStack,\r\n Text,\r\n Button,\r\n Card,\r\n CardBody,\r\n Badge,\r\n Icon,\r\n useDisclosure,\r\n useToast,\r\n useColorModeValue,\r\n Heading,\r\n Center,\r\n Spinner,\r\n AlertDialog,\r\n AlertDialogBody,\r\n AlertDialogFooter,\r\n AlertDialogHeader,\r\n AlertDialogContent,\r\n AlertDialogOverlay,\r\n Image,\r\n Flex,\r\n Wrap,\r\n WrapItem,\r\n} from '@chakra-ui/react';\r\nimport { motion } from 'framer-motion';\r\nimport { \r\n MessageSquare, \r\n Plus, \r\n Calendar,\r\n AlertCircle,\r\n CheckCircle,\r\n Clock,\r\n Trash2,\r\n Eye,\r\n Edit, // Add this import\r\n} from 'lucide-react';\r\nimport { feedbackService } from '../../services/feedback';\r\nimport { UserFeedback as UserFeedbackType } from '../../types/feedback';\r\nimport { useAuth } from '../../lib/contexts/AuthContext';\r\nimport FeedbackForm from '../feedback/FeedbackForm';\r\n\r\nconst MotionBox = motion(Box);\r\n\r\nconst UserFeedback: React.FC = () => {\r\n const [feedbacks, setFeedbacks] = useState<UserFeedbackType[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [selectedFeedback, setSelectedFeedback] = useState<UserFeedbackType | null>(null);\r\n const [editingFeedback, setEditingFeedback] = useState<UserFeedbackType | null>(null); // Add this state\r\n const [deleteId, setDeleteId] = useState<string | null>(null);\r\n const { session } = useAuth();\r\n const toast = useToast();\r\n\r\n const { isOpen: isFormOpen, onOpen: onFormOpen, onClose: onFormClose } = useDisclosure();\r\n const { isOpen: isDetailOpen, onOpen: onDetailOpen, onClose: onDetailClose } = useDisclosure();\r\n const { isOpen: isDeleteOpen, onOpen: onDeleteOpen, onClose: onDeleteClose } = useDisclosure();\r\n\r\n const cancelRef = useRef<HTMLButtonElement>(null);\r\n const detailCloseRef = useRef<HTMLButtonElement>(null);\r\n\r\n const textColor = useColorModeValue('gray.800', 'gray.200');\r\n const mutedColor = useColorModeValue('gray.600', 'gray.400');\r\n const borderColor = useColorModeValue('gray.200', 'gray.600');\r\n\r\n useEffect(() => {\r\n if (session?.user?.id) {\r\n loadUserFeedback();\r\n }\r\n }, [session]);\r\n\r\n const loadUserFeedback = async () => {\r\n try {\r\n setLoading(true);\r\n const data = await feedbackService.getUserFeedback(session!.user.id);\r\n setFeedbacks(data);\r\n } catch (error) {\r\n console.error('Error loading feedback:', error);\r\n toast({\r\n title: 'Error',\r\n description: 'Failed to load your feedback',\r\n status: 'error',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleViewDetails = (feedback: UserFeedbackType) => {\r\n setSelectedFeedback(feedback);\r\n onDetailOpen();\r\n };\r\n\r\n const handleEditFeedback = (feedback: UserFeedbackType) => {\r\n setEditingFeedback(feedback);\r\n onFormOpen();\r\n };\r\n\r\n const handleDelete = async () => {\r\n if (!deleteId) return;\r\n\r\n try {\r\n await feedbackService.deleteFeedback(deleteId);\r\n toast({\r\n title: 'Feedback Deleted',\r\n description: 'Your feedback has been successfully deleted.',\r\n status: 'success',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n loadUserFeedback();\r\n } catch (error) {\r\n toast({\r\n title: 'Error',\r\n description: 'Failed to delete feedback',\r\n status: 'error',\r\n duration: 3000,\r\n isClosable: true,\r\n });\r\n } finally {\r\n onDeleteClose();\r\n setDeleteId(null);\r\n }\r\n };\r\n\r\n const getStatusColor = (status: string) => {\r\n switch (status) {\r\n case 'open': return 'blue';\r\n case 'in_progress': return 'yellow';\r\n case 'resolved': return 'green';\r\n case 'closed': return 'gray';\r\n default: return 'gray';\r\n }\r\n };\r\n\r\n const getTypeColor = (type: string) => {\r\n switch (type) {\r\n case 'ui_ux': return 'purple';\r\n case 'theme': return 'pink';\r\n case 'bug_report': return 'red';\r\n case 'feature_request': return 'yellow';\r\n case 'general': return 'blue';\r\n default: return 'gray';\r\n }\r\n };\r\n\r\n const getCategoryColor = (category: string) => {\r\n switch (category) {\r\n case 'critical': return 'red';\r\n case 'high': return 'orange';\r\n case 'medium': return 'blue';\r\n case 'low': return 'gray';\r\n default: return 'gray';\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <Center py={12}>\r\n <VStack spacing={4}>\r\n <Spinner size=\"lg\" color=\"purple.500\" />\r\n <Text color={mutedColor}>Loading your feedback...</Text>\r\n </VStack>\r\n </Center>\r\n );\r\n }\r\n\r\n return (\r\n <Box>\r\n <VStack spacing={6} align=\"stretch\">\r\n {/* Header */}\r\n <Flex justify=\"space-between\" align=\"center\" flexWrap=\"wrap\" gap={4}>\r\n <Box>\r\n <Heading size=\"lg\" color={textColor}>\r\n My Feedback\r\n </Heading>\r\n <Text color={mutedColor} mt={1}>\r\n Track your submitted feedback and suggestions\r\n </Text>\r\n </Box>\r\n <Button leftIcon={<Icon as={Plus} />} colorScheme=\"purple\" onClick={onFormOpen}>\r\n New Feedback\r\n </Button>\r\n </Flex>\r\n\r\n {/* Stats */}\r\n <HStack spacing={4} flexWrap=\"wrap\">\r\n <Badge colorScheme=\"blue\" px={3} py={1} borderRadius=\"full\">\r\n Total: {feedbacks.length}\r\n </Badge>\r\n <Badge colorScheme=\"green\" px={3} py={1} borderRadius=\"full\">\r\n Resolved: {feedbacks.filter(f => f.status === 'resolved').length}\r\n </Badge>\r\n <Badge colorScheme=\"yellow\" px={3} py={1} borderRadius=\"full\">\r\n In Progress: {feedbacks.filter(f => f.status === 'in_progress').length}\r\n </Badge>\r\n <Badge colorScheme=\"gray\" px={3} py={1} borderRadius=\"full\">\r\n Open: {feedbacks.filter(f => f.status === 'open').length}\r\n </Badge>\r\n </HStack>\r\n\r\n {/* Feedback List */}\r\n {feedbacks.length === 0 ? (\r\n <Card>\r\n <CardBody>\r\n <Center py={12}>\r\n <VStack spacing={4}>\r\n <Icon as={MessageSquare} boxSize={12} color=\"gray.400\" />\r\n <VStack spacing={2}>\r\n <Text fontSize=\"lg\" fontWeight=\"medium\" color={textColor}>\r\n No feedback submitted yet\r\n </Text>\r\n <Text color={mutedColor} textAlign=\"center\">\r\n Share your thoughts to help us improve CourseWise\r\n </Text>\r\n </VStack>\r\n <Button leftIcon={<Icon as={Plus} />} colorScheme=\"purple\" onClick={onFormOpen}>\r\n Submit Your First Feedback\r\n </Button>\r\n </VStack>\r\n </Center>\r\n </CardBody>\r\n </Card>\r\n ) : (\r\n <VStack spacing={4} align=\"stretch\">\r\n {feedbacks.map((feedback, index) => (\r\n <MotionBox\r\n key={feedback.id}\r\n initial={{ opacity: 0, y: 20 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ delay: index * 0.1 }}\r\n >\r\n <Card\r\n border=\"1px\"\r\n borderColor={borderColor}\r\n _hover={{ \r\n boxShadow: 'md',\r\n borderColor: 'purple.300',\r\n }}\r\n transition=\"all 0.2s\"\r\n >\r\n <CardBody>\r\n <VStack align=\"stretch\" spacing={4}>\r\n {/* Header */}\r\n <Flex justify=\"space-between\" align=\"start\" flexWrap=\"wrap\" gap={3}>\r\n <VStack align=\"stretch\" spacing={2} flex={1}>\r\n <HStack spacing={3} flexWrap=\"wrap\">\r\n <Badge colorScheme={getTypeColor(feedback.feedback_type)} variant=\"solid\">\r\n {feedback.feedback_type.replace('_', ' ').toUpperCase()}\r\n </Badge>\r\n <Badge colorScheme={getCategoryColor(feedback.category)} variant=\"outline\">\r\n {feedback.category.toUpperCase()}\r\n </Badge>\r\n <Badge colorScheme={getStatusColor(feedback.status)} variant=\"subtle\">\r\n <Icon as={\r\n feedback.status === 'open' ? Clock :\r\n feedback.status === 'in_progress' ? AlertCircle :\r\n feedback.status === 'resolved' ? CheckCircle : Clock\r\n } boxSize={3} mr={1} />\r\n {feedback.status.replace('_', ' ')}\r\n </Badge>\r\n </HStack>\r\n <Text fontSize=\"lg\" fontWeight=\"semibold\" color={textColor}>\r\n {feedback.title}\r\n </Text>\r\n </VStack>\r\n\r\n {/* Action Buttons */}\r\n <HStack spacing={2} flexShrink={0}>\r\n <Button\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n colorScheme=\"blue\"\r\n leftIcon={<Icon as={Eye} />}\r\n onClick={() => handleViewDetails(feedback)}\r\n >\r\n View\r\n </Button>\r\n {feedback.status === 'open' && (\r\n <>\r\n <Button\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n colorScheme=\"green\"\r\n leftIcon={<Icon as={Edit} />}\r\n onClick={() => handleEditFeedback(feedback)}\r\n >\r\n Edit\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n variant=\"ghost\"\r\n colorScheme=\"red\"\r\n leftIcon={<Icon as={Trash2} />}\r\n onClick={() => {\r\n setDeleteId(feedback.id);\r\n onDeleteOpen();\r\n }}\r\n >\r\n Delete\r\n </Button>\r\n </>\r\n )}\r\n </HStack>\r\n </Flex>\r\n\r\n {/* Description Preview */}\r\n <Text color={mutedColor} noOfLines={2}>\r\n {feedback.description}\r\n </Text>\r\n\r\n {/* Screenshot Preview */}\r\n {feedback.screenshot_url && (\r\n <Box>\r\n <Text fontSize=\"sm\" fontWeight=\"medium\" color={textColor} mb={2}>\r\n Screenshot:\r\n </Text>\r\n <Image\r\n src={feedback.screenshot_url}\r\n alt=\"Feedback screenshot\"\r\n maxH=\"100px\"\r\n borderRadius=\"md\"\r\n border=\"1px solid\"\r\n borderColor={borderColor}\r\n cursor=\"pointer\"\r\n onClick={() => window.open(feedback.screenshot_url, '_blank')}\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Footer */}\r\n <HStack justify=\"space-between\" pt={2} borderTop=\"1px\" borderColor={borderColor}>\r\n <HStack spacing={2}>\r\n <Icon as={Calendar} boxSize={4} color={mutedColor} />\r\n <Text fontSize=\"sm\" color={mutedColor}>\r\n Submitted {new Date(feedback.created_at).toLocaleDateString()}\r\n </Text>\r\n </HStack>\r\n {feedback.updated_at !== feedback.created_at && (\r\n <Text fontSize=\"sm\" color={mutedColor}>\r\n Updated {new Date(feedback.updated_at).toLocaleDateString()}\r\n </Text>\r\n )}\r\n </HStack>\r\n </VStack>\r\n </CardBody>\r\n </Card>\r\n </MotionBox>\r\n ))}\r\n </VStack>\r\n )}\r\n </VStack>\r\n\r\n {/* Feedback Form Modal */}\r\n <FeedbackForm \r\n isOpen={isFormOpen} \r\n onClose={() => {\r\n onFormClose();\r\n setEditingFeedback(null); // Clear editing state when modal closes\r\n }}\r\n onSuccess={() => {\r\n loadUserFeedback();\r\n setEditingFeedback(null); // Clear editing state after success\r\n }}\r\n editFeedback={editingFeedback || undefined} // Pass the feedback to edit\r\n />\r\n\r\n {/* Detail View Modal */}\r\n {selectedFeedback && (\r\n <AlertDialog isOpen={isDetailOpen} onClose={onDetailClose} leastDestructiveRef={detailCloseRef}>\r\n <AlertDialogOverlay>\r\n <AlertDialogContent maxW=\"2xl\">\r\n <AlertDialogHeader>\r\n <HStack spacing={3}>\r\n <Badge colorScheme={getTypeColor(selectedFeedback.feedback_type)} variant=\"solid\">\r\n {selectedFeedback.feedback_type.replace('_', ' ').toUpperCase()}\r\n </Badge>\r\n <Badge colorScheme={getCategoryColor(selectedFeedback.category)} variant=\"outline\">\r\n {selectedFeedback.category.toUpperCase()}\r\n </Badge>\r\n <Badge colorScheme={getStatusColor(selectedFeedback.status)} variant=\"subtle\">\r\n {selectedFeedback.status.replace('_', ' ')}\r\n </Badge>\r\n </HStack>\r\n </AlertDialogHeader>\r\n <AlertDialogBody>\r\n <VStack align=\"stretch\" spacing={4}>\r\n <Box>\r\n <Text fontSize=\"lg\" fontWeight=\"semibold\" mb={2}>\r\n {selectedFeedback.title}\r\n </Text>\r\n <Text color={mutedColor} whiteSpace=\"pre-wrap\">\r\n {selectedFeedback.description}\r\n </Text>\r\n </Box>\r\n \r\n {selectedFeedback.screenshot_url && (\r\n <Box>\r\n <Text fontSize=\"sm\" fontWeight=\"medium\" color={textColor} mb={2}>\r\n Screenshot:\r\n </Text>\r\n <Image\r\n src={selectedFeedback.screenshot_url}\r\n alt=\"Feedback screenshot\"\r\n maxH=\"300px\"\r\n borderRadius=\"md\"\r\n border=\"1px solid\"\r\n borderColor={borderColor}\r\n cursor=\"pointer\"\r\n onClick={() => window.open(selectedFeedback.screenshot_url, '_blank')}\r\n />\r\n </Box>\r\n )}\r\n\r\n {selectedFeedback.admin_response && (\r\n <Box bg=\"green.50\" p={4} borderRadius=\"md\" border=\"1px solid\" borderColor=\"green.200\">\r\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"green.800\" mb={2}>\r\n Admin Response:\r\n </Text>\r\n <Text color=\"green.700\" whiteSpace=\"pre-wrap\">\r\n {selectedFeedback.admin_response}\r\n </Text>\r\n </Box>\r\n )}\r\n\r\n <HStack justify=\"space-between\" pt={2} borderTop=\"1px\" borderColor={borderColor}>\r\n <Text fontSize=\"sm\" color={mutedColor}>\r\n Submitted: {new Date(selectedFeedback.created_at).toLocaleString()}\r\n </Text>\r\n {selectedFeedback.updated_at !== selectedFeedback.created_at && (\r\n <Text fontSize=\"sm\" color={mutedColor}>\r\n Updated: {new Date(selectedFeedback.updated_at).toLocaleString()}\r\n </Text>\r\n )}\r\n </HStack>\r\n </VStack>\r\n </AlertDialogBody>\r\n <AlertDialogFooter>\r\n <Button ref={detailCloseRef} onClick={onDetailClose}>\r\n Close\r\n </Button>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialogOverlay>\r\n </AlertDialog>\r\n )}\r\n\r\n {/* Delete Confirmation */}\r\n <AlertDialog isOpen={isDeleteOpen} onClose={onDeleteClose} leastDestructiveRef={cancelRef}>\r\n <AlertDialogOverlay>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>Delete Feedback</AlertDialogHeader>\r\n <AlertDialogBody>\r\n Are you sure you want to delete this feedback? This action cannot be undone.\r\n </AlertDialogBody>\r\n <AlertDialogFooter>\r\n <Button ref={cancelRef} onClick={onDeleteClose}>Cancel</Button>\r\n <Button colorScheme=\"red\" onClick={handleDelete} ml={3}>\r\n Delete\r\n </Button>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialogOverlay>\r\n </AlertDialog>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default UserFeedback;","import React, { useState, useEffect } from 'react';\r\nimport { Box, Flex, Heading, Text, Tabs, TabList, TabPanels, Tab, TabPanel, Spinner, Avatar, SimpleGrid, Stat, StatLabel, StatNumber, StatHelpText, useColorModeValue, Card, CardBody, Stack, Icon, Divider } from '@chakra-ui/react';\r\nimport { User, Bookmark, BookOpen, Award, BarChart, GraduationCap, Book, Calendar, ClipboardList, Hash, MessageSquare } from 'lucide-react';\r\nimport { supabase } from '../../../lib/supabase';\r\nimport { useAuth } from '../../../lib/contexts/AuthContext';\r\nimport { useToast } from '../../../lib/contexts/ToastContext';\r\nimport NavBar from '../../shared/NavBar';\r\nimport PersonalInfoPanel from './PersonalInfoPanel';\r\nimport CourseHistoryPanel from './CourseHistoryPanel';\r\nimport AcademicRecordsPanel from './AcademicRecordsPanel';\r\nimport UserFeedback from '../UserFeedback';\r\n\r\n// Function to create a CORS-friendly URL for Google images\r\nconst getCorsProxyUrl = (url: string | null | undefined): string => {\r\n if (!url) return '';\r\n if (url.includes('googleusercontent.com')) {\r\n // Use images.weserv.nl as a proxy to avoid CORS issues\r\n return `https://images.weserv.nl/?url=${encodeURIComponent(url)}&default=404`;\r\n }\r\n return url;\r\n};\r\n\r\nconst Dashboard = () => {\r\n const [loading, setLoading] = useState(true);\r\n const [userData, setUserData] = useState<any>(null);\r\n const [academicRecords, setAcademicRecords] = useState<any[]>([]);\r\n const [semesterCourses, setSemesterCourses] = useState<any[]>([]);\r\n const [selectedCourses, setSelectedCourses] = useState<any[]>([]);\r\n const [currentSemesterCourses, setCurrentSemesterCourses] = useState<any>(null);\r\n const { session } = useAuth();\r\n const toast = useToast();\r\n\r\n useEffect(() => {\r\n const fetchUserData = async () => {\r\n try {\r\n setLoading(true);\r\n \r\n if (!session) {\r\n throw new Error('No active session');\r\n }\r\n \r\n // Get user profile\r\n const { data: userData, error: userError } = await supabase\r\n .from('users')\r\n .select('*')\r\n .eq('id', session.user.id)\r\n .single();\r\n \r\n if (userError) {\r\n console.error('Error fetching user data:', userError);\r\n throw userError;\r\n }\r\n \r\n // If Google avatar is available but not saved in database, save it\r\n if (session.user.user_metadata?.avatar_url && \r\n (!userData.profile_picture_url || userData.profile_picture_url !== session.user.user_metadata.avatar_url)) {\r\n \r\n // Add debugging\r\n console.log('Before sync - Profile URL:', userData.profile_picture_url);\r\n console.log('Google Avatar URL:', session.user.user_metadata.avatar_url);\r\n \r\n const { error: updateError } = await supabase\r\n .from('users')\r\n .update({ \r\n profile_picture_url: session.user.user_metadata.avatar_url,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', session.user.id);\r\n \r\n if (updateError) {\r\n console.error('Error synchronizing Google avatar:', updateError);\r\n } else {\r\n // Update the userData with the new profile_picture_url\r\n userData.profile_picture_url = session.user.user_metadata.avatar_url;\r\n console.log('After sync - Updated profile URL:', userData.profile_picture_url);\r\n }\r\n }\r\n \r\n // Get academic records with error handling\r\n const { data: academicRecords, error: academicError } = await supabase\r\n .from('user_academic_records')\r\n .select('*')\r\n .eq('user_id', session.user.id)\r\n .order('semester_number');\r\n \r\n if (academicError) {\r\n console.error('Error fetching academic records:', academicError);\r\n }\r\n \r\n // Get selected courses with error handling\r\n const { data: selectedCourses, error: selectedCoursesError } = await supabase\r\n .from('selected_courses')\r\n .select('*')\r\n .eq('user_id', session.user.id);\r\n \r\n if (selectedCoursesError) {\r\n console.error('Error fetching selected courses:', selectedCoursesError);\r\n }\r\n\r\n // Map selected courses with their details\r\n const selectedCoursesWithDetails = selectedCourses?.map(selectedCourse => ({\r\n ...selectedCourse,\r\n course: {\r\n uuid: selectedCourse.course_uuid,\r\n course_code: selectedCourse.course_acronym || selectedCourse.course_uuid,\r\n course_name: 'Selected Course',\r\n credits: 0,\r\n dept_acronym: '',\r\n description: ''\r\n }\r\n })) || [];\r\n\r\n // Get semester courses with error handling\r\n const { data: semesterCourses, error: coursesError } = await supabase\r\n .from('user_semester_courses')\r\n .select('*, courses_iiitd!inner(uuid, course_code, course_name, credits, dept_acronym, description)')\r\n .eq('user_id', session.user.id)\r\n .order('semester_number');\r\n \r\n if (coursesError) {\r\n console.error('Error fetching semester courses:', coursesError);\r\n }\r\n\r\n // Map the courses with their details\r\n const coursesWithDetails = semesterCourses?.map(semesterCourse => ({\r\n ...semesterCourse,\r\n course: semesterCourse.courses_iiitd || {\r\n uuid: semesterCourse.course_uuid,\r\n course_code: semesterCourse.course_acronym || 'Unknown',\r\n course_name: 'Unknown Course',\r\n credits: 0,\r\n dept_acronym: '',\r\n description: ''\r\n }\r\n })) || [];\r\n\r\n // Update state with fetched data\r\n setUserData(userData);\r\n setAcademicRecords(academicRecords || []);\r\n setSemesterCourses(coursesWithDetails);\r\n setSelectedCourses(selectedCoursesWithDetails);\r\n setCurrentSemesterCourses(userData?.current_semester_courses || null);\r\n \r\n } catch (error: any) {\r\n console.error('Error fetching user data:', error);\r\n toast({\r\n title: 'Error fetching data',\r\n description: error.message || 'Could not load user data',\r\n status: 'error',\r\n duration: 5000,\r\n isClosable: true,\r\n });\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (session) {\r\n fetchUserData();\r\n }\r\n }, [session, toast]);\r\n\r\n const semester = userData?.semester || userData?.current_semester || '-';\r\n const totalCredits = academicRecords.reduce((sum, record) => sum + (record.completed_credits || 0), 0);\r\n\r\n // Helper function to calculate CGPA (same as in AcademicRecordsPanel)\r\n const calculateCGPA = (records: any[]): string => {\r\n if (records.length === 0) return '0.00';\r\n \r\n const totalCredits = records.reduce((sum, record) => sum + record.completed_credits, 0);\r\n if (totalCredits === 0) return '0.00';\r\n \r\n const weightedGPA = records.reduce((sum, record) => {\r\n return sum + (record.gpa * record.completed_credits);\r\n }, 0);\r\n \r\n return (weightedGPA / totalCredits).toFixed(2);\r\n };\r\n\r\n const cumulativeGPA = calculateCGPA(academicRecords);\r\n\r\n return (\r\n <>\r\n <NavBar />\r\n <Box className=\"min-h-screen bg-gradient-to-br from-indigo-50 to-purple-50 pb-16\">\r\n <Box maxW=\"1200px\" margin=\"0 auto\" p={[4, 6, 8]}>\r\n <Flex direction=\"column\" gap={6}>\r\n {/* Header section with user info */}\r\n <Box className=\"bg-gradient-to-r from-indigo-600 to-purple-600 rounded-xl shadow-xl p-8 text-white\">\r\n <Flex direction={['column', 'row']} justifyContent=\"space-between\" alignItems={['center', 'flex-start']} gap={6}>\r\n <Flex direction={['column', 'row']} alignItems=\"center\" gap={6}>\r\n <Box>\r\n <Avatar \r\n size=\"xl\" \r\n name={userData?.full_name || session?.user?.email}\r\n src={getCorsProxyUrl(userData?.profile_picture_url || session?.user?.user_metadata?.avatar_url)}\r\n bg=\"purple.500\"\r\n color=\"white\"\r\n shadow=\"md\"\r\n border=\"3px solid\"\r\n borderColor=\"white\"\r\n />\r\n {/* Temporary debugging image */}\r\n {process.env.NODE_ENV === 'development' && (\r\n <Box display=\"none\">\r\n <img \r\n src={getCorsProxyUrl(userData?.profile_picture_url || session?.user?.user_metadata?.avatar_url)} \r\n alt=\"Debug\" \r\n onLoad={() => console.log(\"Image loaded successfully\")}\r\n onError={(e) => console.error(\"Image failed to load:\", e)}\r\n />\r\n </Box>\r\n )}\r\n </Box>\r\n <Box textAlign={['center', 'left']}>\r\n <Heading size=\"lg\" className=\"font-bold\">\r\n {userData?.full_name || 'Student'}\r\n </Heading>\r\n <Text fontSize=\"md\" mt={1} className=\"opacity-80\">\r\n {userData?.email || session?.user?.email}\r\n </Text>\r\n <Flex align=\"center\" gap={2} mt={3}>\r\n <GraduationCap size={18} className=\"opacity-80\" />\r\n <Text fontSize=\"sm\" className=\"opacity-80\">\r\n {userData?.institution || 'IIIT Delhi'} {userData?.branch ? `• ${userData.branch}` : ''}\r\n </Text>\r\n </Flex>\r\n \r\n {userData?.roll_number && (\r\n <Flex align=\"center\" gap={2} mt={1}>\r\n <Hash size={18} className=\"opacity-80\" />\r\n <Text fontSize=\"sm\" className=\"opacity-80\">\r\n Roll No: {userData.roll_number}\r\n </Text>\r\n </Flex>\r\n )}\r\n </Box>\r\n </Flex>\r\n <SimpleGrid columns={[2, 2, 3]} spacing={4} minW={['auto', '320px']} mt={[4, 0]}>\r\n <Box bg=\"whiteAlpha.200\" p={3} rounded=\"lg\" backdropFilter=\"blur(4px)\" textAlign=\"center\">\r\n <Text fontSize=\"sm\" className=\"opacity-80\">Semester</Text>\r\n <Text fontSize=\"xl\" fontWeight=\"bold\">{semester}</Text>\r\n </Box>\r\n <Box bg=\"whiteAlpha.200\" p={3} rounded=\"lg\" backdropFilter=\"blur(4px)\" textAlign=\"center\">\r\n <Text fontSize=\"sm\" className=\"opacity-80\">Credits</Text>\r\n <Text fontSize=\"xl\" fontWeight=\"bold\">{totalCredits}</Text>\r\n </Box>\r\n <Box bg=\"whiteAlpha.200\" p={3} rounded=\"lg\" backdropFilter=\"blur(4px)\" textAlign=\"center\" \r\n gridColumn={[null, 'span 2', 'auto']}>\r\n <Text fontSize=\"sm\" className=\"opacity-80\">Cumulative GPA</Text>\r\n <Text fontSize=\"xl\" fontWeight=\"bold\">{cumulativeGPA}</Text>\r\n </Box>\r\n </SimpleGrid>\r\n </Flex>\r\n </Box>\r\n\r\n {/* Stats cards */}\r\n {!loading && (\r\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6} mb={2}>\r\n <Card overflow=\"hidden\" variant=\"outline\" shadow=\"md\">\r\n <CardBody p={0}>\r\n <Flex>\r\n <Box bg=\"purple.50\" p={4} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\r\n <Icon as={Book} boxSize={6} color=\"purple.500\" />\r\n </Box>\r\n <Stack p={4} flex={1}>\r\n <Heading size=\"md\" fontWeight=\"semibold\">\r\n {currentSemesterCourses?.total_courses || 0}\r\n </Heading>\r\n <Text fontSize=\"sm\" color=\"gray.500\">Current Courses</Text>\r\n </Stack>\r\n </Flex>\r\n </CardBody>\r\n </Card>\r\n\r\n <Card overflow=\"hidden\" variant=\"outline\" shadow=\"md\">\r\n <CardBody p={0}>\r\n <Flex>\r\n <Box bg=\"indigo.50\" p={4} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\r\n <Icon as={ClipboardList} boxSize={6} color=\"indigo.500\" />\r\n </Box>\r\n <Stack p={4} flex={1}>\r\n <Heading size=\"md\" fontWeight=\"semibold\">\r\n {semesterCourses.filter(course => course.status === 'completed' && course.grade !== 'F').length}\r\n </Heading>\r\n <Text fontSize=\"sm\" color=\"gray.500\">Completed Courses</Text>\r\n </Stack>\r\n </Flex>\r\n </CardBody>\r\n </Card>\r\n\r\n <Card overflow=\"hidden\" variant=\"outline\" shadow=\"md\">\r\n <CardBody p={0}>\r\n <Flex>\r\n <Box bg=\"blue.50\" p={4} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\r\n <Icon as={Calendar} boxSize={6} color=\"blue.500\" />\r\n </Box>\r\n <Stack p={4} flex={1}>\r\n <Heading size=\"md\" fontWeight=\"semibold\">\r\n {academicRecords.length}\r\n </Heading>\r\n <Text fontSize=\"sm\" color=\"gray.500\">Semesters Completed</Text>\r\n </Stack>\r\n </Flex>\r\n </CardBody>\r\n </Card>\r\n </SimpleGrid>\r\n )}\r\n\r\n {/* Main content with tabs */}\r\n {loading ? (\r\n <Flex justify=\"center\" align=\"center\" h=\"400px\">\r\n <Spinner size=\"xl\" color=\"purple.500\" />\r\n </Flex>\r\n ) : (\r\n <Tabs colorScheme=\"purple\" variant=\"enclosed\" className=\"bg-white rounded-xl shadow-lg p-6\">\r\n <TabList overflowX=\"auto\" py={2} className=\"flex-nowrap\">\r\n <Tab className=\"flex items-center gap-2 whitespace-nowrap\">\r\n <User size={18} />\r\n <span>Personal Info</span>\r\n </Tab>\r\n <Tab className=\"flex items-center gap-2 whitespace-nowrap\">\r\n <Bookmark size={18} />\r\n <span>Academic Records</span>\r\n </Tab>\r\n <Tab className=\"flex items-center gap-2 whitespace-nowrap\">\r\n <BookOpen size={18} />\r\n <span>Course History</span>\r\n </Tab>\r\n <Tab className=\"flex items-center gap-2 whitespace-nowrap\">\r\n <MessageSquare size={18} />\r\n <span>My Feedback</span>\r\n </Tab>\r\n </TabList>\r\n <TabPanels>\r\n <TabPanel>\r\n <PersonalInfoPanel userData={userData} />\r\n </TabPanel>\r\n <TabPanel>\r\n <AcademicRecordsPanel />\r\n </TabPanel>\r\n <TabPanel>\r\n <CourseHistoryPanel />\r\n </TabPanel>\r\n <TabPanel>\r\n <UserFeedback />\r\n </TabPanel>\r\n </TabPanels>\r\n </Tabs>\r\n )}\r\n </Flex>\r\n </Box>\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default Dashboard;","import React, { lazy, Suspense } from 'react';\r\nimport { HashRouter as Router, Routes, Route, Navigate } from 'react-router-dom';\r\nimport { ChakraProvider, Box, Flex, Spinner } from '@chakra-ui/react';\r\nimport { GoogleOAuthProvider } from '@react-oauth/google';\r\nimport { BookOpen, AlertTriangle, Star, Calendar } from 'lucide-react';\r\n\r\n// Context providers\r\nimport { AuthProvider } from './lib/contexts/AuthContext';\r\nimport { ToastProvider } from './lib/contexts/ToastContext';\r\nimport { CourseRecommendationProvider } from './context/CourseRecommendationContext';\r\n\r\n// Admin imports\r\nimport AdminDashboard from './features/admin/AdminDashboard';\r\nimport AdminLogin from './features/admin/AdminLogin';\r\nimport ProtectedAdminRoute from './features/admin/components/ProtectedAdminRoute';\r\n\r\n// Import auth components directly to avoid lazy loading issues\r\nimport EnhancedLogin from './features/auth/components/EnhancedLogin';\r\nimport AuthCallback from './features/auth/components/AuthCallback';\r\nimport ProtectedRoute from './features/auth/components/ProtectedRoute';\r\nimport HomePage from './features/home/HomePage';\r\nimport AboutPage from './features/about/AboutPage';\r\n\r\n// User Dashboard import\r\nimport Dashboard from './features/users/components/Dashboard';\r\n\r\n// Lazy load other components\r\nconst AcademicTools = lazy(() => import('./features/academic/AcademicTools'));\r\nconst TimetableClashChecker = lazy(() => import('./features/academic/TimetableClashChecker'));\r\nconst CourseRecommendation = lazy(() => import('./features/academic/CourseRecommendation'));\r\nconst AddCourse = lazy(() => import('./features/admin/AddCourse'));\r\nconst BulkCourseUpload = lazy(() => import('./features/admin/BulkCourseUpload'));\r\nconst MyCourses = lazy(() => import('./features/admin/MyCourses'));\r\nconst EditCourse = lazy(() => import('./features/admin/EditCourse'));\r\nconst UserManagement = lazy(() => import('./features/admin/UserManagement'));\r\nconst Settings = lazy(() => import('./features/admin/Settings'));\r\nconst CourseReviews = lazy(() => import('./features/academic/CourseReviews'));\r\nconst AdminFeedbackManagement = lazy(() => import('./features/admin/AdminFeedbackManagement'));\r\n\r\nconst LoadingSpinner = () => (\r\n <Flex height=\"100vh\" align=\"center\" justify=\"center\">\r\n <Spinner size=\"xl\" color=\"purple.500\" />\r\n </Flex>\r\n);\r\n\r\nconst AppContent = () => {\r\n return (\r\n <Box minH=\"100vh\">\r\n <Suspense fallback={<LoadingSpinner />}>\r\n <Routes>\r\n {/* Public Routes */}\r\n <Route path=\"/\" element={<HomePage />} />\r\n <Route path=\"/login\" element={<EnhancedLogin />} />\r\n <Route path=\"/auth/callback\" element={<AuthCallback />} />\r\n <Route path=\"/academic-tools\" element={<AcademicTools />} />\r\n <Route path=\"/about\" element={<AboutPage />} />\r\n\r\n {/* Protected User Routes */}\r\n <Route path=\"/dashboard\" element={\r\n <ProtectedRoute>\r\n <Dashboard />\r\n </ProtectedRoute>\r\n } />\r\n\r\n {/* Course Feature Routes */}\r\n <Route path=\"/academic-tools/course-recommendation\" element={\r\n <ProtectedRoute>\r\n <CourseRecommendation />\r\n </ProtectedRoute>\r\n } />\r\n <Route path=\"/tt-clash-checker\" element={\r\n <ProtectedRoute>\r\n <TimetableClashChecker />\r\n </ProtectedRoute>\r\n } />\r\n <Route path=\"/academic-tools/course-reviews\" element={\r\n <ProtectedRoute>\r\n <CourseReviews />\r\n </ProtectedRoute>\r\n } />\r\n\r\n {/* Admin Routes */}\r\n <Route path=\"/admin/login\" element={<AdminLogin />} />\r\n <Route\r\n path=\"/admin\"\r\n element={<Navigate to=\"/admin/dashboard\" replace />}\r\n />\r\n <Route\r\n path=\"/admin/dashboard\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <AdminDashboard />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/courses/add\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <AddCourse />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/courses/bulk-upload\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <BulkCourseUpload />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/courses/edit/:id\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <EditCourse />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/courses/my-courses\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <MyCourses />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/user-management\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <UserManagement />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/settings\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <Settings />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/course-reviews\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <CourseReviews />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n <Route\r\n path=\"/admin/feedback\"\r\n element={\r\n <ProtectedAdminRoute>\r\n <AdminFeedbackManagement />\r\n </ProtectedAdminRoute>\r\n }\r\n />\r\n\r\n {/* Catch all */}\r\n <Route path=\"*\" element={<Navigate to=\"/\" replace />} />\r\n </Routes>\r\n </Suspense>\r\n </Box>\r\n );\r\n};\r\n\r\nconst App = () => {\r\n // Provide a fallback empty string to satisfy the type\r\n const clientId = import.meta.env.VITE_GOOGLE_CLIENT_ID || '';\r\n\r\n return (\r\n <>\r\n <ChakraProvider>\r\n <GoogleOAuthProvider clientId={clientId}>\r\n <AuthProvider>\r\n <ToastProvider>\r\n <CourseRecommendationProvider>\r\n <Router>\r\n <AppContent />\r\n </Router>\r\n </CourseRecommendationProvider>\r\n </ToastProvider>\r\n </AuthProvider>\r\n </GoogleOAuthProvider>\r\n </ChakraProvider>\r\n </>\r\n );\r\n};\r\n\r\nexport default App;","import { StrictMode } from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport App from './App.tsx';\r\nimport './index.css';\r\nimport { Analytics } from '@vercel/analytics/react';\r\nimport { SpeedInsights } from '@vercel/speed-insights/react';\r\nimport React from 'react';\r\n\r\ncreateRoot(document.getElementById('root')!).render(\r\n <StrictMode>\r\n <App />\r\n </StrictMode>\r\n);\r\n"],"file":"assets/index-DN1SJQ1D.js"}
Close