|
33 | 33 |
|
34 | 34 | loading = true; |
35 | 35 | try { |
36 | | - const loaded = await supabaseAuth.loadGameFromCloud(); |
37 | | - if (loaded) { |
| 36 | + const loadedState = await supabaseAuth.loadGameFromCloud(); |
| 37 | + if (loadedState) { |
| 38 | + gameManager.loadSaveData(loadedState); |
38 | 39 | success({ title: 'Recovery Successful', message: 'Your game has been loaded from the cloud save.' }); |
39 | 40 | saveRecovery.clearError(); |
40 | 41 | onClose(); |
|
57 | 58 | title: 'New Game', |
58 | 59 | message: 'A new game has been started. Your corrupted save has been backed up.', |
59 | 60 | duration: 5000, |
60 | | - icon: RefreshCw |
| 61 | + icon: RefreshCw, |
61 | 62 | }); |
62 | 63 | saveRecovery.clearError(); |
63 | 64 | onClose(); |
|
78 | 79 | }); |
79 | 80 | </script> |
80 | 81 |
|
81 | | -<Modal onClose={handleDismiss} title="Save Recovery" width="sm"> |
| 82 | +<Modal |
| 83 | + onClose={handleDismiss} |
| 84 | + title="Save Recovery" |
| 85 | + width="sm" |
| 86 | +> |
82 | 87 | <div class="flex flex-col gap-6"> |
83 | 88 | <!-- Error Banner --> |
84 | 89 | <div class="flex items-start gap-4 rounded-xl bg-red-500/20 p-4 border border-red-500/30"> |
85 | | - <AlertTriangle size={32} class="shrink-0 text-red-400 mt-0.5" /> |
| 90 | + <AlertTriangle |
| 91 | + size={32} |
| 92 | + class="shrink-0 text-red-400 mt-0.5" |
| 93 | + /> |
86 | 94 | <div class="flex-1"> |
87 | 95 | <h3 class="text-lg font-bold text-red-300">Save Load Error</h3> |
88 | 96 | <p class="mt-1 text-red-200/80"> |
|
94 | 102 | <!-- Technical Details (collapsible) --> |
95 | 103 | {#if $saveRecovery.errorDetails} |
96 | 104 | <details class="rounded-lg bg-black/30 border border-white/10"> |
97 | | - <summary class="cursor-pointer px-4 py-3 text-sm text-white/60 hover:text-white/80"> |
98 | | - Technical Details |
99 | | - </summary> |
| 105 | + <summary class="cursor-pointer px-4 py-3 text-sm text-white/60 hover:text-white/80"> Technical Details </summary> |
100 | 106 | <div class="px-4 pb-4"> |
101 | 107 | <code class="block whitespace-pre-wrap break-all text-xs text-white/50 font-mono bg-black/20 p-2 rounded"> |
102 | 108 | {$saveRecovery.errorDetails} |
|
108 | 114 | <!-- Backup Info --> |
109 | 115 | {#if $saveRecovery.backupKey} |
110 | 116 | <div class="flex items-center gap-3 rounded-lg bg-green-500/10 border border-green-500/20 px-4 py-3"> |
111 | | - <Database size={20} class="text-green-400" /> |
| 117 | + <Database |
| 118 | + size={20} |
| 119 | + class="text-green-400" |
| 120 | + /> |
112 | 121 | <div class="flex-1"> |
113 | 122 | <p class="text-sm text-green-300">A backup of your save has been created.</p> |
114 | 123 | <p class="text-xs text-green-400/60 mt-0.5">Key: {$saveRecovery.backupKey}</p> |
|
127 | 136 | onclick={handleLoadFromCloud} |
128 | 137 | > |
129 | 138 | <div class="flex h-12 w-12 items-center justify-center rounded-lg bg-accent/30"> |
130 | | - <CloudDownload size={24} class="text-accent-300" /> |
| 139 | + <CloudDownload |
| 140 | + size={24} |
| 141 | + class="text-accent-300" |
| 142 | + /> |
131 | 143 | </div> |
132 | 144 | <div class="flex-1"> |
133 | 145 | <div class="font-semibold text-white">Load from Cloud</div> |
|
140 | 152 | </div> |
141 | 153 | </div> |
142 | 154 | {#if loading} |
143 | | - <RefreshCw size={20} class="animate-spin text-accent-300" /> |
| 155 | + <RefreshCw |
| 156 | + size={20} |
| 157 | + class="animate-spin text-accent-300" |
| 158 | + /> |
144 | 159 | {/if} |
145 | 160 | </button> |
146 | 161 |
|
|
150 | 165 | onclick={handleStartFresh} |
151 | 166 | > |
152 | 167 | <div class="flex h-12 w-12 items-center justify-center rounded-lg bg-white/10"> |
153 | | - <RefreshCw size={24} class="text-white/70" /> |
| 168 | + <RefreshCw |
| 169 | + size={24} |
| 170 | + class="text-white/70" |
| 171 | + /> |
154 | 172 | </div> |
155 | 173 | <div class="flex-1"> |
156 | 174 | <div class="font-semibold text-white">Start Fresh</div> |
157 | | - <div class="text-sm text-white/60"> |
158 | | - Begin a new game. Your old save is backed up. |
159 | | - </div> |
| 175 | + <div class="text-sm text-white/60">Begin a new game. Your old save is backed up.</div> |
160 | 176 | </div> |
161 | 177 | </button> |
162 | 178 |
|
|
166 | 182 | onclick={handleDismiss} |
167 | 183 | > |
168 | 184 | <div class="flex h-12 w-12 items-center justify-center rounded-lg bg-red-500/20"> |
169 | | - <Trash2 size={24} class="text-red-400" /> |
| 185 | + <Trash2 |
| 186 | + size={24} |
| 187 | + class="text-red-400" |
| 188 | + /> |
170 | 189 | </div> |
171 | 190 | <div class="flex-1"> |
172 | 191 | <div class="font-semibold text-red-300">Continue Anyway</div> |
173 | | - <div class="text-sm text-red-200/60"> |
174 | | - Try to play with the current state. Not recommended. |
175 | | - </div> |
| 192 | + <div class="text-sm text-red-200/60">Try to play with the current state. Not recommended.</div> |
176 | 193 | </div> |
177 | 194 | </button> |
178 | 195 | </div> |
179 | 196 |
|
180 | 197 | <!-- Warning --> |
181 | | - <p class="text-center text-xs text-white/40"> |
182 | | - We recommend loading from cloud or starting fresh to avoid further issues. |
183 | | - </p> |
| 198 | + <p class="text-center text-xs text-white/40">We recommend loading from cloud or starting fresh to avoid further issues.</p> |
184 | 199 | </div> |
185 | 200 | </Modal> |
186 | 201 |
|
187 | 202 | {#if showLoginModal} |
188 | | - <Login onClose={() => { |
189 | | - showLoginModal = false; |
190 | | - // Re-check authentication after login |
191 | | - if (supabaseAuth.isAuthenticated) { |
192 | | - handleLoadFromCloud(); |
193 | | - } |
194 | | - }} /> |
| 203 | + <Login |
| 204 | + onClose={() => { |
| 205 | + showLoginModal = false; |
| 206 | + // Re-check authentication after login |
| 207 | + if (supabaseAuth.isAuthenticated) { |
| 208 | + handleLoadFromCloud(); |
| 209 | + } |
| 210 | + }} |
| 211 | + /> |
195 | 212 | {/if} |
0 commit comments