final changes

This commit is contained in:
skillens.ai 2026-02-26 22:33:08 +05:30
parent 92beec3c2d
commit 537752d6e5
5 changed files with 399 additions and 164 deletions

View File

@ -1,72 +1,72 @@
robots.txt,1761396900570,bfe106a3fb878dc83461c86818bf74fc1bdc7f28538ba613cd3e775516ce8b49 robots.txt,1761396900570,bfe106a3fb878dc83461c86818bf74fc1bdc7f28538ba613cd3e775516ce8b49
manifest.json,1761396900568,a9350a49aaac9fe94d3dd77b8270cc998c04ab97944a606189675022431faa51 manifest.json,1761396900568,a9350a49aaac9fe94d3dd77b8270cc998c04ab97944a606189675022431faa51
favicon.svg,1761396900561,a2a4880301751061a600b0bfc5c26fc413aed41e581516c4fa976bcb7fff6663 favicon.svg,1761396900561,a2a4880301751061a600b0bfc5c26fc413aed41e581516c4fa976bcb7fff6663
service-worker.js,1762704464986,78067025e3c748b0364fd3530a7dbff74bd239814203a53f6845cbd55e0e2607 service-worker.js,1770731008838,482a78ad904d2de94c78bd67419d1fdd8172535807b933a9670a304ceefa471a
index.html,1762704464985,57fb1091c5bf8037e3c602389a00e3d80233468408fd05d87722f1fe71a7dd1d index.html,1770731008838,c1e744221cce5c0303625fa501638a0dc9411e7b3af246137116039c2715710f
precache-manifest.47857d818921d80727f3a0850ed0b94a.js,1762704464985,a8d9a4020e5112083b9b7ff4f98ac36fc385970906494ad15fd7658408924fb9 static/media/sub-ques-icon.366b4f1e.svg,1770731008776,8e397611007ec5db7581a4c1bcca006950390ddf652cae209bb3973a645af425
static/media/translate.610ad011.svg,1762704464942,c06f8a3d0c976b02429ce805d8a4944571ab0128ed2ce49c2d3ca134511ed120 asset-manifest.json,1770731008838,55979a73bf0cabe287dcdb56eb2af16dbe88affb823b4b1b91775b8d8a3c22ed
static/media/tru-fals-icon.d0b962d8.svg,1762704464941,a1deab7e5db8e8a94a9c5812dcde5f8cbfbe5da790da8500bf106980b9c79c33 static/media/student-engaged.53fb7b0b.svg,1770731008775,5f8e01d1a5efcbdf3aa00ed07de843ab84404a28b672ca91f4d70d89fa8b37cf
static/media/sub-ques-icon.366b4f1e.svg,1762704464942,8e397611007ec5db7581a4c1bcca006950390ddf652cae209bb3973a645af425 static/media/tru-fals-icon.d0b962d8.svg,1770731008776,a1deab7e5db8e8a94a9c5812dcde5f8cbfbe5da790da8500bf106980b9c79c33
static/media/student-engaged.53fb7b0b.svg,1762704464939,5f8e01d1a5efcbdf3aa00ed07de843ab84404a28b672ca91f4d70d89fa8b37cf static/media/translate.610ad011.svg,1770731008777,c06f8a3d0c976b02429ce805d8a4944571ab0128ed2ce49c2d3ca134511ed120
asset-manifest.json,1762704464986,6e040301298d248f77a9e4a7eea95318288cf92ed742ecef21467ae7fce27e5c static/media/question.0c505ed9.svg,1770731008773,29938066f93476c487414bb7a5dd5227d891c8ab8e115a74a7e7ffccd8d87b36
static/media/questions-icon.3d3c1aaf.svg,1762704464939,197f459a359b00c1c44b6ddd71cbc9160f593d1fe08534e3711e9d72a2956ef1 precache-manifest.b88347085d339f5dd4f7dc9522a46162.js,1770731008838,5cce4392ad28a60ff6d2d9fe8cec5f5c8796a994b1f717467d5e21204da74beb
static/media/quizexam.5545802e.svg,1762704464936,dfc1278bfcd264264a4d0e0e0247c229335abf0573439c5e9829c8607aacd569 static/media/PracticeKiaLogo.a8336af5.svg,1770731008750,1a592518bcfabb2f86669d06ae2fb7b2948bbdbfaf5a80d138ab30f4e482a0f8
static/media/PracticeKiaLogo.a8336af5.svg,1762704464882,1a592518bcfabb2f86669d06ae2fb7b2948bbdbfaf5a80d138ab30f4e482a0f8 static/media/quizexam.5545802e.svg,1770731008773,dfc1278bfcd264264a4d0e0e0247c229335abf0573439c5e9829c8607aacd569
static/media/question.0c505ed9.svg,1762704464936,29938066f93476c487414bb7a5dd5227d891c8ab8e115a74a7e7ffccd8d87b36 static/media/questions-icon.3d3c1aaf.svg,1770731008774,197f459a359b00c1c44b6ddd71cbc9160f593d1fe08534e3711e9d72a2956ef1
static/media/practice-icon.bf603115.svg,1762704464939,27b6a729d91914d899f4b3c1f817e26ac58d2ec0be54dc9b93c01f28adcdd00c static/media/practice.f05e6f00.svg,1770731008773,13b094bcbbb8c50906b1ee0ce68305059e99319464dd4147b4c2194dbb460475
static/media/practice.f05e6f00.svg,1762704464936,13b094bcbbb8c50906b1ee0ce68305059e99319464dd4147b4c2194dbb460475 static/media/OdiSVGlogo.f0834bb1.svg,1770731008752,3ec1cab31a32db378894d796afedaee7c35f8ff99dfb1039b0bb757225a47235
static/media/mul-res-icon.8ef3b097.svg,1762704464939,1f0a79350cb5546361ef02af1657ad36efeff833fd7bb61db88a20e127a290b4 static/media/performance.88855f12.svg,1770731008773,03fc1b19005084049382091745d3f1f29a447763091ad4a9bc5d097c338671c9
static/media/mul-cho-icon.b3dc9ea9.svg,1762704464940,e8edbceb0eb49f7629cf0b8edf599f9347acbf0c6d1df2fa6145cbed03f37e1f static/media/perf-icon.1597a235.svg,1770731008776,7183482b785de425506f49deb27bba02e906132ac7ce5af01f7da8452ef64f28
static/media/OdiSVGlogo.f0834bb1.svg,1762704464920,3ec1cab31a32db378894d796afedaee7c35f8ff99dfb1039b0bb757225a47235 static/media/mul-res-icon.8ef3b097.svg,1770731008776,1f0a79350cb5546361ef02af1657ad36efeff833fd7bb61db88a20e127a290b4
static/media/perf-icon.1597a235.svg,1762704464939,7183482b785de425506f49deb27bba02e906132ac7ce5af01f7da8452ef64f28 static/media/mul-cho-icon.b3dc9ea9.svg,1770731008776,e8edbceb0eb49f7629cf0b8edf599f9347acbf0c6d1df2fa6145cbed03f37e1f
static/media/performance.88855f12.svg,1762704464937,03fc1b19005084049382091745d3f1f29a447763091ad4a9bc5d097c338671c9 static/media/locale-icon.b3596424.svg,1770731008774,68618c76952aa4c5f2623bb010514871688960bb3b9edbcda0eab7eb75442054
static/media/locale-icon.b3596424.svg,1762704464938,68618c76952aa4c5f2623bb010514871688960bb3b9edbcda0eab7eb75442054 static/media/KaTeX_Typewriter-Regular.b8b8393d.woff2,1770731008771,54a0126379ac9b84c5745f17cd0ac9bf11532ea04c39d387d165a71caf77f8d2
static/media/KaTeX_Typewriter-Regular.b8b8393d.woff2,1762704464935,54a0126379ac9b84c5745f17cd0ac9bf11532ea04c39d387d165a71caf77f8d2 static/media/KaTeX_Size4-Regular.61522cd3.woff2,1770731008771,65378bc44e4f908ff3e7d3b5a36f1351cd29dbed446fcf86ebe0655afefe9ea8
static/media/KaTeX_Size4-Regular.61522cd3.woff2,1762704464932,65378bc44e4f908ff3e7d3b5a36f1351cd29dbed446fcf86ebe0655afefe9ea8 static/media/KaTeX_Typewriter-Regular.0e046058.woff,1770731008771,82cff08904dbae816ffe38a914d56622c9b677680bba6a629e584a19ffb6e873
static/media/KaTeX_Typewriter-Regular.0e046058.woff,1762704464935,82cff08904dbae816ffe38a914d56622c9b677680bba6a629e584a19ffb6e873 static/media/KaTeX_Size4-Regular.3045a61f.woff,1770731008771,c397a0db368b7313fdae7297ab0efb8f25f1bc12afc4ce691dabf8e0918017fa
static/media/KaTeX_Size4-Regular.27a23ee6.ttf,1762704464935,df3392005f1d7a6f9bd8cbc0d1e0f06c147944fdd86e3316fd38d4f55f8e4a9f static/media/KaTeX_Size3-Regular.9108a400.woff2,1770731008767,01dd9815f099722e1f7958ab976d9c0ee81615fa39699daf775fdd8a953ff8b1
static/media/KaTeX_Size3-Regular.4de844d4.woff,1762704464935,4398fd91cc5e6b45e4293262c5361ada3a54a24aff0d7a38bc70d3a242f0ef27 static/media/KaTeX_Size4-Regular.27a23ee6.ttf,1770731008771,df3392005f1d7a6f9bd8cbc0d1e0f06c147944fdd86e3316fd38d4f55f8e4a9f
static/media/KaTeX_Size3-Regular.963af864.ttf,1762704464934,f94a1dddcfc1df9beb0ecfaf0a73c3df96009a8d7e8a098ada1aa3a39e9ca678 static/media/KaTeX_Size3-Regular.4de844d4.woff,1770731008769,4398fd91cc5e6b45e4293262c5361ada3a54a24aff0d7a38bc70d3a242f0ef27
static/media/KaTeX_Size3-Regular.9108a400.woff2,1762704464932,01dd9815f099722e1f7958ab976d9c0ee81615fa39699daf775fdd8a953ff8b1 static/media/KaTeX_Size3-Regular.963af864.ttf,1770731008771,f94a1dddcfc1df9beb0ecfaf0a73c3df96009a8d7e8a098ada1aa3a39e9ca678
static/media/KaTeX_Size2-Regular.95a1da91.woff2,1762704464932,47c15e4348ddda442adae347550b466a6325266ccf8d7a4793481682b5bdf4f2 static/media/KaTeX_Size2-Regular.b0628bfd.woff,1770731008767,e23e150fad1a0531631c97f0170716a09b51211d3ad23c84794647ef603a19de
static/media/KaTeX_Size2-Regular.b0628bfd.woff,1762704464932,e23e150fad1a0531631c97f0170716a09b51211d3ad23c84794647ef603a19de static/media/KaTeX_Size2-Regular.95a1da91.woff2,1770731008767,47c15e4348ddda442adae347550b466a6325266ccf8d7a4793481682b5bdf4f2
static/media/KaTeX_Size1-Regular.82ef26dc.woff2,1762704464931,353eb899698a648194c4bfabf250818092ebfdee0f3078346c3acb4194797f48 static/media/KaTeX_Size2-Regular.1fdda0e5.ttf,1770731008767,1685351b16075c0e5c880bbb9c6a3b4c5161ac3c852cc8a67963a37d7311b2b9
static/media/KaTeX_Size1-Regular.4788ba5b.woff,1762704464932,8e8412c0abbcb89ea321e50ec95b55bfe9d77486c84664fbca5b9b101bab7f3d static/media/KaTeX_Size1-Regular.4788ba5b.woff,1770731008766,8e8412c0abbcb89ea321e50ec95b55bfe9d77486c84664fbca5b9b101bab7f3d
static/media/KaTeX_Size2-Regular.1fdda0e5.ttf,1762704464936,1685351b16075c0e5c880bbb9c6a3b4c5161ac3c852cc8a67963a37d7311b2b9 static/media/KaTeX_Script-Regular.1b3161eb.woff2,1770731008766,a5bfd2c095c085b45d10126c94e5cc116a0ea8fd7946a49b54a95da414535890
static/media/KaTeX_Size4-Regular.3045a61f.woff,1762704464935,c397a0db368b7313fdae7297ab0efb8f25f1bc12afc4ce691dabf8e0918017fa static/media/KaTeX_Size1-Regular.0d8d9204.ttf,1770731008767,535e05d118e935a5a1ce5be35dc03a4b20a69ccc5f25210206deaed676c16a64
static/media/KaTeX_Script-Regular.1b3161eb.woff2,1762704464931,a5bfd2c095c085b45d10126c94e5cc116a0ea8fd7946a49b54a95da414535890 static/media/KaTeX_Size1-Regular.82ef26dc.woff2,1770731008766,353eb899698a648194c4bfabf250818092ebfdee0f3078346c3acb4194797f48
static/media/KaTeX_Size1-Regular.0d8d9204.ttf,1762704464935,535e05d118e935a5a1ce5be35dc03a4b20a69ccc5f25210206deaed676c16a64 static/media/KaTeX_Script-Regular.a82fa2a7.woff,1770731008766,84a67d2df883ac10ca688757491e777b64ef90f94ca712cc23b64a8c97de68af
static/media/KaTeX_Script-Regular.a189c37d.ttf,1762704464931,ec985a3df1d229119c660bfaa16e4be32ec7391f09d9c1e220cef2b149745a1a static/media/KaTeX_SansSerif-Regular.1ac3ed6e.woff2,1770731008764,2836d2dafad00dd468d7e2b8f305eeb3af4f434980bc7efb3c696e6968cec09b
static/media/KaTeX_SansSerif-Regular.5f8637ee.woff,1762704464929,d0d8050720c1b4cedb8cfe1feb22dc45fc0382ff62b5504c7fc09e1c24652544 static/media/KaTeX_SansSerif-Regular.5f8637ee.woff,1770731008766,d0d8050720c1b4cedb8cfe1feb22dc45fc0382ff62b5504c7fc09e1c24652544
static/media/KaTeX_SansSerif-Italic.f60b4a34.ttf,1762704464931,cf5a68a17d022639016a9da976bb6a4ab05e06ccd74ce712db3009adcf34fd32 static/media/KaTeX_Script-Regular.a189c37d.ttf,1770731008766,ec985a3df1d229119c660bfaa16e4be32ec7391f09d9c1e220cef2b149745a1a
static/media/KaTeX_SansSerif-Italic.ef725de5.woff,1762704464928,9476b240a74b872f7cbe8517997d68df0c375e3d52a58e165f893a7191f54e86 static/media/KaTeX_SansSerif-Italic.ef725de5.woff,1770731008763,9476b240a74b872f7cbe8517997d68df0c375e3d52a58e165f893a7191f54e86
static/media/KaTeX_SansSerif-Regular.3243452e.ttf,1762704464932,89e5632b7b1d0a3b94bcb71efd36838bb407d575f0212a8d3499b3c3c0fcb12c static/media/KaTeX_SansSerif-Italic.e934cbc8.woff2,1770731008762,2a474c036e86d3fcabb4f8d68318ccce7e5e103f27f804e1fd74a1646ed15cae
static/media/KaTeX_SansSerif-Bold.ad546b47.woff2,1762704464931,9a2e88c7f50de44ea6842c0dc687cd0fc54cff06a47bf6408cf1eba76e25bb81 static/media/KaTeX_SansSerif-Regular.3243452e.ttf,1770731008765,89e5632b7b1d0a3b94bcb71efd36838bb407d575f0212a8d3499b3c3c0fcb12c
static/media/KaTeX_SansSerif-Regular.1ac3ed6e.woff2,1762704464931,2836d2dafad00dd468d7e2b8f305eeb3af4f434980bc7efb3c696e6968cec09b static/media/KaTeX_SansSerif-Bold.ad546b47.woff2,1770731008763,9a2e88c7f50de44ea6842c0dc687cd0fc54cff06a47bf6408cf1eba76e25bb81
static/media/KaTeX_SansSerif-Bold.0e897d27.woff,1762704464928,06df349cd9f09f229c964190cea7b3487aefe84f055207793ddf3e83a3db281a static/media/practice-icon.bf603115.svg,1770731008775,27b6a729d91914d899f4b3c1f817e26ac58d2ec0be54dc9b93c01f28adcdd00c
static/media/KaTeX_Script-Regular.a82fa2a7.woff,1762704464931,84a67d2df883ac10ca688757491e777b64ef90f94ca712cc23b64a8c97de68af static/media/KaTeX_SansSerif-Italic.f60b4a34.ttf,1770731008765,cf5a68a17d022639016a9da976bb6a4ab05e06ccd74ce712db3009adcf34fd32
static/media/KaTeX_SansSerif-Italic.e934cbc8.woff2,1762704464928,2a474c036e86d3fcabb4f8d68318ccce7e5e103f27f804e1fd74a1646ed15cae static/media/KaTeX_SansSerif-Bold.f2ac7312.ttf,1770731008765,a248317ab48e3dc924f1c87b13a27cc5e6d887272d02b1c1cab72795de2c9591
static/media/KaTeX_SansSerif-Bold.f2ac7312.ttf,1762704464929,a248317ab48e3dc924f1c87b13a27cc5e6d887272d02b1c1cab72795de2c9591 static/media/KaTeX_SansSerif-Bold.0e897d27.woff,1770731008763,06df349cd9f09f229c964190cea7b3487aefe84f055207793ddf3e83a3db281a
static/media/logo.0dd03933.png,1762704464920,b9716ed1f565a052edc1154a207334de81856339e8ca43d5d8f51041f3785085 static/media/KaTeX_Typewriter-Regular.6bf42875.ttf,1770731008772,3f8e9a7e1c8f9835a5fdbf303b775991de8d868a7b8ee8eb1f32b0b01ed1b90b
static/media/KaTeX_Typewriter-Regular.6bf42875.ttf,1762704464935,3f8e9a7e1c8f9835a5fdbf303b775991de8d868a7b8ee8eb1f32b0b01ed1b90b static/media/logo.0dd03933.png,1770731008752,b9716ed1f565a052edc1154a207334de81856339e8ca43d5d8f51041f3785085
static/media/KaTeX_Math-Italic.fe5ed587.ttf,1762704464931,1cf503e99eee1d6931a59f03a2718c879571c4bc878d8c5bb310c057e15fcffa static/media/KaTeX_Math-Italic.ed7aea12.woff,1770731008761,7f65f9be10f45caa82382689fe21bf358899ac28002cbd44d3696eea1d6affee
static/media/KaTeX_Math-Italic.ed7aea12.woff,1762704464928,7f65f9be10f45caa82382689fe21bf358899ac28002cbd44d3696eea1d6affee static/media/KaTeX_Math-Italic.fe5ed587.ttf,1770731008762,1cf503e99eee1d6931a59f03a2718c879571c4bc878d8c5bb310c057e15fcffa
static/media/KaTeX_Fraktur-Regular.f9e6a99f.woff2,1762704464923,30c5ebf8d693d9a6db88068bd72eca6aaab2313d91682e147db6ae4d43efc013 static/media/KaTeX_Fraktur-Regular.f9e6a99f.woff2,1770731008756,30c5ebf8d693d9a6db88068bd72eca6aaab2313d91682e147db6ae4d43efc013
static/media/KaTeX_Fraktur-Regular.e435cda5.woff,1762704464923,1ed825d761d10b653432e13606827af1a1621353e75a2bb10c9fdc3f9568cbf2 static/media/KaTeX_Fraktur-Regular.e435cda5.woff,1770731008756,1ed825d761d10b653432e13606827af1a1621353e75a2bb10c9fdc3f9568cbf2
static/media/KaTeX_Fraktur-Bold.796f3797.woff2,1762704464923,440fe396e2bc189c86a666bed548bed61a5482c3afaa04eb41e5b4e977f9accd static/media/KaTeX_Fraktur-Regular.97a699d8.ttf,1770731008756,c84e9b333b1c3dfd0edf947b0166c4436bded08309d47955b99fa4e43177bdaf
static/media/KaTeX_Fraktur-Bold.b9d7c449.ttf,1762704464923,05ef840382f3b9a91d6a08c707c5288ed173a0623b5f986c92d03afd59d2972e static/media/KaTeX_Fraktur-Bold.b9d7c449.ttf,1770731008756,05ef840382f3b9a91d6a08c707c5288ed173a0623b5f986c92d03afd59d2972e
static/media/KaTeX_Fraktur-Regular.97a699d8.ttf,1762704464923,c84e9b333b1c3dfd0edf947b0166c4436bded08309d47955b99fa4e43177bdaf static/media/KaTeX_Fraktur-Bold.796f3797.woff2,1770731008756,440fe396e2bc189c86a666bed548bed61a5482c3afaa04eb41e5b4e977f9accd
static/media/KaTeX_Caligraphic-Regular.e6fb499f.ttf,1762704464923,7d6aca5b5f7d749a0fd1f9e4e7449b1b79a347fd08696f5cadc303ea5e3f3f1c static/media/KaTeX_Caligraphic-Regular.08d95d99.woff2,1770731008752,d4574df1e20cd3519662aff34dcdfa42339c48bfd9dd675d804723794949a8c8
static/media/KaTeX_Caligraphic-Regular.a25140fb.woff,1762704464921,41d8909c711af0e11e9df1fa5bbd8c14071e22130fbac9b6518e920386152038 static/media/KaTeX_Caligraphic-Bold.de2ba279.woff,1770731008752,4e80ee5909ce3b5b965be5b11b75919d58dc6633d372869dbbbbd13f93dbd662
static/media/KaTeX_Fraktur-Bold.40934fc0.woff,1762704464923,8a9c9bd2084df9282df1c63c593dda4c662d2a8111d09956d5bf2c92e6213f4a static/media/KaTeX_Caligraphic-Regular.a25140fb.woff,1770731008756,41d8909c711af0e11e9df1fa5bbd8c14071e22130fbac9b6518e920386152038
static/media/KaTeX_Caligraphic-Bold.de2ba279.woff,1762704464920,4e80ee5909ce3b5b965be5b11b75919d58dc6633d372869dbbbbd13f93dbd662 static/media/KaTeX_Caligraphic-Bold.a9e9b095.woff2,1770731008753,80906c4f0be4d8dccfbb0d3b8cafe79b6ba8bc3200c3c9f060b5616a4d8dec39
static/media/KaTeX_Caligraphic-Regular.08d95d99.woff2,1762704464920,d4574df1e20cd3519662aff34dcdfa42339c48bfd9dd675d804723794949a8c8 static/media/KaTeX_Caligraphic-Regular.e6fb499f.ttf,1770731008754,7d6aca5b5f7d749a0fd1f9e4e7449b1b79a347fd08696f5cadc303ea5e3f3f1c
static/media/KaTeX_Caligraphic-Bold.a9e9b095.woff2,1762704464920,80906c4f0be4d8dccfbb0d3b8cafe79b6ba8bc3200c3c9f060b5616a4d8dec39 static/media/KaTeX_Fraktur-Bold.40934fc0.woff,1770731008756,8a9c9bd2084df9282df1c63c593dda4c662d2a8111d09956d5bf2c92e6213f4a
static/media/GrayscalePKLogo.6bb74404.svg,1762704464920,576b38300e49eda6407adce420001e7ad0333cca317eb668aff457c3258dcca2 static/media/GrayscalePKLogo.6bb74404.svg,1770731008754,576b38300e49eda6407adce420001e7ad0333cca317eb668aff457c3258dcca2
static/media/getFetch.2b2b7da4.cjs,1762704464920,b2d82abee5b8af22b81d67fc20b3feef1eaaf04585dbc24ec755e3304c469096 static/media/getFetch.2b2b7da4.cjs,1770731008752,b2d82abee5b8af22b81d67fc20b3feef1eaaf04585dbc24ec755e3304c469096
static/media/KaTeX_Caligraphic-Bold.497bf407.ttf,1762704464920,50b8dd982d91b531aaf3009e30dc42e72635d476bd0e3d6fe9ba2bdb5c7a036f static/media/KaTeX_Caligraphic-Bold.497bf407.ttf,1770731008752,50b8dd982d91b531aaf3009e30dc42e72635d476bd0e3d6fe9ba2bdb5c7a036f
static/media/exam-icon.10f48851.svg,1762704464939,b766e9975582af716870a844f8deabd4d80e33a47c400d36cee6bc4840062693 static/media/feature-2.36f8d7e2.webp,1770731008752,fc1c038517abf3b731ff3a4675cbaf1a6aa1150ca970762dd0ffc4199b92b75c
static/media/feature-2.36f8d7e2.webp,1762704464918,fc1c038517abf3b731ff3a4675cbaf1a6aa1150ca970762dd0ffc4199b92b75c static/media/exam-icon.10f48851.svg,1770731008774,b766e9975582af716870a844f8deabd4d80e33a47c400d36cee6bc4840062693
assets/images/locale-icon.svg,1761396900579,610498c7ca3b5800d268b1654473f0b1d79de2c6493a7c6982bef90456d35179 assets/images/locale-icon.svg,1761396900579,610498c7ca3b5800d268b1654473f0b1d79de2c6493a7c6982bef90456d35179
assets/images/icons/icon-96x96.png,1761396900602,43a8ac4df8945d7a44e3e4911032214f01eaea92267baa31a93e77942b424c73 assets/images/icons/icon-96x96.png,1761396900602,43a8ac4df8945d7a44e3e4911032214f01eaea92267baa31a93e77942b424c73
assets/images/icons/icon-72x72.png,1761396900600,a42f1df8ab0a8fe921573976d49158e1a2c52fe430460c869947f221aba30a94 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-152x152.png,1761396900590,95a5a117fbd5640f1f1f13c9923398545e3f5b66734ff6c8ce67c942319a8b67
assets/images/icons/icon-144x144.png,1761396900588,e42168e0e1abb5bd7811ebe1b5a2183d0ce287bf266c2efd8d97a23d23ca8d00 assets/images/icons/icon-144x144.png,1761396900588,e42168e0e1abb5bd7811ebe1b5a2183d0ce287bf266c2efd8d97a23d23ca8d00
assets/images/icons/icon-128x128.png,1761396900585,45b577c86e7c03fef868bfa3f96810c5b36f31156c32c0d85620d2e6fe1fc85b assets/images/icons/icon-128x128.png,1761396900585,45b577c86e7c03fef868bfa3f96810c5b36f31156c32c0d85620d2e6fe1fc85b
static/media/delete-icon.da38c0f4.svg,1762704464942,8078772ee88a0588989eec477da1ca949430f3f06efaa9c2db860b74c65f6722 static/media/dashboard.8ec7624b.svg,1770731008772,5a5b5d4bf416d414842bd5eac30432b592342a392450e52943f067db4077bec1
static/media/dashboard.8ec7624b.svg,1762704464936,5a5b5d4bf416d414842bd5eac30432b592342a392450e52943f067db4077bec1 static/media/delete-icon.da38c0f4.svg,1770731008777,8078772ee88a0588989eec477da1ca949430f3f06efaa9c2db860b74c65f6722
static/media/classes.3b73dba0.svg,1762704464936,2abfbb7015d5bccb8640fd0614d3782c048672c9543fe17d127db63287ac141d static/media/class-icon.6afd34b5.svg,1770731008774,a2f492c6c9c7b5201773062dfe90c238c12bc00bec097dc06141201f02b9588e
static/media/class-icon.6afd34b5.svg,1762704464938,a2f492c6c9c7b5201773062dfe90c238c12bc00bec097dc06141201f02b9588e static/media/batch-icon.bf664771.svg,1770731008776,7519e2a92f436a2f46ef7420d721e24df2837d7fce7fe8c30f4bc12980b3d1a0
static/media/Checkmark.1356376c.svg,1762704464948,aa56f27c8198bcae3236a881a7134cd3b7d3dbb048ec75654e8ce2d4710ce027 static/media/batch.3fcff66e.svg,1770731008773,f29038480286f091e3805a43f90ca5a70a13bbcef3076831e0b29b1fcb61d862
static/media/batch.3fcff66e.svg,1762704464936,f29038480286f091e3805a43f90ca5a70a13bbcef3076831e0b29b1fcb61d862 static/media/classes.3b73dba0.svg,1770731008773,2abfbb7015d5bccb8640fd0614d3782c048672c9543fe17d127db63287ac141d
static/media/batch-icon.bf664771.svg,1762704464939,7519e2a92f436a2f46ef7420d721e24df2837d7fce7fe8c30f4bc12980b3d1a0 static/media/Checkmark.1356376c.svg,1770731008788,aa56f27c8198bcae3236a881a7134cd3b7d3dbb048ec75654e8ce2d4710ce027
static/media/KaTeX_Math-Italic.d8b7a801.woff2,1762704464928,463c7b305e898eff5291b63c93cc5cb344035692b6913c1c79073ecbb6243bd4 static/media/auth-BG.2835584f.svg,1770731008752,238d3a2ff1aead1c4aaed0e07d23d2c1164f8be0ef2d5fced5c5ade370f3c5bf
static/media/auth-BG.2835584f.svg,1762704464918,238d3a2ff1aead1c4aaed0e07d23d2c1164f8be0ef2d5fced5c5ade370f3c5bf static/media/KaTeX_Math-Italic.d8b7a801.woff2,1770731008761,463c7b305e898eff5291b63c93cc5cb344035692b6913c1c79073ecbb6243bd4
static/media/KaTeX_Math-BoldItalic.1320454d.woff2,1762704464928,6845d5004e7c212c58d4760856f246a648906e552b0fe06cc1602598c12451c2 static/media/KaTeX_Math-BoldItalic.1320454d.woff2,1770731008763,6845d5004e7c212c58d4760856f246a648906e552b0fe06cc1602598c12451c2
static/media/KaTeX_Math-BoldItalic.48155e43.woff,1762704464928,85cd1b757a1e147fa60d9a33c097ac463cd361d7d29278acb6f9fa12b1ab1807 static/media/add-circle.0011f2bc.svg,1770731008774,d9e5d90e8de1ce16df5720b43ca79543036fcf1a6cd6439a9b15c5a97d269f17
static/media/add-circle.0011f2bc.svg,1762704464938,d9e5d90e8de1ce16df5720b43ca79543036fcf1a6cd6439a9b15c5a97d269f17 static/media/KaTeX_Math-BoldItalic.48155e43.woff,1770731008761,85cd1b757a1e147fa60d9a33c097ac463cd361d7d29278acb6f9fa12b1ab1807
static/media/KaTeX_Math-BoldItalic.6589c4f1.ttf,1762704464928,7015e678d3236d50b3fefa9ba69b1473ed3f8e75adee5cace69614afcfc2f5bf static/media/KaTeX_Main-Regular.f8a7f19f.woff2,1770731008761,d9e0bfb38531e96891681155d118070f8026358d2951cb8470c394b91809288d
static/media/KaTeX_Main-Regular.f8a7f19f.woff2,1762704464928,d9e0bfb38531e96891681155d118070f8026358d2951cb8470c394b91809288d static/media/KaTeX_Main-Italic.65297062.woff2,1770731008758,d85767f0359678f357e48c84e9872f47b139674a79b7b71db0fdbb1317c26d12
static/media/KaTeX_Main-Italic.65297062.woff2,1762704464923,d85767f0359678f357e48c84e9872f47b139674a79b7b71db0fdbb1317c26d12 static/media/KaTeX_Main-Regular.f1cdb692.woff,1770731008761,17452652a1119d3bcd8a71406fc8698a686f53c3923cb96e790e6a5d36d08ab1
static/media/KaTeX_Main-Italic.8ffd28f6.woff,1762704464928,96448f48ed2241c86e68c8461f1640b4420784ddafae0187411614145e1b86b7 static/media/KaTeX_Main-Italic.8ffd28f6.woff,1770731008761,96448f48ed2241c86e68c8461f1640b4420784ddafae0187411614145e1b86b7
static/media/KaTeX_Main-Regular.f1cdb692.woff,1762704464928,17452652a1119d3bcd8a71406fc8698a686f53c3923cb96e790e6a5d36d08ab1 static/media/KaTeX_Main-BoldItalic.d8737343.woff2,1770731008756,c626855b7d035c168c7d791991df8d939103de514bfb4451d79d386573284c72
static/media/KaTeX_Main-BoldItalic.d8737343.woff2,1762704464923,c626855b7d035c168c7d791991df8d939103de514bfb4451d79d386573284c72 static/media/KaTeX_Math-BoldItalic.6589c4f1.ttf,1770731008761,7015e678d3236d50b3fefa9ba69b1473ed3f8e75adee5cace69614afcfc2f5bf
static/media/KaTeX_Main-BoldItalic.5f875f98.woff,1762704464923,70abceb4229394d854d0f09cb4c174bb3044efcb0c914765da73cef487dff695 static/media/KaTeX_Main-Italic.39349e0a.ttf,1770731008758,1d8cb78615c1bf0e6382d19209ab3b545f62297a75006719c9fe6a82f4b3b282
static/media/KaTeX_Main-Bold.a9382e25.woff2,1762704464923,5a85aa329e280b7ebe07d42616135b81a43b3e7699beb03e4f85cb85cc1c42a0 static/media/KaTeX_Main-Bold.4cdba646.woff,1770731008758,0a80f97f42c420ce18f49adadd979581ee6c7b2fea155197d564eab7d4a33b94
static/media/KaTeX_Main-Italic.39349e0a.ttf,1762704464928,1d8cb78615c1bf0e6382d19209ab3b545f62297a75006719c9fe6a82f4b3b282 static/media/KaTeX_Main-BoldItalic.5f875f98.woff,1770731008758,70abceb4229394d854d0f09cb4c174bb3044efcb0c914765da73cef487dff695
static/media/KaTeX_Main-BoldItalic.52fb39b0.ttf,1762704464926,2c270214096b727d963e376c50c9372e0696e3807ab3593c99721e98a2350d9a static/media/KaTeX_Main-Bold.a9382e25.woff2,1770731008756,5a85aa329e280b7ebe07d42616135b81a43b3e7699beb03e4f85cb85cc1c42a0
static/media/KaTeX_Main-Bold.4cdba646.woff,1762704464923,0a80f97f42c420ce18f49adadd979581ee6c7b2fea155197d564eab7d4a33b94 static/media/KaTeX_Main-BoldItalic.52fb39b0.ttf,1770731008756,2c270214096b727d963e376c50c9372e0696e3807ab3593c99721e98a2350d9a
static/media/KaTeX_Main-Regular.818582da.ttf,1762704464928,303bad6cffa808e8161bca30051b6116e39cd128fad1565f4cfe87d57e54f715 static/media/KaTeX_Main-Regular.818582da.ttf,1770731008761,303bad6cffa808e8161bca30051b6116e39cd128fad1565f4cfe87d57e54f715
static/js/runtime-main.6081d0ec.js.map,1762704464986,c8123cc8ee1dd267e60bcb091eaf2d25ed7a5509451d8e86afbc787380151e00 static/media/KaTeX_Main-Bold.8e431f7e.ttf,1770731008758,05a2a07c87d1436ec1339788f266910afda2ef11c2c159b5f9da217e5862678b
static/media/KaTeX_Main-Bold.8e431f7e.ttf,1762704464923,05a2a07c87d1436ec1339788f266910afda2ef11c2c159b5f9da217e5862678b static/media/KaTeX_AMS-Regular.66c67820.woff2,1770731008772,d3c3fdcc36a8dd47d2361854708db75facde86716ac4aff340c27a53edb91fa3
static/js/runtime-main.6081d0ec.js,1762704464949,7a1c482f42a20039677e21ce34ce022263885023785a057bc06f70d610dc40ee static/js/runtime-main.6081d0ec.js,1770731008788,7a1c482f42a20039677e21ce34ce022263885023785a057bc06f70d610dc40ee
static/media/KaTeX_AMS-Regular.66c67820.woff2,1762704464920,d3c3fdcc36a8dd47d2361854708db75facde86716ac4aff340c27a53edb91fa3 static/js/runtime-main.6081d0ec.js.map,1770731008838,c8123cc8ee1dd267e60bcb091eaf2d25ed7a5509451d8e86afbc787380151e00
static/media/feature-1.ea5c34ea.svg,1762704464920,d802659785b69508e521d5543fca40a58cb9076521ffc3e6b006f4786b8079f8 static/media/feature-1.ea5c34ea.svg,1770731008752,d802659785b69508e521d5543fca40a58cb9076521ffc3e6b006f4786b8079f8
static/media/KaTeX_AMS-Regular.10824af7.woff,1762704464920,6c46aa92e4310f9c70a445e7a423691f1704dce1cdc29fdd2e0c83d195fcee10 static/media/KaTeX_AMS-Regular.10824af7.woff,1770731008752,6c46aa92e4310f9c70a445e7a423691f1704dce1cdc29fdd2e0c83d195fcee10
static/media/KaTeX_AMS-Regular.56573229.ttf,1762704464923,c2f8c0a308e057708caa69b82f187cbff35ecda40162ceed7cf66bb958032bba static/media/KaTeX_AMS-Regular.56573229.ttf,1770731008752,c2f8c0a308e057708caa69b82f187cbff35ecda40162ceed7cf66bb958032bba
static/media/feature-3.3d5d81e9.svg,1762704464920,ba23393d89776cb78f7a559903baff48be76665abd99bdd4e5ea103c5e5ed88b static/media/feature-3.3d5d81e9.svg,1770731008752,ba23393d89776cb78f7a559903baff48be76665abd99bdd4e5ea103c5e5ed88b
static/js/4.5c9ee2d0.chunk.js.map,1762704464986,d8d9e9abbe0f04082879cc9c90c0fb1d1f28dfbba11b3d2b78b65d66b35b8b96 static/js/4.5c9ee2d0.chunk.js.map,1770731008838,d8d9e9abbe0f04082879cc9c90c0fb1d1f28dfbba11b3d2b78b65d66b35b8b96
static/js/4.5c9ee2d0.chunk.js,1762704464949,59a7c7888c9e73c67d5bf9455563cee7e9397cd306a614609a84aee098da6cad static/js/4.5c9ee2d0.chunk.js,1770731008795,59a7c7888c9e73c67d5bf9455563cee7e9397cd306a614609a84aee098da6cad
static/js/3.0ae51bd8.chunk.js.map,1762704464986,3bec27d014f16133ccaade384debea7dc56f5deec998a15216216de721bad82a static/js/3.0ae51bd8.chunk.js.map,1770731008838,3bec27d014f16133ccaade384debea7dc56f5deec998a15216216de721bad82a
static/js/3.0ae51bd8.chunk.js,1762704464949,6cdf0e52237283728c7fc227c590b009fd353a8fa0acc12b923b2e79fe4632b9 static/js/3.0ae51bd8.chunk.js,1770731008795,6cdf0e52237283728c7fc227c590b009fd353a8fa0acc12b923b2e79fe4632b9
static/js/2.f1872374.chunk.js.LICENSE.txt,1762704464950,bc485844887473eb82502f45e4e363ca58190ef2e4a8beb067ea4edb86b11522 static/js/2.bdcfca92.chunk.js.LICENSE.txt,1770731008797,bc485844887473eb82502f45e4e363ca58190ef2e4a8beb067ea4edb86b11522
static/js/main.70d2f001.chunk.js,1762704464948,3d8677571a3059a12b3c1c27668166f6956e585ac5385bb8142ea24c7c273526 static/js/main.566c7652.chunk.js,1770731008778,7a99cba7d531b55223ff7059d492704c01d44cd7c58b1faa6f2f64ec2695b08f
static/css/4.97cefae8.chunk.css,1762704464950,a89028fc172450f4ccc12fecd86c150cf0735405675044cee04cf2592756c3a5 static/css/4.97cefae8.chunk.css,1770731008797,a89028fc172450f4ccc12fecd86c150cf0735405675044cee04cf2592756c3a5
static/css/3.1bfbb5fe.chunk.css,1762704464949,fa53ebd8effa8804499790774262a950c68115e9b4ea9d295b07ae92473848c9 static/css/main.b9782f65.chunk.css,1770731008777,115aa90fc90106158cf0fd7a972fa326510d33a8e5481055d603540f1f116766
static/css/2.4ed2bec6.chunk.css,1762704464949,6b672aefb165bb49fe7761f8a920bd7efdfb60ae496f004f9443d6bf2a529434 static/css/2.4ed2bec6.chunk.css,1770731008788,6b672aefb165bb49fe7761f8a920bd7efdfb60ae496f004f9443d6bf2a529434
static/css/main.b9782f65.chunk.css,1762704464942,115aa90fc90106158cf0fd7a972fa326510d33a8e5481055d603540f1f116766 static/css/3.1bfbb5fe.chunk.css,1770731008788,fa53ebd8effa8804499790774262a950c68115e9b4ea9d295b07ae92473848c9
static/css/4.97cefae8.chunk.css.map,1762704464986,cceccec195cfcf6a0764663e84b5386fa8152a3f15e41bad1f79c3287313f005 static/css/4.97cefae8.chunk.css.map,1770731008838,cceccec195cfcf6a0764663e84b5386fa8152a3f15e41bad1f79c3287313f005
static/css/3.1bfbb5fe.chunk.css.map,1762704464986,8fc475e7ed4214343dbe8e12953947d213f2d77dd7472cc99b811bb8ee58a5c4 static/css/main.b9782f65.chunk.css.map,1770731008797,ae1202cb201526bddc6046fd5fd3669972e60c33bdcb2a8e79a39fc84f2c5503
static/js/main.70d2f001.chunk.js.map,1762704464986,810249b85784dfc2de58cb464bdb5cd59ba31451960f1ab91f19842b200edd9f static/js/main.566c7652.chunk.js.map,1770731008838,66af6aedc25e5cca60f0147a079ab74328c1a67d602a8c1c8db6e9bdd3c09218
static/css/main.b9782f65.chunk.css.map,1762704464959,ae1202cb201526bddc6046fd5fd3669972e60c33bdcb2a8e79a39fc84f2c5503 static/css/3.1bfbb5fe.chunk.css.map,1770731008801,8fc475e7ed4214343dbe8e12953947d213f2d77dd7472cc99b811bb8ee58a5c4
static/css/2.4ed2bec6.chunk.css.map,1762704464959,2bd4fbcd3a9b593f1727d1006860d8ca592b270fcab15dbc28ba1f0c63391fe4 static/css/2.4ed2bec6.chunk.css.map,1770731008797,2bd4fbcd3a9b593f1727d1006860d8ca592b270fcab15dbc28ba1f0c63391fe4
static/js/2.f1872374.chunk.js,1762704464951,d8698341ec32ecca8a2a685aba96645f44c03b0fb5ff7f3b33fd0488a7a1b00b static/js/2.bdcfca92.chunk.js,1770731008791,192def8e8054a74baac0d16daf01c4cd1307ac0e1de5f9094fe059db449e8d16
static/js/2.f1872374.chunk.js.map,1762704465002,0be0c48865eaee81ab852a3a6c543f111a98fd7fe6816a1650d37680b8ce46cc static/js/2.bdcfca92.chunk.js.map,1770731008853,ab26184996e92c80b8438fcf5b995947365ffa83a2e1570badb3da9dfc380218

