## 当前状态 - 插件界面已完成重命名 (cursorpro → hummingbird) - 双账号池 UI 已实现 (Auto/Pro 卡片) - 后端已切换到 MySQL 数据库 - 添加了 Cursor 官方用量 API 文档 ## 已知问题 (待修复) 1. 激活时检查账号导致无账号时激活失败 2. 未启用无感换号时不应获取账号 3. 账号用量模块不显示 (seamless 未启用时应隐藏) 4. 积分显示为 0 (后端未正确返回) 5. Auto/Pro 双密钥逻辑混乱,状态不同步 6. 账号添加后无自动分析功能 ## 下一版本计划 - 重构数据模型,优化账号状态管理 - 实现 Cursor API 自动分析账号 - 修复激活流程,不依赖账号 - 启用无感时才分配账号 - 完善账号用量实时显示 ## 文件说明 - docs/系统设计文档.md - 完整架构设计 - cursor 官方用量接口.md - Cursor API 文档 - 参考计费/ - Vibeviewer 开源项目参考 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
63 lines
2.0 KiB
Swift
63 lines
2.0 KiB
Swift
import SwiftUI
|
|
import VibeviewerShareUI
|
|
import VibeviewerAppEnvironment
|
|
import VibeviewerModel
|
|
import VibeviewerSettingsUI
|
|
|
|
struct MenuFooterView: View {
|
|
@Environment(\.dashboardRefreshService) private var refresher
|
|
@Environment(\.settingsWindowManager) private var settingsWindow
|
|
@Environment(AppSession.self) private var session
|
|
|
|
let onRefresh: () -> Void
|
|
|
|
var body: some View {
|
|
HStack(alignment: .center, spacing: 12) {
|
|
Button {
|
|
settingsWindow.show()
|
|
} label: {
|
|
Image(systemName: "gear")
|
|
.font(.system(size: 14))
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
.buttonStyle(.plain)
|
|
|
|
// 显示会员类型徽章
|
|
if let membershipType = session.snapshot?.usageSummary?.membershipType {
|
|
MembershipBadge(
|
|
membershipType: membershipType,
|
|
isEnterpriseUser: session.credentials?.isEnterpriseUser ?? false
|
|
)
|
|
}
|
|
|
|
Spacer()
|
|
|
|
Button {
|
|
onRefresh()
|
|
} label: {
|
|
HStack(spacing: 4) {
|
|
if refresher.isRefreshing {
|
|
ProgressView()
|
|
.controlSize(.mini)
|
|
.progressViewStyle(.circular)
|
|
.tint(.white)
|
|
.frame(width: 16, height: 16)
|
|
}
|
|
Text("Refresh")
|
|
.font(.app(.satoshiMedium, size: 12))
|
|
}
|
|
}
|
|
.buttonStyle(.vibe(Color(hex: "5B67E2").opacity(0.8)))
|
|
.animation(.easeInOut(duration: 0.2), value: refresher.isRefreshing)
|
|
|
|
Button {
|
|
NSApplication.shared.terminate(nil)
|
|
} label: {
|
|
Text("Quit")
|
|
.font(.app(.satoshiMedium, size: 12))
|
|
}
|
|
.buttonStyle(.vibe(Color(hex: "F58283").opacity(0.8)))
|
|
}
|
|
}
|
|
}
|