From dccd61c0c9b6f1a90987e2c8f965cbf3cdd2459d Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Mon, 8 Jun 2020 16:10:00 -0500 Subject: [PATCH] App download indicator. --- packages/console-app/README.md | 2 +- packages/console-app/config.yml | 17 +++--- .../console-app/src/components/BooleanIcon.js | 30 ++++++++++ .../src/containers/panels/apps/AppRecords.js | 59 +++++++++++-------- packages/console-app/src/version.json | 2 +- packages/console-server/config.yml | 19 +++--- packages/console-server/src/resolvers/ipfs.js | 26 +++++++- 7 files changed, 108 insertions(+), 47 deletions(-) create mode 100644 packages/console-app/src/components/BooleanIcon.js diff --git a/packages/console-app/README.md b/packages/console-app/README.md index 2087af2..053605e 100644 --- a/packages/console-app/README.md +++ b/packages/console-app/README.md @@ -14,7 +14,7 @@ First start the server: Then start the Webpack devserver. ```bash - cd packages/consoe-app + cd packages/console-app yarn start ``` diff --git a/packages/console-app/config.yml b/packages/console-app/config.yml index 150b1c4..85be7a6 100644 --- a/packages/console-app/config.yml +++ b/packages/console-app/config.yml @@ -22,20 +22,19 @@ system: services: app: prefix: '/app' - server: 'http://127.0.0.1:5999' + server: 'https://xbox.local' wns: - server: 'http://127.0.0.1:9473/api' - webui: 'http://127.0.0.1:9473/webui' + server: 'https://xbox.local/dxos/wns/api' + webui: 'https://xbox.local/dxos/wns/webui' signal: - server: 'http://127.0.0.1:4000' - api: 'http://127.0.0.1:4000' + server: 'wss://xbox.local/dxos/signal' + api: 'https://xbox.local/dxos/signal/' ipfs: - server: '/ip4/127.0.0.1/tcp/5001' - gateway: '/ip4//127.0.0.1:8888/ipfs/' - webui: 'http://127.0.0.1:5001/webui' + server: 'https://xbox.local/dxos/ipfs/api' + gateway: 'https://xbox.local/dxos/ipfs/gateway' wellknown: - endpoint: 'http://127.0.0.1:9000/.well-known/dxos' + endpoint: 'https://xbox.local/.well-known/dxos' diff --git a/packages/console-app/src/components/BooleanIcon.js b/packages/console-app/src/components/BooleanIcon.js new file mode 100644 index 0000000..b5ffbf3 --- /dev/null +++ b/packages/console-app/src/components/BooleanIcon.js @@ -0,0 +1,30 @@ +// +// Copyright 2020 DxOS +// + +import React from 'react'; + +import YesIcon from '@material-ui/icons/CheckCircleOutline'; +import NoIcon from '@material-ui/icons/RadioButtonUnchecked'; + +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles(theme => ({ + error: { + color: theme.palette.error.main + }, + on: { + color: theme.palette.primary[500] + }, + off: { + color: 'transparent' + } +})); + +export const BooleanIcon = ({ yes = false, error = false }) => { + const classes = useStyles(); + return (yes + ? + : + ); +}; diff --git a/packages/console-app/src/containers/panels/apps/AppRecords.js b/packages/console-app/src/containers/panels/apps/AppRecords.js index da8e912..834b5c8 100644 --- a/packages/console-app/src/containers/panels/apps/AppRecords.js +++ b/packages/console-app/src/containers/panels/apps/AppRecords.js @@ -3,36 +3,42 @@ // import React, { useContext } from 'react'; + import { useQuery } from '@apollo/react-hooks'; - -import WNS_RECORDS from '../../../gql/wns_records.graphql'; - -import { ConsoleContext, useQueryStatusReducer, useSorter } from '../../../hooks'; - import Link from '@material-ui/core/Link'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; import TableBody from '@material-ui/core/TableBody'; +import moment from 'moment'; -import { getServiceUrl } from '../../../util/config'; - +import { BooleanIcon } from '../../../components/BooleanIcon'; import Table from '../../../components/Table'; import TableCell from '../../../components/TableCell'; -import moment from 'moment'; +import { ConsoleContext, useQueryStatusReducer, useSorter } from '../../../hooks'; +import { getServiceUrl } from '../../../util/config'; + +import IPFS_STATUS from '../../../gql/ipfs_status.graphql'; +import WNS_RECORDS from '../../../gql/wns_records.graphql'; const AppRecords = () => { const { config } = useContext(ConsoleContext); const [sorter, sortBy] = useSorter('createTime', false); - const data = useQueryStatusReducer(useQuery(WNS_RECORDS, { + const appResponse = useQueryStatusReducer(useQuery(WNS_RECORDS, { pollInterval: config.api.intervalQuery, variables: { type: 'wrn:app' } })); - if (!data) { + // TODO(telackey): Does this also need an interval? + const ipfsResponse = useQueryStatusReducer(useQuery(IPFS_STATUS)); + + if (!appResponse || !ipfsResponse) { return null; } - const records = data.wns_records.json; + const appData = appResponse.wns_records.json; + const ipfsData = JSON.parse(ipfsResponse.ipfs_status.json); + + const localRefs = new Set(ipfsData.refs.local); // TODO(burdon): Test if app is deployed. const getAppUrl = ({ name, version }) => { @@ -47,8 +53,12 @@ const AppRecords = () => { pathComponents.push(config.services.app.prefix.substring(1)); } - pathComponents.push(`${name}@${version}`); - return pathComponents.join('/'); + if (version) { + pathComponents.push(`${name}@${version}`); + } else { + pathComponents.push(name); + } + return `${pathComponents.join('/')}/`; }; return ( @@ -56,26 +66,29 @@ const AppRecords = () => { Identifier + Name Version Created - Name - Link + Downloaded - {records.sort(sorter).map(({ id, name, version, createTime, attributes: { displayName, publicUrl } }) => { - const link = getAppUrl({ id, name, version, publicUrl }); + {appData.sort(sorter).map(({ id, name, version, createTime, attributes: { displayName, publicUrl, package: hash } }) => { + const verLink = getAppUrl({ id, name, version, publicUrl }); + const appLink = getAppUrl({ id, name, publicUrl }); return ( - {name} - {version} - {moment.utc(createTime).fromNow()} + + {name} + {displayName} - {link && ( - {link} - )} + {version} + + {moment.utc(createTime).fromNow()} + + ); diff --git a/packages/console-app/src/version.json b/packages/console-app/src/version.json index ef07eb6..7f83619 100644 --- a/packages/console-app/src/version.json +++ b/packages/console-app/src/version.json @@ -1,7 +1,7 @@ { "build": { "name": "@dxos/console-app", - "buildDate": "2020-06-01T01:13:48.575Z", + "buildDate": "2020-06-08T18:45:46.717Z", "version": "1.0.0-beta.0" } } diff --git a/packages/console-server/config.yml b/packages/console-server/config.yml index ac97bae..b6021b8 100644 --- a/packages/console-server/config.yml +++ b/packages/console-server/config.yml @@ -3,8 +3,6 @@ # NOTE: Set CONFIG_FILE to swap out this config file. # -# TODO(burdon): Set defaults. - app: title: 'Console' org': 'DxOS' @@ -24,20 +22,19 @@ system: services: app: prefix: '/app' - server: 'http://127.0.0.1:5999' + server: 'https://xbox.local' wns: - server: 'https://node1.dxos.network/wns/api' - webui: 'https://node1.dxos.network/wns/webui' + server: 'https://xbox.local/dxos/wns/api' + webui: 'https://xbox.local/dxos/wns/webui' signal: - server: 'http://127.0.0.1:4000' - api: 'http://127.0.0.1:4000' + server: 'wss://xbox.local/dxos/signal' + api: 'https://xbox.local/dxos/signal/status' ipfs: - server: '/ip4/127.0.0.1/tcp/5001' - gateway: '/ip4//127.0.0.1:8888/ipfs/' - webui: 'http://127.0.0.1:5001/webui' + server: 'https://xbox.local/dxos/ipfs/api' + gateway: 'https://xbox.local/dxos/ipfs/gateway' wellknown: - endpoint: 'http://127.0.0.1:9000/.well-known/dxos' + endpoint: 'https://xbox.local/.well-known/dxos' diff --git a/packages/console-server/src/resolvers/ipfs.js b/packages/console-server/src/resolvers/ipfs.js index 40ab445..09041de 100644 --- a/packages/console-server/src/resolvers/ipfs.js +++ b/packages/console-server/src/resolvers/ipfs.js @@ -21,14 +21,36 @@ export const ipfsResolvers = { // NOTE: Hangs if server not running. const ipfs = new IpfsHttpClient(config.services.ipfs.server); + const id = await ipfs.id(); const version = await ipfs.version(); - const status = await ipfs.id(); + const peers = await ipfs.swarm.peers(); + const stats = await ipfs.stats.repo(); + // Do not expose the repo path. + delete stats['repoPath']; + + const refs = []; + for await (const ref of ipfs.refs.local()) { + if (ref.err) { + log(ref.err); + } else { + refs.push(ref.ref); + } + } return { timestamp: new Date().toUTCString(), json: JSON.stringify({ + id, version, - status + repo: { + stats + }, + refs: { + local: refs + }, + swarm: { + peers + } }) }; }