View File

@ -38,6 +38,10 @@ class AttemptExam extends React.Component {
activeDetailQuestion: {}, activeDetailQuestion: {},
activeQuestionIndex: -1, activeQuestionIndex: -1,
pauseUpdate: false, pauseUpdate: false,
isSectionWise: false,
activeSectionIndex: 0,
sectionDeadline: null,
lockedSections: [],
}; };
this.onGetExamAttempt = this.onGetExamAttempt.bind(this); this.onGetExamAttempt = this.onGetExamAttempt.bind(this);
@ -53,8 +57,54 @@ class AttemptExam extends React.Component {
componentDidMount() { componentDidMount() {
this.onGetExamAttempt(); this.onGetExamAttempt();
this.sendHeartbeat(); this.sendHeartbeat();
// ⏱️ section timer watcher
this.sectionTimer = setInterval(this.checkSectionTimeout, 1000);
} }
checkSectionTimeout = () => {
const {
isSectionWise,
sectionDeadline,
activeSectionIndex,
sections,
lockedSections,
} = this.state;
if (!isSectionWise || !sectionDeadline) return;
if (Date.now() >= sectionDeadline) {
const nextSectionIndex = activeSectionIndex + 1;
// 🔒 lock current section
const newLockedSections = [...lockedSections, activeSectionIndex];
// ✅ If next section exists
if (sections[nextSectionIndex]) {
const firstQuestion = sections[nextSectionIndex].questions[0];
this.setState(
{
activeSectionIndex: nextSectionIndex,
lockedSections: newLockedSections,
sectionDeadline: sections[nextSectionIndex].section_duration
? Date.now() +
sections[nextSectionIndex].section_duration * 60 * 1000
: null,
showQuestion: true,
},
() => {
this.showDetailQuestion(firstQuestion);
}
);
} else {
// ✅ No more sections → submit exam
this.onSubmitExam();
}
}
};
getExamModelToUpdate() { getExamModelToUpdate() {
let tempAllQuestions = this.state.allQuestions; let tempAllQuestions = this.state.allQuestions;
let questionsArray = []; let questionsArray = [];
@ -118,8 +168,10 @@ class AttemptExam extends React.Component {
componentWillUnmount() { componentWillUnmount() {
this.stopExamUpdate(); this.stopExamUpdate();
clearInterval(this.sectionTimer);
} }
sendHeartbeat() { sendHeartbeat() {
this.interval = setInterval(() => { this.interval = setInterval(() => {
if (this.state.pauseUpdate) { if (this.state.pauseUpdate) {
@ -138,47 +190,118 @@ class AttemptExam extends React.Component {
} }
showDetailQuestion(question) { showDetailQuestion(question) {
const {
isSectionWise,
activeSectionIndex,
sectionDeadline,
sections,
lockedSections,
} = this.state;
/* ============================
🔐 SECTION-WISE HARD GUARD
============================ */
if (isSectionWise) {
// ❌ Block visiting locked (previous) sections
if (lockedSections.includes(question.sectionIndx)) {
return;
}
// ❌ Block jumping to any section other than active
if (question.sectionIndx !== activeSectionIndex) {
const timeLeft = sectionDeadline - Date.now();
// Section still running → NO movement
if (timeLeft > 0) {
return;
}
// Time over → allow ONLY next section
if (question.sectionIndx !== activeSectionIndex + 1) {
return;
}
// ✅ Lock current section & activate next
this.setState({
lockedSections: [...lockedSections, activeSectionIndex],
activeSectionIndex: question.sectionIndx,
sectionDeadline: sections[question.sectionIndx]?.section_duration
? Date.now() +
sections[question.sectionIndx].section_duration * 60 * 1000
: null,
});
}
}
/* ============================
SAFE QUESTION LOAD
============================ */
// Save previous question progress
this.updateAnswersForQuestion(this.state.activeDetailQuestion); this.updateAnswersForQuestion(this.state.activeDetailQuestion);
// Mark the question as visited // Mark visited
question.isVisited = true; 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(); question.answer_duration = Date.now();
// Save the current section index for returning to the same tab // Update state (yes, this mutates — refactor later)
this.state.sections[question.sectionIndx].questions[question.secQIndex] = question;
this.state.allQuestions[question.index - 1] = question;
this.setState({ this.setState({
showQuestion: true, showQuestion: true,
activeDetailQuestion: question, activeDetailQuestion: question,
activeQuestionIndex: question.index - 1, activeQuestionIndex: question.index - 1,
sections: this.state.sections, sections: this.state.sections,
allQuestions: this.state.allQuestions, allQuestions: this.state.allQuestions,
lastActiveSection: question.sectionIndx // Save the section index lastActiveSection: question.sectionIndx,
}); });
// Send heartbeat update
this.updateAnswersForQuestion(question); this.updateAnswersForQuestion(question);
} }
onQuestionClick(index) { onQuestionClick(index) {
let q = this.state.allQuestions[index - 1]; let q = this.state.allQuestions[index - 1];
this.showDetailQuestion(q); this.showDetailQuestion(q);
} }
onTabPaneClick() { onTabPaneClick = (key) => {
// Only handle the back navigation if we're in question detail view const newIndex = Number(key);
if (this.state.showQuestion) { const { isSectionWise, activeSectionIndex, sectionDeadline, sections } = this.state;
this.updateAnswersForQuestion(this.state.activeDetailQuestion);
if (isSectionWise && newIndex !== activeSectionIndex) {
const timeLeft = sectionDeadline - Date.now();
if (timeLeft > 0) {
// ❌ Block navigation
return;
}
// ✅ Allow next section ONLY
if (newIndex === activeSectionIndex + 1) {
this.setState({ this.setState({
activeSectionIndex: newIndex,
sectionDeadline: sections[newIndex]?.section_duration
? Date.now() + sections[newIndex].section_duration * 60 * 1000
: null,
showQuestion: false, showQuestion: false,
activeDetailQuestion: {},
activeQuestionIndex: -1
}); });
} }
return;
} }
// Non section-wise exam
this.setState({
activeSectionIndex: newIndex,
showQuestion: false,
});
};
onGetExamAttempt() { onGetExamAttempt() {
var attemptId; var attemptId;
selectorService selectorService
@ -204,7 +327,48 @@ class AttemptExam extends React.Component {
item.questions = quest; item.questions = quest;
return item; return item;
}); });
this.setState({
// ✅ Detect section-wise timing
const isSectionWise = sections1.some(
sec => sec.section_duration && sec.section_duration > 0
);
// ⏱️ total exam duration in seconds
const totalExamSeconds = sections1.reduce(
(sum, sec) => sum + sec.section_duration * 60,
0
);
// ⏳ elapsed time
let elapsedSeconds = totalExamSeconds - result.time_left;
let activeSectionIndex = 0;
let sectionDeadline = null;
let lockedSections = [];
// Walk through sections using ELAPSED time
for (let i = 0; i < sections1.length; i++) {
const sectionTime = sections1[i].section_duration * 60;
if (elapsedSeconds >= sectionTime) {
// section already finished
elapsedSeconds -= sectionTime;
lockedSections.push(i);
continue;
}
// current active section
activeSectionIndex = i;
sectionDeadline =
Date.now() + (sectionTime - elapsedSeconds) * 1000;
break;
}
// ✅ Set initial state
this.setState(
{
attempt_id: attemptId, attempt_id: attemptId,
exam_id: result.exam_id, exam_id: result.exam_id,
exam_language: result.exam_language, exam_language: result.exam_language,
@ -213,7 +377,21 @@ class AttemptExam extends React.Component {
time_left: result.time_left, time_left: result.time_left,
deadline: Date.now() + result.time_left * 1000, deadline: Date.now() + result.time_left * 1000,
allQuestions: questionsArray, allQuestions: questionsArray,
});
isSectionWise,
activeSectionIndex,
sectionDeadline,
lockedSections,
},
() => {
// ✅ Auto-load first question of active section
const firstQuestion =
sections1[activeSectionIndex]?.questions[0];
if (firstQuestion) {
this.showDetailQuestion(firstQuestion);
}
}
);
}); });
}); });
} }
@ -275,14 +453,38 @@ class AttemptExam extends React.Component {
} }
}; };
callbackFunctionNext = (childData) => { callbackFunctionNext = (currentQuestion) => {
// ✅ Load next question const {
const q = childData; isSectionWise,
const indx = q.index; activeSectionIndex,
const nxtQuestion = this.state.allQuestions[indx]; sections,
this.showDetailQuestion(nxtQuestion); allQuestions,
} = this.state;
const currentIndex = currentQuestion.index - 1;
const nextQuestion = allQuestions[currentIndex + 1];
if (!nextQuestion) return;
// 🔐 SECTION-WISE HARD BLOCK
if (isSectionWise) {
const currentSectionQuestions =
sections[activeSectionIndex]?.questions || [];
const lastQuestionOfSection =
currentSectionQuestions[currentSectionQuestions.length - 1];
// ❌ Do NOT allow cross-section jump
if (lastQuestionOfSection?.id === currentQuestion.id) {
return;
}
}
// ✅ Safe to navigate
this.showDetailQuestion(nextQuestion);
}; };
callbackFunctionUpdateAnswer = (question) => { callbackFunctionUpdateAnswer = (question) => {
console.log("Answer Updated", question); console.log("Answer Updated", question);
} }
@ -358,14 +560,20 @@ class AttemptExam extends React.Component {
<QuestionDetail <QuestionDetail
totalQuestion={this.state.allQuestions.length} totalQuestion={this.state.allQuestions.length}
question={this.state.activeDetailQuestion} question={this.state.activeDetailQuestion}
updateAnswerCallback={this.callbackFunctionUpdateAnswer} isSectionWise={this.state.isSectionWise}
activeSectionIndex={this.state.activeSectionIndex}
sections={this.state.sections}
parentCallbackNext={this.callbackFunctionNext} parentCallbackNext={this.callbackFunctionNext}
parentCallback={this.callbackFunction} parentCallback={this.callbackFunction}
/> />
</div> </div>
); );
listItems = this.state.sections.map((item, index) => ( listItems = this.state.sections.map((item, index) => (
<TabPane tab={item.subject_name} key={index}> <TabPane tab={item.subject_name} key={index} disabled={
this.state.isSectionWise &&
index !== this.state.activeSectionIndex
}>
{this.state.showQuestion ? ( {this.state.showQuestion ? (
activeQuestion activeQuestion
) : ( ) : (
@ -608,11 +816,11 @@ class AttemptExam extends React.Component {
<Layout.Content style={{ marginLeft: '300px', padding: '0 24px', minHeight: 280, background: '#fff' }}> <Layout.Content style={{ marginLeft: '300px', padding: '0 24px', minHeight: 280, background: '#fff' }}>
<Layout className="create-exam-card" style={{ background: '#fff' }}> <Layout className="create-exam-card" style={{ background: '#fff' }}>
<Tabs <Tabs
defaultActiveKey="1" activeKey={String(this.state.activeSectionIndex)}
size="large" size="large"
type="line" type="line"
animated animated
onTabClick={this.onTabPaneClick.bind(this)} onTabClick={this.onTabPaneClick}
className="create-exam-tabs" className="create-exam-tabs"
> >
{listItems} {listItems}

View File

@ -24,14 +24,36 @@ class QuestionDetail extends React.Component {
} }
loadNextQuestion = () => { loadNextQuestion = () => {
const { isSectionWise } = this.props;
if (isSectionWise && this.isLastQuestionOfSection()) {
return; // ❌ hard stop
}
this.props.parentCallbackNext(this.props.question); this.props.parentCallbackNext(this.props.question);
}; };
onReviewQuestion = (val) => { onReviewQuestion = (val) => {
this.state.question.isReviewMarked = val; this.state.question.isReviewMarked = val;
this.sendData(this.state.question); this.sendData(this.state.question);
} }
isLastQuestionOfSection = () => {
const { question, sections, activeSectionIndex } = this.props;
if (!sections || activeSectionIndex === undefined) return false;
const currentSectionQuestions =
sections[activeSectionIndex]?.questions || [];
const lastQuestion =
currentSectionQuestions[currentSectionQuestions.length - 1];
return lastQuestion?.id === question.id;
};
onAnswerChange = (event) => { onAnswerChange = (event) => {
let questionType = this.state.question.type_code; let questionType = this.state.question.type_code;
let id = event.target.value; let id = event.target.value;
@ -202,11 +224,15 @@ class QuestionDetail extends React.Component {
<Button <Button
onClick={this.loadNextQuestion} onClick={this.loadNextQuestion}
type="primary" type="primary"
disabled={question.index >= totalQuestion} disabled={
question.index >= totalQuestion ||
(this.props.isSectionWise && this.isLastQuestionOfSection())
}
style={{ borderRadius: '6px' }} style={{ borderRadius: '6px' }}
> >
Next Question Next Question
</Button> </Button>
</div> </div>
</Col> </Col>
</Row> </Row>

View File

@ -134,6 +134,7 @@ const LiveExams = () => {
}} }}
dataSource={data} dataSource={data}
renderItem={(item) => ( renderItem={(item) => (
console.log("Rendering item:", item),
<List.Item> <List.Item>
<Card <Card
hoverable hoverable

View File

@ -859,8 +859,8 @@ function loadLiveExams(jsonObj) {
if (response.ok) { if (response.ok) {
return response.json(); return response.json();
} }
authenticationService.logout(); // authenticationService.logout();
window.location.reload(true); // window.location.reload(true);
}) })
.then((data) => { .then((data) => {
console.log(data); console.log(data);