diff --git a/client-web/src/http.ts b/client-web/src/http.ts index dc388a118..fe2bc9e24 100644 --- a/client-web/src/http.ts +++ b/client-web/src/http.ts @@ -33,10 +33,10 @@ export interface IDefaultChatRoom { title: string; } export interface IUserDefaults { - defaultAccessProfileOpen: boolean, - defaultAccessAssetsOpen: boolean, - usersCanFree: boolean, - defaultRooms: Omit[] + defaultAccessProfileOpen: boolean; + defaultAccessAssetsOpen: boolean; + usersCanFree: boolean; + defaultRooms: Omit[]; } export type TUser = { firstName: string; @@ -283,6 +283,31 @@ export async function deployNfmt( } } +interface GraphData { + apiCallCount: number; + apiCalls: { y: string[]; x: string[] }; + issuance: { y: string[]; x: string[] }; + issuanceCount: number; + sessions: { y: string[]; x: string[] }; + sessionsCount: number; + transactions: { y: string[]; x: string[] }; + transactionsCount: number; +} + +export const getGraphs = ( + appId: string, + startDate: string, + endDate: string +) => { + const params = new URLSearchParams(); + params.append("startDate", startDate); + params.append("endDate", endDate); + + return httpWithAuth().get( + "/apps/graph-statistic/" + appId + "?" + params.toString() + ); +}; + export function getBalance(walletAddress: string) { const user = useStoreState.getState().user; return http.get(`/wallets/balance`, { @@ -582,7 +607,9 @@ export function changeUserDefaults(appId: string, data: IUserDefaults) { export function getDefaultChats() { const appToken = useStoreState.getState().config.appToken; - return httpWithToken(appToken).get("/apps/get-default-rooms"); + return httpWithToken(appToken).get( + "/apps/get-default-rooms" + ); } export function createApp(fd: FormData) { const owner = useStoreState.getState().user; diff --git a/client-web/src/pages/Owner/Apps.tsx b/client-web/src/pages/Owner/Apps.tsx index 83d86fadc..17908f2c7 100644 --- a/client-web/src/pages/Owner/Apps.tsx +++ b/client-web/src/pages/Owner/Apps.tsx @@ -21,6 +21,7 @@ import { useSnackbar } from "../../context/SnackbarContext"; import { useHistory } from "react-router"; import SettingsIcon from "@mui/icons-material/Settings"; import { AppsTableHead } from "../../components/AppsTable/AppsTableHead"; +import LeaderboardIcon from '@mui/icons-material/Leaderboard'; const COINS_TO_CREATE_APP = 10; @@ -194,7 +195,7 @@ export default function Apps({ onRowClick }: Props) { - {app.stats?.totalTransactions.toLocaleString("en-US")} + {app.stats?.totalTransactions.toLocaleString("en-US")} {" "} +{app.stats?.recentlyTransactions} @@ -208,13 +209,17 @@ export default function Apps({ onRowClick }: Props) { onEdit(app)}> + history.push('/statistics/' + app._id)}> + + diff --git a/client-web/src/pages/Routes.tsx b/client-web/src/pages/Routes.tsx index e20429c98..3a83dea26 100644 --- a/client-web/src/pages/Routes.tsx +++ b/client-web/src/pages/Routes.tsx @@ -209,7 +209,7 @@ export const Routes = () => { - + diff --git a/client-web/src/pages/Statistics/index.tsx b/client-web/src/pages/Statistics/index.tsx index b3ce18683..3cab8a5be 100644 --- a/client-web/src/pages/Statistics/index.tsx +++ b/client-web/src/pages/Statistics/index.tsx @@ -20,6 +20,7 @@ import { Legend, ResponsiveContainer, } from "recharts"; +import { useParams } from "react-router"; interface TabPanelProps { children?: React.ReactNode; @@ -56,79 +57,83 @@ function a11yProps(index: number) { }; } +const LineChartLocal = ({ data, name }: { data: any[]; name: string }) => { + return ( + + + + + + + + + ); +}; + export default function StatisticsPage() { const [value, setValue] = React.useState(0); - const [apiCount, setApiCount] = React.useState(); - const [sessionsCount, setSessionsCount] = React.useState(); - const [transactionCount, setTransactionCount] = React.useState(); - const [issuanceCount, setIssuenceCount] = React.useState(); + const [apiCount, setApiCount] = React.useState(0); + const [sessionsCount, setSessionsCount] = React.useState(0); + const [transactionCount, setTransactionCount] = React.useState(0); + const [issuanceCount, setIssuenceCount] = React.useState(0); const [loading, setLoading] = React.useState(false); const [sessionGraph, setSessionGraph] = React.useState([]); const [apisGraph, setApisGraph] = React.useState([]); const [transactionGraph, setTransactionGraph] = React.useState([]); const [issuanceGraph, setIssuenceGraph] = React.useState([]); + const { appId } = useParams<{ appId: string }>(); + const [startDate, setStartDate] = React.useState(() => { const startDate = new Date(); startDate.setDate(1); startDate.setHours(0, 0, 0, 0); - return format(startDate, "yyyy-MM-dd"); + return startDate.toISOString(); }); const [endDate, setEndDate] = React.useState(() => { const endDate = new Date(); - return format(endDate, "yyyy-MM-dd"); + return endDate.toISOString(); }); const confirUrl = new URL(config.API_URL); const baseUrl = confirUrl.origin; - const getCounts = async () => { - setLoading(true); + const getData = async () => { try { - const sessionCountResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/sessions-count?startDate=${startDate}&endDate=${endDate}`, - }); - setSessionsCount(sessionCountResp.data.count); - - const transactionCountResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/transactions-count?startDate=${startDate}&endDate=${endDate}`, - }); - setTransactionCount(transactionCountResp.data.count); + const { data } = await http.getGraphs(appId, startDate, endDate); + setTransactionCount(data.transactionsCount); + setApiCount(data.apiCallCount); + setIssuenceCount(data.issuanceCount); + setSessionsCount(data.sessionsCount); + setSessionGraph(convert(data.sessions)); + setTransactionGraph(convert(data.transactions)); + setIssuenceGraph(convert(data.issuance)); + setApisGraph(convert(data.apiCalls)); + } catch (error) {} - const issuanceCountResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/issuance-count?startDate=${startDate}&endDate=${endDate}`, - }); - setIssuenceCount(issuanceCountResp.data.count); - - const apisCountResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/apis-count?startDate=${startDate}&endDate=${endDate}`, - }); - setApiCount(apisCountResp.data.count); - } catch (e) { - setLoading(false); - } - setLoading(false); - }; - - const getGraph = async () => { - const sessionGraphResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/sessions-graph?startDate=${startDate}&endDate=${endDate}`, - }); - // /analysis/apis-graph?startDate=${startDate}&endDate=${endDate} - const apiGraphResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/apis-graph?startDate=${startDate}&endDate=${endDate}`, - }); - - const transactionsGraphResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/transactions-graph?startDate=${startDate}&endDate=${endDate}`, - }); - - const issuanceGraphResp = await http.httpWithAuth()({ - url: `${baseUrl}/analysis/issuance-graph?startDate=${startDate}&endDate=${endDate}`, - }); - - function convert(data) { + function convert(data: { x: string[]; y: string[] }) { let converded = []; for (const [index, value] of data.y.entries()) { @@ -141,16 +146,10 @@ export default function StatisticsPage() { return converded; } - - setSessionGraph(convert(sessionGraphResp.data)); - setApisGraph(convert(apiGraphResp.data)); - setTransactionGraph(convert(transactionsGraphResp.data)); - setIssuenceGraph(convert(issuanceGraphResp.data)); }; React.useEffect(() => { - getCounts(); - getGraph(); + getData(); }, []); const handleChange = (event: React.SyntheticEvent, newValue: number) => { @@ -158,8 +157,7 @@ export default function StatisticsPage() { }; const filterStats = async () => { - await getCounts(); - await getGraph(); + await getData(); }; const onUploadCsv = async () => { @@ -167,14 +165,14 @@ export default function StatisticsPage() { url: `${baseUrl}/analysis/apis-csv?startDate=${startDate}&endDate=${endDate}`, }); - let dataUrl = "data:text/csv," + response.data - let filename = "api.csv" + let dataUrl = "data:text/csv," + response.data; + let filename = "api.csv"; const link = document.createElement("a"); link.href = dataUrl; link.download = filename; link.click(); - } + }; return ( { console.log(e.target.value); - setStartDate(e.target.value); + setStartDate(new Date(e.target.value).toISOString()); }} style={{ paddingRight: "15px" }} /> @@ -204,12 +202,13 @@ export default function StatisticsPage() { id="date" label="To" type="date" - defaultValue={endDate} + defaultValue={format(new Date(endDate), 'yyyy-MM-dd')} + sx={{ width: 220 }} InputLabelProps={{ shrink: true, }} - onChange={(e) => setEndDate(e.target.value)} + onChange={(e) => setEndDate(new Date(e.target.value).toISOString())} style={{ paddingRight: "15px" }} /> - - - - - - + @@ -309,33 +282,7 @@ export default function StatisticsPage() { className="tabpanel-box" style={{ display: "flex", justifyContent: "center" }} > - - - - - - + @@ -344,33 +291,7 @@ export default function StatisticsPage() { className="tabpanel-box" style={{ display: "flex", justifyContent: "center" }} > - - - - - - + @@ -378,33 +299,7 @@ export default function StatisticsPage() { className="tabpanel-box" style={{ display: "flex", justifyContent: "center" }} > - - - - - - +