fix type errors of components

This commit is contained in:
Lhcfl 2024-04-12 01:12:18 +08:00
parent 8e28f0e97c
commit e6b7eca775
10 changed files with 88 additions and 66 deletions

View file

@ -2,16 +2,16 @@
<MkModal <MkModal
ref="modal" ref="modal"
:z-priority="'middle'" :z-priority="'middle'"
@click="modal.close()" @click="modal!.close()"
@closed="emit('closed')" @closed="emit('closed')"
> >
<div class="xubzgfga"> <div class="xubzgfga">
<header>{{ image.name }}</header> <header>{{ image.name }}</header>
<img <img
:src="image.url" :src="image.url"
:alt="image.comment" :alt="image.comment || undefined"
:title="image.comment" :title="image.comment || undefined"
@click="modal.close()" @click="modal!.close()"
/> />
<footer> <footer>
<span>{{ image.type }}</span> <span>{{ image.type }}</span>
@ -33,7 +33,7 @@ import bytes from "@/filters/bytes";
import number from "@/filters/number"; import number from "@/filters/number";
import MkModal from "@/components/MkModal.vue"; import MkModal from "@/components/MkModal.vue";
const props = withDefaults( withDefaults(
defineProps<{ defineProps<{
image: entities.DriveFile; image: entities.DriveFile;
}>(), }>(),
@ -41,10 +41,10 @@ const props = withDefaults(
); );
const emit = defineEmits<{ const emit = defineEmits<{
(ev: "closed"): void; closed: [];
}>(); }>();
const modal = ref<InstanceType<typeof MkModal>>(); const modal = ref<InstanceType<typeof MkModal> | null>(null);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View file

@ -4,20 +4,20 @@
ref="canvas" ref="canvas"
:width="size" :width="size"
:height="size" :height="size"
:title="title" :title="title || undefined"
/> />
<img <img
v-if="src" v-if="src"
:src="src" :src="src"
:title="title" :title="title || undefined"
:type="type" :type="type"
:alt="alt" :alt="alt || undefined"
:class="{ :class="{
cover, cover,
wide: largestDimension === 'width', wide: largestDimension === 'width',
tall: largestDimension === 'height', tall: largestDimension === 'height',
}" }"
:style="{ 'object-fit': cover ? 'cover' : null }" :style="{ 'object-fit': cover ? 'cover' : undefined }"
loading="lazy" loading="lazy"
@load="onLoad" @load="onLoad"
/> />

View file

@ -23,17 +23,14 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from "vue";
import type { entities } from "firefish-js"; import type { entities } from "firefish-js";
import * as os from "@/os";
import { getProxiedImageUrlNullable } from "@/scripts/media-proxy"; import { getProxiedImageUrlNullable } from "@/scripts/media-proxy";
const props = defineProps<{ defineProps<{
instance: entities.Instance; instance: entities.Instance;
}>(); }>();
function getInstanceIcon(instance): string { function getInstanceIcon(instance: entities.Instance): string {
return ( return (
getProxiedImageUrlNullable(instance.faviconUrl, "preview") ?? getProxiedImageUrlNullable(instance.faviconUrl, "preview") ??
getProxiedImageUrlNullable(instance.iconUrl, "preview") ?? getProxiedImageUrlNullable(instance.iconUrl, "preview") ??

View file

@ -65,14 +65,14 @@ import * as os from "@/os";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
const emit = defineEmits<{ const emit = defineEmits<{
(ev: "ok", selected: entities.Instance): void; ok: [selected: entities.Instance];
(ev: "cancel"): void; cancel: [];
(ev: "closed"): void; closed: [];
}>(); }>();
const hostname = ref(""); const hostname = ref("");
const instances = ref<entities.Instance[]>([]); const instances = ref<entities.Instance[]>([]);
const selected = ref<entities.Instance | null>(); const selected = ref<entities.Instance | null>(null);
const dialogEl = ref<InstanceType<typeof XModalWindow>>(); const dialogEl = ref<InstanceType<typeof XModalWindow>>();
let searchOrderLatch = 0; let searchOrderLatch = 0;

View file

@ -52,6 +52,7 @@ import { i18n } from "@/i18n";
import MkActiveUsersHeatmap from "@/components/MkActiveUsersHeatmap.vue"; import MkActiveUsersHeatmap from "@/components/MkActiveUsersHeatmap.vue";
import MkFolder from "@/components/MkFolder.vue"; import MkFolder from "@/components/MkFolder.vue";
import { initChart } from "@/scripts/init-chart"; import { initChart } from "@/scripts/init-chart";
import type { entities } from "firefish-js";
initChart(); initChart();
@ -67,7 +68,18 @@ const { handler: externalTooltipHandler2 } = useChartTooltip({
position: "middle", position: "middle",
}); });
function createDoughnut(chartEl, tooltip, data) { interface ColorData {
name: string;
color: string | undefined;
value: number;
onClick?: () => void;
}
function createDoughnut(
chartEl: HTMLCanvasElement,
tooltip: typeof externalTooltipHandler1,
data: ColorData[],
) {
const chartInstance = new Chart(chartEl, { const chartInstance = new Chart(chartEl, {
type: "doughnut", type: "doughnut",
data: { data: {
@ -96,13 +108,13 @@ function createDoughnut(chartEl, tooltip, data) {
}, },
onClick: (ev) => { onClick: (ev) => {
const hit = chartInstance.getElementsAtEventForMode( const hit = chartInstance.getElementsAtEventForMode(
ev, ev as unknown as Event,
"nearest", "nearest",
{ intersect: true }, { intersect: true },
false, false,
)[0]; )[0];
if (hit && data[hit.index].onClick) { if (hit) {
data[hit.index].onClick(); data[hit.index].onClick?.();
} }
}, },
plugins: { plugins: {
@ -124,48 +136,41 @@ function createDoughnut(chartEl, tooltip, data) {
return chartInstance; return chartInstance;
} }
function instance2ColorData(x: entities.Instance): ColorData {
return {
name: x.host,
color: x.themeColor || undefined,
value: x.followersCount,
onClick: () => {
os.pageWindow(`/instance-info/${x.host}`);
},
};
}
onMounted(() => { onMounted(() => {
os.apiGet("federation/stats", { limit: 30 }).then((fedStats) => { os.apiGet("federation/stats", { limit: 30 }).then((fedStats) => {
createDoughnut( createDoughnut(
subDoughnutEl.value, subDoughnutEl.value!,
externalTooltipHandler1, externalTooltipHandler1,
fedStats.topSubInstances fedStats.topSubInstances.map(instance2ColorData).concat([
.map((x) => ({ {
name: x.host, name: "(other)",
color: x.themeColor, color: "#80808080",
value: x.followersCount, value: fedStats.otherFollowersCount,
onClick: () => { },
os.pageWindow(`/instance-info/${x.host}`); ]),
},
}))
.concat([
{
name: "(other)",
color: "#80808080",
value: fedStats.otherFollowersCount,
},
]),
); );
createDoughnut( createDoughnut(
pubDoughnutEl.value, pubDoughnutEl.value!,
externalTooltipHandler2, externalTooltipHandler2,
fedStats.topPubInstances fedStats.topPubInstances.map(instance2ColorData).concat([
.map((x) => ({ {
name: x.host, name: "(other)",
color: x.themeColor, color: "#80808080",
value: x.followingCount, value: fedStats.otherFollowingCount,
onClick: () => { },
os.pageWindow(`/instance-info/${x.host}`); ]),
},
}))
.concat([
{
name: "(other)",
color: "#80808080",
value: fedStats.otherFollowingCount,
},
]),
); );
}); });
}); });

View file

@ -6,7 +6,7 @@
:anchor="anchor" :anchor="anchor"
:transparent-bg="true" :transparent-bg="true"
:src="src" :src="src"
@click="modal.close()" @click="modal!.close()"
@closed="emit('closed')" @closed="emit('closed')"
> >
<div <div
@ -109,7 +109,7 @@ const items = Object.keys(navbarItemDef)
})); }));
function close() { function close() {
modal.value.close(); modal.value!.close();
} }
</script> </script>

View file

@ -54,8 +54,8 @@ const url = computed(() => {
return char2filePath(char.value); return char2filePath(char.value);
} else { } else {
return defaultStore.state.disableShowingAnimatedImages return defaultStore.state.disableShowingAnimatedImages
? getStaticImageUrl(customEmoji.value.url) ? getStaticImageUrl(customEmoji.value!.url)
: customEmoji.value.url; : customEmoji.value!.url;
} }
}); });
const alt = computed(() => const alt = computed(() =>

View file

@ -1,6 +1,13 @@
import { onDeactivated, onUnmounted, ref } from "vue"; import { onDeactivated, onUnmounted, ref } from "vue";
import * as os from "@/os"; import * as os from "@/os";
import MkChartTooltip from "@/components/MkChartTooltip.vue"; import MkChartTooltip from "@/components/MkChartTooltip.vue";
import type { Color, TooltipOptions } from "chart.js";
type ToolTipSerie = {
backgroundColor: Color;
borderColor: Color;
text: string;
};
export function useChartTooltip( export function useChartTooltip(
opts: { position: "top" | "middle" } = { position: "top" }, opts: { position: "top" | "middle" } = { position: "top" },
@ -8,9 +15,9 @@ export function useChartTooltip(
const tooltipShowing = ref(false); const tooltipShowing = ref(false);
const tooltipX = ref(0); const tooltipX = ref(0);
const tooltipY = ref(0); const tooltipY = ref(0);
const tooltipTitle = ref(null); const tooltipTitle = ref<string | null>(null);
const tooltipSeries = ref(null); const tooltipSeries = ref<ToolTipSerie[] | null>(null);
let disposeTooltipComponent; let disposeTooltipComponent: () => void;
os.popup( os.popup(
MkChartTooltip, MkChartTooltip,
@ -34,7 +41,7 @@ export function useChartTooltip(
tooltipShowing.value = false; tooltipShowing.value = false;
}); });
function handler(context) { const handler: TooltipOptions["external"] = (context) => {
if (context.tooltip.opacity === 0) { if (context.tooltip.opacity === 0) {
tooltipShowing.value = false; tooltipShowing.value = false;
return; return;

View file

@ -405,6 +405,17 @@ export type Endpoints = {
res: Instance[]; res: Instance[];
}; };
"federation/show-instance": { req: { host: string }; res: Instance }; "federation/show-instance": { req: { host: string }; res: Instance };
"federation/stats": {
req: {
limit?: number;
};
res: {
topSubInstances: Instance[];
otherFollowersCount: number;
topPubInstances: Instance[];
otherFollowingCount: number;
};
};
"federation/update-remote-user": { req: { userId: User["id"] }; res: null }; "federation/update-remote-user": { req: { userId: User["id"] }; res: null };
"federation/users": { "federation/users": {
req: { req: {

View file

@ -539,6 +539,8 @@ export type Instance = {
lastCommunicatedAt: DateString; lastCommunicatedAt: DateString;
isNotResponding: boolean; isNotResponding: boolean;
isSuspended: boolean; isSuspended: boolean;
isBlocked: boolean;
isSilenced: boolean;
softwareName: string | null; softwareName: string | null;
softwareVersion: string | null; softwareVersion: string | null;
openRegistrations: boolean | null; openRegistrations: boolean | null;