Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"prettier": "npx prettier --write ."
},
"dependencies": {
"@tanstack/react-query": "^5.81.5",
"axios": "^1.6.5",
"chart.js": "^4.4.1",
"clsx": "^2.1.0",
Expand Down
18 changes: 15 additions & 3 deletions frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,19 @@ import React, { useEffect } from 'react';
import Login from '@/views/Login';
import { useUserStore } from "@/store/userStore";
import { Bounce, ToastContainer } from 'react-toastify';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

import 'react-toastify/dist/ReactToastify.css';

const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 5000,
refetchOnWindowFocus: false,
},
},
});

const AuthLayout: React.FC = () => {

const userStore = useUserStore();
Expand Down Expand Up @@ -72,9 +82,11 @@ const router = createBrowserRouter([

const App: React.FC = () => {
return (
<div className="bg-gray-100 min-h-full pb-5">
<RouterProvider router={router} />
</div>
<QueryClientProvider client={queryClient}>
<div className="bg-gray-100 min-h-full pb-5">
<RouterProvider router={router} />
</div>
</QueryClientProvider>
);
};

Expand Down
13 changes: 8 additions & 5 deletions frontend/src/components/RefreshTimer.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Select, { components, ControlProps, Props as SelectProps } from 'react-select';
import { useRefreshStore } from "@/store/refreshStore";
import { useRefreshTimeStore } from "@/store/refreshTimeStore";
import { FaRotate } from 'react-icons/fa6';
import { useState } from 'react';
import { useQueryClient } from '@tanstack/react-query';

function Control({ children, ...props }: ControlProps) {
const [rotate, setRotate] = useState(false);
Expand All @@ -26,12 +27,14 @@ function Control({ children, ...props }: ControlProps) {
}

export default function RefreshTime(props: SelectProps) {
const refreshStore = useRefreshStore();
const refreshTimeStore = useRefreshTimeStore();
const queryClient = useQueryClient();

function onRefreshClick(e: React.MouseEvent<HTMLSpanElement, MouseEvent>) {
e.preventDefault();
e.stopPropagation();
refreshStore.triggerRefresh();
// Manually trigger refresh of bitcoin queries
queryClient.invalidateQueries({ queryKey: ['bitcoin'] });
}

const optionsMap = new Map([
Expand All @@ -48,10 +51,10 @@ export default function RefreshTime(props: SelectProps) {
isSearchable={false}
// @ts-expect-error onRefreshMouseDown
onRefreshMouseDown={onRefreshClick}
onChange={(e) => refreshStore.setRefreshTime((e as { value: number }).value)}
onChange={(e) => refreshTimeStore.setRefreshTime((e as { value: number }).value)}
components={{ Control: Control }}
options={Array.from(optionsMap).map(([value, label]) => ({ value, label }))}
defaultValue={{ value: refreshStore.refreshTime, label: optionsMap.get(refreshStore.refreshTime)}}
defaultValue={{ value: refreshTimeStore.refreshTime, label: optionsMap.get(refreshTimeStore.refreshTime)}}
styles={{
control: (baseStyles) => ({
...baseStyles,
Expand Down
35 changes: 0 additions & 35 deletions frontend/src/hooks/useRefreshData.ts

This file was deleted.

14 changes: 14 additions & 0 deletions frontend/src/store/api/bitcoinApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import api from './api';
import { HomeApiResponse, PeersApiResponse } from '@/types';

export const bitcoinApi = {
home: async (): Promise<HomeApiResponse> => {
const { data } = await api.get<HomeApiResponse>('/bitcoin/home');
return data;
},

peers: async (): Promise<PeersApiResponse> => {
const { data } = await api.get<PeersApiResponse>('/bitcoin/peers');
return data;
},
};
119 changes: 0 additions & 119 deletions frontend/src/store/homeStore.ts

This file was deleted.

54 changes: 0 additions & 54 deletions frontend/src/store/peerStore.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
import { create } from 'zustand';
import { devtools, persist } from 'zustand/middleware';

type RefreshStore = {
type RefreshTimeStore = {
refreshTime: number;
setRefreshTime: (time: number) => void;
refresh: boolean;
triggerRefresh: () => void;
}

export const useRefreshStore = create<RefreshStore>()(
export const useRefreshTimeStore = create<RefreshTimeStore>()(
devtools(
persist(
(set) => ({
refreshTime: 15000,
setRefreshTime: (time: number) => set({ refreshTime: time }),
refresh: false,
triggerRefresh: () => set((state) => ({ refresh: !state.refresh }))
}),
{
name: 'refreshTime',
partialize: (state) => ({ refreshTime: state.refreshTime }),
}
)
)
Expand Down
32 changes: 22 additions & 10 deletions frontend/src/store/types.ts → frontend/src/types/api.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
export interface IBaseApiStore {
loading: boolean;
fetch: () => void;
}

// API Response Types
export interface IMainStore {
totalConnections: number;
totalUploadTraffic: number;
Expand All @@ -27,6 +23,11 @@ export interface IBlockchainStore {
lastBlockTime: number;
}

export interface INetwork {
available: boolean;
address: string | undefined;
}

export interface INetworkInfo {
uploadTarget: {
target: number;
Expand All @@ -40,11 +41,6 @@ export interface INetworkInfo {
};
}

export interface INetwork {
available: boolean;
address: string | undefined;
}

export interface IPeer {
id: number;
address: string;
Expand All @@ -57,4 +53,20 @@ export interface IPeer {
subversion: string;
connection_type: string;
inbound: boolean;
}

// API Response types
export interface HomeApiResponse {
main: IMainStore;
node: INodeStore;
blockchain: IBlockchainStore;
networkInfo: INetworkInfo;
peers: IPeer[];
}

export interface PeersApiResponse {
allTimeUploadTraffic: number;
allTimeDownloadTraffic: number;
banned: number;
peers: IPeer[];
}
1 change: 1 addition & 0 deletions frontend/src/types/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './api';
Loading