diff --git a/app/graphql/types/base_connection.rb b/app/graphql/types/base_connection.rb index c929820..1e1b775 100644 --- a/app/graphql/types/base_connection.rb +++ b/app/graphql/types/base_connection.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true module Types class BaseConnection < Types::BaseObject - # add `nodes` and `pageInfo` fields, as well as `edge_type(...)` and `node_nullable(...)` overrides include GraphQL::Types::Relay::ConnectionBehaviors + has_nodes_field(false) + edges_nullable(false) + edge_nullable(false) end end diff --git a/app/graphql/types/base_edge.rb b/app/graphql/types/base_edge.rb index bfa77ee..20439cb 100644 --- a/app/graphql/types/base_edge.rb +++ b/app/graphql/types/base_edge.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module Types class BaseEdge < Types::BaseObject - # add `node` and `cursor` fields, as well as `node_type(...)` override include GraphQL::Types::Relay::EdgeBehaviors + node_nullable(false) end end diff --git a/app/javascript/__generated__/schema.graphql b/app/javascript/__generated__/schema.graphql index ebecaf9..daacf47 100644 --- a/app/javascript/__generated__/schema.graphql +++ b/app/javascript/__generated__/schema.graphql @@ -11,12 +11,7 @@ type BalanceConnection { """ A list of edges. """ - edges: [BalanceEdge] - - """ - A list of nodes. - """ - nodes: [Balance] + edges: [BalanceEdge!]! """ Information to aid in pagination. @@ -36,7 +31,7 @@ type BalanceEdge { """ The item at the end of the edge. """ - node: Balance + node: Balance! } type Currency implements Node { @@ -59,12 +54,7 @@ type FiatBalanceConnection { """ A list of edges. """ - edges: [FiatBalanceEdge] - - """ - A list of nodes. - """ - nodes: [FiatBalance] + edges: [FiatBalanceEdge!]! """ Information to aid in pagination. @@ -84,7 +74,7 @@ type FiatBalanceEdge { """ The item at the end of the edge. """ - node: FiatBalance + node: FiatBalance! } """ diff --git a/app/javascript/modules.d.ts b/app/javascript/modules.d.ts index 7f2ac3f..be2c4ca 100644 --- a/app/javascript/modules.d.ts +++ b/app/javascript/modules.d.ts @@ -7,6 +7,11 @@ declare module "*.png" { export default png; } +declare module "*.svg" { + const svg: string; + export default svg; +} + declare module "babel-plugin-relay/macro" { export { graphql } from "react-relay"; } diff --git a/app/javascript/src/images/logo.png b/app/javascript/src/assets/images/logo.png similarity index 100% rename from app/javascript/src/images/logo.png rename to app/javascript/src/assets/images/logo.png diff --git a/app/javascript/src/assets/vectors/website_login.svg b/app/javascript/src/assets/vectors/website_login.svg new file mode 100644 index 0000000..5efc4f2 --- /dev/null +++ b/app/javascript/src/assets/vectors/website_login.svg @@ -0,0 +1,317 @@ + + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/javascript/src/components/Navbar/Navbar.tsx b/app/javascript/src/components/Navbar/Navbar.tsx index c22e88e..c367b4d 100644 --- a/app/javascript/src/components/Navbar/Navbar.tsx +++ b/app/javascript/src/components/Navbar/Navbar.tsx @@ -1,6 +1,6 @@ import * as React from "react"; -import XStakeLogo from "../../images/logo.png"; +import XStakeLogo from "../../assets/images/logo.png"; import { useApp } from "../../contexts/AppProvider"; import { useCurrentUser } from "../../contexts/UserProvider"; diff --git a/app/javascript/src/messages/Unauthenticated.tsx b/app/javascript/src/messages/Unauthenticated.tsx new file mode 100644 index 0000000..b996f7a --- /dev/null +++ b/app/javascript/src/messages/Unauthenticated.tsx @@ -0,0 +1,37 @@ +import type { FC } from "react"; +import React from "react"; + +import websiteLogin from "../assets/vectors/website_login.svg"; + +export const Unauthenticated: FC = () => { + return ( +
+
+ hero +
+

+ Parece que você não está inscrito ou não iniciou sua sessão +

