From b2643f1a10b3c963486c6698884f301177b356e8 Mon Sep 17 00:00:00 2001 From: "skillens.ai" Date: Fri, 7 Nov 2025 01:03:26 +0530 Subject: [PATCH] addded profile page --- .firebase/hosting.YnVpbGQ.cache | 230 +- src/App.js | 39 +- src/component/Profile.css | 37 +- src/component/Profile.jsx | 522 +++- .../Student/Exams/AttemptExam/AttemptExam.js | 46 +- src/component/Student/Exams/Report/Report.css | 3 +- src/component/Student/Exams/Report/Report.js | 2153 +++++++++-------- 7 files changed, 1796 insertions(+), 1234 deletions(-) diff --git a/.firebase/hosting.YnVpbGQ.cache b/.firebase/hosting.YnVpbGQ.cache index 2da3e78..378a32c 100644 --- a/.firebase/hosting.YnVpbGQ.cache +++ b/.firebase/hosting.YnVpbGQ.cache @@ -1,72 +1,72 @@ robots.txt,1761396900570,bfe106a3fb878dc83461c86818bf74fc1bdc7f28538ba613cd3e775516ce8b49 manifest.json,1761396900568,a9350a49aaac9fe94d3dd77b8270cc998c04ab97944a606189675022431faa51 favicon.svg,1761396900561,a2a4880301751061a600b0bfc5c26fc413aed41e581516c4fa976bcb7fff6663 -service-worker.js,1762276378710,75de03906e552c4c8c2a1f8d2eeb24922bc7d1055210eb2dd103a4d0f7f15d35 -asset-manifest.json,1762276378711,2f626701cd6623aaf59f1190761686a06db51c8d22a9e20ee6a7033270dd1057 -precache-manifest.efa2df517ec1866cf84fbb8ed87d4876.js,1762276378709,3276caca38de42e885604bbffbf9d342ba4352b5b70f34c2517e19ead65126f3 -static/media/sub-ques-icon.366b4f1e.svg,1762276378619,8e397611007ec5db7581a4c1bcca006950390ddf652cae209bb3973a645af425 -static/media/tru-fals-icon.d0b962d8.svg,1762276378619,a1deab7e5db8e8a94a9c5812dcde5f8cbfbe5da790da8500bf106980b9c79c33 -static/media/translate.610ad011.svg,1762276378619,c06f8a3d0c976b02429ce805d8a4944571ab0128ed2ce49c2d3ca134511ed120 -index.html,1762276378650,6d8d85f2a4921ea706f102711e0fa9aa516e43e98f6a50e39f8ec2cbc761b4ff -static/media/quizexam.5545802e.svg,1762276378608,dfc1278bfcd264264a4d0e0e0247c229335abf0573439c5e9829c8607aacd569 -static/media/questions-icon.3d3c1aaf.svg,1762276378612,197f459a359b00c1c44b6ddd71cbc9160f593d1fe08534e3711e9d72a2956ef1 -static/media/student-engaged.53fb7b0b.svg,1762276378613,5f8e01d1a5efcbdf3aa00ed07de843ab84404a28b672ca91f4d70d89fa8b37cf -static/media/question.0c505ed9.svg,1762276378607,29938066f93476c487414bb7a5dd5227d891c8ab8e115a74a7e7ffccd8d87b36 -static/media/practice.f05e6f00.svg,1762276378608,13b094bcbbb8c50906b1ee0ce68305059e99319464dd4147b4c2194dbb460475 -static/media/PracticeKiaLogo.a8336af5.svg,1762276378528,1a592518bcfabb2f86669d06ae2fb7b2948bbdbfaf5a80d138ab30f4e482a0f8 -static/media/performance.88855f12.svg,1762276378612,03fc1b19005084049382091745d3f1f29a447763091ad4a9bc5d097c338671c9 -static/media/perf-icon.1597a235.svg,1762276378616,7183482b785de425506f49deb27bba02e906132ac7ce5af01f7da8452ef64f28 -static/media/mul-cho-icon.b3dc9ea9.svg,1762276378618,e8edbceb0eb49f7629cf0b8edf599f9347acbf0c6d1df2fa6145cbed03f37e1f -static/media/OdiSVGlogo.f0834bb1.svg,1762276378543,3ec1cab31a32db378894d796afedaee7c35f8ff99dfb1039b0bb757225a47235 -static/media/mul-res-icon.8ef3b097.svg,1762276378617,1f0a79350cb5546361ef02af1657ad36efeff833fd7bb61db88a20e127a290b4 -static/media/locale-icon.b3596424.svg,1762276378612,68618c76952aa4c5f2623bb010514871688960bb3b9edbcda0eab7eb75442054 -static/media/KaTeX_Typewriter-Regular.b8b8393d.woff2,1762276378603,54a0126379ac9b84c5745f17cd0ac9bf11532ea04c39d387d165a71caf77f8d2 -static/media/KaTeX_Size4-Regular.61522cd3.woff2,1762276378603,65378bc44e4f908ff3e7d3b5a36f1351cd29dbed446fcf86ebe0655afefe9ea8 -static/media/practice-icon.bf603115.svg,1762276378613,27b6a729d91914d899f4b3c1f817e26ac58d2ec0be54dc9b93c01f28adcdd00c -static/media/KaTeX_Typewriter-Regular.0e046058.woff,1762276378603,82cff08904dbae816ffe38a914d56622c9b677680bba6a629e584a19ffb6e873 -static/media/KaTeX_Size3-Regular.9108a400.woff2,1762276378603,01dd9815f099722e1f7958ab976d9c0ee81615fa39699daf775fdd8a953ff8b1 -static/media/KaTeX_Size3-Regular.963af864.ttf,1762276378603,f94a1dddcfc1df9beb0ecfaf0a73c3df96009a8d7e8a098ada1aa3a39e9ca678 -static/media/KaTeX_Size4-Regular.3045a61f.woff,1762276378603,c397a0db368b7313fdae7297ab0efb8f25f1bc12afc4ce691dabf8e0918017fa -static/media/KaTeX_Size3-Regular.4de844d4.woff,1762276378602,4398fd91cc5e6b45e4293262c5361ada3a54a24aff0d7a38bc70d3a242f0ef27 -static/media/KaTeX_Size2-Regular.95a1da91.woff2,1762276378597,47c15e4348ddda442adae347550b466a6325266ccf8d7a4793481682b5bdf4f2 -static/media/KaTeX_Size1-Regular.82ef26dc.woff2,1762276378594,353eb899698a648194c4bfabf250818092ebfdee0f3078346c3acb4194797f48 -static/media/KaTeX_Size2-Regular.b0628bfd.woff,1762276378599,e23e150fad1a0531631c97f0170716a09b51211d3ad23c84794647ef603a19de -static/media/KaTeX_Size2-Regular.1fdda0e5.ttf,1762276378599,1685351b16075c0e5c880bbb9c6a3b4c5161ac3c852cc8a67963a37d7311b2b9 -static/media/KaTeX_Size1-Regular.4788ba5b.woff,1762276378596,8e8412c0abbcb89ea321e50ec95b55bfe9d77486c84664fbca5b9b101bab7f3d -static/media/KaTeX_Script-Regular.a82fa2a7.woff,1762276378593,84a67d2df883ac10ca688757491e777b64ef90f94ca712cc23b64a8c97de68af -static/media/KaTeX_Size1-Regular.0d8d9204.ttf,1762276378598,535e05d118e935a5a1ce5be35dc03a4b20a69ccc5f25210206deaed676c16a64 -static/media/KaTeX_SansSerif-Regular.5f8637ee.woff,1762276378591,d0d8050720c1b4cedb8cfe1feb22dc45fc0382ff62b5504c7fc09e1c24652544 -static/media/KaTeX_Script-Regular.1b3161eb.woff2,1762276378591,a5bfd2c095c085b45d10126c94e5cc116a0ea8fd7946a49b54a95da414535890 -static/media/KaTeX_SansSerif-Regular.1ac3ed6e.woff2,1762276378591,2836d2dafad00dd468d7e2b8f305eeb3af4f434980bc7efb3c696e6968cec09b -static/media/KaTeX_SansSerif-Regular.3243452e.ttf,1762276378593,89e5632b7b1d0a3b94bcb71efd36838bb407d575f0212a8d3499b3c3c0fcb12c -static/media/KaTeX_Script-Regular.a189c37d.ttf,1762276378594,ec985a3df1d229119c660bfaa16e4be32ec7391f09d9c1e220cef2b149745a1a -static/media/KaTeX_Size4-Regular.27a23ee6.ttf,1762276378605,df3392005f1d7a6f9bd8cbc0d1e0f06c147944fdd86e3316fd38d4f55f8e4a9f -static/media/KaTeX_SansSerif-Italic.ef725de5.woff,1762276378591,9476b240a74b872f7cbe8517997d68df0c375e3d52a58e165f893a7191f54e86 -static/media/KaTeX_SansSerif-Italic.e934cbc8.woff2,1762276378588,2a474c036e86d3fcabb4f8d68318ccce7e5e103f27f804e1fd74a1646ed15cae -static/media/KaTeX_SansSerif-Bold.ad546b47.woff2,1762276378583,9a2e88c7f50de44ea6842c0dc687cd0fc54cff06a47bf6408cf1eba76e25bb81 -static/media/KaTeX_SansSerif-Italic.f60b4a34.ttf,1762276378590,cf5a68a17d022639016a9da976bb6a4ab05e06ccd74ce712db3009adcf34fd32 -static/media/KaTeX_SansSerif-Bold.0e897d27.woff,1762276378584,06df349cd9f09f229c964190cea7b3487aefe84f055207793ddf3e83a3db281a -static/media/KaTeX_SansSerif-Bold.f2ac7312.ttf,1762276378584,a248317ab48e3dc924f1c87b13a27cc5e6d887272d02b1c1cab72795de2c9591 -static/media/logo.0dd03933.png,1762276378543,b9716ed1f565a052edc1154a207334de81856339e8ca43d5d8f51041f3785085 -static/media/KaTeX_Typewriter-Regular.6bf42875.ttf,1762276378605,3f8e9a7e1c8f9835a5fdbf303b775991de8d868a7b8ee8eb1f32b0b01ed1b90b -static/media/KaTeX_Math-Italic.ed7aea12.woff,1762276378579,7f65f9be10f45caa82382689fe21bf358899ac28002cbd44d3696eea1d6affee -static/media/KaTeX_Math-Italic.fe5ed587.ttf,1762276378582,1cf503e99eee1d6931a59f03a2718c879571c4bc878d8c5bb310c057e15fcffa -static/media/KaTeX_Fraktur-Regular.f9e6a99f.woff2,1762276378564,30c5ebf8d693d9a6db88068bd72eca6aaab2313d91682e147db6ae4d43efc013 -static/media/KaTeX_Fraktur-Regular.e435cda5.woff,1762276378564,1ed825d761d10b653432e13606827af1a1621353e75a2bb10c9fdc3f9568cbf2 -static/media/KaTeX_Fraktur-Regular.97a699d8.ttf,1762276378564,c84e9b333b1c3dfd0edf947b0166c4436bded08309d47955b99fa4e43177bdaf -static/media/KaTeX_Fraktur-Bold.796f3797.woff2,1762276378562,440fe396e2bc189c86a666bed548bed61a5482c3afaa04eb41e5b4e977f9accd -static/media/KaTeX_Fraktur-Bold.40934fc0.woff,1762276378562,8a9c9bd2084df9282df1c63c593dda4c662d2a8111d09956d5bf2c92e6213f4a -static/media/KaTeX_Fraktur-Bold.b9d7c449.ttf,1762276378564,05ef840382f3b9a91d6a08c707c5288ed173a0623b5f986c92d03afd59d2972e -static/media/KaTeX_Caligraphic-Regular.a25140fb.woff,1762276378562,41d8909c711af0e11e9df1fa5bbd8c14071e22130fbac9b6518e920386152038 -static/media/KaTeX_Caligraphic-Regular.e6fb499f.ttf,1762276378553,7d6aca5b5f7d749a0fd1f9e4e7449b1b79a347fd08696f5cadc303ea5e3f3f1c -static/media/KaTeX_Caligraphic-Bold.de2ba279.woff,1762276378543,4e80ee5909ce3b5b965be5b11b75919d58dc6633d372869dbbbbd13f93dbd662 -static/media/KaTeX_Caligraphic-Regular.08d95d99.woff2,1762276378547,d4574df1e20cd3519662aff34dcdfa42339c48bfd9dd675d804723794949a8c8 -static/media/KaTeX_Caligraphic-Bold.a9e9b095.woff2,1762276378551,80906c4f0be4d8dccfbb0d3b8cafe79b6ba8bc3200c3c9f060b5616a4d8dec39 -static/media/KaTeX_Caligraphic-Bold.497bf407.ttf,1762276378543,50b8dd982d91b531aaf3009e30dc42e72635d476bd0e3d6fe9ba2bdb5c7a036f -static/media/getFetch.2b2b7da4.cjs,1762276378543,b2d82abee5b8af22b81d67fc20b3feef1eaaf04585dbc24ec755e3304c469096 -static/media/GrayscalePKLogo.6bb74404.svg,1762276378543,576b38300e49eda6407adce420001e7ad0333cca317eb668aff457c3258dcca2 -static/media/feature-2.36f8d7e2.webp,1762276378543,fc1c038517abf3b731ff3a4675cbaf1a6aa1150ca970762dd0ffc4199b92b75c -static/media/exam-icon.10f48851.svg,1762276378613,b766e9975582af716870a844f8deabd4d80e33a47c400d36cee6bc4840062693 +service-worker.js,1762373005221,e89d758535bc28af10a1a7a13a392c0923ac09549348a2afe7bd607dae1c30d5 +precache-manifest.07407fb0dcc2abd9fbac7665e195a222.js,1762373005221,517c7e806b96b44d6a56289733a0abaccff457063bea65e9f68c7ceb297c25e7 +index.html,1762373005174,bcf2628dbda59347edbc800af1e25010d928a51f0450671afbcd121e0ed19408 +static/media/tru-fals-icon.d0b962d8.svg,1762373005146,a1deab7e5db8e8a94a9c5812dcde5f8cbfbe5da790da8500bf106980b9c79c33 +asset-manifest.json,1762373005222,af38b16faa20b389480ebc6d415830bdb4c0263a0d23f336306b20c235191ec4 +static/media/questions-icon.3d3c1aaf.svg,1762373005142,197f459a359b00c1c44b6ddd71cbc9160f593d1fe08534e3711e9d72a2956ef1 +static/media/sub-ques-icon.366b4f1e.svg,1762373005147,8e397611007ec5db7581a4c1bcca006950390ddf652cae209bb3973a645af425 +static/media/student-engaged.53fb7b0b.svg,1762373005142,5f8e01d1a5efcbdf3aa00ed07de843ab84404a28b672ca91f4d70d89fa8b37cf +static/media/practice.f05e6f00.svg,1762373005137,13b094bcbbb8c50906b1ee0ce68305059e99319464dd4147b4c2194dbb460475 +static/media/translate.610ad011.svg,1762373005147,c06f8a3d0c976b02429ce805d8a4944571ab0128ed2ce49c2d3ca134511ed120 +static/media/PracticeKiaLogo.a8336af5.svg,1762373005104,1a592518bcfabb2f86669d06ae2fb7b2948bbdbfaf5a80d138ab30f4e482a0f8 +static/media/performance.88855f12.svg,1762373005138,03fc1b19005084049382091745d3f1f29a447763091ad4a9bc5d097c338671c9 +static/media/question.0c505ed9.svg,1762373005135,29938066f93476c487414bb7a5dd5227d891c8ab8e115a74a7e7ffccd8d87b36 +static/media/perf-icon.1597a235.svg,1762373005143,7183482b785de425506f49deb27bba02e906132ac7ce5af01f7da8452ef64f28 +static/media/practice-icon.bf603115.svg,1762373005142,27b6a729d91914d899f4b3c1f817e26ac58d2ec0be54dc9b93c01f28adcdd00c +static/media/mul-cho-icon.b3dc9ea9.svg,1762373005146,e8edbceb0eb49f7629cf0b8edf599f9347acbf0c6d1df2fa6145cbed03f37e1f +static/media/OdiSVGlogo.f0834bb1.svg,1762373005103,3ec1cab31a32db378894d796afedaee7c35f8ff99dfb1039b0bb757225a47235 +static/media/mul-res-icon.8ef3b097.svg,1762373005143,1f0a79350cb5546361ef02af1657ad36efeff833fd7bb61db88a20e127a290b4 +static/media/locale-icon.b3596424.svg,1762373005142,68618c76952aa4c5f2623bb010514871688960bb3b9edbcda0eab7eb75442054 +static/media/KaTeX_Typewriter-Regular.b8b8393d.woff2,1762373005134,54a0126379ac9b84c5745f17cd0ac9bf11532ea04c39d387d165a71caf77f8d2 +static/media/KaTeX_Size4-Regular.61522cd3.woff2,1762373005133,65378bc44e4f908ff3e7d3b5a36f1351cd29dbed446fcf86ebe0655afefe9ea8 +static/media/quizexam.5545802e.svg,1762373005136,dfc1278bfcd264264a4d0e0e0247c229335abf0573439c5e9829c8607aacd569 +static/media/KaTeX_Size3-Regular.9108a400.woff2,1762373005134,01dd9815f099722e1f7958ab976d9c0ee81615fa39699daf775fdd8a953ff8b1 +static/media/KaTeX_Typewriter-Regular.0e046058.woff,1762373005135,82cff08904dbae816ffe38a914d56622c9b677680bba6a629e584a19ffb6e873 +static/media/KaTeX_Size3-Regular.4de844d4.woff,1762373005130,4398fd91cc5e6b45e4293262c5361ada3a54a24aff0d7a38bc70d3a242f0ef27 +static/media/KaTeX_Size3-Regular.963af864.ttf,1762373005134,f94a1dddcfc1df9beb0ecfaf0a73c3df96009a8d7e8a098ada1aa3a39e9ca678 +static/media/KaTeX_Size4-Regular.27a23ee6.ttf,1762373005135,df3392005f1d7a6f9bd8cbc0d1e0f06c147944fdd86e3316fd38d4f55f8e4a9f +static/media/KaTeX_Size2-Regular.b0628bfd.woff,1762373005129,e23e150fad1a0531631c97f0170716a09b51211d3ad23c84794647ef603a19de +static/media/KaTeX_Size2-Regular.95a1da91.woff2,1762373005127,47c15e4348ddda442adae347550b466a6325266ccf8d7a4793481682b5bdf4f2 +static/media/KaTeX_Size1-Regular.82ef26dc.woff2,1762373005127,353eb899698a648194c4bfabf250818092ebfdee0f3078346c3acb4194797f48 +static/media/KaTeX_Size1-Regular.4788ba5b.woff,1762373005127,8e8412c0abbcb89ea321e50ec95b55bfe9d77486c84664fbca5b9b101bab7f3d +static/media/KaTeX_Script-Regular.a82fa2a7.woff,1762373005128,84a67d2df883ac10ca688757491e777b64ef90f94ca712cc23b64a8c97de68af +static/media/KaTeX_SansSerif-Regular.5f8637ee.woff,1762373005127,d0d8050720c1b4cedb8cfe1feb22dc45fc0382ff62b5504c7fc09e1c24652544 +static/media/KaTeX_Size1-Regular.0d8d9204.ttf,1762373005127,535e05d118e935a5a1ce5be35dc03a4b20a69ccc5f25210206deaed676c16a64 +static/media/KaTeX_Script-Regular.a189c37d.ttf,1762373005127,ec985a3df1d229119c660bfaa16e4be32ec7391f09d9c1e220cef2b149745a1a +static/media/KaTeX_Script-Regular.1b3161eb.woff2,1762373005127,a5bfd2c095c085b45d10126c94e5cc116a0ea8fd7946a49b54a95da414535890 +static/media/KaTeX_SansSerif-Regular.3243452e.ttf,1762373005127,89e5632b7b1d0a3b94bcb71efd36838bb407d575f0212a8d3499b3c3c0fcb12c +static/media/KaTeX_SansSerif-Italic.e934cbc8.woff2,1762373005123,2a474c036e86d3fcabb4f8d68318ccce7e5e103f27f804e1fd74a1646ed15cae +static/media/KaTeX_SansSerif-Italic.ef725de5.woff,1762373005127,9476b240a74b872f7cbe8517997d68df0c375e3d52a58e165f893a7191f54e86 +static/media/KaTeX_SansSerif-Italic.f60b4a34.ttf,1762373005127,cf5a68a17d022639016a9da976bb6a4ab05e06ccd74ce712db3009adcf34fd32 +static/media/KaTeX_SansSerif-Bold.ad546b47.woff2,1762373005120,9a2e88c7f50de44ea6842c0dc687cd0fc54cff06a47bf6408cf1eba76e25bb81 +static/media/KaTeX_SansSerif-Bold.0e897d27.woff,1762373005121,06df349cd9f09f229c964190cea7b3487aefe84f055207793ddf3e83a3db281a +static/media/KaTeX_SansSerif-Bold.f2ac7312.ttf,1762373005120,a248317ab48e3dc924f1c87b13a27cc5e6d887272d02b1c1cab72795de2c9591 +static/media/KaTeX_SansSerif-Regular.1ac3ed6e.woff2,1762373005126,2836d2dafad00dd468d7e2b8f305eeb3af4f434980bc7efb3c696e6968cec09b +static/media/KaTeX_Size4-Regular.3045a61f.woff,1762373005135,c397a0db368b7313fdae7297ab0efb8f25f1bc12afc4ce691dabf8e0918017fa +static/media/KaTeX_Size2-Regular.1fdda0e5.ttf,1762373005134,1685351b16075c0e5c880bbb9c6a3b4c5161ac3c852cc8a67963a37d7311b2b9 +static/media/logo.0dd03933.png,1762373005103,b9716ed1f565a052edc1154a207334de81856339e8ca43d5d8f51041f3785085 +static/media/KaTeX_Typewriter-Regular.6bf42875.ttf,1762373005134,3f8e9a7e1c8f9835a5fdbf303b775991de8d868a7b8ee8eb1f32b0b01ed1b90b +static/media/KaTeX_Math-Italic.ed7aea12.woff,1762373005120,7f65f9be10f45caa82382689fe21bf358899ac28002cbd44d3696eea1d6affee +static/media/KaTeX_Math-Italic.fe5ed587.ttf,1762373005121,1cf503e99eee1d6931a59f03a2718c879571c4bc878d8c5bb310c057e15fcffa +static/media/KaTeX_Fraktur-Regular.f9e6a99f.woff2,1762373005111,30c5ebf8d693d9a6db88068bd72eca6aaab2313d91682e147db6ae4d43efc013 +static/media/KaTeX_Fraktur-Regular.e435cda5.woff,1762373005112,1ed825d761d10b653432e13606827af1a1621353e75a2bb10c9fdc3f9568cbf2 +static/media/KaTeX_Fraktur-Bold.796f3797.woff2,1762373005111,440fe396e2bc189c86a666bed548bed61a5482c3afaa04eb41e5b4e977f9accd +static/media/KaTeX_Fraktur-Bold.b9d7c449.ttf,1762373005111,05ef840382f3b9a91d6a08c707c5288ed173a0623b5f986c92d03afd59d2972e +static/media/KaTeX_Fraktur-Regular.97a699d8.ttf,1762373005111,c84e9b333b1c3dfd0edf947b0166c4436bded08309d47955b99fa4e43177bdaf +static/media/KaTeX_Caligraphic-Regular.a25140fb.woff,1762373005104,41d8909c711af0e11e9df1fa5bbd8c14071e22130fbac9b6518e920386152038 +static/media/KaTeX_Caligraphic-Regular.e6fb499f.ttf,1762373005111,7d6aca5b5f7d749a0fd1f9e4e7449b1b79a347fd08696f5cadc303ea5e3f3f1c +static/media/KaTeX_Caligraphic-Bold.de2ba279.woff,1762373005111,4e80ee5909ce3b5b965be5b11b75919d58dc6633d372869dbbbbd13f93dbd662 +static/media/KaTeX_Fraktur-Bold.40934fc0.woff,1762373005104,8a9c9bd2084df9282df1c63c593dda4c662d2a8111d09956d5bf2c92e6213f4a +static/media/KaTeX_Caligraphic-Bold.a9e9b095.woff2,1762373005104,80906c4f0be4d8dccfbb0d3b8cafe79b6ba8bc3200c3c9f060b5616a4d8dec39 +static/media/KaTeX_Caligraphic-Regular.08d95d99.woff2,1762373005104,d4574df1e20cd3519662aff34dcdfa42339c48bfd9dd675d804723794949a8c8 +static/media/GrayscalePKLogo.6bb74404.svg,1762373005103,576b38300e49eda6407adce420001e7ad0333cca317eb668aff457c3258dcca2 +static/media/getFetch.2b2b7da4.cjs,1762373005103,b2d82abee5b8af22b81d67fc20b3feef1eaaf04585dbc24ec755e3304c469096 +static/media/KaTeX_Caligraphic-Bold.497bf407.ttf,1762373005108,50b8dd982d91b531aaf3009e30dc42e72635d476bd0e3d6fe9ba2bdb5c7a036f +static/media/feature-2.36f8d7e2.webp,1762373005104,fc1c038517abf3b731ff3a4675cbaf1a6aa1150ca970762dd0ffc4199b92b75c +static/media/exam-icon.10f48851.svg,1762373005142,b766e9975582af716870a844f8deabd4d80e33a47c400d36cee6bc4840062693 assets/images/locale-icon.svg,1761396900579,610498c7ca3b5800d268b1654473f0b1d79de2c6493a7c6982bef90456d35179 assets/images/icons/icon-96x96.png,1761396900602,43a8ac4df8945d7a44e3e4911032214f01eaea92267baa31a93e77942b424c73 assets/images/icons/icon-72x72.png,1761396900600,a42f1df8ab0a8fe921573976d49158e1a2c52fe430460c869947f221aba30a94 @@ -76,52 +76,52 @@ assets/images/icons/icon-192x192.png,1761396900592,ac9fe46fbeb4c54fb3c838b645380 assets/images/icons/icon-152x152.png,1761396900590,95a5a117fbd5640f1f1f13c9923398545e3f5b66734ff6c8ce67c942319a8b67 assets/images/icons/icon-144x144.png,1761396900588,e42168e0e1abb5bd7811ebe1b5a2183d0ce287bf266c2efd8d97a23d23ca8d00 assets/images/icons/icon-128x128.png,1761396900585,45b577c86e7c03fef868bfa3f96810c5b36f31156c32c0d85620d2e6fe1fc85b -static/media/delete-icon.da38c0f4.svg,1762276378626,8078772ee88a0588989eec477da1ca949430f3f06efaa9c2db860b74c65f6722 -static/media/dashboard.8ec7624b.svg,1762276378606,5a5b5d4bf416d414842bd5eac30432b592342a392450e52943f067db4077bec1 -static/media/classes.3b73dba0.svg,1762276378609,2abfbb7015d5bccb8640fd0614d3782c048672c9543fe17d127db63287ac141d -static/media/class-icon.6afd34b5.svg,1762276378612,a2f492c6c9c7b5201773062dfe90c238c12bc00bec097dc06141201f02b9588e -static/media/Checkmark.1356376c.svg,1762276378631,aa56f27c8198bcae3236a881a7134cd3b7d3dbb048ec75654e8ce2d4710ce027 -static/media/batch.3fcff66e.svg,1762276378608,f29038480286f091e3805a43f90ca5a70a13bbcef3076831e0b29b1fcb61d862 -static/media/batch-icon.bf664771.svg,1762276378613,7519e2a92f436a2f46ef7420d721e24df2837d7fce7fe8c30f4bc12980b3d1a0 -static/media/auth-BG.2835584f.svg,1762276378542,238d3a2ff1aead1c4aaed0e07d23d2c1164f8be0ef2d5fced5c5ade370f3c5bf -static/media/KaTeX_Math-BoldItalic.48155e43.woff,1762276378579,85cd1b757a1e147fa60d9a33c097ac463cd361d7d29278acb6f9fa12b1ab1807 -static/media/KaTeX_Math-BoldItalic.1320454d.woff2,1762276378579,6845d5004e7c212c58d4760856f246a648906e552b0fe06cc1602598c12451c2 -static/media/KaTeX_Math-Italic.d8b7a801.woff2,1762276378584,463c7b305e898eff5291b63c93cc5cb344035692b6913c1c79073ecbb6243bd4 -static/media/add-circle.0011f2bc.svg,1762276378612,d9e5d90e8de1ce16df5720b43ca79543036fcf1a6cd6439a9b15c5a97d269f17 -static/media/KaTeX_Main-Regular.f8a7f19f.woff2,1762276378579,d9e0bfb38531e96891681155d118070f8026358d2951cb8470c394b91809288d -static/media/KaTeX_Math-BoldItalic.6589c4f1.ttf,1762276378582,7015e678d3236d50b3fefa9ba69b1473ed3f8e75adee5cace69614afcfc2f5bf -static/media/KaTeX_Main-Regular.f1cdb692.woff,1762276378579,17452652a1119d3bcd8a71406fc8698a686f53c3923cb96e790e6a5d36d08ab1 -static/media/KaTeX_Main-Italic.65297062.woff2,1762276378571,d85767f0359678f357e48c84e9872f47b139674a79b7b71db0fdbb1317c26d12 -static/media/KaTeX_Main-Italic.8ffd28f6.woff,1762276378579,96448f48ed2241c86e68c8461f1640b4420784ddafae0187411614145e1b86b7 -static/media/KaTeX_Main-BoldItalic.5f875f98.woff,1762276378569,70abceb4229394d854d0f09cb4c174bb3044efcb0c914765da73cef487dff695 -static/media/KaTeX_Main-Italic.39349e0a.ttf,1762276378579,1d8cb78615c1bf0e6382d19209ab3b545f62297a75006719c9fe6a82f4b3b282 -static/media/KaTeX_Main-BoldItalic.d8737343.woff2,1762276378565,c626855b7d035c168c7d791991df8d939103de514bfb4451d79d386573284c72 -static/media/KaTeX_Main-Bold.a9382e25.woff2,1762276378566,5a85aa329e280b7ebe07d42616135b81a43b3e7699beb03e4f85cb85cc1c42a0 -static/media/KaTeX_Main-Regular.818582da.ttf,1762276378579,303bad6cffa808e8161bca30051b6116e39cd128fad1565f4cfe87d57e54f715 -static/media/KaTeX_Main-Bold.4cdba646.woff,1762276378564,0a80f97f42c420ce18f49adadd979581ee6c7b2fea155197d564eab7d4a33b94 -static/media/KaTeX_Main-BoldItalic.52fb39b0.ttf,1762276378570,2c270214096b727d963e376c50c9372e0696e3807ab3593c99721e98a2350d9a -static/js/runtime-main.8e38f746.js.map,1762276378710,98b6824dc3f1c6a12430e946a64b8092ff5d05fb96b55ca6d5c4fea01d94a485 -static/js/runtime-main.8e38f746.js,1762276378631,7abbb5f70c00c663738f8bd45449c09010174c2b33ab79da6c8f810ff5b5fe93 -static/media/KaTeX_AMS-Regular.66c67820.woff2,1762276378543,d3c3fdcc36a8dd47d2361854708db75facde86716ac4aff340c27a53edb91fa3 -static/media/KaTeX_Main-Bold.8e431f7e.ttf,1762276378565,05a2a07c87d1436ec1339788f266910afda2ef11c2c159b5f9da217e5862678b -static/media/feature-1.ea5c34ea.svg,1762276378543,d802659785b69508e521d5543fca40a58cb9076521ffc3e6b006f4786b8079f8 -static/media/KaTeX_AMS-Regular.10824af7.woff,1762276378543,6c46aa92e4310f9c70a445e7a423691f1704dce1cdc29fdd2e0c83d195fcee10 -static/media/KaTeX_AMS-Regular.56573229.ttf,1762276378564,c2f8c0a308e057708caa69b82f187cbff35ecda40162ceed7cf66bb958032bba -static/js/4.b1a8909a.chunk.js.map,1762276378711,cc29c410ad87d4a687401e2252b312788aefed8b7f53e786346b2dd60dfb3de3 -static/js/4.b1a8909a.chunk.js,1762276378647,1b67d9265ad5a6c8ae015e37061ef359ea779782933587de7f991636980039dc -static/js/3.9b1c3a2b.chunk.js,1762276378632,394137fe0adad4357a1abd73710491aa4720ee89c553605e9e076e0f70a24dd8 -static/js/3.9b1c3a2b.chunk.js.map,1762276378710,5044d0e0862c1cb2f043f63c402ded99e321dc799e6aabd0703bbe596047df77 -static/media/feature-3.3d5d81e9.svg,1762276378543,ba23393d89776cb78f7a559903baff48be76665abd99bdd4e5ea103c5e5ed88b -static/js/2.38f4eabb.chunk.js.LICENSE.txt,1762276378647,9c84bc4d2f8584d32d75e01e0317e22af1e39f5ac5ded3e2e4e34984704c172b -static/js/main.70ac1fc7.chunk.js,1762276378627,185d9c49a9c9b7fc7938fdab28ecc098262372bd7378f6234739230e9429e40e -static/css/4.629184c9.chunk.css,1762276378636,dfeba86da1256521df7a877a265d56d314f65016837f30878338c2b7fc62a6ab -static/css/2.9f1a6119.chunk.css,1762276378632,5b08fdb85c1aaa0cf9acf7c4c35148cabc67c4897f21b89b8734390f584ad0a2 -static/css/main.c29fa4f6.chunk.css,1762276378620,9349f33dbede136110272f647bd8fdbe32f644d678e66dbed97764bd296fe4b4 -static/css/3.6c5a3051.chunk.css,1762276378632,1ae150a22b1d42322775be9055605f93c75188e7081cfbdb206a59fc2f5ab8f1 -static/css/3.6c5a3051.chunk.css.map,1762276378651,bcc301c3b3b46c96afc0fc028a6aa3cd299ccda538d7c6cb9ebc87f8de535796 -static/css/4.629184c9.chunk.css.map,1762276378701,b82aa57e6e357dbb20067334e544e9b30d20ed0d928c13e6c61e1747e6f5a205 -static/js/main.70ac1fc7.chunk.js.map,1762276378710,d1da826aea287b0acc90913cfff59e35bd9bd1f98d4955211699997c9a8a289e -static/css/2.9f1a6119.chunk.css.map,1762276378651,65fe44874775e5d32c6076f91b40fc5d120cecbf5da0d211d9303dbb56b2e6ec -static/css/main.c29fa4f6.chunk.css.map,1762276378647,ead4c6714e4852cf46801e2ff6405efc9a3bfab11d67d89722b7474e24a50c01 -static/js/2.38f4eabb.chunk.js,1762276378634,a78e5e705e6d7630a1c134aa340d6bae0200ed08fed57c4bf99fa408e8b0c832 -static/js/2.38f4eabb.chunk.js.map,1762276378726,62cc59fa588e6c4bedcdb1dd82aa7c0a7acee88175e17ad51712ac0e9b6698ce +static/media/delete-icon.da38c0f4.svg,1762373005147,8078772ee88a0588989eec477da1ca949430f3f06efaa9c2db860b74c65f6722 +static/media/dashboard.8ec7624b.svg,1762373005135,5a5b5d4bf416d414842bd5eac30432b592342a392450e52943f067db4077bec1 +static/media/classes.3b73dba0.svg,1762373005137,2abfbb7015d5bccb8640fd0614d3782c048672c9543fe17d127db63287ac141d +static/media/class-icon.6afd34b5.svg,1762373005142,a2f492c6c9c7b5201773062dfe90c238c12bc00bec097dc06141201f02b9588e +static/media/Checkmark.1356376c.svg,1762373005154,aa56f27c8198bcae3236a881a7134cd3b7d3dbb048ec75654e8ce2d4710ce027 +static/media/batch.3fcff66e.svg,1762373005137,f29038480286f091e3805a43f90ca5a70a13bbcef3076831e0b29b1fcb61d862 +static/media/batch-icon.bf664771.svg,1762373005142,7519e2a92f436a2f46ef7420d721e24df2837d7fce7fe8c30f4bc12980b3d1a0 +static/media/KaTeX_Math-Italic.d8b7a801.woff2,1762373005120,463c7b305e898eff5291b63c93cc5cb344035692b6913c1c79073ecbb6243bd4 +static/media/auth-BG.2835584f.svg,1762373005095,238d3a2ff1aead1c4aaed0e07d23d2c1164f8be0ef2d5fced5c5ade370f3c5bf +static/media/KaTeX_Math-BoldItalic.1320454d.woff2,1762373005121,6845d5004e7c212c58d4760856f246a648906e552b0fe06cc1602598c12451c2 +static/media/KaTeX_Math-BoldItalic.48155e43.woff,1762373005120,85cd1b757a1e147fa60d9a33c097ac463cd361d7d29278acb6f9fa12b1ab1807 +static/media/add-circle.0011f2bc.svg,1762373005142,d9e5d90e8de1ce16df5720b43ca79543036fcf1a6cd6439a9b15c5a97d269f17 +static/media/KaTeX_Math-BoldItalic.6589c4f1.ttf,1762373005120,7015e678d3236d50b3fefa9ba69b1473ed3f8e75adee5cace69614afcfc2f5bf +static/media/KaTeX_Main-Regular.f8a7f19f.woff2,1762373005120,d9e0bfb38531e96891681155d118070f8026358d2951cb8470c394b91809288d +static/media/KaTeX_Main-Italic.65297062.woff2,1762373005127,d85767f0359678f357e48c84e9872f47b139674a79b7b71db0fdbb1317c26d12 +static/media/KaTeX_Main-Italic.8ffd28f6.woff,1762373005116,96448f48ed2241c86e68c8461f1640b4420784ddafae0187411614145e1b86b7 +static/media/KaTeX_Main-BoldItalic.d8737343.woff2,1762373005112,c626855b7d035c168c7d791991df8d939103de514bfb4451d79d386573284c72 +static/media/KaTeX_Main-Regular.f1cdb692.woff,1762373005120,17452652a1119d3bcd8a71406fc8698a686f53c3923cb96e790e6a5d36d08ab1 +static/media/KaTeX_Main-BoldItalic.5f875f98.woff,1762373005115,70abceb4229394d854d0f09cb4c174bb3044efcb0c914765da73cef487dff695 +static/media/KaTeX_Main-Italic.39349e0a.ttf,1762373005119,1d8cb78615c1bf0e6382d19209ab3b545f62297a75006719c9fe6a82f4b3b282 +static/media/KaTeX_Main-BoldItalic.52fb39b0.ttf,1762373005113,2c270214096b727d963e376c50c9372e0696e3807ab3593c99721e98a2350d9a +static/media/KaTeX_Main-Bold.a9382e25.woff2,1762373005111,5a85aa329e280b7ebe07d42616135b81a43b3e7699beb03e4f85cb85cc1c42a0 +static/js/runtime-main.8e38f746.js.map,1762373005222,98b6824dc3f1c6a12430e946a64b8092ff5d05fb96b55ca6d5c4fea01d94a485 +static/media/KaTeX_Main-Regular.818582da.ttf,1762373005120,303bad6cffa808e8161bca30051b6116e39cd128fad1565f4cfe87d57e54f715 +static/media/KaTeX_Main-Bold.4cdba646.woff,1762373005111,0a80f97f42c420ce18f49adadd979581ee6c7b2fea155197d564eab7d4a33b94 +static/media/KaTeX_Main-Bold.8e431f7e.ttf,1762373005112,05a2a07c87d1436ec1339788f266910afda2ef11c2c159b5f9da217e5862678b +static/js/runtime-main.8e38f746.js,1762373005155,7abbb5f70c00c663738f8bd45449c09010174c2b33ab79da6c8f810ff5b5fe93 +static/media/KaTeX_AMS-Regular.66c67820.woff2,1762373005104,d3c3fdcc36a8dd47d2361854708db75facde86716ac4aff340c27a53edb91fa3 +static/media/feature-1.ea5c34ea.svg,1762373005103,d802659785b69508e521d5543fca40a58cb9076521ffc3e6b006f4786b8079f8 +static/media/KaTeX_AMS-Regular.10824af7.woff,1762373005111,6c46aa92e4310f9c70a445e7a423691f1704dce1cdc29fdd2e0c83d195fcee10 +static/media/KaTeX_AMS-Regular.56573229.ttf,1762373005104,c2f8c0a308e057708caa69b82f187cbff35ecda40162ceed7cf66bb958032bba +static/media/feature-3.3d5d81e9.svg,1762373005104,ba23393d89776cb78f7a559903baff48be76665abd99bdd4e5ea103c5e5ed88b +static/js/4.b1a8909a.chunk.js.map,1762373005223,cc29c410ad87d4a687401e2252b312788aefed8b7f53e786346b2dd60dfb3de3 +static/js/3.9b1c3a2b.chunk.js.map,1762373005223,5044d0e0862c1cb2f043f63c402ded99e321dc799e6aabd0703bbe596047df77 +static/js/3.9b1c3a2b.chunk.js,1762373005156,394137fe0adad4357a1abd73710491aa4720ee89c553605e9e076e0f70a24dd8 +static/js/4.b1a8909a.chunk.js,1762373005156,1b67d9265ad5a6c8ae015e37061ef359ea779782933587de7f991636980039dc +static/js/2.d7f87784.chunk.js.LICENSE.txt,1762373005169,9c84bc4d2f8584d32d75e01e0317e22af1e39f5ac5ded3e2e4e34984704c172b +static/js/main.be37a9ce.chunk.js,1762373005155,5075f2a479664257e68b2714db5142f1e0ba92399d7e748dc90a40bb549a0ba6 +static/css/4.629184c9.chunk.css,1762373005156,dfeba86da1256521df7a877a265d56d314f65016837f30878338c2b7fc62a6ab +static/css/main.c29fa4f6.chunk.css,1762373005147,9349f33dbede136110272f647bd8fdbe32f644d678e66dbed97764bd296fe4b4 +static/css/3.6c5a3051.chunk.css,1762373005156,1ae150a22b1d42322775be9055605f93c75188e7081cfbdb206a59fc2f5ab8f1 +static/css/2.9f1a6119.chunk.css,1762373005155,5b08fdb85c1aaa0cf9acf7c4c35148cabc67c4897f21b89b8734390f584ad0a2 +static/css/4.629184c9.chunk.css.map,1762373005175,b82aa57e6e357dbb20067334e544e9b30d20ed0d928c13e6c61e1747e6f5a205 +static/css/3.6c5a3051.chunk.css.map,1762373005174,bcc301c3b3b46c96afc0fc028a6aa3cd299ccda538d7c6cb9ebc87f8de535796 +static/js/main.be37a9ce.chunk.js.map,1762373005222,a286e93e9215d39651d2917cf092ed80221d819d5d923724221878e003dc655b +static/css/2.9f1a6119.chunk.css.map,1762373005174,65fe44874775e5d32c6076f91b40fc5d120cecbf5da0d211d9303dbb56b2e6ec +static/css/main.c29fa4f6.chunk.css.map,1762373005174,ead4c6714e4852cf46801e2ff6405efc9a3bfab11d67d89722b7474e24a50c01 +static/js/2.d7f87784.chunk.js,1762373005158,00bdc2357556fcbc8eff302d487955d66883b1b09609249a775c3441e8f1f21d +static/js/2.d7f87784.chunk.js.map,1762373005237,abc8de9d7d1d5e6f2e23a0b9a7c301cc30e6d9df8d3821304eb6fdc71e3000c5 diff --git a/src/App.js b/src/App.js index 0b55f34..95e30ad 100644 --- a/src/App.js +++ b/src/App.js @@ -53,24 +53,25 @@ import AttemptRevision from './component/Student/Exams/AttemptPractice/AttemptRe import AttemptPractice from './component/Student/Exams/AttemptPractice/AttemptPractice'; import Authenticate from './component/Login/Authenticate'; import Instructions from './component/Student/Exams/LiveExams/Instructions'; +import Profile from './component/Profile'; const config = { - loader: { load: ["[tex]/html"] }, - startup: { - typeset: false - }, - tex: { - packages: { "[+]": ["html"] }, - inlineMath: [ - ["$", "$"], - ["\\(", "\\)"] - ], - displayMath: [ - ["$$", "$$"], - ["\\[", "\\]"] - ] - } + loader: { load: ["[tex]/html"] }, + startup: { + typeset: false + }, + tex: { + packages: { "[+]": ["html"] }, + inlineMath: [ + ["$", "$"], + ["\\(", "\\)"] + ], + displayMath: [ + ["$$", "$$"], + ["\\[", "\\]"] + ] + } }; class App extends React.Component { @@ -78,7 +79,7 @@ class App extends React.Component { super(props); this.state = { - mj: {current: null}, + mj: { current: null }, currentUser: null }; } @@ -97,7 +98,7 @@ class App extends React.Component { { - this.setState(prev => ({...prev, mj: {current: mathJax}})); + this.setState(prev => ({ ...prev, mj: { current: mathJax } })); console.log("getting maths.."); }} config={config} @@ -118,6 +119,8 @@ class App extends React.Component { + + {/* Always have non-exact path at the very end to eliminate conflicts with other 'exact' routes */} {/* */} {/* */} @@ -139,7 +142,7 @@ class App extends React.Component { {/* do not uncomment this */} {/* do not uncomment this */} {/* do not uncomment this */} - + diff --git a/src/component/Profile.css b/src/component/Profile.css index 62e8e0b..d60c854 100644 --- a/src/component/Profile.css +++ b/src/component/Profile.css @@ -1,5 +1,32 @@ -.profile-page .user-info { - margin-block: 2rem; - display: grid; - grid: auto-flow/250px 1fr; -} \ No newline at end of file +.profile-page { + min-height: 100vh; +} + +.ant-card { + background-color: #fff; + transition: box-shadow 0.2s ease; +} + +.ant-card:hover { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.06); +} + +.avatar-container { + display: flex; + align-items: center; + gap: 1rem; +} + +.user-info { + margin-top: 2rem; + display: grid; + grid-template-columns: 1fr; + gap: 1rem; +} + +.button-container { + margin-top: 2rem; + display: flex; + gap: 1rem; + justify-content: flex-start; +} diff --git a/src/component/Profile.jsx b/src/component/Profile.jsx index ac75b21..7b11394 100644 --- a/src/component/Profile.jsx +++ b/src/component/Profile.jsx @@ -1,49 +1,499 @@ -import React, { useEffect, useState } from 'react'; -import './Profile.css'; -import { Avatar, Button, Layout, Space, Typography } from 'antd'; -import { UploadOutlined, UserOutlined } from '@ant-design/icons'; -import { authenticationService } from '../_services'; +import React, { useEffect, useState } from "react"; +import { + Avatar, + Button, + Card, + Layout, + Row, + Col, + Typography, + Space, + Tag, + Modal, + Form, + Input, + Select, + message, + Upload, +} from "antd"; +import { + UploadOutlined, + UserOutlined, + LockOutlined, + StopOutlined, + EditOutlined, + KeyOutlined, +} from "@ant-design/icons"; +import { authenticationService } from "../_services"; +import "./Profile.css"; +import axios from "axios"; + +const { Title, Text } = Typography; +const { Option } = Select; const Profile = () => { + const [isModalOpen, setIsModalOpen] = useState(false); + const [form] = Form.useForm(); const [loading, setLoading] = useState(false); - - let user = authenticationService.currentUserValue; + const [resetLoading, setResetLoading] = useState(false); + const [uploading, setUploading] = useState(false); + const [imageUrl, setImageUrl] = useState(null); + const [user, setUser] = useState({}); + + const [fetching, setFetching] = useState(true); + + /** 🧩 Prefill modal with user data */ + const handleEdit = () => { + form.setFieldsValue({ + first_name: user.first_name || "", + last_name: user.last_name || "", + mobile_num: user.mobile_num || "", + gender: user.gender || "", + state: user.state || "", + city: user.city || "", + }); + setIsModalOpen(true); + }; + + /** 🧩 Fetch user details from API */ + const fetchUserDetails = async () => { + try { + setFetching(true); + const response = await axios.get( + "https://api.practicekea.com/api-student/v1/Users/MyDetails", + { + headers: { + Authorization: `Bearer ${authenticationService.currentUserValue.jwtToken}`, + }, + } + ); + + if (response.status === 200 && response.data?.result) { + const r = response.data.result; + + // Map backend fields → frontend fields + const formattedUser = { + first_name: r.firstName || "", + last_name: r.lastName || "", + gender: r.gender || "", + state: r.state || "", + city: r.city || "", + email_id: authenticationService.currentUserValue.email_id || "", + mobile_num: r.mobileNumber || "", + role_name: authenticationService.currentUserValue.role_name || "", + institute_name: authenticationService.currentUserValue.institute_name || "", + profile_pic: r.profilePic || "", + }; + + setUser(formattedUser); + } else { + message.warning("No user data found."); + } + } catch (error) { + console.error("Error fetching user:", error); + message.error("Failed to load profile data."); + } finally { + setFetching(false); + } + }; + + /** 🔄 Fetch on mount */ + useEffect(() => { + fetchUserDetails(); + }, []); + + /** 📸 Upload profile picture to PracticeKea API (matches Android logic) */ + const handleUpload = async ({ file }) => { + const formData = new FormData(); + + // 🧩 Match Android's part names + formData.append("file", file); // same as MultipartBody.Part.createFormData("file", ...) + formData.append("someData", "Profile Image"); // same as .toRequestBody("text/plain") + + try { + setUploading(true); + + const response = await axios.post( + "https://api.practicekea.com/api/AWSS3File/uploadMyPic", + formData, + { + headers: { + Authorization: `Bearer ${authenticationService.currentUserValue.jwtToken}`, + "Content-Type": "multipart/form-data", + }, + } + ); + + // 🧠 Log structure to confirm what backend returns + console.log("Upload response:", response.data); + + // ✅ Example: { data: { url: "https://api-bucket.practicekea.com/uploads/xyz.jpg" } } + const uploadedUrl = response.data?.data?.url || response.data?.url; + + if (!uploadedUrl) throw new Error("No image URL returned from server"); + + // Update avatar immediately + setImageUrl(uploadedUrl); + message.success("Profile picture uploaded successfully!"); + + // ✅ Optionally update user's saved image in profile + await axios.put( + "https://api.practicekea.com/api-student/v1/Users/UpdateMyDetails", + { profile_pic: uploadedUrl }, + { + headers: { + Authorization: `Bearer ${authenticationService.currentUserValue.jwtToken}`, + "Content-Type": "application/json", + }, + } + ); + + // Update local user data + authenticationService.updateCurrentUser({ + ...user, + profile_pic: uploadedUrl, + }); + } catch (error) { + console.error("Upload error:", error); + message.error("Failed to upload image. Please try again."); + } finally { + setUploading(false); + } + }; + + + /** 💾 Save edited profile info to API */ + const handleSave = async () => { + try { + const values = await form.validateFields(); + setLoading(true); + + // ✅ Example backend API endpoint for updating user data + const response = await axios.put( + `https://api.practicekea.com/api-student/v1/Users/UpdateMyDetails`, // adjust endpoint as per your backend + values, + { + headers: { + Authorization: `Bearer ${authenticationService.currentUserValue.jwtToken}`, // if using JWT + "Content-Type": "application/json", + }, + } + ); + + if (response.status === 200) { + message.success("Profile updated successfully!"); + setIsModalOpen(false); + + // ✅ Optionally update user info in your authentication service + const updatedUser = { ...user, ...values }; + authenticationService.updateCurrentUser(updatedUser); + } else { + throw new Error("Unexpected response from server."); + } + } catch (error) { + console.error(error); + const errorMsg = + error.response?.data?.message || + "Failed to save profile changes."; + message.error(errorMsg); + } finally { + setLoading(false); + } + }; + + /** 🔐 Reset password using Firebase Identity Toolkit */ + const handleResetPassword = async () => { + if (!user?.email_id) { + message.warning("No email associated with this account."); + return; + } + + try { + setResetLoading(true); + const response = await fetch( + `https://identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key=${process.env.REACT_APP_FIREBASE_API_KEY}`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + requestType: "PASSWORD_RESET", + email: user.email_id, + }), + } + ); + + const data = await response.json(); + if (data.error) { + throw new Error(data.error.message); + } + + message.success( + `Password reset email sent to ${user.email_id}. Please check your inbox.` + ); + } catch (error) { + console.error(error); + let msg = "Failed to send reset email."; + if (error.message === "EMAIL_NOT_FOUND") msg = "User not found."; + if (error.message === "INVALID_EMAIL") msg = "Invalid email address."; + message.error(msg); + } finally { + setResetLoading(false); + } + }; return ( - - -
- Manage your personal and account details here -
+ + + + {/* --- Header --- */} + + + + } + style={{ backgroundColor: "#1677ff" }} + /> + + + + {user.first_name || user.last_name ? ( + <> + {user.first_name} {user.last_name} + </> + ) : ( + <Text type="warning">No name entered</Text> + )} + + {user.email_id} +
+ {user.role_name || "No role assigned"} + {user.institute_name && ( + {user.institute_name} + )} +
+ + + + + + +
+
- Account Details + {/* --- Account Info --- */} + + Account Information + + + } + style={{ + borderRadius: 16, + boxShadow: "0 2px 12px rgba(0,0,0,0.05)", + }} + > + + {[ + { label: "Full Name", value: `${user.first_name || ""} ${user.last_name || ""}`.trim() || null }, + { label: "Email ID", value: user.email_id }, + { label: "Phone Number", value: user.mobile_num }, + { label: "Gender", value: user.gender }, + { label: "City", value: user.city }, + { label: "State", value: user.state }, + { label: "Affiliated Institute", value: user.institute_name }, + { label: "Role", value: user.role_name }, + ].map((item, index) => ( +
+ + {item.label} + + + {item.value ? ( + item.value + ) : ( + + No {item.label.toLowerCase()} entered + + )} + +
+ ))} +
+
- - } /> - - + {/* --- Action Buttons --- */} +
+ -
- Full Name - {user.first_name || user.last_name? <>{user.first_name} {user.last_name} : No name entered} - Email ID - {user.email_id} - Phone Number - {user.mobile_num? user.mobile_num : No number entered} - Affiliated Institute - {user.institute_name? user.institute_name : No institute associated} - Role - {user.role_name? user.role_name : No role assigned} -
+ +
+ +
-
- - -
+ {/* --- Edit Modal --- */} + setIsModalOpen(false)} + onOk={handleSave} + okText="Save Changes" + confirmLoading={loading} + centered + style={{ + borderRadius: 16, // ✅ outer border radius + overflow: "hidden", + }} + bodyStyle={{ + borderRadius: 16, // ✅ inner rounding for modal body + background: "#fff", + padding: "24px", + }} + modalRender={(node) => ( +
+ {node} +
+ )} + > +
+ + + - + + + + + + + + + + + + + + + + + + + +
+
); -} +}; -export default Profile; \ No newline at end of file +export default Profile; diff --git a/src/component/Student/Exams/AttemptExam/AttemptExam.js b/src/component/Student/Exams/AttemptExam/AttemptExam.js index 8ae30ea..4bf53fa 100644 --- a/src/component/Student/Exams/AttemptExam/AttemptExam.js +++ b/src/component/Student/Exams/AttemptExam/AttemptExam.js @@ -62,7 +62,7 @@ class AttemptExam extends React.Component { tempAllQuestions.map((question, index) => { let quest = {}; quest.question_id = question.id; - quest.answer_duration = 0; + quest.answer_duration = question.answer_duration; quest.is_reviewed = question.isReviewMarked; quest.is_visited = question.isVisited; let options = question.options; @@ -138,12 +138,15 @@ class AttemptExam extends React.Component { } showDetailQuestion(question) { + this.updateAnswersForQuestion(this.state.activeDetailQuestion); + // Mark the question as visited question.isVisited = true; // Update the question in both section and allQuestions arrays this.state.sections[question.sectionIndx].questions[question.secQIndex] = question; this.state.allQuestions[question.index - 1] = question; + question.answer_duration = Date.now(); // Save the current section index for returning to the same tab this.setState({ @@ -154,6 +157,8 @@ class AttemptExam extends React.Component { allQuestions: this.state.allQuestions, lastActiveSection: question.sectionIndx // Save the section index }); + + this.updateAnswersForQuestion(question); } onQuestionClick(index) { @@ -165,7 +170,7 @@ class AttemptExam extends React.Component { // Only handle the back navigation if we're in question detail view if (this.state.showQuestion) { this.updateAnswersForQuestion(this.state.activeDetailQuestion); - + this.setState({ showQuestion: false, activeDetailQuestion: {}, @@ -229,6 +234,22 @@ class AttemptExam extends React.Component { }; updateAnswersForQuestion = (question) => { + // ✅ Check if question exists and has options + if ( + !question || + typeof question !== "object" || + !question.options || + !Array.isArray(question.options) + ) { + console.warn("⚠️ Skipped updateAnswersForQuestion — invalid or missing question."); + return; + } + + const duration = + question.answer_duration + ? Math.floor((Date.now() - question.answer_duration) / 1000) + : 0; + // ✅ Extract selected answer IDs (just numbers) const selectedAnswers = question.options .filter(option => option.isSelected) @@ -237,26 +258,29 @@ class AttemptExam extends React.Component { // ✅ Build the JSON object like your Kotlin version const answerObject = { question_id: question.id, - answer_duration: question.answer_duration || 0, + answer_duration: duration, is_reviewed: question.isReviewMarked || false, - is_visited: true, - answers: selectedAnswers + is_visited: question.isVisited || false, + answers: selectedAnswers, }; // ✅ Send it (stringify the full object) - selectorService.updateExamStatus(this.state.attempt_id, JSON.stringify(answerObject)); - } + try { + selectorService.updateExamStatus( + this.state.attempt_id, + JSON.stringify(answerObject) + ); + } catch (error) { + console.error("❌ Failed to update exam status:", error); + } + }; callbackFunctionNext = (childData) => { - this.updateAnswersForQuestion(childData); - // ✅ Load next question const q = childData; const indx = q.index; const nxtQuestion = this.state.allQuestions[indx]; this.showDetailQuestion(nxtQuestion); - - this.updateAnswersForQuestion(nxtQuestion); }; callbackFunctionUpdateAnswer = (question) => { diff --git a/src/component/Student/Exams/Report/Report.css b/src/component/Student/Exams/Report/Report.css index 654d106..6cbd9ce 100644 --- a/src/component/Student/Exams/Report/Report.css +++ b/src/component/Student/Exams/Report/Report.css @@ -106,5 +106,4 @@ td.firstColumnReport{ .createExamLayout{ background-color: #F5F7FA; -} - +} \ No newline at end of file diff --git a/src/component/Student/Exams/Report/Report.js b/src/component/Student/Exams/Report/Report.js index 12b8e6b..a99b8ab 100644 --- a/src/component/Student/Exams/Report/Report.js +++ b/src/component/Student/Exams/Report/Report.js @@ -252,1046 +252,1031 @@ class Report extends React.Component { return ( -
{item.subject_name}
-
+
{ + e.currentTarget.style.backgroundColor = "#e6f4ff"; + e.currentTarget.style.boxShadow = "0 2px 6px rgba(0,0,0,0.1)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.backgroundColor = "#f9f9f9"; + e.currentTarget.style.boxShadow = "none"; + }} + > +
+ {item.subject_name} +
+
{item.totalSectionMarks}/{item.total_marks}
} key={secIndex} > - - -
- - {/* - */} - {/* - */} -
- -
- {/* Overall - */} - {/*
- */}{" "} -
- -
- {/* Difficulty Levels - */} - {/*
- */}{" "} -
- -
- {/* Answer Key - */} - {/*
- */}{" "} -
- -
- {/*
- -
-
- -
*/} - {/* Answer Key - */} - {/*
-
*/} -
-
- + + -
-
- - Overall - -
- - - - - - - -
-
-
-
- - Score -
-
-
-
- {item.totalSectionMarks}/{item.total_marks} -
-
-
-
-
-
-
- - Accuracy -
-
- {(item.total_correct_answer * 100) / - (item.total_correct_answer + - item.total_wrong_answer + - item.total_notAttempted_answer)} - % -
-
-
- {" "} -
-
-
-
-
- +

- Difficulty Levels - -

- Performance across questions of different difficulty - levels like Easy, Medium & Hard + Overall +

+ +

+ A quick summary of your total Score and Accuracy across this section.

-
-
- {/* - - - + + {/* ✅ Grey background for the section */} +
+ + {/* SCORE CARD */} +
+ (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } > -
-
Easy
-
{item.easy.total}
+
+
+

+ + Score +

+ + {item.totalSectionMarks}/{item.total_marks} + +
+ +
+ You scored{" "} + {item.totalSectionMarks} out of{" "} + {item.total_marks} total marks. +
-
+ + {/* Optional: You can add a small mini bar chart or graphic here to match height */} +
( -
-
Accuracy
-
- {(item.easy.correct * 100) / - item.easy.total} -
-
- ), + paper_bgcolor: "rgba(0,0,0,0)", + plot_bgcolor: "rgba(0,0,0,0)", }} - config={{ displayModeBar: false }} - />{" "} -
-
- - {/* -
-
-
-
Medium
-
{item.medium.total}
-
-
- ( -
-
Accuracy
-
- {(item.medium.correct * 100) / - item.medium.total} -
-
- ), - }} - config={{ displayModeBar: false }} + config={{ displayModeBar: false, responsive: true }} + style={{ width: "100%" }} />
- {/* - -
-
-
Hard
-
{item.hard.total}
-
-
- ( -
-
Accuracy
-
- {(item.hard.correct * 100) / - item.hard.total} -
-
- ), - }} - config={{ displayModeBar: false }} - />{" "} -
-
{" "} - - {/* - - -
*/} - -
*/}{" "} -
*/} -
*/} - -
-
-
-
- - Question Type - -

