Skip to content
This repository was archived by the owner on Oct 19, 2023. It is now read-only.

Commit d3015a2

Browse files
authored
Merge pull request #45 from nevermined-io/test/setup
Test/setup
2 parents 82031e8 + 7035f92 commit d3015a2

File tree

11 files changed

+1146
-151
lines changed

11 files changed

+1146
-151
lines changed

example/src/examples/index.tsx

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
1-
import React from 'react';
1+
import React, { useEffect } from 'react';
22
import Catalog from 'hello-catalog';
3+
import { DDO } from '@nevermined-io/nevermined-sdk-js';
34

4-
const Example = (props: any) => {
5-
const ethProvider = Catalog.getEtheruemProvider();
6-
const { isAvailable: isEthAvailable } = Catalog.useWeb3Service(ethProvider);
5+
export const allAssetsDefaultQuery = {
6+
offset: 2, // limit response to 2 items
7+
page: 1,
8+
query: {},
9+
sort: {
10+
created: -1
11+
}
12+
};
13+
14+
const App = (props: any) => {
15+
const { sdk } = Catalog.useNevermined();
16+
const { useFetchAssets, assets, isLoadingFetchAssets } = Catalog.useAssetService();
17+
useFetchAssets(allAssetsDefaultQuery);
718

819
return (
920
<>
10-
<div>Is Etheruem available: </div>
11-
<div>{String(isEthAvailable())}</div>
21+
<div>Is SDK Avaialable:</div>
22+
<div>{Object.keys(sdk).length > 0 ? 'Yes' : 'No'}</div>
23+
<div>Is Loading Assets</div>
24+
<div>{isLoadingFetchAssets ? 'Yes' : 'No'}</div>
25+
<div>Assets:</div>
26+
<div>
27+
{assets?.map((asset: DDO) => (
28+
<div key={asset.id}>{asset.id}</div>
29+
))}
30+
</div>
1231
</>
1332
);
1433
};
1534

16-
export default Example;
35+
export default App;

lib/.eslintrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"extends": ["react-app", "react-app/jest"],
3+
"parse": "@typescript-eslint/parser",
34
"env": {
45
"es6": true,
56
"browser": true,

lib/README.md

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,74 @@
1-
# Preqrequisites
2-
3-
1. have `yarn` installed
4-
2. have `nvm` installed (or node version 14)
5-
3. use node version 14: `nvm use`
6-
4. install packages: `yarn`.
7-
8-
## Available Scripts
9-
10-
In the project directory, you can run:
11-
12-
### `yarn start`
13-
14-
Runs the app in the development mode.\
15-
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
16-
17-
The page will reload if you make edits.\
18-
You will also see any lint errors in the console.
19-
20-
### `yarn test`
21-
22-
Launches the test runner in the interactive watch mode.\
23-
24-
### `yarn test:e2e`
25-
26-
Start integration tests.
27-
28-
### `yarn build`
29-
30-
Builds the library. It uses a custom webpack config found under `webpack.config.js`
31-
32-
This config is only used for building the `PACKAGE`, not for dev mode.
33-
34-
### Documentation
35-
36-
Documentation uses [typedoc](https://github.com/TypeStrong/typedoc) under the hood.
37-
38-
To generate documentation:
39-
40-
`yarn docs:generate`.
41-
42-
To view documentation:
43-
44-
`yarn docs:serve`
45-
46-
Utility command to do both:
47-
48-
`yarn docs:dev`
49-
50-
51-
Documentation is currently not hosted or committed to git.
52-
53-
## Components
54-
55-
To see the components in action, start the server. The [Example](/src/Example.tsx) contains a small app showcasing all the components. Please make sure to add new component examples to the example when you add new ones.
1+
# Nevermined React Library
2+
3+
This projects aims to provide generic React components that
4+
connect and communicate with Nevermined.
5+
6+
### Example
7+
8+
```typescript
9+
import React from 'react';
10+
import ReactDOM from 'react-dom';
11+
import { Config, DDO } from '@nevermined-io/nevermined-sdk-js';
12+
import Catalog from '@nevermined-io/components-catalog';
13+
import App from 'app';
14+
15+
const metadataUri = 'https://metadata.autonomies.staging.nevermined.rocks';
16+
const gatewayAddress = '0xe63a11dC61b117D9c2B1Ac8021d4cffEd8EC213b';
17+
const gatewayUri = 'https://gateway.autonomies.staging.nevermined.rocks';
18+
const faucetUri = 'https://faucet.autonomies.staging.nevermined.rocks';
19+
const nodeUri = 'https://polygon-mumbai.infura.io/v3/eda048626e2745b182f43de61ac70be1';
20+
21+
const appConfig = {
22+
metadataUri,
23+
gatewayUri,
24+
faucetUri,
25+
nodeUri,
26+
gatewayAddress,
27+
verbose: true
28+
} as Config;
29+
30+
const assetsQuery = {
31+
offset: 2, // limit response to 2 items
32+
page: 1,
33+
query: {},
34+
sort: {
35+
created: -1
36+
}
37+
};
38+
39+
const App = () => {
40+
const { sdk } = Catalog.useNevermined();
41+
const { useFetchAssets, assets, isLoadingFetchAssets } = Catalog.useAssetService();
42+
useFetchAssets(assetsQuery);
43+
44+
return (
45+
<>
46+
<div>Is SDK Avaialable:</div>
47+
<div>{Object.keys(sdk).length > 0 ? 'Yes' : 'No'}</div>
48+
<div>Is Loading Assets</div>
49+
<div>{isLoadingFetchAssets ? 'Yes' : 'No'}</div>
50+
<div>Assets:</div>
51+
<div>
52+
{assets?.map((asset: DDO) => (
53+
<div key={asset.id}>{asset.id}</div>
54+
))}
55+
</div>
56+
</>
57+
);
58+
};
59+
60+
ReactDOM.render(
61+
<div>
62+
<Catalog.NeverminedProvider config={appConfig}>
63+
<App />
64+
</Catalog.NeverminedProvider>
65+
</div>,
66+
document.getElementById('root') as HTMLElement
67+
);
68+
```
69+
70+
71+
### Available Services
72+
73+
#### useAssetService
74+
#### useWeb3Service

lib/package.json

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,18 @@
88
"build:react": "react-scripts build",
99
"build:tsc": "tsc --noEmit false",
1010
"clean": "rm -rf dist",
11-
"test": "react-scripts test --coverage --watchAll=false --silent --env=./test/custom-env.js",
11+
"test": "jest src --watchAll",
1212
"eject": "react-scripts eject",
1313
"ts:lint": "npx eslint . --ext .ts,.tsx"
1414
},
1515
"main": "./dist/node/index.js",
1616
"types": "./dist/node/index.d.ts",
1717
"eslintConfig": {
18-
"extends": [
19-
"react-app",
20-
"react-app/jest"
21-
]
18+
"extends": ["react-app", "react-app/jest"]
2219
},
2320
"browserslist": {
24-
"production": [
25-
">0.2%",
26-
"not dead",
27-
"not op_mini all"
28-
],
29-
"development": [
30-
"last 1 chrome version",
31-
"last 1 firefox version",
32-
"last 1 safari version"
33-
]
21+
"production": [">0.2%", "not dead", "not op_mini all"],
22+
"development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"]
3423
},
3524
"peerDependencies": {
3625
"react": "^17.0.2",
@@ -47,11 +36,12 @@
4736
"bem-helpers": "^1.1.0",
4837
"bip39": "^3.0.4",
4938
"classnames": "^2.3.1",
39+
"jest": "^28.1.0",
5040
"lodash.uniqby": "^4.7.0",
5141
"node-fetch": "^3.2.0",
5242
"os-browserify": "^0.3.0",
5343
"path-browserify": "^1.0.1",
54-
"react": "^17.0.2",
44+
"react": "^18.0.0",
5545
"react-app-rewired": "^2.2.1",
5646
"react-scripts": "^5.0.1",
5747
"stream-browserify": "^3.0.0",
@@ -68,8 +58,9 @@
6858
"@babel/preset-react": "^7.16.5",
6959
"@metamask/providers": "^8.1.1",
7060
"@types/jest": "^27.0.3",
71-
"@types/lodash.uniqby": "^4.7.6",
7261
"@types/node": "^12.0.0",
62+
"@typescript-eslint/eslint-plugin": "^5.23.0",
63+
"@typescript-eslint/parser": "^5.23.0",
7364
"babel-loader": "8.1.0",
7465
"eslint-config-react-app": "^6.0.0",
7566
"prettier": "^2.5.1",

lib/src/nevermined.tsx

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect, createContext, useContext } from 'react';
22
import { Nevermined, Config } from '@nevermined-io/nevermined-sdk-js';
33
import Web3 from 'web3';
44
import {
5+
GenericOutput,
56
NeverminedProviderContext,
67
NeverminedProviderProps,
78
OutputUseNeverminedService
@@ -14,46 +15,56 @@ const DEFAULT_NODE_URI =
1415

1516
export const getEtheruemProvider = () => {
1617
const handler = (): Web3 => {
17-
const provider: provider = window.ethereum;
18+
const provider: provider = window?.ethereum;
1819
const web3 = new Web3(isEmptyObject(provider) ? DEFAULT_NODE_URI : provider);
19-
2020
return web3;
2121
};
22-
2322
return handler();
2423
};
2524

25+
export const initializeNevermined = async (
26+
config: Config
27+
): Promise<GenericOutput<Nevermined, any>> => {
28+
try {
29+
console.log('Loading SDK Started..');
30+
const web3Provider = !isEmptyObject(config.web3Provider)
31+
? config.web3Provider
32+
: getEtheruemProvider();
33+
34+
const nvmSdk: Nevermined = await Nevermined.getInstance({
35+
...config,
36+
web3Provider
37+
});
38+
console.log('Loading SDK Finished Successfully');
39+
return { data: nvmSdk, error: undefined, success: false };
40+
} catch (error) {
41+
console.log('Loading SDK Failed:');
42+
console.log(error);
43+
return { data: {} as Nevermined, error, success: false };
44+
}
45+
};
46+
2647
const useNeverminedService = (config: Config): OutputUseNeverminedService => {
2748
const [isLoading, setIsLoading] = useState<boolean>(true);
2849
const [error, setError] = useState<any>(undefined);
2950
const [sdk, setSdk] = useState({} as Nevermined);
3051

3152
useEffect(() => {
3253
const loadNevermined = async (): Promise<void> => {
33-
try {
34-
const sdkAlreadyLoaded = !isEmptyObject(sdk);
35-
if (sdkAlreadyLoaded) {
36-
console.log('SDK already loaded. Aborting reload.');
37-
console.log(sdk);
38-
return;
39-
}
40-
41-
console.log('Loading SDK Started..');
42-
const web3Provider = !isEmptyObject(config.web3Provider)
43-
? config.web3Provider
44-
: getEtheruemProvider();
45-
46-
const nvmSdk: any = await Nevermined.getInstance({
47-
...config,
48-
web3Provider
49-
});
50-
setSdk(nvmSdk);
51-
console.log('Loading SDK Finished:', nvmSdk);
52-
setIsLoading(false);
53-
} catch (error) {
54+
const sdkAlreadyLoaded = !isEmptyObject(sdk);
55+
if (sdkAlreadyLoaded) {
56+
console.log('SDK already loaded.');
57+
return;
58+
}
59+
setIsLoading(true);
60+
const { data, success, error } = await initializeNevermined(config);
61+
if (success) {
62+
setSdk(data);
63+
setError(error);
64+
} else {
5465
setError(error);
55-
console.log(error);
5666
}
67+
setIsLoading(false);
5768
};
5869
loadNevermined();
5970
}, [config, sdk]);
Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
1-
import { DDO, DID, SearchQuery } from '@nevermined-io/nevermined-sdk-js';
1+
import { DDO, DID, Nevermined, SearchQuery } from '@nevermined-io/nevermined-sdk-js';
22
import { useEffect, useState } from 'react';
3-
import { UseAssetService } from '../types';
3+
import { GenericOutput, UseAssetService } from '../types';
44
import { useNevermined } from '../nevermined';
55

6-
const allAssetsDefaultQuery: SearchQuery = {
7-
offset: 1,
6+
export const allAssetsDefaultQuery: SearchQuery = {
7+
offset: 2, // limit response to 2 items
88
page: 1,
99
query: {},
1010
sort: {
1111
created: -1
1212
}
1313
};
1414

15+
export const fetchAssets = async (
16+
sdk: Nevermined,
17+
q: SearchQuery
18+
): Promise<GenericOutput<DDO[], any>> => {
19+
try {
20+
const response = await sdk?.assets.query(q);
21+
return { success: true, data: response.results, error: undefined };
22+
} catch (error) {
23+
return { success: false, data: [], error };
24+
}
25+
};
26+
1527
const useAssetService = (): UseAssetService => {
1628
const { sdk } = useNevermined();
1729
const [assets, setAssets] = useState<DDO[]>([]);
30+
const [errorFetchAssets, setErrorFetchAssets] = useState<any>(undefined);
1831
const [isLoadingFetchAssets, setIsLoadingFetchAssets] = useState<boolean>(false);
1932

2033
const getAssetDDO = async (did: DID | string): Promise<DDO> => {
@@ -29,18 +42,22 @@ const useAssetService = (): UseAssetService => {
2942
if (!sdk?.assets) {
3043
return;
3144
}
32-
const fetchAllAssets = (q: SearchQuery) => {
33-
setIsLoadingFetchAssets(true);
34-
sdk?.assets.query(q).then((result: any) => {
35-
setAssets(result.results);
36-
setIsLoadingFetchAssets(false);
37-
});
45+
setIsLoadingFetchAssets(true);
46+
const handler = async () => {
47+
const response = await fetchAssets(sdk, query);
48+
if (response.success) {
49+
setAssets(response.data);
50+
setErrorFetchAssets(undefined);
51+
} else {
52+
setErrorFetchAssets(response.error);
53+
}
54+
setIsLoadingFetchAssets(false);
3855
};
39-
fetchAllAssets(query);
56+
handler();
4057
}, [sdk, query]);
4158
};
4259

43-
return { getAssetDDO, assets, isLoadingFetchAssets, useFetchAssets };
60+
return { getAssetDDO, assets, isLoadingFetchAssets, errorFetchAssets, useFetchAssets };
4461
};
4562

4663
export default useAssetService;

0 commit comments

Comments
 (0)