addded profile page

This commit is contained in:
skillens.ai 2025-11-07 01:03:26 +05:30
parent 78f2f6b926
commit b2643f1a10
7 changed files with 1796 additions and 1234 deletions

View File

@ -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

View File

@ -53,6 +53,7 @@ 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 = {
@ -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 {
<Layout className='logged-in-view'>
<MathJaxContext
onStartup={(mathJax) => {
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 {
<PrivateRoute exact path="/attemptExam" comp={AttemptExam} />
<PrivateRoute exact path="/report" comp={Report} />
<PrivateRoute exact path="/instructions" comp={Instructions} />
<PrivateRoute exact path="/profile-page" comp={Profile} />
{/* Always have non-exact path at the very end to eliminate conflicts with other 'exact' routes */}
{/* <PrivateRoute exact path="/class" comp={Class} /> */}
{/* <PrivateRoute exact path="/viewclass" comp={ViewClass} /> */}

View File

@ -1,5 +1,32 @@
.profile-page .user-info {
margin-block: 2rem;
display: grid;
grid: auto-flow/250px 1fr;
.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;
}

View File

@ -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);
const [resetLoading, setResetLoading] = useState(false);
const [uploading, setUploading] = useState(false);
const [imageUrl, setImageUrl] = useState(null);
const [user, setUser] = useState({});
let user = authenticationService.currentUserValue;
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 (
<Layout style={{padding: '0 2rem 2rem'}}>
<Layout.Content prefixCls='profile-page'>
<div className='mb-1-0'>
<Typography.Text type='secondary'>Manage your personal and account details here</Typography.Text>
<Layout
className="profile-layout"
style={{
background: "#f5f7fa",
minHeight: "100vh",
overflowY: "auto",
padding: "2rem",
}}
>
<Row justify="center">
<Col xs={24} md={18} lg={12}>
{/* --- Header --- */}
<Card
style={{
borderRadius: 16,
boxShadow: "0 2px 12px rgba(0,0,0,0.08)",
marginBottom: "2rem",
}}
bodyStyle={{ padding: "2rem" }}
>
<Row align="middle" gutter={[16, 16]}>
<Col flex="none">
<Avatar
size={90}
src={null}
icon={<UserOutlined />}
style={{ backgroundColor: "#1677ff" }}
/>
</Col>
<Col flex="auto">
<Title level={4} style={{ margin: 0 }}>
{user.first_name || user.last_name ? (
<>
{user.first_name} {user.last_name}
</>
) : (
<Text type="warning">No name entered</Text>
)}
</Title>
<Text type="secondary">{user.email_id}</Text>
<div style={{ marginTop: 12 }}>
<Tag color="blue">{user.role_name || "No role assigned"}</Tag>
{user.institute_name && (
<Tag color="purple">{user.institute_name}</Tag>
)}
</div>
</Col>
<Col flex="none">
<Upload
customRequest={handleUpload}
showUploadList={false}
accept="image/*"
>
<Button
type="default"
icon={<UploadOutlined />}
loading={uploading}
>
{uploading ? "Uploading..." : "Change Picture"}
</Button>
</Upload>
</Col>
</Row>
</Card>
<Typography.Paragraph strong>Account Details</Typography.Paragraph>
<Space className='avatar-container'>
<Avatar shape="square" src={null} size={80} icon={<UserOutlined />} />
<Button onClick={() => {}} type='ghost' icon={<UploadOutlined/>}>Change Picture</Button>
{/* --- Account Info --- */}
<Card
title={
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
}}
>
<Text strong>Account Information</Text>
<Button
type="link"
icon={<EditOutlined />}
onClick={handleEdit}
style={{ padding: 0 }}
>
Edit Profile
</Button>
</div>
}
style={{
borderRadius: 16,
boxShadow: "0 2px 12px rgba(0,0,0,0.05)",
}}
>
<Space
direction="vertical"
size="large"
style={{ width: "100%", marginTop: 8 }}
>
{[
{ 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) => (
<div key={index}>
<Text strong style={{ display: "block" }}>
{item.label}
</Text>
<Text type="secondary">
{item.value ? (
item.value
) : (
<Text type="warning">
No {item.label.toLowerCase()} entered
</Text>
)}
</Text>
</div>
))}
</Space>
</Card>
<div className='user-info'>
<Typography.Paragraph strong style={{color: 'var(--font-color-primary)'}} type='primary'>Full Name</Typography.Paragraph>
<span>{user.first_name || user.last_name? <>{user.first_name} {user.last_name}</> : <Typography.Text type='warning'>No name entered</Typography.Text>}</span>
<Typography.Paragraph strong style={{color: 'var(--font-color-primary)'}} type='primary'>Email ID</Typography.Paragraph>
<span>{user.email_id}</span>
<Typography.Paragraph strong style={{color: 'var(--font-color-primary)'}} type='primary'>Phone Number</Typography.Paragraph>
<span>{user.mobile_num? user.mobile_num : <Typography.Text type='warning'>No number entered</Typography.Text>}</span>
<Typography.Paragraph strong style={{color: 'var(--font-color-primary)'}} type='primary'>Affiliated Institute</Typography.Paragraph>
<span>{user.institute_name? user.institute_name : <Typography.Text type='warning'>No institute associated</Typography.Text>}</span>
<Typography.Paragraph strong style={{color: 'var(--font-color-primary)'}} type='primary'>Role</Typography.Paragraph>
<span>{user.role_name? user.role_name : <Typography.Text type='warning'>No role assigned</Typography.Text>}</span>
{/* --- Action Buttons --- */}
<div
style={{
marginTop: "2rem",
display: "flex",
flexWrap: "wrap",
gap: "1rem",
justifyContent: "space-between",
}}
>
<Button
type="primary"
icon={<KeyOutlined />}
size="large"
style={{ flex: 1, minWidth: 150 }}
onClick={handleResetPassword}
loading={resetLoading}
>
Reset Password
</Button>
<Button
danger
icon={<StopOutlined />}
size="large"
style={{ flex: 1, minWidth: 150 }}
>
Deactivate Account
</Button>
</div>
</Col>
</Row>
<div className='button-container'>
<Button type='primary'>Change Password</Button>
<Button type='danger'>Deactivate Account</Button>
{/* --- Edit Modal --- */}
<Modal
title="Edit Profile"
visible={isModalOpen} // for AntD v4
open={isModalOpen} // for AntD v5
onCancel={() => 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) => (
<div
style={{
borderRadius: 16, // ensure all layers are rounded
overflow: "hidden",
boxShadow: "0 4px 24px rgba(0, 0, 0, 0.15)",
}}
>
{node}
</div>
)}
>
<Form
form={form}
layout="vertical"
name="edit_profile"
initialValues={user}
>
<Form.Item
label="First Name"
name="firstName"
rules={[{ required: true, message: "Please enter your first name" }]}
>
<Input placeholder="Enter first name" />
</Form.Item>
</Layout.Content>
<Form.Item
label="Last Name"
name="lastName"
rules={[{ required: true, message: "Please enter your last name" }]}
>
<Input placeholder="Enter last name" />
</Form.Item>
<Form.Item
label="Mobile Number"
name="mobile_num"
rules={[
{ required: true, message: "Please enter your phone number" },
{ pattern: /^[0-9]{10}$/, message: "Enter a valid 10-digit number" },
]}
>
<Input placeholder="Enter phone number" maxLength={10} />
</Form.Item>
<Form.Item
label="Gender"
name="gender"
rules={[{ required: true, message: "Please select gender" }]}
>
<Select placeholder="Select gender">
<Option value="Male">Male</Option>
<Option value="Female">Female</Option>
<Option value="Other">Other</Option>
</Select>
</Form.Item>
<Form.Item
label="State"
name="state"
rules={[{ required: true, message: "Please enter your state" }]}
>
<Input placeholder="Enter state" />
</Form.Item>
<Form.Item
label="City"
name="city"
rules={[{ required: true, message: "Please enter your city" }]}
>
<Input placeholder="Enter city" />
</Form.Item>
</Form>
</Modal>
</Layout>
);
}
};
export default Profile;

View File

@ -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) {
@ -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) => {

View File

@ -107,4 +107,3 @@ td.firstColumnReport{
.createExamLayout{
background-color: #F5F7FA;
}

File diff suppressed because it is too large Load Diff