From 7c485a2dcfdb075bd176aa242dc3067c51b54dbb Mon Sep 17 00:00:00 2001 From: Willem Olding Date: Sun, 17 Sep 2023 16:30:49 +1000 Subject: [PATCH] add the dojo react starter --- LICENSE | 21 ++ client/.env | 7 + client/.eslintrc.cjs | 14 ++ client/.gitignore | 24 +++ client/bun.lockb | Bin 0 -> 247283 bytes client/codegen.ts | 15 ++ client/index.html | 13 ++ client/package.json | 47 ++++ client/public/vite.svg | 1 + client/src/App.tsx | 71 ++++++ client/src/DojoContext.tsx | 78 +++++++ client/src/assets/react.svg | 1 + client/src/dojo/contractComponents.ts | 65 ++++++ client/src/dojo/createClientComponents.ts | 13 ++ client/src/dojo/createSystemCalls.ts | 93 ++++++++ client/src/dojo/setup.ts | 27 +++ client/src/dojo/setupNetwork.ts | 51 +++++ client/src/dojo/world.ts | 3 + client/src/generated/graphql.ts | 252 ++++++++++++++++++++++ client/src/graphql/schema.graphql | 19 ++ client/src/index.css | 120 +++++++++++ client/src/main.tsx | 23 ++ client/src/utils/index.ts | 44 ++++ client/src/vite-env.d.ts | 1 + client/tsconfig.json | 33 +++ client/tsconfig.node.json | 10 + client/vite.config.ts | 7 + 27 files changed, 1053 insertions(+) create mode 100644 LICENSE create mode 100644 client/.env create mode 100644 client/.eslintrc.cjs create mode 100644 client/.gitignore create mode 100755 client/bun.lockb create mode 100644 client/codegen.ts create mode 100644 client/index.html create mode 100644 client/package.json create mode 100644 client/public/vite.svg create mode 100644 client/src/App.tsx create mode 100644 client/src/DojoContext.tsx create mode 100644 client/src/assets/react.svg create mode 100644 client/src/dojo/contractComponents.ts create mode 100644 client/src/dojo/createClientComponents.ts create mode 100644 client/src/dojo/createSystemCalls.ts create mode 100644 client/src/dojo/setup.ts create mode 100644 client/src/dojo/setupNetwork.ts create mode 100644 client/src/dojo/world.ts create mode 100644 client/src/generated/graphql.ts create mode 100644 client/src/graphql/schema.graphql create mode 100644 client/src/index.css create mode 100644 client/src/main.tsx create mode 100644 client/src/utils/index.ts create mode 100644 client/src/vite-env.d.ts create mode 100644 client/tsconfig.json create mode 100644 client/tsconfig.node.json create mode 100644 client/vite.config.ts diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6d975c5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 ArcaneAssemblers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/client/.env b/client/.env new file mode 100644 index 0000000..2e2ce2a --- /dev/null +++ b/client/.env @@ -0,0 +1,7 @@ +VITE_PUBLIC_ETH_CONTRACT_ADDRESS=0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 +VITE_PUBLIC_ACCOUNT_CLASS_HASH=0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f +VITE_PUBLIC_MASTER_ADDRESS=0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973 +VITE_PUBLIC_MASTER_PRIVATE_KEY=0x1800000000300000180000000000030000000000003006001800006600 +VITE_PUBLIC_WORLD_ADDRESS=0x223b959926c92e10a5de78a76871fa40cefafbdce789137843df7c7b30e3e0 +VITE_PUBLIC_NODE_URL=http://localhost:5050 +VITE_PUBLIC_TORII=http://localhost:8080 \ No newline at end of file diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs new file mode 100644 index 0000000..4020bcb --- /dev/null +++ b/client/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/client/bun.lockb b/client/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2ebe7191e25a9156d438d9c69f547175d75e2513 GIT binary patch literal 247283 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 literal 0 HcmV?d00001 diff --git a/client/codegen.ts b/client/codegen.ts new file mode 100644 index 0000000..7df216e --- /dev/null +++ b/client/codegen.ts @@ -0,0 +1,15 @@ +import type { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + schema: 'http://localhost:8080', + documents: 'src/**/*.graphql', + generates: { + 'src/generated/graphql.ts': { + plugins: ['typescript', 'typescript-operations', 'typescript-graphql-request'], + config: { + rawRequest: true + }, + }, + }, +}; +export default config; \ No newline at end of file diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..e0d1c84 --- /dev/null +++ b/client/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..3f98cfa --- /dev/null +++ b/client/package.json @@ -0,0 +1,47 @@ +{ + "name": "react-example", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "codegen": "graphql-codegen" + }, + "dependencies": { + "@dojoengine/core": "^0.0.17", + "@dojoengine/create-burner": "^0.0.18", + "@dojoengine/react": "^0.0.3", + "@dojoengine/utils": "^0.0.2", + "@latticexyz/recs": "^1.43.0", + "@latticexyz/utils": "^1.43.0", + "ethers": "^5.7.2", + "graphql": "^16.7.1", + "graphql-request": "^6.1.0", + "mobx": "^6.9.0", + "proxy-deep": "^3.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "rxjs": "^7.8.1", + "starknet": "^5.14.1" + }, + "devDependencies": { + "@graphql-codegen/cli": "^5.0.0", + "@graphql-codegen/typescript": "^4.0.1", + "@graphql-codegen/typescript-graphql-request": "^5.0.0", + "@graphql-codegen/typescript-operations": "^4.0.1", + "@types/node": "^20.4.8", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } +} \ No newline at end of file diff --git a/client/public/vite.svg b/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/App.tsx b/client/src/App.tsx new file mode 100644 index 0000000..81877c3 --- /dev/null +++ b/client/src/App.tsx @@ -0,0 +1,71 @@ +import { useDojo } from './DojoContext'; +import { useComponentValue } from "@dojoengine/react"; +import { Direction, } from './dojo/createSystemCalls' +import { EntityIndex, setComponent } from '@latticexyz/recs'; +import { useEffect } from 'react'; +import { getFirstComponentByType } from './utils'; +import { Moves, Position } from './generated/graphql'; + +function App() { + const { + setup: { + systemCalls: { spawn, move }, + components: { Moves, Position }, + network: { graphSdk, call } + }, + account: { create, list, select, account, isDeploying } + } = useDojo(); + + // entity id - this example uses the account address as the entity id + const entityId = account.address; + + // get current component values + const position = useComponentValue(Position, parseInt(entityId.toString()) as EntityIndex); + const moves = useComponentValue(Moves, parseInt(entityId.toString()) as EntityIndex); + + useEffect(() => { + + if (!entityId) return; + + const fetchData = async () => { + const { data } = await graphSdk.getEntities(); + + if (data) { + const remaining = getFirstComponentByType(data.entities?.edges, 'Moves') as Moves; + const position = getFirstComponentByType(data.entities?.edges, 'Position') as Position; + + setComponent(Moves, parseInt(entityId.toString()) as EntityIndex, { remaining: remaining.remaining }) + setComponent(Position, parseInt(entityId.toString()) as EntityIndex, { x: position.x, y: position.y }) + } + } + fetchData(); + }, [account.address]); + + + return ( + <> + +
+ select signer:{" "} + +
+
+ +
Moves Left: {moves ? `${moves['remaining']}` : 'Need to Spawn'}
+
Position: {position ? `${position['x']}, ${position['y']}` : 'Need to Spawn'}
+
+
+
+ +
+ +
+ + ); +} + +export default App; diff --git a/client/src/DojoContext.tsx b/client/src/DojoContext.tsx new file mode 100644 index 0000000..0a2c6ca --- /dev/null +++ b/client/src/DojoContext.tsx @@ -0,0 +1,78 @@ +import { createContext, ReactNode, useContext, useMemo } from "react"; +import { SetupResult } from "./dojo/setup"; +import { Account, RpcProvider } from "starknet"; +import { useBurner } from "@dojoengine/create-burner"; + +type EternumContext = { + setup: SetupResult; + account: { + create: () => void; + list: () => any[]; + get: (id: string) => any; + select: (id: string) => void; + account: Account; + masterAccount: Account; + isDeploying: boolean; + clear: () => void; + }; +} + +const DojoContext = createContext(null); + +type Props = { + children: ReactNode; + value: SetupResult; +}; + +export const DojoProvider = ({ children, value }: Props) => { + + const { VITE_PUBLIC_MASTER_ADDRESS, VITE_PUBLIC_MASTER_PRIVATE_KEY, VITE_PUBLIC_ACCOUNT_CLASS_HASH, VITE_PUBLIC_NODE_URL } = import.meta.env; + const currentValue = useContext(DojoContext); + if (currentValue) throw new Error("DojoProvider can only be used once"); + + const provider = useMemo( + () => + new RpcProvider({ + nodeUrl: VITE_PUBLIC_NODE_URL!, + }), + [], + ); + + const masterAddress = VITE_PUBLIC_MASTER_ADDRESS!; + const privateKey = VITE_PUBLIC_MASTER_PRIVATE_KEY!; + const masterAccount = useMemo( + () => new Account(provider, masterAddress, privateKey), + [provider, masterAddress, privateKey], + ); + + const { create, list, get, account, select, isDeploying, clear } = useBurner({ + masterAccount: masterAccount, + accountClassHash: VITE_PUBLIC_ACCOUNT_CLASS_HASH!, + }); + + const selectedAccount = useMemo(() => { + return account || masterAccount; + }, [account]) + + const contextValue: EternumContext = { + setup: value, // the provided setup + account: { + create, // create a new account + list, // list all accounts + get, // get an account by id + select, // select an account by id + account: selectedAccount, // the selected account + masterAccount, // the master account + isDeploying, // is the account being deployed + clear + } + } + + return {children}; +}; + +export const useDojo = () => { + const value = useContext(DojoContext); + if (!value) throw new Error("Must be used within a DojoProvider"); + return value; +}; diff --git a/client/src/assets/react.svg b/client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/dojo/contractComponents.ts b/client/src/dojo/contractComponents.ts new file mode 100644 index 0000000..490570a --- /dev/null +++ b/client/src/dojo/contractComponents.ts @@ -0,0 +1,65 @@ +/* Autogenerated file. Do not edit manually. */ + +import { defineComponent, Type as RecsType, World } from "@latticexyz/recs"; + +export function defineContractComponents(world: World) { + return { + Moves: (() => { + const name = "Moves"; + return defineComponent( + world, + { + remaining: RecsType.Number, + }, + { + metadata: { + name: name, + }, + } + ); + })(), + Position: (() => { + const name = "Position"; + return defineComponent( + world, + { + x: RecsType.Number, + y: RecsType.Number, + }, + { + metadata: { + name: name, + }, + } + ); + })(), + AuthStatus: (() => { + const name = "AuthStatus"; + return defineComponent( + world, + { + is_authorized: RecsType.Boolean, + }, + { + metadata: { + name: name, + }, + } + ); + })(), + AuthRole: (() => { + const name = "AuthRole"; + return defineComponent( + world, + { + id: RecsType.Number, + }, + { + metadata: { + name: name, + }, + } + ); + })(), + }; +} diff --git a/client/src/dojo/createClientComponents.ts b/client/src/dojo/createClientComponents.ts new file mode 100644 index 0000000..cfee6bc --- /dev/null +++ b/client/src/dojo/createClientComponents.ts @@ -0,0 +1,13 @@ +import { overridableComponent } from "@latticexyz/recs"; +import { SetupNetworkResult } from "./setupNetwork"; + + +export type ClientComponents = ReturnType; + +export function createClientComponents({ contractComponents }: SetupNetworkResult) { + return { + ...contractComponents, + Position: overridableComponent(contractComponents.Position), + Moves: overridableComponent(contractComponents.Moves), + }; +} \ No newline at end of file diff --git a/client/src/dojo/createSystemCalls.ts b/client/src/dojo/createSystemCalls.ts new file mode 100644 index 0000000..a63022d --- /dev/null +++ b/client/src/dojo/createSystemCalls.ts @@ -0,0 +1,93 @@ +import { SetupNetworkResult } from "./setupNetwork"; +import { Account } from "starknet"; +import { EntityIndex, getComponentValue } from "@latticexyz/recs"; +import { uuid } from "@latticexyz/utils"; +import { ClientComponents } from "./createClientComponents"; +import { updatePositionWithDirection } from "../utils"; +import { getEvents, setComponentsFromEvents } from "@dojoengine/utils"; + +export type SystemCalls = ReturnType; + +export function createSystemCalls( + { execute, contractComponents }: SetupNetworkResult, + { Position, Moves }: ClientComponents +) { + + const spawn = async (signer: Account) => { + const entityId = parseInt(signer.address) as EntityIndex; + + const positionId = uuid(); + Position.addOverride(positionId, { + entity: entityId, + value: { x: 1000, y: 1000 }, + }); + + const movesId = uuid(); + Moves.addOverride(movesId, { + entity: entityId, + value: { remaining: 100 }, + }); + + try { + const tx = await execute(signer, "spawn", []); + + console.log(tx) + const receipt = await signer.waitForTransaction(tx.transaction_hash, { retryInterval: 100 }) + setComponentsFromEvents(contractComponents, getEvents(receipt)); + + } catch (e) { + console.log(e) + Position.removeOverride(positionId); + Moves.removeOverride(movesId); + } finally { + Position.removeOverride(positionId); + Moves.removeOverride(movesId); + } + }; + + const move = async (signer: Account, direction: Direction) => { + + const entityId = parseInt(signer.address) as EntityIndex; + + const positionId = uuid(); + Position.addOverride(positionId, { + entity: entityId, + value: updatePositionWithDirection(direction, getComponentValue(Position, entityId) as any), + }); + + const movesId = uuid(); + Moves.addOverride(movesId, { + entity: entityId, + value: { remaining: (getComponentValue(Moves, entityId)?.remaining || 0) - 1 }, + }); + + try { + const tx = await execute(signer, "move", [direction]); + + console.log(tx) + const receipt = await signer.waitForTransaction(tx.transaction_hash, { retryInterval: 100 }) + setComponentsFromEvents(contractComponents, getEvents(receipt)); + + } catch (e) { + console.log(e) + Position.removeOverride(positionId); + Moves.removeOverride(movesId); + } finally { + Position.removeOverride(positionId); + Moves.removeOverride(movesId); + } + + }; + + return { + spawn, + move + }; +} + +export enum Direction { + Left = 0, + Right = 1, + Up = 2, + Down = 3, +} diff --git a/client/src/dojo/setup.ts b/client/src/dojo/setup.ts new file mode 100644 index 0000000..2f87fa1 --- /dev/null +++ b/client/src/dojo/setup.ts @@ -0,0 +1,27 @@ +import { createClientComponents } from "./createClientComponents"; +import { createSystemCalls } from "./createSystemCalls"; +import { setupNetwork } from "./setupNetwork"; + +export type SetupResult = Awaited>; + +/** + * Sets up the necessary components and network utilities. + * + * @returns An object containing network configurations, client components, and system calls. + */ +export async function setup() { + // Initialize the network configuration. + const network = await setupNetwork(); + + // Create client components based on the network setup. + const components = createClientComponents(network); + + // Establish system calls using the network and components. + const systemCalls = createSystemCalls(network, components); + + return { + network, + components, + systemCalls, + }; +} \ No newline at end of file diff --git a/client/src/dojo/setupNetwork.ts b/client/src/dojo/setupNetwork.ts new file mode 100644 index 0000000..d8c103d --- /dev/null +++ b/client/src/dojo/setupNetwork.ts @@ -0,0 +1,51 @@ +import { defineContractComponents } from "./contractComponents"; +import { world } from "./world"; +import { RPCProvider, Query, } from "@dojoengine/core"; +import { Account, num } from "starknet"; +import { GraphQLClient } from 'graphql-request'; +import { getSdk } from '../generated/graphql'; + +export type SetupNetworkResult = Awaited>; + +export async function setupNetwork() { + // Extract environment variables for better readability. + const { VITE_PUBLIC_WORLD_ADDRESS, VITE_PUBLIC_NODE_URL, VITE_PUBLIC_TORII } = import.meta.env; + + // Create a new RPCProvider instance. + const provider = new RPCProvider(VITE_PUBLIC_WORLD_ADDRESS, VITE_PUBLIC_NODE_URL); + + // Utility function to get the SDK. + const createGraphSdk = () => getSdk(new GraphQLClient(VITE_PUBLIC_TORII)); + + // Return the setup object. + return { + provider, + world, + + // Define contract components for the world. + contractComponents: defineContractComponents(world), + + // Define the graph SDK instance. + graphSdk: createGraphSdk(), + + // Execute function. + execute: async (signer: Account, system: string, call_data: num.BigNumberish[]) => { + return provider.execute(signer, system, call_data); + }, + + // Entity query function. + entity: async (component: string, query: Query) => { + return provider.entity(component, query); + }, + + // Entities query function. + entities: async (component: string, partition: number) => { + return provider.entities(component, partition); + }, + + // Call function. + call: async (selector: string, call_data: num.BigNumberish[]) => { + return provider.call(selector, call_data); + }, + }; +} \ No newline at end of file diff --git a/client/src/dojo/world.ts b/client/src/dojo/world.ts new file mode 100644 index 0000000..4e386e6 --- /dev/null +++ b/client/src/dojo/world.ts @@ -0,0 +1,3 @@ +import { createWorld } from "@latticexyz/recs"; + +export const world = createWorld(); \ No newline at end of file diff --git a/client/src/generated/graphql.ts b/client/src/generated/graphql.ts new file mode 100644 index 0000000..8ff86c1 --- /dev/null +++ b/client/src/generated/graphql.ts @@ -0,0 +1,252 @@ +import { GraphQLClient } from 'graphql-request'; +import { GraphQLClientRequestHeaders } from 'graphql-request/build/cjs/types'; +import { print } from 'graphql' +import gql from 'graphql-tag'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + Cursor: { input: any; output: any; } + DateTime: { input: any; output: any; } + felt252: { input: any; output: any; } + u8: { input: any; output: any; } + u32: { input: any; output: any; } +}; + +export type ComponentUnion = Moves | Position; + +export type Entity = { + __typename?: 'Entity'; + componentNames?: Maybe; + components?: Maybe>>; + createdAt?: Maybe; + id?: Maybe; + keys?: Maybe; + updatedAt?: Maybe; +}; + +export type EntityConnection = { + __typename?: 'EntityConnection'; + edges?: Maybe>>; + totalCount: Scalars['Int']['output']; +}; + +export type EntityEdge = { + __typename?: 'EntityEdge'; + cursor: Scalars['Cursor']['output']; + node?: Maybe; +}; + +export type Event = { + __typename?: 'Event'; + createdAt?: Maybe; + data?: Maybe; + id?: Maybe; + keys?: Maybe; + systemCall: SystemCall; + systemCallId?: Maybe; +}; + +export type EventConnection = { + __typename?: 'EventConnection'; + edges?: Maybe>>; + totalCount: Scalars['Int']['output']; +}; + +export type EventEdge = { + __typename?: 'EventEdge'; + cursor: Scalars['Cursor']['output']; + node?: Maybe; +}; + +export type Moves = { + __typename?: 'Moves'; + entity?: Maybe; + remaining?: Maybe; +}; + +export type MovesConnection = { + __typename?: 'MovesConnection'; + edges?: Maybe>>; + totalCount: Scalars['Int']['output']; +}; + +export type MovesEdge = { + __typename?: 'MovesEdge'; + cursor: Scalars['Cursor']['output']; + node?: Maybe; +}; + +export type Position = { + __typename?: 'Position'; + entity?: Maybe; + x?: Maybe; + y?: Maybe; +}; + +export type PositionConnection = { + __typename?: 'PositionConnection'; + edges?: Maybe>>; + totalCount: Scalars['Int']['output']; +}; + +export type PositionEdge = { + __typename?: 'PositionEdge'; + cursor: Scalars['Cursor']['output']; + node?: Maybe; +}; + +export type Query = { + __typename?: 'Query'; + entities?: Maybe; + entity: Entity; + event: Event; + events?: Maybe; + movesComponents?: Maybe; + positionComponents?: Maybe; + system: System; + systemCall: SystemCall; + systemCalls?: Maybe; + systems?: Maybe; +}; + + +export type QueryEntitiesArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + keys: Array; + last?: InputMaybe; +}; + + +export type QueryEntityArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryEventArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryMovesComponentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type QueryPositionComponentsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type QuerySystemArgs = { + id: Scalars['ID']['input']; +}; + + +export type QuerySystemCallArgs = { + id: Scalars['Int']['input']; +}; + +export type System = { + __typename?: 'System'; + classHash?: Maybe; + createdAt?: Maybe; + id?: Maybe; + name?: Maybe; + systemCalls: Array; + transactionHash?: Maybe; +}; + +export type SystemCall = { + __typename?: 'SystemCall'; + createdAt?: Maybe; + data?: Maybe; + id?: Maybe; + system: System; + systemId?: Maybe; + transactionHash?: Maybe; +}; + +export type SystemCallConnection = { + __typename?: 'SystemCallConnection'; + edges?: Maybe>>; + totalCount: Scalars['Int']['output']; +}; + +export type SystemCallEdge = { + __typename?: 'SystemCallEdge'; + cursor: Scalars['Cursor']['output']; + node?: Maybe; +}; + +export type SystemConnection = { + __typename?: 'SystemConnection'; + edges?: Maybe>>; + totalCount: Scalars['Int']['output']; +}; + +export type SystemEdge = { + __typename?: 'SystemEdge'; + cursor: Scalars['Cursor']['output']; + node?: Maybe; +}; + +export type GetEntitiesQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetEntitiesQuery = { __typename?: 'Query', entities?: { __typename?: 'EntityConnection', edges?: Array<{ __typename?: 'EntityEdge', node?: { __typename?: 'Entity', keys?: string | null, components?: Array<{ __typename: 'Moves', remaining?: any | null } | { __typename: 'Position', x?: any | null, y?: any | null } | null> | null } | null } | null> | null } | null }; + + +export const GetEntitiesDocument = gql` + query getEntities { + entities(keys: ["%"]) { + edges { + node { + keys + components { + __typename + ... on Moves { + remaining + } + ... on Position { + x + y + } + } + } + } + } +} + `; + +export type SdkFunctionWrapper = (action: (requestHeaders?:Record) => Promise, operationName: string, operationType?: string) => Promise; + + +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); +const GetEntitiesDocumentString = print(GetEntitiesDocument); +export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { + return { + getEntities(variables?: GetEntitiesQueryVariables, requestHeaders?: GraphQLClientRequestHeaders): Promise<{ data: GetEntitiesQuery; extensions?: any; headers: Dom.Headers; status: number; }> { + return withWrapper((wrappedRequestHeaders) => client.rawRequest(GetEntitiesDocumentString, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'getEntities', 'query'); + } + }; +} +export type Sdk = ReturnType; \ No newline at end of file diff --git a/client/src/graphql/schema.graphql b/client/src/graphql/schema.graphql new file mode 100644 index 0000000..3c9bd8a --- /dev/null +++ b/client/src/graphql/schema.graphql @@ -0,0 +1,19 @@ +query getEntities { + entities(keys: ["%"]) { + edges { + node { + keys + components { + __typename + ... on Moves { + remaining + } + ... on Position { + x + y + } + } + } + } + } +} \ No newline at end of file diff --git a/client/src/index.css b/client/src/index.css new file mode 100644 index 0000000..331bd5f --- /dev/null +++ b/client/src/index.css @@ -0,0 +1,120 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} + +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} + +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} + +button:hover { + border-color: #646cff; +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + +canvas { + display: block; +} \ No newline at end of file diff --git a/client/src/main.tsx b/client/src/main.tsx new file mode 100644 index 0000000..6114626 --- /dev/null +++ b/client/src/main.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; +import { setup } from './dojo/setup'; +import { DojoProvider } from './DojoContext'; + +async function init() { + const rootElement = document.getElementById('root'); + if (!rootElement) throw new Error('React root not found'); + const root = ReactDOM.createRoot(rootElement as HTMLElement); + + const setupResult = await setup(); + root.render( + + + + + + ); +} + +init(); \ No newline at end of file diff --git a/client/src/utils/index.ts b/client/src/utils/index.ts new file mode 100644 index 0000000..c68f635 --- /dev/null +++ b/client/src/utils/index.ts @@ -0,0 +1,44 @@ +import { Direction } from "../dojo/createSystemCalls"; + +export function isValidArray(input: any): input is any[] { + return Array.isArray(input) && input != null; +} + +export function getFirstComponentByType(entities: any[] | null | undefined, typename: string): any | null { + if (!isValidArray(entities)) return null; + + for (const entity of entities) { + if (isValidArray(entity?.node.components)) { + const foundComponent = entity.node.components.find((comp: any) => comp.__typename === typename); + if (foundComponent) return foundComponent; + } + } + + return null; +} + +export function extractAndCleanKey(entities?: any[] | null | undefined): string | null { + if (!isValidArray(entities) || !entities[0]?.keys) return null; + + return entities[0].keys.replace(/,/g, ''); +} + +export function updatePositionWithDirection(direction: Direction, value: { x: number, y: number }) { + switch (direction) { + case Direction.Left: + value.x--; + break; + case Direction.Right: + value.x++; + break; + case Direction.Up: + value.y--; + break; + case Direction.Down: + value.y++; + break; + default: + throw new Error("Invalid direction provided"); + } + return value; +} diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..761deb7 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +})