Skip to content

Commit

Permalink
fix: blockchain context
Browse files Browse the repository at this point in the history
  • Loading branch information
abdulhakim2902 committed Sep 4, 2022
1 parent 6133b8f commit 7cab041
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 25 deletions.
2 changes: 1 addition & 1 deletion src/components/ServerList/ServerList.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, {useMemo} from 'react';
import React, {useMemo} from 'react';

import CountUp from 'react-countup';
import dynamic from 'next/dynamic';
Expand Down
11 changes: 8 additions & 3 deletions src/components/common/Blockchain/Blockchain.provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@ import React, {useEffect, useState} from 'react';
import {IProvider, PolkadotJs} from 'src/lib/services/polkadot-js';

import BlockchainContext from './Blockchain.context';
import {useIsMountedRef} from './useIsMountedRef';

type BlockchainProviderProps = {
children: React.ReactNode;
};

export const BlockchainProvider: React.ComponentType<BlockchainProviderProps> = ({children}) => {
const BlockchainProvider: React.ComponentType<BlockchainProviderProps> = ({children}) => {
const [provider, setProvider] = useState<IProvider | null>(null);
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<boolean>(false);

const isMountedRef = useIsMountedRef();

useEffect(() => {
if (error) return;
if (!isMountedRef.current) return;
connect();
}, [provider, error]);
}, [isMountedRef]);

const connect = async () => {
try {
Expand All @@ -34,3 +37,5 @@ export const BlockchainProvider: React.ComponentType<BlockchainProviderProps> =
</BlockchainContext.Provider>
);
};

export default BlockchainProvider;
13 changes: 13 additions & 0 deletions src/components/common/Blockchain/useIsMountedRef.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {useEffect, useRef} from 'react';

export const useIsMountedRef = () => {
const isMountedRef = useRef<null | boolean>(null);
useEffect(() => {
isMountedRef.current = true;
return () => {
isMountedRef.current = false;
};
}, []);

return isMountedRef;
};
41 changes: 23 additions & 18 deletions src/hooks/use-instances.hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,25 +130,30 @@ export const useInstances = (instanceType: InstanceType, accountId?: string) =>
try {
if (!provider || !accountId) return;

await provider.updateApiURL(accountId, server.id, newApiURL, async (newServer, signerOpened) => {
if (signerOpened) setLoading(true);
if (newServer) {
fetch(`${newServer.apiUrl}/server`)
.then(res => res.json())
.then(data => {
newServer.detail = data;
})
.catch(console.log)
.finally(() => {
const newServerList = serverList.map(e => {
if (e.id === server.id) return newServer;
return e;
await provider.updateApiURL(
accountId,
server.id,
newApiURL,
async (newServer, signerOpened) => {
if (signerOpened) setLoading(true);
if (newServer) {
fetch(`${newServer.apiUrl}/server`)
.then(res => res.json())
.then(data => {
newServer.detail = data;
})

setServerList([...newServerList])
});
}
});
.catch(console.log)
.finally(() => {
const newServerList = serverList.map(e => {
if (e.id === server.id) return newServer;
return e;
});

setServerList([...newServerList]);
});
}
},
);
} catch (err) {
console.log(err);
} finally {
Expand Down
11 changes: 8 additions & 3 deletions src/pages/_app.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import dynamic from 'next/dynamic';
import themeV2 from '../themes/light-theme';

import type {AppProps} from 'next/app';
import {ThemeProvider} from '@material-ui/core/styles';
import themeV2 from '../themes/light-theme';
import {NextPage} from 'next';
import {ReactElement, ReactNode} from 'react';
import {QueryClient, QueryClientProvider} from '@tanstack/react-query';
import {ReactQueryDevtools} from '@tanstack/react-query-devtools';

import {BlockchainProvider} from 'src/components/common/Blockchain/Blockchain.provider';

import '../../styles/globals.css';

const BlockchainProvider = dynamic(
() => import('src/components/common/Blockchain/Blockchain.provider'),
{ssr: false},
);

export type NextPageWithLayout = NextPage & {
getLayout?: (page: ReactElement) => ReactNode;
};
Expand Down

0 comments on commit 7cab041

Please sign in to comment.