+
+ + Entrar + + + Inscrever-se + +
+
+
+
+ ); +}; diff --git a/app/javascript/src/messages/index.ts b/app/javascript/src/messages/index.ts new file mode 100644 index 0000000..ef73d42 --- /dev/null +++ b/app/javascript/src/messages/index.ts @@ -0,0 +1,5 @@ +import { Unauthenticated } from "./Unauthenticated"; + +export const Messages = { + Unauthenticated, +}; diff --git a/app/javascript/src/pages/Wallet/Balances.tsx b/app/javascript/src/pages/Wallet/Balances.tsx index e3e8eb7..9c4473d 100644 --- a/app/javascript/src/pages/Wallet/Balances.tsx +++ b/app/javascript/src/pages/Wallet/Balances.tsx @@ -10,14 +10,16 @@ type Props = { balancesRef: Balances_balances$key; }; export const Balances: FC = ({ balancesRef }) => { - const { nodes } = useFragment( + const { edges } = useFragment( graphql` fragment Balances_balances on BalanceConnection { - nodes { - id - amount - currency { - name + edges { + node { + id + amount + currency { + name + } } } } @@ -25,7 +27,7 @@ export const Balances: FC = ({ balancesRef }) => { balancesRef ); - if (!nodes?.length) return null; + if (!edges.length) return null; return (
@@ -48,28 +50,28 @@ export const Balances: FC = ({ balancesRef }) => { - {nodes?.map((balance) => { + {edges.map(({ node }) => { return ( - +
{`${balance?.currency.name}

- {balance?.currency.name} + {node.currency.name}

- {balance?.amount} + {node.amount}

diff --git a/app/javascript/src/pages/Wallet/FiatBalances.tsx b/app/javascript/src/pages/Wallet/FiatBalances.tsx index 9c037cd..e754ddc 100644 --- a/app/javascript/src/pages/Wallet/FiatBalances.tsx +++ b/app/javascript/src/pages/Wallet/FiatBalances.tsx @@ -9,26 +9,28 @@ type Props = { fiatBalancesRef: FiatBalances_fiatBalances$key; }; export const FiatBalances: FC = ({ fiatBalancesRef }) => { - const { nodes } = useFragment( + const { edges } = useFragment( graphql` fragment FiatBalances_fiatBalances on FiatBalanceConnection { - nodes { - id - amountCents - amountCurrency + edges { + node { + id + amountCents + amountCurrency + } } } `, fiatBalancesRef ); - if (!nodes?.length) return null; + if (!edges.length) return null; - const [firstResult] = nodes; + const [firstResult] = edges; - const amount = ( - firstResult?.amountCents ? firstResult?.amountCents / 100 : 0 - ).toFixed(2); + const { amountCents, amountCurrency } = firstResult.node; + + const amount = (amountCents ? amountCents / 100 : 0).toFixed(2); return (
@@ -50,7 +52,7 @@ export const FiatBalances: FC = ({ fiatBalancesRef }) => {

{amount} - {firstResult?.amountCurrency} + {amountCurrency}

diff --git a/app/javascript/src/pages/Wallet/Wallet.tsx b/app/javascript/src/pages/Wallet/Wallet.tsx index 361ddbc..891a31c 100644 --- a/app/javascript/src/pages/Wallet/Wallet.tsx +++ b/app/javascript/src/pages/Wallet/Wallet.tsx @@ -3,11 +3,14 @@ import type { FC } from "react"; import React from "react"; import { useLazyLoadQuery } from "react-relay"; +import { useCurrentUser } from "../../contexts/UserProvider"; +import { Messages } from "../../messages"; import { Balances } from "./Balances"; import { FiatBalances } from "./FiatBalances"; import type { WalletQuery } from "./__generated__/WalletQuery.graphql"; export const Wallet: FC = () => { + const { isAuthenticated } = useCurrentUser(); const { fiatBalances, balances } = useLazyLoadQuery( graphql` query WalletQuery { @@ -22,6 +25,8 @@ export const Wallet: FC = () => { {} ); + if (!isAuthenticated) return ; + return (
diff --git a/app/javascript/src/pages/Wallet/__generated__/Balances_balances.graphql.ts b/app/javascript/src/pages/Wallet/__generated__/Balances_balances.graphql.ts index be272d4..da224c7 100644 --- a/app/javascript/src/pages/Wallet/__generated__/Balances_balances.graphql.ts +++ b/app/javascript/src/pages/Wallet/__generated__/Balances_balances.graphql.ts @@ -5,13 +5,15 @@ import { ReaderFragment } from "relay-runtime"; import { FragmentRefs } from "relay-runtime"; export type Balances_balances = { - readonly nodes: ReadonlyArray<{ - readonly id: string; - readonly amount: string; - readonly currency: { - readonly name: string; + readonly edges: ReadonlyArray<{ + readonly node: { + readonly id: string; + readonly amount: string; + readonly currency: { + readonly name: string; + }; }; - } | null> | null; + }>; readonly " $refType": "Balances_balances"; }; export type Balances_balances$data = Balances_balances; @@ -31,38 +33,49 @@ const node: ReaderFragment = { { "alias": null, "args": null, - "concreteType": "Balance", + "concreteType": "BalanceEdge", "kind": "LinkedField", - "name": "nodes", + "name": "edges", "plural": true, "selections": [ { "alias": null, "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "amount", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Currency", + "concreteType": "Balance", "kind": "LinkedField", - "name": "currency", + "name": "node", "plural": false, "selections": [ { "alias": null, "args": null, "kind": "ScalarField", - "name": "name", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "amount", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Currency", + "kind": "LinkedField", + "name": "currency", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null + } + ], "storageKey": null } ], @@ -75,5 +88,5 @@ const node: ReaderFragment = { "type": "BalanceConnection", "abstractKey": null }; -(node as any).hash = '2704da1dc9949b1becbd9ec947c5ec33'; +(node as any).hash = 'f42e01739ec72a194e05843169435d96'; export default node; diff --git a/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts b/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts index 348a09e..58d9fe6 100644 --- a/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts +++ b/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts @@ -5,11 +5,13 @@ import { ReaderFragment } from "relay-runtime"; import { FragmentRefs } from "relay-runtime"; export type FiatBalances_fiatBalances = { - readonly nodes: ReadonlyArray<{ - readonly id: string; - readonly amountCents: number; - readonly amountCurrency: string; - } | null> | null; + readonly edges: ReadonlyArray<{ + readonly node: { + readonly id: string; + readonly amountCents: number; + readonly amountCurrency: string; + }; + }>; readonly " $refType": "FiatBalances_fiatBalances"; }; export type FiatBalances_fiatBalances$data = FiatBalances_fiatBalances; @@ -29,30 +31,41 @@ const node: ReaderFragment = { { "alias": null, "args": null, - "concreteType": "FiatBalance", + "concreteType": "FiatBalanceEdge", "kind": "LinkedField", - "name": "nodes", + "name": "edges", "plural": true, "selections": [ { "alias": null, "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "amountCents", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "amountCurrency", + "concreteType": "FiatBalance", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "amountCents", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "amountCurrency", + "storageKey": null + } + ], "storageKey": null } ], @@ -62,5 +75,5 @@ const node: ReaderFragment = { "type": "FiatBalanceConnection", "abstractKey": null }; -(node as any).hash = '0584f36abe6ca6f8612b8c593c4cfb6d'; +(node as any).hash = '106c8efa69b9cde5af510a15c2493ba6'; export default node; diff --git a/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts b/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts index e24b668..5d8deb2 100644 --- a/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts +++ b/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts @@ -31,21 +31,25 @@ query WalletQuery { } fragment Balances_balances on BalanceConnection { - nodes { - id - amount - currency { - name + edges { + node { id + amount + currency { + name + id + } } } } fragment FiatBalances_fiatBalances on FiatBalanceConnection { - nodes { - id - amountCents - amountCurrency + edges { + node { + id + amountCents + amountCurrency + } } } */ @@ -118,24 +122,35 @@ return { { "alias": null, "args": null, - "concreteType": "FiatBalance", + "concreteType": "FiatBalanceEdge", "kind": "LinkedField", - "name": "nodes", + "name": "edges", "plural": true, "selections": [ - (v0/*: any*/), { "alias": null, "args": null, - "kind": "ScalarField", - "name": "amountCents", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "amountCurrency", + "concreteType": "FiatBalance", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "amountCents", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "amountCurrency", + "storageKey": null + } + ], "storageKey": null } ], @@ -155,35 +170,46 @@ return { { "alias": null, "args": null, - "concreteType": "Balance", + "concreteType": "BalanceEdge", "kind": "LinkedField", - "name": "nodes", + "name": "edges", "plural": true, "selections": [ - (v0/*: any*/), { "alias": null, "args": null, - "kind": "ScalarField", - "name": "amount", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Currency", + "concreteType": "Balance", "kind": "LinkedField", - "name": "currency", + "name": "node", "plural": false, "selections": [ + (v0/*: any*/), { "alias": null, "args": null, "kind": "ScalarField", - "name": "name", + "name": "amount", "storageKey": null }, - (v0/*: any*/) + { + "alias": null, + "args": null, + "concreteType": "Currency", + "kind": "LinkedField", + "name": "currency", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null + }, + (v0/*: any*/) + ], + "storageKey": null + } ], "storageKey": null } @@ -196,12 +222,12 @@ return { ] }, "params": { - "cacheID": "82d013e2bf418b53aeec5412f2f92661", + "cacheID": "3c87fba4bacbbbe14fd4b584bfb1f7bb", "id": null, "metadata": {}, "name": "WalletQuery", "operationKind": "query", - "text": "query WalletQuery {\n fiatBalances {\n ...FiatBalances_fiatBalances\n }\n balances {\n ...Balances_balances\n }\n}\n\nfragment Balances_balances on BalanceConnection {\n nodes {\n id\n amount\n currency {\n name\n id\n }\n }\n}\n\nfragment FiatBalances_fiatBalances on FiatBalanceConnection {\n nodes {\n id\n amountCents\n amountCurrency\n }\n}\n" + "text": "query WalletQuery {\n fiatBalances {\n ...FiatBalances_fiatBalances\n }\n balances {\n ...Balances_balances\n }\n}\n\nfragment Balances_balances on BalanceConnection {\n edges {\n node {\n id\n amount\n currency {\n name\n id\n }\n }\n }\n}\n\nfragment FiatBalances_fiatBalances on FiatBalanceConnection {\n edges {\n node {\n id\n amountCents\n amountCurrency\n }\n }\n}\n" } }; })();