Skip to content

Commit

Permalink
feat: init
Browse files Browse the repository at this point in the history
  • Loading branch information
tien committed Jun 9, 2024
0 parents commit ee305f8
Show file tree
Hide file tree
Showing 45 changed files with 8,301 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
.yarn
.nx/cache
.nx/workspace-data
3 changes: 3 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"plugins": ["@trivago/prettier-plugin-sort-imports"]
}
8 changes: 8 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"eslint.experimental.useFlatConfig": true,
"eslint.workingDirectories": [
{
"mode": "auto"
}
]
}
1 change: 1 addition & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nodeLinker: node-modules
674 changes: 674 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# reactive-dot
1 change: 1 addition & 0 deletions apps/example/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
dist
4 changes: 4 additions & 0 deletions apps/example/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import recommended from "@reactive-dot/eslint-config/react.js";
import tseslint from "typescript-eslint";

export default tseslint.config(...recommended);
7 changes: 7 additions & 0 deletions apps/example/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<!doctype html>
<html>
<body>
<div id="root"></div>
<script type="module" src="./src/index.tsx"></script>
</body>
</html>
Binary file added apps/example/kusama.scale
Binary file not shown.
30 changes: 30 additions & 0 deletions apps/example/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "example",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint src",
"preview": "vite preview"
},
"dependencies": {
"@reactive-dot/react": "workspace:^",
"polkadot-api": "^0.8.0",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
"devDependencies": {
"@reactive-dot/eslint-config": "workspace:^",
"@tsconfig/recommended": "^1.0.6",
"@tsconfig/strictest": "^2.0.5",
"@tsconfig/vite-react": "^3.0.2",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.2.1",
"eslint": "^9.4.0",
"typescript": "^5.4.5",
"vite": "^5.2.13"
}
}
10 changes: 10 additions & 0 deletions apps/example/polkadot-api.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"polkadot": {
"chain": "polkadot",
"metadata": "polkadot.scale"
},
"kusama": {
"chain": "ksmcc3",
"metadata": "kusama.scale"
}
}
Binary file added apps/example/polkadot.scale
Binary file not shown.
113 changes: 113 additions & 0 deletions apps/example/src/App.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { kusama, polkadot } from "@polkadot-api/descriptors";
import {
ReDotChainProvider,
ReDotProvider,
useQuery,
useTypedApi,
} from "@reactive-dot/react";
import {
ksmcc3 as kusamaChainSpec,
polkadot as polkadotChainSpec,
} from "polkadot-api/chains";
import { getSmProvider } from "polkadot-api/sm-provider";
import { startFromWorker } from "polkadot-api/smoldot/from-worker";
import SmWorker from "polkadot-api/smoldot/worker?worker";
import { Suspense } from "react";

const Example = () => {
const [
currentBlock,
timestamp,
totalIssuance,
activeEra,
totalValueLocked,
poolMetadatum,
] = useQuery((builder) =>
builder
.readStorage("System", "Number", [])
.readStorage("Timestamp", "Now", [])
.readStorage("Balances", "TotalIssuance", [])
.readStorage("Staking", "ActiveEra", [])
.readStorage("NominationPools", "TotalValueLocked", [])
.readStorages("NominationPools", "Metadata", [[0], [1], [2], [3], [4]]),
);

const totalStaked = useQuery((builder) =>
activeEra === undefined
? undefined
: builder.readStorage("Staking", "ErasTotalStake", [activeEra.index]),
);

const client = useTypedApi({ chainId: "kusama" });

return (
<div>
<article>
<h3>Current block</h3>
<p>
{currentBlock} @ {new Date(Number(timestamp)).toLocaleString()}
</p>
</article>
<article>
<h3>Active era</h3>
<p>{activeEra?.index}</p>
</article>
<article>
<h3>Total issuance</h3>
<p>{totalIssuance.toString()} planck</p>
</article>
<article>
<h3>Total value staked</h3>
<p>{totalStaked?.toString()} planck</p>
</article>
<article>
<h3>Total value locked in nomination Pools</h3>
<p>{totalValueLocked.toString()} planck</p>
</article>
<article>
<h3>First 4 pools</h3>
{poolMetadatum.map((x, index) => (
<p key={index}>{x.asText()}</p>
))}
</article>
</div>
);
};

const smoldot = startFromWorker(new SmWorker());

const App = () => (
<ReDotProvider
config={{
chains: {
polkadot: {
descriptor: polkadot,
provider: getSmProvider(
smoldot.addChain({ chainSpec: polkadotChainSpec }),
),
},
kusama: {
descriptor: kusama,
provider: getSmProvider(
smoldot.addChain({ chainSpec: kusamaChainSpec }),
),
},
},
}}
>
<ReDotChainProvider chainId="polkadot">
<Suspense fallback={<h2>Loading Polkadot...</h2>}>
<h2>Polkadot</h2>
<Example />
</Suspense>
</ReDotChainProvider>
<ReDotChainProvider chainId="kusama">
<Suspense fallback={<h2>Loading Kusama...</h2>}>
<h2>Kusama</h2>
<Example />
</Suspense>
</ReDotChainProvider>
</ReDotProvider>
);