- Performance across questions types i.e. MCQ,MRQ and True - and False. -

-
-
- {/* - - - -
+
+ (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } > -
-

MCQ

-

{item.total_MCQ} Questions

-
-
-
+

- Accuracy + + Accuracy

-
- {isNaN( - ( - item.total_MCQ_correct / - item.total_MCQ_attempt - ).toFixed(2) * 100 - ) - ? 0 - : ( - item.total_MCQ_correct / - item.total_MCQ_attempt - ).toFixed(2) * 100} + {( + (item.total_correct_answer * 100) / + (item.total_correct_answer + + item.total_wrong_answer + + item.total_notAttempted_answer) + ).toFixed(1)} % -
+
-
+ +
( -
-
Accuracy
-
- {(item.easy.correct * 100) / - item.easy.total} -
-
- ), + paper_bgcolor: "rgba(0,0,0,0)", + plot_bgcolor: "rgba(0,0,0,0)", }} - config={{ displayModeBar: false }} - />{" "} + config={{ displayModeBar: false, responsive: true }} + />
- {/* -
- {" "} -
-
-

MRQ

-

{item.total_MRQ} Questions

-
-
-
-

- Accuracy -

-
- {isNaN( - ( - item.total_MRQ_correct / - item.total_MRQ_attempt - ).toFixed(2) * 100 - ) - ? 0 - : ( - item.total_MRQ_correct / - item.total_MRQ_attempt - ).toFixed(2) * 100} - % -
-
-
- ( -
-
Accuracy
-
- {(item.medium.correct * 100) / - item.medium.total} -
-
- ), - }} - config={{ displayModeBar: false }} - />{" "} -
-
{" "} - - {/* - -
-
-

True&False

-

{item.total_TF} Questions

-
-
-
-

- Accuracy -

-
- {isNaN( - ( - item.total_TF_correct / - item.total_TF_attempt - ).toFixed(2) * 100 - ) - ? 0 - : ( - item.total_TF_correct / - item.total_TF_attempt - ).toFixed(2) * 100} - % -
-
-
- ( -
-
Accuracy
-
- {(item.hard.correct * 100) / - item.hard.total} -
-
- ), - }} - config={{ displayModeBar: false }} - />{" "} -
-
{" "} - {/* - - -
*/} - -
*/} - -
*/} -
*/}
+
-
-
- +

