fix: stabilize web registration and asset loading

This commit is contained in:
2026-08-01 20:18:47 +08:00
parent bcdaa737eb
commit 7a07f52e2c
17 changed files with 1085 additions and 20 deletions

View File

@@ -14,6 +14,7 @@ const ICON_SCRIPT: Script = preload("res://scenes/ui/SettingsPanelIcon.gd")
const TOGGLE_SCRIPT: Script = preload("res://scenes/ui/SettingsToggle.gd")
const SLIDER_SCRIPT: Script = preload("res://scenes/ui/SettingsSlider.gd")
const BADGE_TEXTURE_PATH: String = "res://assets/ui/settings/settings_whale_badge_asset_v1.png"
const WebFilePicker = preload("res://_Core/utils/WebFilePicker.gd")
const TEXT_COLOR: Color = Color(0.188, 0.294, 0.424)
const MUTED_COLOR: Color = Color(0.560, 0.639, 0.733)
@@ -22,6 +23,7 @@ const SOFT_BLUE: Color = Color(0.918, 0.961, 0.992, 0.92)
const DANGER_COLOR: Color = Color(0.894, 0.392, 0.357)
const MOVEMENT_ACTIONS: Array[String] = ["move_left", "move_right", "move_up", "move_down"]
const AVATAR_NATIVE_FILE_FILTERS: Array[String] = ["*.png,*.jpg,*.jpeg,*.webp"]
const WEB_FILE_MAX_BYTES: int = 8 * 1024 * 1024
const CATEGORIES: Array[Dictionary] = [
{"id": "basic", "label": "基础", "icon": "basic"},
@@ -71,6 +73,7 @@ var _savedSettings: Dictionary = DEFAULT_SETTINGS.duplicate(true)
var _isOpen: bool = false
var _transitionTween: Tween
var _avatarUploadPending: bool = false
var _webFilePicker: RefCounted = WebFilePicker.new()
func _ready() -> void:
visible = false
@@ -976,6 +979,9 @@ func _on_reconnect_pressed() -> void:
_statusLabel.text = "已请求重新连接聊天服务"
func _on_upload_avatar_pressed() -> void:
if _try_open_web_avatar_file_picker():
_set_account_status("请选择头像图片")
return
if _open_macos_avatar_file_dialog():
return
if _try_open_native_avatar_file_picker():
@@ -983,6 +989,27 @@ func _on_upload_avatar_pressed() -> void:
return
_set_account_status("系统文件选择器暂时不可用")
func _try_open_web_avatar_file_picker() -> bool:
if OS.get_name() != "Web" or _webFilePicker == null:
return false
return bool(_webFilePicker.call("open", ".png,.jpg,.jpeg,.webp", WEB_FILE_MAX_BYTES, _on_web_avatar_file_selected))
func _on_web_avatar_file_selected(status: String, fileName: String, _mimeType: String, base64Data: String) -> void:
if status == "cancel":
_set_account_status("已取消头像选择")
return
if status == "too_large":
_set_account_status("头像图片不能超过8MB")
return
if status != "ok":
_set_account_status("浏览器读取头像失败")
return
var path := WebFilePicker.save_base64_file(base64Data, fileName, "avatar")
if path.is_empty():
_set_account_status("头像图片暂存失败")
return
_on_avatar_file_selected(path)
func _try_open_native_avatar_file_picker() -> bool:
if DisplayServer.get_name() == "headless":
return false