feat(stream): friendlier pagination loading + error retry
All checks were successful
Deploy to Frontend Servers / deploy (push) Successful in 29s

- Replace the bare '…' loading dots at the bottom of the post stream
  with a skeleton bubble that matches the initial-load placeholders, so
  pagination feels like content arriving instead of a frozen indicator.
- Localize the retry control via new 'retry' / 'loadMoreFailed' keys
  across all 7 locales and surface a user-friendly error string instead
  of the raw exception message.
- Retry button now picks reset() vs loadMore() based on item count so a
  pagination failure only refetches the next page, not the whole stream.
- When a banner deep-link can't find its target post and pagination
  errors, break out of the retry loop and release the scroll lock so the
  user sees the inline retry instead of an endless freeze.

Verified in the browser: zh-CN renders '加载更多资料失败,请检查网络后重试。'
with a '重试' button; banner clicks with empty / '#' / 'javascript:' /
null linkUrls render no anchor and do not navigate.
This commit is contained in:
TerryM
2026-06-02 11:39:17 +08:00
parent 7ed9f8c8bf
commit 387b25f1e3
8 changed files with 42 additions and 9 deletions

View File

@@ -126,6 +126,9 @@ export const enDict: Dict = {
tagsCommaLabel: "Tags (comma-separated)",
uploadFile: "Upload",
loading: "Loading…",
loadMoreFailed:
"Couldn't load more posts. Check your connection and try again.",
retry: "Retry",
paginationPrev: "Previous",
paginationNext: "Next",
listRange: "Showing {{from}}{{to}} of {{total}}",

View File

@@ -126,6 +126,9 @@ export const idDict: Dict = {
tagsCommaLabel: "Tag (dipisahkan koma)",
uploadFile: "Unggah",
loading: "Memuat…",
loadMoreFailed:
"Gagal memuat lebih banyak. Periksa koneksi Anda dan coba lagi.",
retry: "Coba lagi",
paginationPrev: "Sebelumnya",
paginationNext: "Berikutnya",
listRange: "Menampilkan {{from}}{{to}} dari {{total}}",

View File

@@ -127,6 +127,9 @@ export const jaDict: Dict = {
tagsCommaLabel: "タグ(カンマ区切り)",
uploadFile: "アップロード",
loading: "読み込み中…",
loadMoreFailed:
"追加の読み込みに失敗しました。接続を確認してやり直してください。",
retry: "再試行",
paginationPrev: "前へ",
paginationNext: "次へ",
listRange: "{{from}}{{to}} / 全 {{total}} 件",

View File

@@ -126,6 +126,8 @@ export const koDict: Dict = {
tagsCommaLabel: "태그 (쉼표로 구분)",
uploadFile: "업로드",
loading: "로딩 중…",
loadMoreFailed: "더 불러오지 못했습니다. 연결을 확인하고 다시 시도하세요.",
retry: "다시 시도",
paginationPrev: "이전",
paginationNext: "다음",
listRange: "{{from}}{{to}} / 총 {{total}}건",

View File

@@ -126,6 +126,8 @@ export const msDict: Dict = {
tagsCommaLabel: "Tag (dipisahkan koma)",
uploadFile: "Muat naik",
loading: "Memuatkan…",
loadMoreFailed: "Gagal memuatkan lagi. Sila semak sambungan dan cuba lagi.",
retry: "Cuba lagi",
paginationPrev: "Sebelum",
paginationNext: "Seterusnya",
listRange: "Menunjukkan {{from}}{{to}} daripada {{total}}",

View File

@@ -126,6 +126,8 @@ export const viDict: Dict = {
tagsCommaLabel: "Thẻ (cách nhau bằng dấu phẩy)",
uploadFile: "Tải lên",
loading: "Đang tải…",
loadMoreFailed: "Không thể tải thêm bài. Hãy kiểm tra kết nối và thử lại.",
retry: "Thử lại",
paginationPrev: "Trước",
paginationNext: "Sau",
listRange: "Hiển thị {{from}}{{to}} trên {{total}}",

View File

@@ -124,6 +124,8 @@ export const zhDict: Dict = {
tagsCommaLabel: "标签(逗号分隔)",
uploadFile: "上传文件",
loading: "加载中…",
loadMoreFailed: "加载更多资料失败,请检查网络后重试。",
retry: "重试",
paginationPrev: "上一页",
paginationNext: "下一页",
listRange: "显示 {{from}}{{to}},共 {{total}} 条",