- Answer Key - -

- - {item.total_correct_answer} -

- Correct -
- - - {item.total_wrong_answer} -
- Incorrect -
-
- - {item.total_notAttempted_answer} -
- Not - Answered -
-
- -
- -
-
- -
- -
-
+ Difficulty Levels +

+ +

+ Performance across questions of different difficulty levels —{" "} + Easy, Medium & Hard.

-
+ + {/* Grey background wrapper */}
-
- + + {[ + { + label: "Easy", + color: "#52c41a", + data: item.easy, + }, + { + label: "Medium", + color: "#1677ff", + data: item.medium, + }, + { + label: "Hard", + color: "#ff4d4f", + data: item.hard, + }, + ].map((d, i) => ( + +
+ (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } + > + {/* Header */} +
+

+ {d.label} +

+ + {d.data.total} Questions + +
+ + {/* Accuracy */} +
+ Accuracy + + {d.data.total > 0 + ? ((d.data.correct * 100) / d.data.total).toFixed(1) + : 0} + % + +
+ + {/* Chart */} + +
+ + ))} +
+
+
+ +
+
+

+ Question Type +

+ +

+ Performance across question types — MCQ, MRQ, and{" "} + True & False. +

+ + {/* ✅ Grey section background */} +
+ + {[ + { + title: "MCQ", + total: item.total_MCQ, + correct: item.total_MCQ_correct, + attempt: item.total_MCQ_attempt, + totalQ: item.total_MCQ, + }, + { + title: "MRQ", + total: item.total_MRQ, + correct: item.total_MRQ_correct, + attempt: item.total_MRQ_attempt, + totalQ: item.total_MRQ, + }, + { + title: "True / False", + total: item.total_TF, + correct: item.total_TF_correct, + attempt: item.total_TF_attempt, + totalQ: item.total_TF, + }, + ].map((t, i) => ( + +
+ (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } + > + {/* Header */} +
+

+ {t.title} +

+ + {t.total} Questions + +
+ + {/* Accuracy */} +
+ Accuracy + + {isNaN((t.correct / t.attempt) * 100) + ? 0 + : ((t.correct / t.attempt) * 100).toFixed(1)} + % + +
+ + {/* Plotly Chart */} + +
+ + ))} +
+
+
+ +
+ {/* ANSWER KEY */} +
+