export default App;
9 changes: 9 additions & 0 deletions apps/example/src/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import App from "./App.js";
import React from "react";
import ReactDOM from "react-dom/client";

ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<App />
</React.StrictMode>,
);
8 changes: 8 additions & 0 deletions apps/example/src/redot.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { type polkadot, type kusama } from "@polkadot-api/descriptors";

declare module "@reactive-dot/react" {
export interface Chain {
polkadot: typeof polkadot;
kusama: typeof kusama;
}
}
1 change: 1 addition & 0 deletions apps/example/src/vite-env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/// <reference types="vite/client" />
9 changes: 9 additions & 0 deletions apps/example/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"extends": [
"@tsconfig/recommended/tsconfig.json",
"@tsconfig/strictest/tsconfig.json",
"@tsconfig/vite-react/tsconfig.json"
],
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
11 changes: 11 additions & 0 deletions apps/example/tsconfig.node.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true
},
"include": ["vite.config.ts"]
}
7 changes: 7 additions & 0 deletions apps/example/vite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";

// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
});
20 changes: 20 additions & 0 deletions nx.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"$schema": "./node_modules/nx/schemas/nx-schema.json",
"targetDefaults": {
"dev": {
"dependsOn": ["^build"]
},
"build": {
"dependsOn": ["^build"],
"outputs": ["{projectRoot}/build", "{projectRoot}/dist"],
"cache": true
},
"lint": {
"cache": true
},
"test": {
"cache": true
}
},
"defaultBase": "master"
}
35 changes: 35 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"name": "reactive-dot",
"description": "Reactive library for building Substrate front-end",
"keywords": [
"substrate",
"polkadot",
"react"
],
"homepage": "https://github.com/tien/reactive-dot#readme",
"bugs": {
"url": "https://github.com/tien/reactive-dot/issues",
"email": "[email protected]"
},
"license": "GPL-3.0-or-later",
"author": "Tiến Nguyễn Khắc <[email protected]> (https://tien.zone/)",
"repository": "github:tien/reactive-dot",
"private": true,
"type": "module",
"packageManager": "[email protected]",
"workspaces": [
"apps/*",
"packages/*"
],
"scripts": {
"dev": "nx run-many -t dev",
"build": "nx run-many -t build",
"lint": "nx run-many -t lint",
"test": "nx run-many -t test"
},
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"nx": "19.2.2",
"prettier": "^3.3.1"
}
}
10 changes: 10 additions & 0 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "@reactive-dot/core",
"version": "0.0.0",
"type": "module",
"exports": "./dist/index.js",
"scripts": {
"dev": "tsup-node --watch",
"build": "tsup-node"
}
}
20 changes: 20 additions & 0 deletions packages/eslint-config/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import eslint from "@eslint/js";
import tseslint from "typescript-eslint";

export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
{
rules: {
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
},
},
);
21 changes: 21 additions & 0 deletions packages/eslint-config/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "@reactive-dot/eslint-config",
"version": "0.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies": {
"@eslint/compat": "^1.0.3",
"@eslint/js": "^9.4.0",
"@types/eslint__js": "^8.42.3",
"eslint-plugin-react": "^7.34.2",
"eslint-plugin-react-hooks": "^4.6.2",
"typescript": "^5.4.5",
"typescript-eslint": "^7.12.0"
},
"peerDependencies": {
"eslint": "*"
}
}
33 changes: 33 additions & 0 deletions packages/eslint-config/react.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import base from "./index.js";
import { fixupPluginRules, fixupConfigRules } from "@eslint/compat";
import reactHooks from "eslint-plugin-react-hooks/index.js";
import reactJsxRuntime from "eslint-plugin-react/configs/jsx-runtime.js";
import reactRecommended from "eslint-plugin-react/configs/recommended.js";
import tseslint from "typescript-eslint";

export default tseslint.config(
...base,
...fixupConfigRules(reactRecommended),
{
languageOptions: reactJsxRuntime.languageOptions,
rules: reactJsxRuntime.rules,
},
{
plugins: {
"react-hooks": fixupPluginRules(reactHooks),
},
rules: reactHooks.configs.recommended.rules,
},
{
settings: {
react: {
version: "detect",
},
},
rules: {
"react/display-name": "off",
"react/no-unescaped-entities": "off",
"react/no-unknown-property": ["error", { ignore: ["css"] }],
},
},
);
4 changes: 4 additions & 0 deletions packages/react/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
dist
dot.scale
polkadot-api.json
Empty file added packages/react/development.d.ts
Empty file.
4 changes: 4 additions & 0 deletions packages/react/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import recommended from "@reactive-dot/eslint-config/react.js";
import tseslint from "typescript-eslint";

export default tseslint.config(...recommended);
Loading

0 comments on commit ee305f8

Please sign in to comment.