mirror of https://github.com/wg-easy/wg-easy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.3 KiB
145 lines
4.3 KiB
import { defineStore } from 'pinia';
|
|
import { sha256 } from 'js-sha256';
|
|
import type { TypedInternalResponse } from 'nitropack/types';
|
|
|
|
type WGClientReturn = TypedInternalResponse<
|
|
'/api/client',
|
|
unknown,
|
|
'get'
|
|
>[number];
|
|
|
|
export type LocalClient = WGClientReturn & {
|
|
avatar?: string;
|
|
transferMax?: number;
|
|
} & Omit<ClientPersist, 'transferRxPrevious' | 'transferTxPrevious'>;
|
|
|
|
export type ClientPersist = {
|
|
transferRxHistory: number[];
|
|
transferRxPrevious: number;
|
|
transferRxCurrent: number;
|
|
transferRxSeries: { name: string; data: number[] }[];
|
|
hoverRx?: unknown;
|
|
transferTxHistory: number[];
|
|
transferTxPrevious: number;
|
|
transferTxCurrent: number;
|
|
transferTxSeries: { name: string; data: number[] }[];
|
|
hoverTx?: unknown;
|
|
};
|
|
|
|
export const useClientsStore = defineStore('Clients', () => {
|
|
const globalStore = useGlobalStore();
|
|
const clients = ref<null | LocalClient[]>(null);
|
|
const clientsPersist = ref<Record<string, ClientPersist>>({});
|
|
|
|
const searchParams = ref({
|
|
filter: '',
|
|
});
|
|
|
|
const { data: _clients, refresh: _refresh } = useFetch('/api/client', {
|
|
method: 'get',
|
|
params: searchParams,
|
|
});
|
|
|
|
// TODO: rewrite
|
|
async function refresh({ updateCharts = false } = {}) {
|
|
await _refresh();
|
|
let transformedClients = _clients.value?.map((client) => {
|
|
let avatar = undefined;
|
|
if (client.name.includes('@') && client.name.includes('.')) {
|
|
avatar = `https://gravatar.com/avatar/${sha256(client.name.toLowerCase().trim())}.jpg`;
|
|
}
|
|
|
|
if (!clientsPersist.value[client.id]) {
|
|
clientsPersist.value[client.id] = {
|
|
transferRxHistory: Array(50).fill(0),
|
|
transferRxPrevious: client.transferRx ?? 0,
|
|
transferTxHistory: Array(50).fill(0),
|
|
transferTxPrevious: client.transferTx ?? 0,
|
|
transferRxCurrent: 0,
|
|
transferTxCurrent: 0,
|
|
transferRxSeries: [],
|
|
transferTxSeries: [],
|
|
};
|
|
}
|
|
|
|
// We know that this can't be undefined
|
|
const clientPersist = clientsPersist.value[client.id]!;
|
|
|
|
// Debug
|
|
// client.transferRx = this.clientsPersist[client.id].transferRxPrevious + Math.random() * 1000;
|
|
// client.transferTx = this.clientsPersist[client.id].transferTxPrevious + Math.random() * 1000;
|
|
// client.latestHandshakeAt = new Date();
|
|
// this.requiresPassword = true;
|
|
|
|
clientPersist.transferRxCurrent =
|
|
(client.transferRx ?? 0) - clientPersist.transferRxPrevious;
|
|
|
|
clientPersist.transferRxPrevious = client.transferRx ?? 0;
|
|
|
|
clientPersist.transferTxCurrent =
|
|
(client.transferTx ?? 0) - clientPersist.transferTxPrevious;
|
|
|
|
clientPersist.transferTxPrevious = client.transferTx ?? 0;
|
|
|
|
let transferMax = undefined;
|
|
|
|
if (updateCharts) {
|
|
clientPersist.transferRxHistory.push(clientPersist.transferRxCurrent);
|
|
clientPersist.transferRxHistory.shift();
|
|
|
|
clientPersist.transferTxHistory.push(clientPersist.transferTxCurrent);
|
|
clientPersist.transferTxHistory.shift();
|
|
|
|
clientPersist.transferTxSeries = [
|
|
{
|
|
name: 'Tx',
|
|
data: clientPersist.transferTxHistory,
|
|
},
|
|
];
|
|
|
|
clientPersist.transferRxSeries = [
|
|
{
|
|
name: 'Rx',
|
|
data: clientPersist.transferRxHistory,
|
|
},
|
|
];
|
|
|
|
transferMax = Math.max(
|
|
...clientPersist.transferTxHistory,
|
|
...clientPersist.transferRxHistory
|
|
);
|
|
}
|
|
|
|
return {
|
|
...client,
|
|
avatar,
|
|
transferTxHistory: clientPersist.transferTxHistory,
|
|
transferRxHistory: clientPersist.transferRxHistory,
|
|
transferMax,
|
|
transferTxSeries: clientPersist.transferTxSeries,
|
|
transferRxSeries: clientPersist.transferRxSeries,
|
|
transferTxCurrent: clientPersist.transferTxCurrent,
|
|
transferRxCurrent: clientPersist.transferRxCurrent,
|
|
hoverTx: clientPersist.hoverTx,
|
|
hoverRx: clientPersist.hoverRx,
|
|
};
|
|
});
|
|
|
|
if (transformedClients !== undefined) {
|
|
transformedClients = sortByProperty(
|
|
transformedClients,
|
|
'name',
|
|
globalStore.sortClient
|
|
);
|
|
}
|
|
|
|
clients.value = transformedClients ?? null;
|
|
}
|
|
|
|
function setSearchQuery(filter: string) {
|
|
clients.value = null;
|
|
searchParams.value.filter = filter;
|
|
}
|
|
|
|
return { clients, clientsPersist, refresh, _clients, setSearchQuery };
|
|
});
|
|
|