@@ -12,6 +12,7 @@ import {
1212 Shield01Icon ,
1313} from " @hugeicons/core-free-icons" ;
1414import { getContext } from " svelte" ;
15+ import { onDestroy } from " svelte" ;
1516
1617const getGlobalState = getContext <() => GlobalState >(" globalState" );
1718const setGlobalState =
@@ -26,6 +27,7 @@ let tapCount = $state(0);
2627let lastTapTime = $state (0 );
2728let isRetrying = $state (false );
2829let retryMessage = $state (" " );
30+ let timeoutId: ReturnType <typeof setTimeout > | null = null ;
2931
3032function showDeleteConfirmation() {
3133 isDeleteConfirmationOpen = true ;
@@ -48,23 +50,28 @@ function cancelDelete() {
4850 isFinalConfirmationOpen = false ;
4951}
5052
53+ // Cleanup on unmount
54+ onDestroy (() => {
55+ if (timeoutId ) clearTimeout (timeoutId );
56+ });
57+
5158async function handleVersionTap() {
5259 const now = Date .now ();
5360
54- // Reset counter if more than 3 seconds between taps
61+ // Reset if more than 3s between taps
5562 if (now - lastTapTime > 3000 ) {
5663 tapCount = 0 ;
5764 }
5865
5966 tapCount ++ ;
6067 lastTapTime = now ;
6168
62- // Show tap count feedback (only visible to user)
69+ // Show feedback after 5 taps
6370 if (tapCount >= 5 ) {
6471 retryMessage = ` Taps: ${tapCount }/10 ` ;
6572 }
6673
67- // Trigger eVault profile retry after 10 taps
74+ // Trigger hidden action at 10 taps
6875 if (tapCount === 10 ) {
6976 isRetrying = true ;
7077 retryMessage = " Retrying eVault profile setup..." ;
@@ -73,8 +80,10 @@ async function handleVersionTap() {
7380 await globalState .vaultController .retryProfileCreation ();
7481 retryMessage = " ✅ eVault profile setup completed successfully!" ;
7582
76- // Reset after success
77- setTimeout (() => {
83+ // Clear previous timeout if exists
84+ if (timeoutId ) clearTimeout (timeoutId );
85+
86+ timeoutId = setTimeout (() => {
7887 tapCount = 0 ;
7988 retryMessage = " " ;
8089 isRetrying = false ;
@@ -84,8 +93,10 @@ async function handleVersionTap() {
8493 retryMessage =
8594 " ❌ Failed to setup eVault profile. Check console for details." ;
8695
87- // Reset after error
88- setTimeout (() => {
96+ // Clear previous timeout if exists
97+ if (timeoutId ) clearTimeout (timeoutId );
98+
99+ timeoutId = setTimeout (() => {
89100 tapCount = 0 ;
90101 retryMessage = " " ;
91102 isRetrying = false ;
@@ -146,59 +157,63 @@ $effect(() => {
146157</main >
147158
148159<!-- First Confirmation Drawer -->
149- <Drawer bind:isPaneOpen ={isDeleteConfirmationOpen }>
150- <div class =" text-center" >
151- <h4 class =" mt-[2.3svh] mb-[0.5svh] text-red-600" >
152- ⚠️ Delete Account Warning
153- </h4 >
154- <p class =" text-black-700 mb-4" >
155- Are you sure you want to delete your account? This action will:
156- </p >
157- <ul class =" text-left text-black-700 mb-6 space-y-2" >
158- <li >• Permanently delete all your personal data</li >
159- <li >• Remove your ePassport and eVault access</li >
160- <li >• Delete your eName and all associated credentials</li >
161- <li >• Make your data inaccessible within 24 hours</li >
162- <li >• This action cannot be undone</li >
163- </ul >
164- <div class =" flex gap-3" >
165- <ButtonAction class ="flex-1" callback ={cancelDelete }
166- >Cancel</ButtonAction
167- >
168- <ButtonAction
169- class =" flex-1 bg-red-600 hover:bg-red-700"
170- callback ={confirmDelete }>Continue</ButtonAction
171- >
160+ {#if isDeleteConfirmationOpen }
161+ <Drawer bind:isPaneOpen ={isDeleteConfirmationOpen }>
162+ <div class =" text-center" >
163+ <h4 class =" mt-[2.3svh] mb-[0.5svh] text-red-600" >
164+ ⚠️ Delete Account Warning
165+ </h4 >
166+ <p class =" text-black-700 mb-4" >
167+ Are you sure you want to delete your account? This action will:
168+ </p >
169+ <ul class =" text-left text-black-700 mb-6 space-y-2" >
170+ <li >• Permanently delete all your personal data</li >
171+ <li >• Remove your ePassport and eVault access</li >
172+ <li >• Delete your eName and all associated credentials</li >
173+ <li >• Make your data inaccessible within 24 hours</li >
174+ <li >• This action cannot be undone</li >
175+ </ul >
176+ <div class =" flex gap-3" >
177+ <ButtonAction class ="flex-1" callback ={cancelDelete }
178+ >Cancel</ButtonAction
179+ >
180+ <ButtonAction
181+ class =" flex-1 bg-red-600 hover:bg-red-700"
182+ callback ={confirmDelete }>Continue</ButtonAction
183+ >
184+ </div >
172185 </div >
173- </div >
174- </ Drawer >
186+ </Drawer >
187+ { /if }
175188
176189<!-- Final Confirmation Drawer -->
177- <Drawer bind:isPaneOpen ={isFinalConfirmationOpen }>
178- <div class =" text-center" >
179- <h4 class =" mt-[2.3svh] mb-[0.5svh] text-red-600" >
180- 🚨 Final Confirmation
181- </h4 >
182- <p class =" text-black-700 mb-4" >
183- This is your final warning. Once you confirm:
184- </p >
185- <div class =" bg-red-50 border border-red-200 rounded-md p-4 mb-6" >
186- <p class =" text-red-800 font-medium" >
187- All your data will be permanently deleted and you will lose
188- access to your ePassport, eVault, and eName forever.
190+ {#if isFinalConfirmationOpen }
191+ <Drawer bind:isPaneOpen ={isFinalConfirmationOpen }>
192+ <div class =" text-center" >
193+ <h4 class =" mt-[2.3svh] mb-[0.5svh] text-red-600" >
194+ 🚨 Final Confirmation
195+ </h4 >
196+ <p class =" text-black-700 mb-4" >
197+ This is your final warning. Once you confirm:
189198 </p >
199+ <div class =" bg-red-50 border border-red-200 rounded-md p-4 mb-6" >
200+ <p class =" text-red-800 font-medium" >
201+ All your data will be permanently deleted and you will lose
202+ access to your ePassport, eVault, and eName forever.
203+ </p >
204+ </div >
205+ <p class =" text-black-700 mb-6" >
206+ Are you absolutely certain you want to proceed?
207+ </p >
208+ <div class =" flex gap-3" >
209+ <ButtonAction class ="flex-1" callback ={cancelDelete }
210+ >Cancel</ButtonAction
211+ >
212+ <ButtonAction
213+ class =" flex-1 bg-red-600 hover:bg-red-700"
214+ callback ={nukeWallet }>Delete</ButtonAction
215+ >
216+ </div >
190217 </div >
191- <p class =" text-black-700 mb-6" >
192- Are you absolutely certain you want to proceed?
193- </p >
194- <div class =" flex gap-3" >
195- <ButtonAction class ="flex-1" callback ={cancelDelete }
196- >Cancel</ButtonAction
197- >
198- <ButtonAction
199- class =" flex-1 bg-red-600 hover:bg-red-700"
200- callback ={nukeWallet }>Delete</ButtonAction
201- >
202- </div >
203- </div >
204- </Drawer >
218+ </Drawer >
219+ {/if }
0 commit comments