+ Answer Key +

+ + {/* Stats Row */} +
+ {/* Stats */} +
+
+ + + Correct: {item.total_correct_answer} + +
+ +
+ + + Incorrect: {item.total_wrong_answer} + +
+ +
+ + + Not Attempted: {item.total_notAttempted_answer} + +
+
+ + {/* Filters */} +
+ + + +
+
+ + {/* Questions Grid */} +
+ - - { - (answerKey = item.questions - .filter((y, i) => { - if ( - this.state.typeDropdown && - this.state.typeDropdown.length === 0 - ) { - return 1; - } - return this.state.typeDropdown.includes( - y.type_code - ) - ? 1 - : 0; + + {(() => { + const filtered = item.questions + .filter((q) => { + const { typeDropdown, typeDifficulty } = this.state; + const matchType = + !typeDropdown?.length || + typeDropdown.includes(q.type_code); + const matchDiff = + !typeDifficulty?.length || + typeDifficulty.includes(q.complexity_code); + return matchType && matchDiff; }) - .filter((z, i) => { - if ( - this.state.typeDifficulty && - this.state.typeDifficulty.length === 0 - ) { - return 1; - } - return this.state.typeDifficulty.includes( - z.complexity_code - ) - ? 1 - : 0; - }) - .map((x, index) => { - return ( - ( + +
+ this.setState({ view: { ...q, index }, visible: true }) + } style={{ - margin: "2%", - boxSizing: "border-box", + background: "#fff", + borderRadius: "12px", + padding: "16px", + minHeight: "240px", + boxShadow: "0 2px 8px rgba(0,0,0,0.08)", + border: `2px solid ${q.isCorrect + ? "#52c41a" + : q.isAttempted + ? "#ff4d4f" + : "#d9d9d9" + }`, + cursor: "pointer", + position: "relative", + transition: "all 0.2s ease-in-out", }} - span={7} + onMouseEnter={(e) => + (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } >
{ - this.setState({ - view: { ...x, index: index }, - visible: true, - }); - }} - key={index} style={{ - width: "100%", - height: "300px", - backgroundColor: "white", - borderRadius: "16px", - padding: "15px", - border: - "1px solid " + - (x.isCorrect - ? "green" - : x.isAttempted - ? "red" - : "grey"), - position: "relative", - cursor: "pointer", + display: "flex", + justifyContent: "space-between", + marginBottom: "8px", }} > -
- - {index + 1} - - - {x.isCorrect - ? "Correct" - : x.isAttempted - ? "Incorrect" - : "Not Answered"} - -
- {parse(x.question_text)} + + Q{index + 1} + - {x.type_code} + {q.isCorrect + ? "Correct" + : q.isAttempted + ? "Incorrect" + : "Unanswered"}
- - ); - })) - } - {answerKey.length !== 0 ? ( - <> - ) : ( -
- -
- )} +
]+)>)/gi, "")} // optional tooltip for full text + > + {parse(q.question_text)} +
+ +
+ {q.type_code} +
+
+ + )); + + return filtered.length ? ( + filtered + ) : ( +
+ +
+ ); + })()}
- - All Questions -
- {item.questions - .filter((y, i) => { - if ( - this.state.typeDropdown && - this.state.typeDropdown.length === 0 - ) - return 1; - return this.state.typeDropdown.includes( - y.type_code - ) - ? 1 - : 0; - }) - .filter((z, i) => { - if ( - this.state.typeDifficulty && - this.state.typeDifficulty.length === 0 - ) { - return 1; - } - return this.state.typeDifficulty.includes( - z.complexity_code - ) - ? 1 - : 0; - }) - .map((x, index) => { - return ( + + {/* Right Sidebar */} + +
+

+ All Questions +

+
+ {item.questions.map((q, index) => ( { - this.setState({ - visible: true, - view: { ...x, index: index }, - }); - }} + key={index} + onClick={() => + this.setState({ visible: true, view: { ...q, index } }) + } style={{ - margin: "5px", - backgroundColor: x.isCorrect - ? "green" - : item.isAttempted - ? "red" - : "rgb(162, 164, 169)", + margin: "6px", + backgroundColor: q.isCorrect + ? "#52c41a" + : q.isAttempted + ? "#ff4d4f" + : "#d9d9d9", cursor: "pointer", }} > {index + 1} - ); - })} + ))} +
+
+ + {/* Drawer for Detailed Question View */} + Question #{this.state.view.index + 1} +
+ } width={640} placement="right" - closable={false} onClose={this.handleCancel} visible={this.state.visible} - // footer={ - //
- // - // - //
- // } + bodyStyle={{ + backgroundColor: "#f9fafb", + paddingBottom: "40px", + }} > - -

