feat: 更新 @riwa/api-types 依赖至 0.0.89,优化交易对和图表组件

This commit is contained in:
2026-01-08 00:02:56 +07:00
parent d3285363f0
commit babd307b60
5 changed files with 30 additions and 19 deletions

View File

@@ -34,7 +34,7 @@
"@elysiajs/eden": "^1.4.5", "@elysiajs/eden": "^1.4.5",
"@ionic/vue": "^8.7.11", "@ionic/vue": "^8.7.11",
"@ionic/vue-router": "^8.7.11", "@ionic/vue-router": "^8.7.11",
"@riwa/api-types": "http://192.168.1.17:9527/api/riwa-eden-0.0.87.tgz", "@riwa/api-types": "http://192.168.1.17:9527/api/riwa-eden-0.0.89.tgz",
"@tailwindcss/vite": "^4.1.18", "@tailwindcss/vite": "^4.1.18",
"@vee-validate/yup": "^4.15.1", "@vee-validate/yup": "^4.15.1",
"@vueuse/core": "^14.1.0", "@vueuse/core": "^14.1.0",

12
pnpm-lock.yaml generated
View File

@@ -57,8 +57,8 @@ importers:
specifier: ^8.7.11 specifier: ^8.7.11
version: 8.7.11(@stencil/core@4.39.0)(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) version: 8.7.11(@stencil/core@4.39.0)(vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))
'@riwa/api-types': '@riwa/api-types':
specifier: http://192.168.1.17:9527/api/riwa-eden-0.0.87.tgz specifier: http://192.168.1.17:9527/api/riwa-eden-0.0.89.tgz
version: '@riwa/eden@http://192.168.1.17:9527/api/riwa-eden-0.0.87.tgz(@elysiajs/eden@1.4.5(elysia@1.4.18(@sinclair/typebox@0.34.41)(exact-mirror@0.2.5(@sinclair/typebox@0.34.41))(file-type@21.1.1)(openapi-types@12.1.3)(typescript@5.9.3)))' version: '@riwa/eden@http://192.168.1.17:9527/api/riwa-eden-0.0.89.tgz(@elysiajs/eden@1.4.5(elysia@1.4.18(@sinclair/typebox@0.34.41)(exact-mirror@0.2.5(@sinclair/typebox@0.34.41))(file-type@21.1.1)(openapi-types@12.1.3)(typescript@5.9.3)))'
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: ^4.1.18 specifier: ^4.1.18
version: 4.1.18(vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2)) version: 4.1.18(vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.2))
@@ -2766,9 +2766,9 @@ packages:
'@remirror/core-constants@3.0.0': '@remirror/core-constants@3.0.0':
resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
'@riwa/eden@http://192.168.1.17:9527/api/riwa-eden-0.0.87.tgz': '@riwa/eden@http://192.168.1.17:9527/api/riwa-eden-0.0.89.tgz':
resolution: {tarball: http://192.168.1.17:9527/api/riwa-eden-0.0.87.tgz} resolution: {tarball: http://192.168.1.17:9527/api/riwa-eden-0.0.89.tgz}
version: 0.0.87 version: 0.0.89
peerDependencies: peerDependencies:
'@elysiajs/eden': ^1.4.5 '@elysiajs/eden': ^1.4.5
@@ -12077,7 +12077,7 @@ snapshots:
'@remirror/core-constants@3.0.0': {} '@remirror/core-constants@3.0.0': {}
'@riwa/eden@http://192.168.1.17:9527/api/riwa-eden-0.0.87.tgz(@elysiajs/eden@1.4.5(elysia@1.4.18(@sinclair/typebox@0.34.41)(exact-mirror@0.2.5(@sinclair/typebox@0.34.41))(file-type@21.1.1)(openapi-types@12.1.3)(typescript@5.9.3)))': '@riwa/eden@http://192.168.1.17:9527/api/riwa-eden-0.0.89.tgz(@elysiajs/eden@1.4.5(elysia@1.4.18(@sinclair/typebox@0.34.41)(exact-mirror@0.2.5(@sinclair/typebox@0.34.41))(file-type@21.1.1)(openapi-types@12.1.3)(typescript@5.9.3)))':
dependencies: dependencies:
'@elysiajs/eden': 1.4.5(elysia@1.4.18(@sinclair/typebox@0.34.41)(exact-mirror@0.2.5(@sinclair/typebox@0.34.41))(file-type@21.1.1)(openapi-types@12.1.3)(typescript@5.9.3)) '@elysiajs/eden': 1.4.5(elysia@1.4.18(@sinclair/typebox@0.34.41)(exact-mirror@0.2.5(@sinclair/typebox@0.34.41))(file-type@21.1.1)(openapi-types@12.1.3)(typescript@5.9.3))

View File

@@ -68,6 +68,9 @@ const defaultOptions = {
}, },
} satisfies ChartingLibraryWidgetOptions; } satisfies ChartingLibraryWidgetOptions;
export interface TradingViewChartExpose {
}
export const TradingViewChart = defineComponent({ export const TradingViewChart = defineComponent({
name: "TradingViewChart", name: "TradingViewChart",
props: { props: {
@@ -141,6 +144,17 @@ export const TradingViewChart = defineComponent({
}, 0); }, 0);
}); });
// 监听交易对变化,动态更新图表数据
watch(() => props.symbol, (newSymbol) => {
if (!widget.value || !newSymbol)
return;
widget.value.activeChart().setSymbol(newSymbol, () => {
console.log(`[TradingView]: Symbol changed to ${newSymbol}`);
});
});
return () => h("div", { ref: el, class: "w-full", style: styles.value }); return () => h("div", { ref: el, class: "w-full", style: styles.value });
}, },
}); });
export type TradingViewInst = InstanceType<typeof TradingViewChart> & TradingViewChartExpose;

