@yinxe/opencode-tui-usage 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.jsx +55 -41
- package/package.json +1 -1
package/dist/usage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE;QACZ,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAC1C,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACnD,0BAA0B,IAAI,MAAM,EAAE,CAAC;QACvC,0BAA0B,IAAI,MAAM,EAAE,CAAC;KACxC,CAAC;IACF,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAIpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE;QACZ,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAC1C,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACnD,0BAA0B,IAAI,MAAM,EAAE,CAAC;QACvC,0BAA0B,IAAI,MAAM,EAAE,CAAC;KACxC,CAAC;IACF,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CA4N5D"}
|
package/dist/usage.jsx
CHANGED
|
@@ -39,19 +39,49 @@ export function UsageView(props) {
|
|
|
39
39
|
const [fetchError, setFetchError] = createSignal(null);
|
|
40
40
|
// 请求 ID 计数器,用于处理竞态条件
|
|
41
41
|
let currentRequestId = 0;
|
|
42
|
-
//
|
|
42
|
+
// 从 v1.0.0 恢复的刷新逻辑:只在 provider/model 组合变化时刷新
|
|
43
|
+
const doRefresh = () => {
|
|
44
|
+
const providerID = currentProvider();
|
|
45
|
+
if (!providerID)
|
|
46
|
+
return;
|
|
47
|
+
const requestId = ++currentRequestId;
|
|
48
|
+
setLoading(true);
|
|
49
|
+
setFetchError(null);
|
|
50
|
+
const supported = props.quotaService.setActiveProvider(providerID);
|
|
51
|
+
setProviderSupported(supported);
|
|
52
|
+
if (!supported) {
|
|
53
|
+
setResult(null);
|
|
54
|
+
setLoading(false);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
props.quotaService.fetchQuota().then((data) => {
|
|
58
|
+
if (requestId !== currentRequestId)
|
|
59
|
+
return;
|
|
60
|
+
if (data && data.quota) {
|
|
61
|
+
setResult(data);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
setResult(null);
|
|
65
|
+
}
|
|
66
|
+
setLoading(false);
|
|
67
|
+
}).catch((error) => {
|
|
68
|
+
if (requestId !== currentRequestId)
|
|
69
|
+
return;
|
|
70
|
+
console.error("[UsageView] Failed to fetch quota:", error);
|
|
71
|
+
setFetchError(String(error));
|
|
72
|
+
setResult(null);
|
|
73
|
+
setLoading(false);
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
// Effect 1: 检测 session 消息,提取 provider/model
|
|
43
77
|
createEffect(() => {
|
|
44
78
|
const sessionId = props.sessionId;
|
|
45
79
|
const messages = props.api.state.session.messages(sessionId);
|
|
46
|
-
const requestId = ++currentRequestId;
|
|
47
|
-
// 无消息时重置状态
|
|
48
80
|
if (!messages || messages.length === 0) {
|
|
49
81
|
setCurrentProvider(null);
|
|
50
82
|
setCurrentModel(null);
|
|
51
83
|
setFetchError(null);
|
|
52
84
|
setProviderSupported(false);
|
|
53
|
-
setResult(null);
|
|
54
|
-
setLoading(false);
|
|
55
85
|
return;
|
|
56
86
|
}
|
|
57
87
|
// 从后向前查找最后一个 assistant 消息
|
|
@@ -67,63 +97,47 @@ export function UsageView(props) {
|
|
|
67
97
|
setCurrentModel(null);
|
|
68
98
|
setFetchError(null);
|
|
69
99
|
setProviderSupported(false);
|
|
70
|
-
setResult(null);
|
|
71
|
-
setLoading(false);
|
|
72
100
|
return;
|
|
73
101
|
}
|
|
74
|
-
// 检查 providerID 类型是否正确
|
|
75
102
|
if (!("providerID" in lastAssistantMsg) || typeof lastAssistantMsg.providerID !== "string") {
|
|
76
103
|
setCurrentProvider(null);
|
|
77
104
|
setCurrentModel(null);
|
|
78
105
|
setFetchError(null);
|
|
79
106
|
setProviderSupported(false);
|
|
80
|
-
setResult(null);
|
|
81
|
-
setLoading(false);
|
|
82
107
|
return;
|
|
83
108
|
}
|
|
84
109
|
const providerID = lastAssistantMsg.providerID;
|
|
85
110
|
const modelID = "modelID" in lastAssistantMsg && typeof lastAssistantMsg.modelID === "string"
|
|
86
111
|
? lastAssistantMsg.modelID
|
|
87
112
|
: "";
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
// 检查是否真的发生了变化
|
|
114
|
+
if (providerID !== currentProvider() || modelID !== currentModel()) {
|
|
115
|
+
setCurrentProvider(providerID);
|
|
116
|
+
setCurrentModel(modelID);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// Effect 2: 监听 provider 变化,触发额度获取
|
|
120
|
+
createEffect(() => {
|
|
121
|
+
const providerID = currentProvider();
|
|
122
|
+
if (!providerID) {
|
|
96
123
|
setResult(null);
|
|
97
124
|
setLoading(false);
|
|
125
|
+
setProviderSupported(false);
|
|
98
126
|
return;
|
|
99
127
|
}
|
|
100
|
-
|
|
101
|
-
.then((data) => {
|
|
102
|
-
// 忽略过期响应(provider 已切换)
|
|
103
|
-
if (requestId !== currentRequestId)
|
|
104
|
-
return;
|
|
105
|
-
if (data && data.quota) {
|
|
106
|
-
setResult(data);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
setResult(null);
|
|
110
|
-
}
|
|
111
|
-
setLoading(false);
|
|
112
|
-
})
|
|
113
|
-
.catch((error) => {
|
|
114
|
-
if (requestId !== currentRequestId)
|
|
115
|
-
return;
|
|
116
|
-
console.error("[UsageView] Failed to fetch quota:", error);
|
|
117
|
-
setFetchError(String(error));
|
|
118
|
-
setResult(null);
|
|
119
|
-
setLoading(false);
|
|
120
|
-
});
|
|
128
|
+
doRefresh();
|
|
121
129
|
});
|
|
122
|
-
//
|
|
130
|
+
// Effect 3: 倒计时定时器,归零时触发刷新
|
|
123
131
|
createEffect(() => {
|
|
124
132
|
setRefreshCountdown(REFRESH_INTERVAL);
|
|
125
133
|
const id = setInterval(() => {
|
|
126
|
-
setRefreshCountdown((r) =>
|
|
134
|
+
setRefreshCountdown((r) => {
|
|
135
|
+
if (r <= 1) {
|
|
136
|
+
doRefresh();
|
|
137
|
+
return REFRESH_INTERVAL;
|
|
138
|
+
}
|
|
139
|
+
return r - 1;
|
|
140
|
+
});
|
|
127
141
|
}, 1000);
|
|
128
142
|
onCleanup(() => clearInterval(id));
|
|
129
143
|
});
|