- - {!this.state.view.question_text - ? this.state.view.question_text - : parse(this.state.view.question_text)} - -

+ +
+

+ {parse(this.state.view.question_text || "")} +

+
+ {/* Options */} {this.state.view.type_code === "MRQ" ? ( { - return { - label: x.text, - value: index, - disabled: true, - }; - } - )} + options={this.state.view.options?.map((opt, i) => ({ + label: opt.text, + value: i, + disabled: true, + }))} disabled defaultValue={[1]} /> - ) : this.state.view.type_code === "MCQ" || - this.state.view.type_code === "TNF" ? ( + ) : this.state.view.type_code === "MCQ" || this.state.view.type_code === "TNF" ? ( { - // return { label: x.text, value: x.text }; - // } - // )} disabled value={ - this.state.view.options - .filter((x) => x.isCorrect) - .map((y) => { - console.log(y); - return y.text; - })[0] + this.state.view.options?.find((x) => x.isCorrect)?.text || undefined } > - {this.state.view.options.map((x, idx) => { - return ( - - - {" "} - {x.text} - - - ); - })} + {this.state.view.options?.map((opt, idx) => ( + + + {opt.text} + + + ))} - ) : ( -
- )} + ) : null} - Complexity - - - -
- Author - - {" "} - {this.state.view.author_name} - -
- Explanation -