View File

@@ -6,7 +6,11 @@ const emit = defineEmits<{
select: [symbol: string]; select: [symbol: string];
}>(); }>();
const { data } = safeClient(client.api.trading_pairs.get()); const [query] = useResetRef({
offset: 0,
limit: 200,
});
const { data } = safeClient(client.api.trading_pairs.get({ query: query.value }));
const searchText = ref(""); const searchText = ref("");
function handleSelect(symbol: string) { function handleSelect(symbol: string) {
@@ -22,7 +26,7 @@ function handleSelect(symbol: string) {
<ion-content> <ion-content>
<div class="mt-2 flex flex-col"> <div class="mt-2 flex flex-col">
<div v-for="item in data" :key="item.symbol" class="flex items-center px-3 my-3 w-full" @click="handleSelect(item.symbol)"> <div v-for="item in data?.data" :key="item.symbol" class="flex items-center px-3 my-3 w-full" @click="handleSelect(item.symbol)">
<Icon icon="cryptocurrency-color:dta" class="text-3xl" /> <Icon icon="cryptocurrency-color:dta" class="text-3xl" />
<div class="ml-2 inline-flex gap-2 items-baseline"> <div class="ml-2 inline-flex gap-2 items-baseline">
<span class="font-medium text-md">{{ item.baseAsset }}</span><span class="text-xs text-text-400">/ {{ item.quoteAsset }}</span> <span class="font-medium text-md">{{ item.baseAsset }}</span><span class="text-xs text-text-400">/ {{ item.quoteAsset }}</span>

View File

@@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ChartingLibraryWidgetOptions } from "#/charting_library"; import type { ChartingLibraryWidgetOptions } from "#/charting_library";
import type { TradingViewInst } from "@/tradingview/index";
import { modalController } from "@ionic/vue"; import { modalController } from "@ionic/vue";
import { useRouteQuery } from "@vueuse/router"; import { useRouteQuery } from "@vueuse/router";
import { caretDownOutline, ellipsisHorizontal } from "ionicons/icons"; import { caretDownOutline, ellipsisHorizontal } from "ionicons/icons";
@@ -20,19 +21,11 @@ const tradingviewOptions: Partial<ChartingLibraryWidgetOptions> = {
"create_volume_indicator_by_default", "create_volume_indicator_by_default",
], ],
}; };
const tradingViewInst = useTemplateRef<TradingViewInst>("tradingViewInst");
const { data } = safeClient(client.api.trading_pairs.get());
async function openTradePairs() { async function openTradePairs() {
if (!data.value)
return;
const modal = await modalController.create({ const modal = await modalController.create({
component: TradePairsModal, component: TradePairsModal,
componentProps: {
tradingPairs: data.value,
currentSymbol: symbol.value,
},
breakpoints: [0, 0.95], breakpoints: [0, 0.95],
initialBreakpoint: 0.95, initialBreakpoint: 0.95,
handle: true, handle: true,
@@ -72,7 +65,7 @@ async function openTradePairs() {
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
<ion-content :fullscreen="true"> <ion-content :fullscreen="true">
<TradingViewChart class="mb-5" height="300px" :symbol="symbol" :options="tradingviewOptions" /> <TradingViewChart ref="tradingViewInst" class="mb-5" height="300px" :symbol="symbol" :options="tradingviewOptions" />
<div class="grid grid-cols-5 px-4"> <div class="grid grid-cols-5 px-4">
<div class="col-span-3 space-y-2"> <div class="col-span-3 space-y-2">