|
28 | 28 | let commentInput: HTMLInputElement | undefined = $state(); |
29 | 29 | let isCommentsLoading = $state(false); |
30 | 30 | let commentsError = $state<string | null>(null); |
| 31 | + let isDrawerOpen = $state(false); |
31 | 32 |
|
32 | 33 | const sentinel = (node: HTMLElement) => { |
33 | 34 | const observer = new IntersectionObserver( |
|
203 | 204 | activePostId.set(post.id); |
204 | 205 | if (window.matchMedia('(max-width: 768px)').matches) { |
205 | 206 | showComments.value = true; |
| 207 | + isDrawerOpen = true; |
206 | 208 | drawer?.present({ animate: true }); |
207 | 209 | } else { |
208 | 210 | showComments.value = true; |
|
215 | 217 | </li> |
216 | 218 | {/each} |
217 | 219 | {#if $isLoadingMore} |
218 | | - <li class="my-4 flex flex-col items-center justify-center gap-2"> |
219 | | - <span class="text-center">Loading more posts...</span> |
220 | | - <div |
221 | | - class="h-6 w-6 animate-spin rounded-full border-2 border-gray-400 border-t-transparent" |
222 | | - ></div> |
223 | | - </li> |
| 220 | + <li class="my-4 text-center">Loading more posts...</li> |
224 | 221 | {/if} |
225 | 222 | {#if !$hasMore && $posts.length > 0 && !$isLoadingMore} |
226 | 223 | <li class="my-4 text-center text-gray-500">No more posts to load</li> |
|
237 | 234 | <p class="text-center">Select a post to view comments</p> |
238 | 235 | </div> |
239 | 236 | {:else} |
240 | | - <ul class="pb-4"> |
241 | | - <h3 class="text-black-600 mb-6 text-center"> |
242 | | - {$comments.length} Comments |
243 | | - </h3> |
244 | | - {#if isCommentsLoading} |
245 | | - <li class="text-center text-gray-500">Loading comments...</li> |
246 | | - {:else if commentsError} |
247 | | - <li class="text-center text-red-500">{commentsError}</li> |
248 | | - {:else} |
| 237 | + <h3 class="text-black-600 mb-6 text-center"> |
| 238 | + {$comments.length} Comments |
| 239 | + </h3> |
| 240 | + {#if isCommentsLoading} |
| 241 | + <p class="text-center text-gray-500">Loading comments...</p> |
| 242 | + {:else if commentsError} |
| 243 | + <p class="text-center text-red-500">{commentsError}</p> |
| 244 | + {:else} |
| 245 | + <ul> |
249 | 246 | {#each $comments as comment (comment.id)} |
250 | 247 | <li class="mb-4"> |
251 | 248 | <Comment |
|
266 | 263 | /> |
267 | 264 | </li> |
268 | 265 | {/each} |
269 | | - {/if} |
270 | | - <MessageInput |
271 | | - class="sticky start-0 bottom-4 mt-4 w-full px-2" |
272 | | - variant="comment" |
273 | | - src={profile?.avatarUrl ?? '/images/user.png'} |
274 | | - bind:value={commentValue} |
275 | | - {handleSend} |
276 | | - bind:input={commentInput} |
277 | | - /> |
278 | | - </ul> |
| 266 | + </ul> |
| 267 | + {/if} |
| 268 | + <MessageInput |
| 269 | + class="sticky start-0 bottom-4 mt-4 w-full px-2" |
| 270 | + variant="comment" |
| 271 | + src={profile?.avatarUrl ?? '/images/user.png'} |
| 272 | + bind:value={commentValue} |
| 273 | + {handleSend} |
| 274 | + bind:input={commentInput} |
| 275 | + /> |
279 | 276 | {/if} |
280 | 277 | {/snippet} |
281 | 278 |
|
282 | 279 | <!-- Mobile Comments Drawer --> |
283 | | - <Drawer bind:drawer> |
284 | | - <ul class="pb-4"> |
285 | | - <h3 class="text-black-600 mb-6 text-center">{$comments.length} Comments</h3> |
286 | | - {#if isCommentsLoading} |
287 | | - <li class="text-center text-gray-500">Loading comments...</li> |
288 | | - {:else if commentsError} |
289 | | - <li class="text-center text-red-500">{commentsError}</li> |
290 | | - {:else} |
| 280 | + <Drawer |
| 281 | + bind:drawer |
| 282 | + onClose={() => { |
| 283 | + isDrawerOpen = false; |
| 284 | + showComments.value = false; |
| 285 | + }} |
| 286 | + > |
| 287 | + <h3 class="text-black-600 mb-6 text-center">{$comments.length} Comments</h3> |
| 288 | + {#if isCommentsLoading} |
| 289 | + <p class="text-center text-gray-500">Loading comments...</p> |
| 290 | + {:else if commentsError} |
| 291 | + <p class="text-center text-red-500">{commentsError}</p> |
| 292 | + {:else} |
| 293 | + <ul class="pb-32"> |
291 | 294 | {#each $comments as comment (comment.id)} |
292 | 295 | <li class="mb-4"> |
293 | 296 | <Comment |
|
308 | 311 | /> |
309 | 312 | </li> |
310 | 313 | {/each} |
311 | | - {/if} |
| 314 | + </ul> |
| 315 | + {/if} |
| 316 | + </Drawer> |
| 317 | + |
| 318 | + {#if showComments.value && isDrawerOpen} |
| 319 | + <div |
| 320 | + class="fixed right-0 bottom-0 left-0 z-50 border-t border-gray-200 bg-white px-5 py-4 md:hidden" |
| 321 | + > |
312 | 322 | <MessageInput |
313 | | - class="fixed start-0 bottom-4 mt-4 w-full px-5" |
| 323 | + class="w-full" |
314 | 324 | variant="comment" |
315 | 325 | src={profile?.avatarUrl ?? '/images/user.png'} |
316 | 326 | bind:value={commentValue} |
317 | 327 | {handleSend} |
318 | 328 | bind:input={commentInput} |
319 | 329 | /> |
320 | | - </ul> |
321 | | - </Drawer> |
| 330 | + </div> |
| 331 | + {/if} |
322 | 332 | </MainPanel> |
0 commit comments