- - {this.state.view.answer_explanation} - -

+ {/* Difficulty Tag */} +
+

Complexity

+ + {this.state.view.complexity_code === 1 + ? "Easy" + : this.state.view.complexity_code === 2 + ? "Medium" + : "Hard"} + +
+ + {/* Author */} +
+

Author

+ + {this.state.view.author_name || "Unknown"} + +
+ + {/* Explanation */} +
+

Explanation

+
+ {this.state.view.answer_explanation || "No explanation provided."} +
+
+
@@ -1301,149 +1286,223 @@ class Report extends React.Component { ); return ( - + - - {this.state.examName} - Report - - -
- {/* - */} - - {/* */} - - {/* +
+ (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } + >
-
-
- - Score -
-
- {this.state.totalMarksReceived}/ - {this.state.totalMarks} -
-
-
- ( -
-
- - Score -
-
- {this.state.totalMarksReceived}/ - {this.state.totalMarks} -
-
- ), - }} - config={{ displayModeBar: false }} - />{" "} -
+

+ + Score +

+ + {this.state.totalMarksReceived}/{this.state.totalMarks} +
- {/* */} - -
- {/* +
+ (e.currentTarget.style.transform = "translateY(-4px)") + } + onMouseLeave={(e) => + (e.currentTarget.style.transform = "translateY(0)") + } + >
-
-
- - Accuracy -
-
{percentage}%
-
-
- {" "} -
+

+ + Accuracy +

+ + {percentage.toFixed(1)}% +
- {/* */} - - {/* */} - - {/* */} - {/*
*/} + {/* PAGE HEADER */} +
+ {this.state.examName} — Report +
+ + {/* OVERALL SECTION */} +
+ + {/* SCORE CARD */} +
*/} + + + + + + {/* ACCURACY CARD */} +
*/} -
-
{tabs}
-
+ + + + + + + + {/* SECTION TABS */} +
+ {tabs} +
); + } }