├── docs ├── .gitignore ├── source │ ├── fonts │ │ ├── slate.eot │ │ ├── slate.ttf │ │ ├── slate.woff │ │ ├── slate.woff2 │ │ └── slate.svg │ ├── images │ │ ├── logo.png │ │ └── navbar.png │ ├── javascripts │ │ ├── all_nosearch.js │ │ ├── all.js │ │ └── app │ │ │ ├── _toc.js │ │ │ └── _search.js │ ├── index.yml │ ├── stylesheets │ │ └── _icon-font.scss │ ├── includes │ │ └── _errors.md │ └── index.html ├── README.md ├── LICENSE └── package.json ├── public ├── favicon.ico ├── static │ ├── logotypes │ │ ├── 42.png │ │ ├── bkk.png │ │ ├── cgi.png │ │ ├── dnb.png │ │ ├── dt.png │ │ ├── epm.png │ │ ├── ewe.png │ │ ├── ey.png │ │ ├── ice.png │ │ ├── nte.png │ │ ├── occ.png │ │ ├── tum.png │ │ ├── uio.png │ │ ├── 3for2.png │ │ ├── RWTH.png │ │ ├── agder.png │ │ ├── akita.png │ │ ├── alpiq.png │ │ ├── bosch.png │ │ ├── dnvgl.png │ │ ├── engie.png │ │ ├── entra.png │ │ ├── festo.png │ │ ├── fourc.png │ │ ├── grid.png │ │ ├── ismb.png │ │ ├── kpmg.png │ │ ├── kryha.png │ │ ├── ntnu.png │ │ ├── oslo.png │ │ ├── poyry.png │ │ ├── sweco.png │ │ ├── tele2.png │ │ ├── tine.png │ │ ├── tukio.png │ │ ├── undc.png │ │ ├── unmsm.png │ │ ├── yield.png │ │ ├── XDK2MAM.png │ │ ├── acando.png │ │ ├── aliander.png │ │ ├── allego.png │ │ ├── amrita.png │ │ ├── aparito.png │ │ ├── apgsga.png │ │ ├── ariwonto.png │ │ ├── arundo.png │ │ ├── biilabs.png │ │ ├── blocklab.png │ │ ├── crayon.png │ │ ├── elering.png │ │ ├── enexis.png │ │ ├── farmboek.png │ │ ├── fujitsu.png │ │ ├── gasunie.png │ │ ├── illaris.png │ │ ├── nordic.png │ │ ├── orange.png │ │ ├── philips.png │ │ ├── samsung.png │ │ ├── schuco.png │ │ ├── swisscom.png │ │ ├── telstra.png │ │ ├── trianel.png │ │ ├── accenture.png │ │ ├── farmforce.png │ │ ├── frankfurt.png │ │ ├── innoenergy.png │ │ ├── intelzone.png │ │ ├── microsoft.png │ │ ├── movimento.png │ │ ├── schneider.png │ │ ├── trondheim.png │ │ ├── wondrwall.png │ │ ├── USC_viterbi.png │ │ ├── bIOTAsphere.png │ │ ├── grandcentrix.png │ │ ├── logo-footer.png │ │ ├── multiconsult.png │ │ ├── techMahindra.png │ │ ├── logo-footer@2x.png │ │ ├── handelshoyskolen.png │ │ ├── south-east-water.png │ │ └── nordic_semiconductor.png │ ├── icons │ │ ├── map-atlas.png │ │ ├── btn_google.png │ │ ├── icon-padlock.png │ │ ├── icon-padlock@2x.png │ │ ├── get_involved │ │ │ ├── arrow.png │ │ │ ├── icon-quote.svg │ │ │ ├── icon-1.svg │ │ │ └── icon-2.svg │ │ ├── proof_of_concept │ │ │ ├── logos │ │ │ │ ├── bosch.png │ │ │ │ ├── nordic.png │ │ │ │ ├── adafruit.png │ │ │ │ └── netatmo.png │ │ │ ├── icon-5.svg │ │ │ ├── icon-2.svg │ │ │ └── icon-1.svg │ │ ├── arrow-right.svg │ │ ├── icon-padlock.svg │ │ ├── icon-arrow-back-dark.svg │ │ ├── icon-arrow-back.svg │ │ ├── icon-arrow-left.svg │ │ ├── icon-arrow-right.svg │ │ ├── icon-cancel.svg │ │ ├── icon-key.svg │ │ ├── icon-small-packet.svg │ │ ├── icon-add.svg │ │ ├── icon-wind-dir.svg │ │ ├── arrow-up.svg │ │ ├── icon-delete.svg │ │ ├── up-arrow.svg │ │ ├── arrow-down.svg │ │ ├── icon-drops.svg │ │ ├── icon-wind.svg │ │ ├── icon-weather.svg │ │ ├── icon-small-location.svg │ │ ├── icon-weather-light.svg │ │ ├── icon-weather-small.svg │ │ ├── icon-small-location-dark.svg │ │ └── business │ │ │ ├── icon-9.svg │ │ │ ├── icon-3.svg │ │ │ ├── icon-1.svg │ │ │ ├── icon-2.svg │ │ │ └── icon-6.svg │ ├── docs │ │ ├── fonts │ │ │ ├── slate.eot │ │ │ ├── slate.ttf │ │ │ ├── slate.woff │ │ │ ├── slate.woff2 │ │ │ └── slate.svg │ │ ├── images │ │ │ ├── logo.png │ │ │ └── navbar.png │ │ └── stylesheets │ │ │ └── highlight-monokai.css │ ├── illustrations │ │ ├── MAM.png │ │ ├── home1.png │ │ ├── vision.png │ │ ├── exploring.png │ │ ├── hackathon.png │ │ ├── onboarding.png │ │ ├── header-image-1.png │ │ ├── header-image-2.png │ │ ├── header-image-3.png │ │ ├── sensor-image.png │ │ ├── proof_of_concept.png │ │ ├── sensor-image@2x.png │ │ ├── header-image-1@2x.png │ │ ├── header-image-2@2x.png │ │ ├── header-image-3@2x.png │ │ ├── joint_use_case_dev.png │ │ ├── use_case_ideation.png │ │ ├── sensor-location-image.png │ │ ├── sensor-location-image@2x.png │ │ └── business_model_innovation.png │ ├── fonts │ │ ├── NunitoSans-Black.ttf │ │ ├── NunitoSans-Bold.ttf │ │ ├── NunitoSans-Italic.ttf │ │ ├── NunitoSans-Light.ttf │ │ ├── NunitoSans-Regular.ttf │ │ ├── NunitoSans-SemiBold.ttf │ │ ├── NunitoSans-BlackItalic.ttf │ │ ├── NunitoSans-BoldItalic.ttf │ │ ├── NunitoSans-ExtraBold.ttf │ │ ├── NunitoSans-ExtraLight.ttf │ │ ├── NunitoSans-LightItalic.ttf │ │ ├── NunitoSans-ExtraBoldItalic.ttf │ │ ├── NunitoSans-ExtraLightItalic.ttf │ │ └── NunitoSans-SemiBoldItalic.ttf │ ├── template │ │ ├── package.json │ │ ├── keyStorage.js │ │ ├── README.md │ │ ├── index.js │ │ ├── mam.js │ │ └── data.json │ └── shapes │ │ ├── business │ │ ├── shape-5.svg │ │ ├── shape-2.svg │ │ ├── shape-header-hero.svg │ │ ├── shape-4.svg │ │ ├── shape-header-bg-1.svg │ │ └── shape-header-hero-text.svg │ │ ├── demo │ │ ├── shape-5.svg │ │ ├── shape-header-hero.svg │ │ └── shape-header-hero-text.svg │ │ ├── get_involved │ │ ├── shape-5.svg │ │ ├── shape-1.svg │ │ ├── shape-2.svg │ │ ├── shape-header-hero1.svg │ │ ├── shape-4.svg │ │ └── shape-header-bg-1.svg │ │ ├── proof_of_concept │ │ ├── shape-5.svg │ │ ├── shape-1.svg │ │ ├── shape-2.svg │ │ ├── shape-4.svg │ │ ├── shape-header-hero.svg │ │ ├── shape-header-bg-1.svg │ │ ├── shape-header-bg-2.svg │ │ └── shape-header-hero-text.svg │ │ ├── shape-main-1.svg │ │ ├── shape-header-hero.svg │ │ ├── shape-main-2.svg │ │ ├── shape-header-bg-1.svg │ │ ├── shape-header-bg-2.svg │ │ └── shape-main-1-mobile.svg ├── manifest.json └── index.html ├── Blueprint - Data Marketplace.pdf ├── firebase_functions ├── functions │ ├── src │ │ └── models │ │ │ ├── deviceListItem.ts │ │ │ └── wallet.ts │ ├── tsconfig.json │ ├── .eslintrc.json │ └── package.json ├── .gitignore ├── firebase.json ├── firestore.rules └── README.md ├── src ├── store │ ├── actionTypes.js │ ├── sensor │ │ ├── actions │ │ │ └── index.js │ │ └── reducer │ │ │ └── index.js │ ├── settings │ │ ├── actions │ │ │ └── index.js │ │ └── reducer │ │ │ └── index.js │ ├── user │ │ ├── actions │ │ │ └── index.js │ │ └── reducer │ │ │ └── index.js │ ├── reducer.js │ └── configure.js ├── config.json.example ├── components │ ├── map │ │ ├── controls.js │ │ └── markers.js │ ├── inview │ │ └── index.js │ ├── loading │ │ └── index.js │ ├── card │ │ └── index.js │ ├── scroll-to-top │ │ └── index.js │ ├── device-list │ │ └── index.js │ ├── content │ │ ├── list.js │ │ ├── index.js │ │ ├── heading.js │ │ └── card.js │ ├── carousel │ │ └── index.js │ ├── feature-section │ │ ├── why-join.js │ │ └── feature-cards.js │ ├── header │ │ ├── burger.js │ │ └── mini-header.js │ ├── banner │ │ └── index.js │ ├── data-stream │ │ └── index.js │ ├── login-modal │ │ └── index.js │ ├── sensor-nav │ │ └── index.js │ ├── device-nav │ │ └── index.js │ └── cookie │ │ └── index.js ├── assets │ └── scss │ │ └── menu.scss ├── index.js ├── utils │ ├── helpers.js │ ├── firebase.js │ ├── api.js │ ├── iota.js │ └── zip.js └── Router.js ├── .gitignore ├── cors-config.json ├── .github └── workflows │ └── codeql-analysis.yml ├── README.md └── firebase.json /docs/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /docs/source/fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/docs/source/fonts/slate.eot -------------------------------------------------------------------------------- /docs/source/fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/docs/source/fonts/slate.ttf -------------------------------------------------------------------------------- /docs/source/fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/docs/source/fonts/slate.woff -------------------------------------------------------------------------------- /docs/source/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/docs/source/images/logo.png -------------------------------------------------------------------------------- /docs/source/javascripts/all_nosearch.js: -------------------------------------------------------------------------------- 1 | //= require ./lib/_energize 2 | //= require ./app/_lang 3 | //= require ./app/_toc 4 | -------------------------------------------------------------------------------- /docs/source/fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/docs/source/fonts/slate.woff2 -------------------------------------------------------------------------------- /docs/source/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/docs/source/images/navbar.png -------------------------------------------------------------------------------- /public/static/logotypes/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/42.png -------------------------------------------------------------------------------- /public/static/logotypes/bkk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/bkk.png -------------------------------------------------------------------------------- /public/static/logotypes/cgi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/cgi.png -------------------------------------------------------------------------------- /public/static/logotypes/dnb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/dnb.png -------------------------------------------------------------------------------- /public/static/logotypes/dt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/dt.png -------------------------------------------------------------------------------- /public/static/logotypes/epm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/epm.png -------------------------------------------------------------------------------- /public/static/logotypes/ewe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/ewe.png -------------------------------------------------------------------------------- /public/static/logotypes/ey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/ey.png -------------------------------------------------------------------------------- /public/static/logotypes/ice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/ice.png -------------------------------------------------------------------------------- /public/static/logotypes/nte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/nte.png -------------------------------------------------------------------------------- /public/static/logotypes/occ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/occ.png -------------------------------------------------------------------------------- /public/static/logotypes/tum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/tum.png -------------------------------------------------------------------------------- /public/static/logotypes/uio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/uio.png -------------------------------------------------------------------------------- /Blueprint - Data Marketplace.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/Blueprint - Data Marketplace.pdf -------------------------------------------------------------------------------- /public/static/icons/map-atlas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/map-atlas.png -------------------------------------------------------------------------------- /public/static/logotypes/3for2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/3for2.png -------------------------------------------------------------------------------- /public/static/logotypes/RWTH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/RWTH.png -------------------------------------------------------------------------------- /public/static/logotypes/agder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/agder.png -------------------------------------------------------------------------------- /public/static/logotypes/akita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/akita.png -------------------------------------------------------------------------------- /public/static/logotypes/alpiq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/alpiq.png -------------------------------------------------------------------------------- /public/static/logotypes/bosch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/bosch.png -------------------------------------------------------------------------------- /public/static/logotypes/dnvgl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/dnvgl.png -------------------------------------------------------------------------------- /public/static/logotypes/engie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/engie.png -------------------------------------------------------------------------------- /public/static/logotypes/entra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/entra.png -------------------------------------------------------------------------------- /public/static/logotypes/festo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/festo.png -------------------------------------------------------------------------------- /public/static/logotypes/fourc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/fourc.png -------------------------------------------------------------------------------- /public/static/logotypes/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/grid.png -------------------------------------------------------------------------------- /public/static/logotypes/ismb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/ismb.png -------------------------------------------------------------------------------- /public/static/logotypes/kpmg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/kpmg.png -------------------------------------------------------------------------------- /public/static/logotypes/kryha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/kryha.png -------------------------------------------------------------------------------- /public/static/logotypes/ntnu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/ntnu.png -------------------------------------------------------------------------------- /public/static/logotypes/oslo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/oslo.png -------------------------------------------------------------------------------- /public/static/logotypes/poyry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/poyry.png -------------------------------------------------------------------------------- /public/static/logotypes/sweco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/sweco.png -------------------------------------------------------------------------------- /public/static/logotypes/tele2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/tele2.png -------------------------------------------------------------------------------- /public/static/logotypes/tine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/tine.png -------------------------------------------------------------------------------- /public/static/logotypes/tukio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/tukio.png -------------------------------------------------------------------------------- /public/static/logotypes/undc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/undc.png -------------------------------------------------------------------------------- /public/static/logotypes/unmsm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/unmsm.png -------------------------------------------------------------------------------- /public/static/logotypes/yield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/yield.png -------------------------------------------------------------------------------- /firebase_functions/functions/src/models/deviceListItem.ts: -------------------------------------------------------------------------------- 1 | export interface DeviceListItem { 2 | seed: string; 3 | sk: string; 4 | } 5 | -------------------------------------------------------------------------------- /public/static/docs/fonts/slate.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/docs/fonts/slate.eot -------------------------------------------------------------------------------- /public/static/docs/fonts/slate.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/docs/fonts/slate.ttf -------------------------------------------------------------------------------- /public/static/docs/fonts/slate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/docs/fonts/slate.woff -------------------------------------------------------------------------------- /public/static/docs/fonts/slate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/docs/fonts/slate.woff2 -------------------------------------------------------------------------------- /public/static/docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/docs/images/logo.png -------------------------------------------------------------------------------- /public/static/docs/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/docs/images/navbar.png -------------------------------------------------------------------------------- /public/static/icons/btn_google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/btn_google.png -------------------------------------------------------------------------------- /public/static/icons/icon-padlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/icon-padlock.png -------------------------------------------------------------------------------- /public/static/illustrations/MAM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/MAM.png -------------------------------------------------------------------------------- /public/static/logotypes/XDK2MAM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/XDK2MAM.png -------------------------------------------------------------------------------- /public/static/logotypes/acando.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/acando.png -------------------------------------------------------------------------------- /public/static/logotypes/aliander.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/aliander.png -------------------------------------------------------------------------------- /public/static/logotypes/allego.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/allego.png -------------------------------------------------------------------------------- /public/static/logotypes/amrita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/amrita.png -------------------------------------------------------------------------------- /public/static/logotypes/aparito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/aparito.png -------------------------------------------------------------------------------- /public/static/logotypes/apgsga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/apgsga.png -------------------------------------------------------------------------------- /public/static/logotypes/ariwonto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/ariwonto.png -------------------------------------------------------------------------------- /public/static/logotypes/arundo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/arundo.png -------------------------------------------------------------------------------- /public/static/logotypes/biilabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/biilabs.png -------------------------------------------------------------------------------- /public/static/logotypes/blocklab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/blocklab.png -------------------------------------------------------------------------------- /public/static/logotypes/crayon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/crayon.png -------------------------------------------------------------------------------- /public/static/logotypes/elering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/elering.png -------------------------------------------------------------------------------- /public/static/logotypes/enexis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/enexis.png -------------------------------------------------------------------------------- /public/static/logotypes/farmboek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/farmboek.png -------------------------------------------------------------------------------- /public/static/logotypes/fujitsu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/fujitsu.png -------------------------------------------------------------------------------- /public/static/logotypes/gasunie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/gasunie.png -------------------------------------------------------------------------------- /public/static/logotypes/illaris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/illaris.png -------------------------------------------------------------------------------- /public/static/logotypes/nordic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/nordic.png -------------------------------------------------------------------------------- /public/static/logotypes/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/orange.png -------------------------------------------------------------------------------- /public/static/logotypes/philips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/philips.png -------------------------------------------------------------------------------- /public/static/logotypes/samsung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/samsung.png -------------------------------------------------------------------------------- /public/static/logotypes/schuco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/schuco.png -------------------------------------------------------------------------------- /public/static/logotypes/swisscom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/swisscom.png -------------------------------------------------------------------------------- /public/static/logotypes/telstra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/telstra.png -------------------------------------------------------------------------------- /public/static/logotypes/trianel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/trianel.png -------------------------------------------------------------------------------- /docs/source/javascripts/all.js: -------------------------------------------------------------------------------- 1 | //= require ./lib/_energize 2 | //= require ./app/_lang 3 | //= require ./app/_search 4 | //= require ./app/_toc 5 | -------------------------------------------------------------------------------- /public/static/illustrations/home1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/home1.png -------------------------------------------------------------------------------- /public/static/illustrations/vision.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/vision.png -------------------------------------------------------------------------------- /public/static/logotypes/accenture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/accenture.png -------------------------------------------------------------------------------- /public/static/logotypes/farmforce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/farmforce.png -------------------------------------------------------------------------------- /public/static/logotypes/frankfurt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/frankfurt.png -------------------------------------------------------------------------------- /public/static/logotypes/innoenergy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/innoenergy.png -------------------------------------------------------------------------------- /public/static/logotypes/intelzone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/intelzone.png -------------------------------------------------------------------------------- /public/static/logotypes/microsoft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/microsoft.png -------------------------------------------------------------------------------- /public/static/logotypes/movimento.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/movimento.png -------------------------------------------------------------------------------- /public/static/logotypes/schneider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/schneider.png -------------------------------------------------------------------------------- /public/static/logotypes/trondheim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/trondheim.png -------------------------------------------------------------------------------- /public/static/logotypes/wondrwall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/wondrwall.png -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-Black.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-Bold.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-Italic.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-Light.ttf -------------------------------------------------------------------------------- /public/static/icons/icon-padlock@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/icon-padlock@2x.png -------------------------------------------------------------------------------- /public/static/illustrations/exploring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/exploring.png -------------------------------------------------------------------------------- /public/static/illustrations/hackathon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/hackathon.png -------------------------------------------------------------------------------- /public/static/logotypes/USC_viterbi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/USC_viterbi.png -------------------------------------------------------------------------------- /public/static/logotypes/bIOTAsphere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/bIOTAsphere.png -------------------------------------------------------------------------------- /public/static/logotypes/grandcentrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/grandcentrix.png -------------------------------------------------------------------------------- /public/static/logotypes/logo-footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/logo-footer.png -------------------------------------------------------------------------------- /public/static/logotypes/multiconsult.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/multiconsult.png -------------------------------------------------------------------------------- /public/static/logotypes/techMahindra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/techMahindra.png -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-Regular.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-SemiBold.ttf -------------------------------------------------------------------------------- /public/static/icons/get_involved/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/get_involved/arrow.png -------------------------------------------------------------------------------- /public/static/illustrations/onboarding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/onboarding.png -------------------------------------------------------------------------------- /public/static/logotypes/logo-footer@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/logo-footer@2x.png -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-BlackItalic.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-BoldItalic.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-ExtraBold.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-ExtraLight.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-LightItalic.ttf -------------------------------------------------------------------------------- /public/static/illustrations/header-image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/header-image-1.png -------------------------------------------------------------------------------- /public/static/illustrations/header-image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/header-image-2.png -------------------------------------------------------------------------------- /public/static/illustrations/header-image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/header-image-3.png -------------------------------------------------------------------------------- /public/static/illustrations/sensor-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/sensor-image.png -------------------------------------------------------------------------------- /public/static/logotypes/handelshoyskolen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/handelshoyskolen.png -------------------------------------------------------------------------------- /public/static/logotypes/south-east-water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/south-east-water.png -------------------------------------------------------------------------------- /public/static/illustrations/proof_of_concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/proof_of_concept.png -------------------------------------------------------------------------------- /public/static/illustrations/sensor-image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/sensor-image@2x.png -------------------------------------------------------------------------------- /public/static/logotypes/nordic_semiconductor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/logotypes/nordic_semiconductor.png -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /public/static/fonts/NunitoSans-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/fonts/NunitoSans-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /public/static/illustrations/header-image-1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/header-image-1@2x.png -------------------------------------------------------------------------------- /public/static/illustrations/header-image-2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/header-image-2@2x.png -------------------------------------------------------------------------------- /public/static/illustrations/header-image-3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/header-image-3@2x.png -------------------------------------------------------------------------------- /public/static/illustrations/joint_use_case_dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/joint_use_case_dev.png -------------------------------------------------------------------------------- /public/static/illustrations/use_case_ideation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/use_case_ideation.png -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/logos/bosch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/proof_of_concept/logos/bosch.png -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/logos/nordic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/proof_of_concept/logos/nordic.png -------------------------------------------------------------------------------- /public/static/illustrations/sensor-location-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/sensor-location-image.png -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/logos/adafruit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/proof_of_concept/logos/adafruit.png -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/logos/netatmo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/icons/proof_of_concept/logos/netatmo.png -------------------------------------------------------------------------------- /public/static/illustrations/sensor-location-image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/sensor-location-image@2x.png -------------------------------------------------------------------------------- /public/static/template/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@iota/iota.js": "^1.8.2", 4 | "@iota/mam.js": "^1.6.2", 5 | "node-fetch": "^2.6.6" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /public/static/illustrations/business_model_innovation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotaledger-archive/data-marketplace/HEAD/public/static/illustrations/business_model_innovation.png -------------------------------------------------------------------------------- /src/store/actionTypes.js: -------------------------------------------------------------------------------- 1 | export const LOAD_PROJECT_SETTINGS = 'SETTINGS'; 2 | export const LOAD_USER = 'LOAD_USER'; 3 | export const LOAD_SENSOR = 'LOAD_SENSOR'; 4 | export const LOGOUT = 'LOGOUT'; 5 | -------------------------------------------------------------------------------- /firebase_functions/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | .firebaserc 5 | 6 | # Compiled binary addons 7 | build/Release 8 | /functions/lib 9 | 10 | # Dependency directory 11 | node_modules 12 | -------------------------------------------------------------------------------- /public/static/icons/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /firebase_functions/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "functions": { 3 | "predeploy": "npm --prefix functions run build", 4 | "source": "functions" 5 | }, 6 | "firestore": { 7 | "rules": "firestore.rules" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # build artifacts 5 | /build 6 | .firebase 7 | .firebaserc 8 | 9 | .DS_Store 10 | 11 | /src/config*.json 12 | 13 | *.log 14 | 15 | webpack-build-log.json 16 | 17 | # VS Code 18 | .vscode 19 | -------------------------------------------------------------------------------- /public/static/icons/icon-padlock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /cors-config.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "origin": [ 4 | "http://localhost:3000", 5 | "https://data.iota.org" 6 | ], 7 | "responseHeader": ["Content-Type"], 8 | "method": ["OPTIONS", "GET", "POST", "PUT", "DELETE"], 9 | "maxAgeSeconds": 6000 10 | } 11 | ] 12 | -------------------------------------------------------------------------------- /docs/source/index.yml: -------------------------------------------------------------------------------- 1 | title: Data Marketplace API Reference 2 | 3 | language_tabs: 4 | - javascript 5 | 6 | toc_footers: 7 | - Back to Data Marketplace 8 | 9 | includes: 10 | - main 11 | - _errors 12 | 13 | search: true 14 | 15 | highlight_theme: monokai 16 | -------------------------------------------------------------------------------- /src/store/sensor/actions/index.js: -------------------------------------------------------------------------------- 1 | import { LOAD_SENSOR } from '../../actionTypes'; 2 | import api from '../../../utils/api'; 3 | 4 | export const loadSensor = deviceId => { 5 | const promise = api.get('device', { deviceId }); 6 | return { 7 | type: LOAD_SENSOR, 8 | promise, 9 | }; 10 | }; 11 | -------------------------------------------------------------------------------- /public/static/icons/icon-arrow-back-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/static/icons/icon-arrow-back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/store/settings/actions/index.js: -------------------------------------------------------------------------------- 1 | import { LOAD_PROJECT_SETTINGS } from '../../actionTypes'; 2 | import api from '../../../utils/api'; 3 | 4 | export const storeProjectSettings = () => { 5 | const promise = api.get('settings'); 6 | return { 7 | type: LOAD_PROJECT_SETTINGS, 8 | promise, 9 | }; 10 | }; 11 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Data Marketplace", 3 | "name": "The IOTA Data Marketplace", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone" 13 | } 14 | -------------------------------------------------------------------------------- /public/static/icons/icon-arrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/static/icons/icon-arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /firebase_functions/functions/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["es6"], 4 | "module": "commonjs", 5 | "noImplicitReturns": true, 6 | "outDir": "lib", 7 | "sourceMap": true, 8 | "target": "es6", 9 | "types": [] 10 | }, 11 | "compileOnSave": true, 12 | "include": ["src"] 13 | } 14 | -------------------------------------------------------------------------------- /firebase_functions/functions/src/models/wallet.ts: -------------------------------------------------------------------------------- 1 | export interface Wallet { 2 | address: string; 3 | seed: string; 4 | balance: number; 5 | } 6 | 7 | export interface InitializedWallet { 8 | messageId: string; 9 | wallet: Wallet; 10 | } 11 | 12 | export interface BalanceOnlyWallet { 13 | messageId: string; 14 | wallet: { balance: number }; 15 | } 16 | -------------------------------------------------------------------------------- /public/static/icons/icon-cancel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/config.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 3 | "authDomain": "XXXXXXXXXXXXX.firebaseapp.com", 4 | "databaseURL": "https://XXXXXXXXXXXXX.firebaseio.com", 5 | "projectId": "XXXXXXXXXXXXX", 6 | "domain": "https://us-central1-XXXXXXXXXXXXX.cloudfunctions.net", 7 | "nodeUrl": "https://api.lb-0.h.chrysalis-devnet.iota.cafe/" 8 | } 9 | -------------------------------------------------------------------------------- /src/store/user/actions/index.js: -------------------------------------------------------------------------------- 1 | import { LOAD_USER, LOGOUT } from '../../actionTypes'; 2 | import api from '../../../utils/api'; 3 | 4 | export const loadUser = userId => { 5 | if (!userId) return; 6 | const promise = api.get('user', { userId }); 7 | return { 8 | type: LOAD_USER, 9 | promise, 10 | }; 11 | }; 12 | 13 | export const logout = () => ({ 14 | type: LOGOUT, 15 | }); 16 | -------------------------------------------------------------------------------- /public/static/icons/icon-key.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | Getting Started 2 | ------------------------------ 3 | 4 | ### Prerequisites 5 | 6 | You're going to need: 7 | 8 | - **Node.js v8** 9 | 10 | 11 | ```shell 12 | yarn 13 | ``` 14 | 15 | ### Getting Set Up 16 | 17 | ```shell 18 | yarn start 19 | ``` 20 | 21 | You can now see the docs at http://localhost:4567 22 | 23 | ### Build static page 24 | 25 | Compile documentation to static site in `./build`: 26 | 27 | ```shell 28 | yarn build 29 | ``` 30 | 31 | -------------------------------------------------------------------------------- /src/components/map/controls.js: -------------------------------------------------------------------------------- 1 | import { MapController } from 'react-map-gl'; 2 | 3 | export default class MyMapControls extends MapController { 4 | constructor() { 5 | super(); 6 | // subscribe to additional events 7 | this.events = ['click']; 8 | } 9 | 10 | // override the default handler in MapControls 11 | handle(event) { 12 | if (event.type === 'wheel') { 13 | return false; 14 | } 15 | return super.handle(event); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/store/sensor/reducer/index.js: -------------------------------------------------------------------------------- 1 | import { handle } from 'redux-pack'; 2 | import { LOAD_SENSOR } from '../../actionTypes'; 3 | 4 | export default (state = {}, action) => { 5 | const { type, payload } = action; 6 | 7 | switch (type) { 8 | case LOAD_SENSOR: 9 | if (!payload || payload.length === 0) return state; 10 | return handle(state, action, { 11 | success: prevState => payload, 12 | failure: prevState => prevState, 13 | }); 14 | default: 15 | return state; 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /src/store/reducer.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import { LOGOUT } from './actionTypes'; 3 | import settings from './settings/reducer'; 4 | import user from './user/reducer'; 5 | import sensor from './sensor/reducer'; 6 | 7 | const appReducer = combineReducers({ 8 | settings, 9 | sensor, 10 | user, 11 | }); 12 | 13 | const rootReducer = (state, action) => { 14 | if (action.type === LOGOUT) { 15 | state = undefined; 16 | } 17 | 18 | return appReducer(state, action); 19 | }; 20 | 21 | export default rootReducer; 22 | -------------------------------------------------------------------------------- /src/store/settings/reducer/index.js: -------------------------------------------------------------------------------- 1 | import { handle } from 'redux-pack'; 2 | import { LOAD_PROJECT_SETTINGS } from '../../actionTypes'; 3 | 4 | export default (state = {}, action) => { 5 | const { type, payload } = action; 6 | 7 | switch (type) { 8 | case LOAD_PROJECT_SETTINGS: 9 | if (!payload || payload.length === 0) return state; 10 | return handle(state, action, { 11 | success: prevState => payload, 12 | failure: prevState => prevState, 13 | }); 14 | default: 15 | return state; 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /src/components/inview/index.js: -------------------------------------------------------------------------------- 1 | import React, { useContext, useEffect } from 'react'; 2 | import InView from 'in-view'; 3 | import { SensorContext } from '../../pages/sensor'; 4 | 5 | const InViewEvent = ({ children }) => { 6 | const { func } = useContext(SensorContext); 7 | 8 | // Attach eventListener to last data packet to load new data when last packet is in view 9 | useEffect(() => { 10 | InView('.inview').on('enter', (el) => func()); 11 | }, []); 12 | 13 | return
{children}
; 14 | }; 15 | 16 | export default InViewEvent; 17 | -------------------------------------------------------------------------------- /src/store/user/reducer/index.js: -------------------------------------------------------------------------------- 1 | import { handle } from 'redux-pack'; 2 | import { LOAD_USER, LOGOUT } from '../../actionTypes'; 3 | 4 | export default (state = {}, action) => { 5 | const { type, payload } = action; 6 | 7 | switch (type) { 8 | case LOAD_USER: 9 | if (!payload || payload.length === 0) return state; 10 | return handle(state, action, { 11 | success: prevState => payload, 12 | failure: prevState => prevState, 13 | }); 14 | case LOGOUT: 15 | return {}; 16 | default: 17 | return state; 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /firebase_functions/functions/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 7 | "parser": "@typescript-eslint/parser", 8 | "parserOptions": { 9 | "ecmaVersion": 13, 10 | "sourceType": "module" 11 | }, 12 | "plugins": ["@typescript-eslint"], 13 | "rules": { 14 | "@typescript-eslint/no-var-requires": "off", 15 | "@typescript-eslint/no-var-requires": "off", 16 | "@typescript-eslint/no-explicit-any": "off" 17 | }, 18 | "root": true 19 | } 20 | -------------------------------------------------------------------------------- /docs/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2015 SD Elements, Inc. 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. -------------------------------------------------------------------------------- /src/assets/scss/menu.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Burger menu custom styles 3 | // 4 | .bm-burger-button { 5 | position: fixed; 6 | width: 30px; 7 | height: 22px; 8 | top: 36px; 9 | left: initial; 10 | right: 15px; 11 | padding: 10px 0; 12 | opacity: 0.8; 13 | } 14 | 15 | .bm-burger-bars { 16 | background: #373a47; 17 | } 18 | 19 | .bm-morph-shape { 20 | fill: #373a47; 21 | } 22 | 23 | .bm-menu { 24 | background: #373a47; 25 | } 26 | 27 | #slide { 28 | .bm-cross { 29 | background: #bdc3c7; 30 | } 31 | 32 | .bm-menu { 33 | padding: 2.5em 0.4em 0; 34 | font-size: 1.15em; 35 | width: 88%; 36 | float: right; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /firebase_functions/firestore.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service cloud.firestore { 3 | match /databases/{database}/documents { 4 | match /deviceList { 5 | allow read, write: if false; 6 | } 7 | match /keys { 8 | allow read, write: if false; 9 | } 10 | match /settings { 11 | allow read, write: if false; 12 | } 13 | match /devices/{documents=**} { 14 | // Allow reading of devices 15 | allow read; 16 | allow write: if request.auth.token.email.matches('.*@iota[.]org'); 17 | } 18 | match /users/{userId} { 19 | allow read, write: if request.auth.uid == userId; 20 | } 21 | match /users/{userId}/{documents=**} { 22 | allow read: if request.auth.uid == userId; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/static/docs/stylesheets/highlight-monokai.css: -------------------------------------------------------------------------------- 1 | .hljs{display:block;overflow-x:auto;padding:.5em;background:#272822;color:#ddd}.hljs-keyword,.hljs-literal,.hljs-name,.hljs-selector-tag,.hljs-strong,.hljs-tag{color:#f92672}.hljs-code{color:#66d9ef}.hljs-class .hljs-title{color:#fff}.hljs-attribute,.hljs-link,.hljs-regexp,.hljs-symbol{color:#bf79db}.hljs-addition,.hljs-built_in,.hljs-builtin-name,.hljs-bullet,.hljs-emphasis,.hljs-section,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-string,.hljs-subst,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type,.hljs-variable{color:#a6e22e}.hljs-comment,.hljs-deletion,.hljs-meta,.hljs-quote{color:#75715e}.hljs-doctag,.hljs-keyword,.hljs-literal,.hljs-section,.hljs-selector-id,.hljs-selector-tag,.hljs-title,.hljs-type{font-weight:700} -------------------------------------------------------------------------------- /public/static/icons/get_involved/icon-quote.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /public/static/icons/icon-small-packet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/static/template/keyStorage.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch'); 2 | const { debug, endpoint, secretKey, sensorId } = require('./config.json'); 3 | 4 | // Push key to data marketplace. 5 | exports.storeKey = async (sidekey, root, messageId, time) => { 6 | if (debug) return 'Debug mode'; 7 | 8 | const packet = { 9 | sidekey, 10 | root, 11 | time, 12 | messageId 13 | }; 14 | 15 | try { 16 | // Initiate Fetch Call 17 | const resp = await fetch(endpoint, { 18 | method: 'POST', 19 | headers: { 20 | 'Content-Type': 'application/json' 21 | }, 22 | body: JSON.stringify({ id: sensorId, packet, sk: secretKey }) 23 | }); 24 | return await resp.json(); 25 | } catch (error) { 26 | console.log('storeKey error', error); 27 | return error; 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /public/static/icons/icon-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/components/loading/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default ({ color = '#fff', size = '80' }) => ( 4 | 11 | 12 | 13 | 14 | 15 | 23 | 24 | 25 | 26 | 27 | ); 28 | -------------------------------------------------------------------------------- /public/static/icons/icon-wind-dir.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL" 2 | 3 | on: 4 | push: 5 | branches: [develop] 6 | pull_request: 7 | branches: [develop] 8 | schedule: 9 | - cron: '0 0 * * 1' 10 | 11 | jobs: 12 | analyze: 13 | name: Analyze 14 | runs-on: ubuntu-latest 15 | 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | language: ['javascript'] 20 | 21 | steps: 22 | - name: Checkout repository 23 | uses: actions/checkout@v2 24 | with: 25 | fetch-depth: 2 26 | 27 | - run: git checkout HEAD^2 28 | if: ${{ github.event_name == 'pull_request' }} 29 | 30 | # Initializes the CodeQL tools for scanning. 31 | - name: Initialize CodeQL 32 | uses: github/codeql-action/init@v1 33 | with: 34 | languages: ${{ matrix.language }} 35 | 36 | - name: Perform CodeQL Analysis 37 | uses: github/codeql-action/analyze@v1 38 | -------------------------------------------------------------------------------- /public/static/shapes/business/shape-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/demo/shape-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/get_involved/shape-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/business/shape-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/demo/shape-header-hero.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/get_involved/shape-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/get_involved/shape-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/get_involved/shape-header-hero1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/business/shape-header-hero.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /docs/source/stylesheets/_icon-font.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'slate'; 3 | src:url('../fonts/slate.eot?-syv14m'); 4 | src:url('../fonts/slate.eot?#iefix-syv14m') format('embedded-opentype'), 5 | url('../fonts/slate.woff2?-syv14m') format('woff2'), 6 | url('../fonts/slate.woff?-syv14m') format('woff'), 7 | url('../fonts/slate.ttf?-syv14m') format('truetype'), 8 | url('../fonts/slate.svg?-syv14m#slate') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | 13 | %icon { 14 | font-family: 'slate'; 15 | speak: none; 16 | font-style: normal; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | } 22 | 23 | %icon-exclamation-sign { 24 | @extend %icon; 25 | content: "\e600"; 26 | } 27 | %icon-info-sign { 28 | @extend %icon; 29 | content: "\e602"; 30 | } 31 | %icon-ok-sign { 32 | @extend %icon; 33 | content: "\e606"; 34 | } 35 | %icon-search { 36 | @extend %icon; 37 | content: "\e607"; 38 | } 39 | -------------------------------------------------------------------------------- /public/static/shapes/business/shape-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/get_involved/shape-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-header-hero.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/icons/arrow-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | background 7 | 8 | 9 | 10 | Layer 1 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/static/shapes/shape-main-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/static/shapes/shape-header-hero.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/static/shapes/shape-main-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/static/shapes/shape-header-bg-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/static/shapes/shape-header-bg-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/static/shapes/shape-main-1-mobile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/static/shapes/business/shape-header-bg-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /public/static/shapes/get_involved/shape-header-bg-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-header-bg-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-header-bg-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /public/static/icons/icon-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/static/icons/up-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | -------------------------------------------------------------------------------- /src/store/configure.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware, compose } from 'redux'; 2 | import { middleware as reduxPackMiddleware } from 'redux-pack'; 3 | import reducer from './reducer'; 4 | 5 | let devtools = () => (fn) => fn; 6 | let log = () => (fn) => fn; 7 | if (process.env.NODE_ENV === 'development') { 8 | if (window.devToolsExtension) { 9 | devtools = window.devToolsExtension; 10 | } 11 | } 12 | 13 | if (process.env.NODE_ENV === 'development') { 14 | log = require('redux-logger').default; 15 | } 16 | 17 | const configureStore = (initialState) => { 18 | let enhancers; 19 | if (process.env.NODE_ENV === 'development') { 20 | enhancers = [applyMiddleware(reduxPackMiddleware, log), devtools()]; 21 | } else { 22 | enhancers = [applyMiddleware(reduxPackMiddleware), devtools()]; 23 | } 24 | 25 | const store = createStore(reducer, initialState, compose(...enhancers)); 26 | 27 | if (module.hot) { 28 | module.hot.accept('./reducer', () => { 29 | const nextReducer = require('./reducer').default; 30 | store.replaceReducer(nextReducer); 31 | }); 32 | } 33 | 34 | return store; 35 | }; 36 | 37 | export default configureStore; 38 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import WebFontLoader from 'webfontloader'; 4 | import ReactGA from 'react-ga'; 5 | import { Provider } from 'react-redux'; 6 | import './assets/scss/index.scss'; 7 | import Router from './Router'; 8 | import configureStore from './store/configure'; 9 | import { initializeFirebaseApp } from './utils/firebase'; 10 | import * as serviceWorker from './serviceWorker'; 11 | 12 | WebFontLoader.load({ 13 | google: { 14 | families: ['Nunito Sans:200,300,400,600,700,800', 'Material Icons'], 15 | }, 16 | }); 17 | 18 | initializeFirebaseApp(); 19 | const store = configureStore(); 20 | 21 | ReactGA.initialize('UA-133496479-1'); 22 | ReactGA.set({ anonymizeIp: true }); 23 | 24 | const renderApp = () => ( 25 | 26 | 27 | 28 | ); 29 | 30 | ReactDOM.render(renderApp(), document.getElementById('root')); 31 | 32 | // If you want your app to work offline and load faster, you can change 33 | // unregister() to register() below. Note this comes with some pitfalls. 34 | // Learn more about service workers: http://bit.ly/CRA-PWA 35 | serviceWorker.unregister(); 36 | -------------------------------------------------------------------------------- /public/static/icons/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | background 7 | 8 | 9 | 10 | Layer 1 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/utils/helpers.js: -------------------------------------------------------------------------------- 1 | import FileSaver from 'file-saver'; 2 | 3 | export const reducer = amount => { 4 | if (amount < Math.pow(10, 3)) { 5 | const num = amount; 6 | if (num % 1 !== 0) return num.toFixed(2) + 'i'; 7 | return num + 'i'; 8 | } else if (amount < Math.pow(10, 6)) { 9 | const num = amount / Math.pow(10, 3); 10 | if (num % 1 !== 0) return num.toFixed(2) + 'Ki'; 11 | return num + 'Ki'; 12 | } else if (amount < Math.pow(10, 9)) { 13 | const num = amount / Math.pow(10, 6); 14 | if (num % 1 !== 0) return num.toFixed(2) + 'Mi'; 15 | return num + 'Mi'; 16 | } else if (amount < Math.pow(10, 12)) { 17 | const num = amount / Math.pow(10, 9); 18 | if (num % 1 !== 0) return num.toFixed(2) + 'Gi'; 19 | return num + 'Gi'; 20 | } else if (amount < Math.pow(10, 15)) { 21 | const num = amount / Math.pow(10, 12); 22 | if (num % 1 !== 0) return num.toFixed(2) + 'Ti'; 23 | return num + 'Ti'; 24 | } 25 | }; 26 | 27 | export const getSensorStreamJSON = async (sensorId, stream) => { 28 | const blob = new Blob([JSON.stringify(stream, null, 2)], {type : 'application/json'}); 29 | FileSaver.saveAs(blob, `${sensorId}-data.json`); 30 | }; -------------------------------------------------------------------------------- /docs/source/includes/_errors.md: -------------------------------------------------------------------------------- 1 | # Errors 2 | 3 | 4 | 5 | The Kittn API uses the following error codes: 6 | 7 | 8 | Error Code | Meaning 9 | ---------- | ------- 10 | 400 | Bad Request -- Your request sucks 11 | 401 | Unauthorized -- Your API key is wrong 12 | 403 | Forbidden -- The kitten requested is hidden for administrators only 13 | 404 | Not Found -- The specified kitten could not be found 14 | 405 | Method Not Allowed -- You tried to access a kitten with an invalid method 15 | 406 | Not Acceptable -- You requested a format that isn't json 16 | 410 | Gone -- The kitten requested has been removed from our servers 17 | 418 | I'm a teapot 18 | 429 | Too Many Requests -- You're requesting too many kittens! Slow down! 19 | 500 | Internal Server Error -- We had a problem with our server. Try again later. 20 | 503 | Service Unavailable -- We're temporarially offline for maintanance. Please try again later. 21 | -------------------------------------------------------------------------------- /public/static/icons/icon-drops.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/static/shapes/business/shape-header-hero-text.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | Exploring together 15 | new business 16 | models 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/static/shapes/demo/shape-header-hero-text.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | Try the Data 16 | Marketplace 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/static/icons/icon-wind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/card/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | 4 | export default props => ( 5 | 6 | {props.header ? {props.header} : null} 7 | {props.children} 8 | {props.footer ? {props.footer} : null} 9 | 10 | ); 11 | 12 | const Card = styled.div` 13 | color: inherit; 14 | text-decoration: none; 15 | position: relative; 16 | padding-top: 20px; 17 | border: 1px solid #eaecee; 18 | border-radius: 6px; 19 | margin-bottom: 40px; 20 | background-color: #fff; 21 | cursor: pointer; 22 | transition: box-shadow 0.19s ease-out; 23 | width: 500px; 24 | @media (max-width: 1120px) { 25 | margin-bottom: 20px; 26 | } 27 | @media (max-width: 890px) { 28 | width: 100%; 29 | } 30 | @media (max-width: 400px) { 31 | width: 280px; 32 | } 33 | &:hover { 34 | box-shadow: 0 23px 50px 0 rgba(25, 54, 80, 0.1); 35 | } 36 | `; 37 | 38 | const CardHeader = styled.header` 39 | position: relative; 40 | padding: 0 30px 8px 30px; 41 | border-bottom: 1px solid #eaecee; 42 | `; 43 | 44 | const CardFooter = styled.footer` 45 | padding: 20px 30px; 46 | background-color: rgba(206, 218, 226, 0.2); 47 | border-top: 1px solid #eaecee; 48 | `; 49 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "data-marketplace-api-reference", 3 | "version": "1.0.0", 4 | "description": "Data Marketplace API Reference", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "gulp serve", 8 | "build": "rimraf ./build && gulp" 9 | }, 10 | "license": "Apache-2.0", 11 | "homepage": "https://data.iota.org/#/documentation", 12 | "devDependencies": { 13 | "del": "^6.0.0", 14 | "gulp": "^4.0.2", 15 | "gulp-clean-css": "^4.3.0", 16 | "gulp-cli": "^2.3.0", 17 | "gulp-concat": "^2.6.1", 18 | "gulp-ejs": "^5.1.0", 19 | "gulp-if": "^3.0.0", 20 | "gulp-live-server": "^0.0.31", 21 | "gulp-open": "^3.0.1", 22 | "gulp-prettify": "^0.5.0", 23 | "gulp-rename": "^2.0.0", 24 | "gulp-sass": "^4.1.0", 25 | "gulp-uglify": "^3.0.2", 26 | "gulp-util": "^3.0.8", 27 | "highlight.js": "^10.6.0", 28 | "js-yaml": "^4.1.0", 29 | "marked": "^2.0.0", 30 | "node-sass": "^5.0.0", 31 | "rimraf": "^3.0.2" 32 | }, 33 | "resolutions": { 34 | "ansi-regex": "^5.0.1", 35 | "glob-parent": "^5.1.2", 36 | "hosted-git-info": "^2.8.9", 37 | "lodash": "^4.17.21", 38 | "lodash.template": "^4.5.0", 39 | "path-parse": "^1.0.7", 40 | "tar": "^4.4.18", 41 | "trim-newlines": "^3.0.1", 42 | "yargs-parser": "^5.0.1" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/components/scroll-to-top/index.js: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | 3 | export default class Sticky extends PureComponent { 4 | static defaultProps = { 5 | top: 380, 6 | }; 7 | 8 | constructor(props) { 9 | super(props); 10 | this.setSticky = this.setSticky.bind(this); 11 | } 12 | 13 | componentDidMount() { 14 | window.addEventListener('scroll', this.setSticky); 15 | } 16 | 17 | componentWillUnmount() { 18 | window.removeEventListener('scroll', this.setSticky); 19 | } 20 | 21 | setSticky() { 22 | const { elem } = this; 23 | const { top } = this.props; 24 | window.requestAnimationFrame(() => { 25 | const scrollTop = 26 | window.pageYOffset !== undefined 27 | ? window.pageYOffset 28 | : (document.documentElement || document.body.parentNode || document.body).scrollTop; 29 | 30 | if (scrollTop >= top) { 31 | elem.style.position = 'fixed'; 32 | elem.style.top = `${top}px`; 33 | } else { 34 | elem.style.position = 'relative'; 35 | elem.style.top = 0; 36 | } 37 | }); 38 | } 39 | 40 | render() { 41 | return ( 42 |
(this.elem = elem)} onClick={this.props.onClick}> 43 | scrollToTop 44 |
45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/components/device-list/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import DeviceCard from '../card/device'; 4 | import AddCard from '../add-sensor'; 5 | 6 | export default props => ( 7 | 8 | 9 | {props.devices.map((device, i) => ( 10 | 11 | ))} 12 | {props.devices.length < props.maxDevices ? ( 13 | 14 | ) : ( 15 | {`You can create up to ${props.maxDevices || 16 | 5} devices. Delete a device to add another.`} 17 | )} 18 | 19 | 20 | ); 21 | 22 | const InfoCol = styled.main` 23 | position: relative; 24 | width: 880px; 25 | 26 | @media (max-width: 760px) { 27 | width: 100%; 28 | padding: 0; 29 | } 30 | `; 31 | 32 | const CardWrapper = styled.div` 33 | display: flex; 34 | flex-flow: row wrap; 35 | justify-content: space-between; 36 | padding: 40px 40px 200px; 37 | @media (max-width: 1195px) { 38 | flex-flow: column nowrap; 39 | padding-bottom: 0; 40 | } 41 | @media (max-width: 760px) { 42 | width: 100%; 43 | align-items: center; 44 | } 45 | `; 46 | 47 | const End = styled.span` 48 | padding: 15px 0 50px; 49 | color: white; 50 | opacity: 0.4; 51 | `; 52 | -------------------------------------------------------------------------------- /public/static/template/README.md: -------------------------------------------------------------------------------- 1 | ## Install packages 2 | If you have Yarn, run: 3 | `yarn` 4 | 5 | If you have NPM, run: 6 | `npm install` 7 | 8 | 9 | ## Run script 10 | `node index.js` 11 | 12 | 13 | ## Modify payload 14 | Payload​ represents a single data package in ​JSON​ format, it’s keys should match field IDs of the sensor. 15 | 16 | Open `index.js` file from the root folder. 17 | You'll find two usage examples 18 | - First example shows how to read sensor data from a static file or database. For this example we 19 | provided a `​data.json​` file with sample data. 20 | - Second example shows how to read sensor data from remote server using API. For this example we utilize a server which serves sample data. To modify the server URL, please update the serverUrl​ field from the ​`config.json`​ file in same folder. 21 | 22 | To modify the sensor ID and it’s secret key, please update the ​`config.json`.​ 23 | 24 | #### Debug your code 25 | By default the script runs in `​debug mode` which enables you to verify the data before publishing it to the Data Marketplace. 26 | 27 | As long as debug flag set to `​true​`, no data is published. 28 | To modify the ​debug​ flag please update the ​debug​ field from the ​`config.json`​ file. 29 | 30 | 31 | ## Publish to the Data Marketplace 32 | 33 | To publish data stream to the Data Marketplace, set the `debug` variable to `false` in `config.json` file 34 | -------------------------------------------------------------------------------- /src/components/content/list.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import Heading from './heading'; 4 | 5 | export default class List extends React.Component { 6 | render() { 7 | const { id, items, title } = this.props; 8 | return ( 9 |
10 | {title ? : null} 11 | 18 |
19 | ); 20 | } 21 | } 22 | 23 | const DIV = styled.div` 24 | width: 100%; 25 | max-width: 1170px; 26 | padding: 0 15px; 27 | margin-right: auto; 28 | margin-left: auto; 29 | display: flex; 30 | align-items: center; 31 | justify-content: center; 32 | flex-direction: column; 33 | `; 34 | 35 | const Ul = styled.ul` 36 | width: 100%; 37 | max-width: 724px; 38 | list-style: none; 39 | padding: 0 20px; 40 | margin: 0; 41 | `; 42 | 43 | const Li = styled.li` 44 | color: #cedbe2; 45 | display: flex; 46 | line-height: 16px; 47 | 48 | &::before { 49 | content: '•'; 50 | padding-right: 14px; 51 | padding-top: 4px; 52 | color: #009fff; 53 | } 54 | `; 55 | 56 | const SPAN = styled.span` 57 | font-size: 16px; 58 | line-height: 27px; 59 | color: #4e5a61; 60 | `; 61 | -------------------------------------------------------------------------------- /src/utils/firebase.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import 'firebase/app'; 3 | import 'firebase/auth'; 4 | import 'firebase/firestore'; 5 | import api from './api'; 6 | import config from '../config.json'; 7 | 8 | export const initializeFirebaseApp = () => { 9 | firebase.initializeApp(config); 10 | }; 11 | 12 | export const userAuth = async () => { 13 | return new Promise((resolve, reject) => { 14 | firebase.auth().onAuthStateChanged(async (user) => { 15 | if (user) { 16 | // User is signed in. 17 | resolve(user); 18 | } else { 19 | firebase 20 | .auth() 21 | .signInAnonymously() 22 | .then((data) => { 23 | if (data.user) { 24 | resolve(data.user); 25 | } 26 | reject(data); 27 | }) 28 | .catch((error) => { 29 | console.error('userAuth error', error); 30 | reject(error.message); 31 | return error.message; 32 | }); 33 | } 34 | }); 35 | }); 36 | }; 37 | 38 | export const allDevices = () => { 39 | return new Promise(async (resolve, reject) => { 40 | try { 41 | const devices = await api.get('devices'); 42 | const devicesWithData = devices.filter((device) => device.hasData); 43 | resolve(devicesWithData); 44 | } catch (error) { 45 | reject(error); 46 | } 47 | }); 48 | }; 49 | -------------------------------------------------------------------------------- /src/components/carousel/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | // import Slider from 'react-slick'; 3 | import styled from 'styled-components'; 4 | 5 | export default class extends React.Component { 6 | render() { 7 | const settings = { 8 | dots: true, 9 | infinite: true, 10 | speed: 500, 11 | slidesToShow: 1, 12 | slidesToScroll: 1, 13 | }; 14 | return ( 15 | 16 | {/* 17 | {this.props.items.map(item => ( 18 | 19 |

{item}

20 |
21 | ))} 22 |
*/} 23 |
24 | ); 25 | } 26 | } 27 | 28 | const Container = styled.div` 29 | display: none; 30 | @media (max-width: 650px) { 31 | width: 90%; 32 | display: flex; 33 | flex-direction: column; 34 | align-self: center; 35 | margin-bottom: 30px; 36 | } 37 | `; 38 | 39 | const Item = styled.div` 40 | padding: 10px; 41 | `; 42 | 43 | const P = styled.p` 44 | height: 200px; 45 | font-size: 17px; 46 | font-weight: normal; 47 | line-height: 1.88; 48 | text-align: left; 49 | color: #ffffff; 50 | border-radius: 10px; 51 | border: solid 1px #4194ff; 52 | padding: 0 30px; 53 | display: flex; 54 | justify-content: center; 55 | flex-direction: column; 56 | background-image: linear-gradient(219deg, #4194ff, #175fe1); 57 | `; 58 | -------------------------------------------------------------------------------- /public/static/shapes/proof_of_concept/shape-header-hero-text.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | Proof of Concept 16 | Technical specifications 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | The IOTA Data Marketplace 28 | 29 | 30 | 31 | 32 |
33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/utils/api.js: -------------------------------------------------------------------------------- 1 | import { stringify } from 'query-string'; 2 | import { domain } from '../config.json'; 3 | 4 | // TODO: check version '1.5.0'; 5 | const apiVersion = 1; 6 | 7 | const headers = { 8 | 'Content-Type': 'application/json', 9 | 'X-IOTA-API-Version': apiVersion, 10 | }; 11 | 12 | const parseSettings = ({ method, data } = {}) => ({ 13 | headers, 14 | method, 15 | body: data ? JSON.stringify(data) : undefined, 16 | }); 17 | 18 | const parseEndpoint = (endpoint, params) => { 19 | const querystring = params ? `?${stringify(params)}` : ''; 20 | return `${endpoint}${querystring}`; 21 | }; 22 | 23 | const request = async (endpoint, { params, ...settings } = {}) => { 24 | if (!endpoint) return null; 25 | const response = await fetch(parseEndpoint(endpoint, params), parseSettings(settings)); 26 | const result = await response.json(); 27 | return result; 28 | }; 29 | 30 | export default { 31 | get: async (endpoint, params) => { 32 | return await request(`${domain}/${endpoint}`, { method: 'get', params }); 33 | }, 34 | post: async (endpoint, data = {}) => { 35 | return await request(`${domain}/${endpoint}`, { method: 'post', data }); 36 | }, 37 | put: async (endpoint, data = {}) => { 38 | return await request(`${domain}/${endpoint}`, { method: 'put', data }); 39 | }, 40 | delete: async (endpoint, data = {}) => { 41 | return await request(`${domain}/${endpoint}`, { method: 'delete', data }); 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /public/static/icons/icon-weather.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/content/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import Heading from './heading'; 4 | 5 | export default class Content extends React.Component { 6 | componentDidUpdate() { 7 | if (this.props.anchor) { 8 | const target = document.querySelector(`#${this.props.anchor}`); 9 | target.scrollIntoView({ behavior: 'smooth', block: 'start' }); 10 | } 11 | } 12 | 13 | render() { 14 | const { 15 | content: { id, title, text, img = null }, 16 | } = this.props; 17 | return ( 18 |
19 | {title ? : null} 20 |
21 | { 22 | typeof text === 'object' ? ( 23 |

{text}

24 | ) : ( 25 |

26 | ) 27 | } 28 |

29 |
30 | ); 31 | } 32 | } 33 | 34 | const SECTION = styled.section` 35 | z-index: 10; 36 | padding: 20px; 37 | max-width: 724px; 38 | width: 100%; 39 | display: flex; 40 | align-self: center; 41 | align-items: flex-start; 42 | flex-direction: column; 43 | `; 44 | 45 | const DIV = styled.div` 46 | display: flex; 47 | justify-content: center; 48 | `; 49 | 50 | const P = styled.p` 51 | @media (max-width: 1120px) { 52 | margin: 0 auto; 53 | } 54 | font-size: 16px; 55 | line-height: 27px; 56 | color: #4e5a61; 57 | max-width: 724px; 58 | `; 59 | -------------------------------------------------------------------------------- /src/components/content/heading.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | 4 | export default class Heading extends React.Component { 5 | componentDidUpdate() { 6 | if (this.props.anchor) { 7 | const target = document.querySelector(`#${this.props.anchor}`); 8 | target.scrollIntoView({ behavior: 'smooth', block: 'start' }); 9 | } 10 | } 11 | 12 | render() { 13 | const { id, title, img } = this.props; 14 | return ( 15 |
16 | {img ? ( 17 | 18 | {title} 19 | {title} 20 | 21 | ) : ( 22 |

{title}

23 | )} 24 |
25 | ); 26 | } 27 | } 28 | 29 | const HeaderWrapper = styled.div` 30 | display: flex; 31 | flex-direction: row; 32 | align-items: center; 33 | `; 34 | 35 | const HEADER = styled.header` 36 | margin-bottom: 20px; 37 | width: 100%; 38 | `; 39 | 40 | const H3 = styled.h3` 41 | font-size: 28px; 42 | font-weight: normal; 43 | line-height: 32px; 44 | margin-bottom: 12px; 45 | text-align: center; 46 | color: #009fff; 47 | @media (max-width: 760px) { 48 | font-size: 24px; 49 | margin-bottom: 0; 50 | } 51 | `; 52 | 53 | const H3IMG = styled(H3)` 54 | text-align: left; 55 | color: #292929; 56 | margin-bottom: 0; 57 | `; 58 | 59 | const IMG = styled.img` 60 | width: 80px; 61 | margin-right: 20px; 62 | `; 63 | -------------------------------------------------------------------------------- /public/static/icons/icon-small-location.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/static/icons/icon-weather-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/static/icons/icon-weather-small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/content/card.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | 4 | const Card = ({ imageSrc, imageAlt, heading, text, scale }) => ( 5 | 6 | {imageAlt} 7 | {heading} 8 | {text} 9 | 10 | ); 11 | 12 | export default props => { 13 | if (props.link) { 14 | return ( 15 | 16 | 17 | 18 | ); 19 | } 20 | return ; 21 | }; 22 | 23 | const InfoCol = styled.div` 24 | width: 100%; 25 | max-width: 350px; 26 | text-align: center; 27 | padding: 0 30px; 28 | margin-bottom: 60px; 29 | 30 | @media (max-width: 767px) { 31 | margin-bottom: 30px; 32 | } 33 | `; 34 | 35 | const Image = styled.img` 36 | @media (max-width: 760px) { 37 | margin-bottom: 18px; 38 | } 39 | margin-bottom: 35px; 40 | height: 100px; 41 | width: ${props => (props.scale ? `${props.scale}%` : '100px')}; 42 | `; 43 | 44 | const InfoHeading = styled.p` 45 | @media (max-width: 760px) { 46 | font-size: 22px; 47 | margin-bottom: 0; 48 | } 49 | font-size: 24px; 50 | line-height: 42px; 51 | margin-bottom: 10px; 52 | `; 53 | 54 | const Text = styled.p` 55 | @media (max-width: 1120px) { 56 | font-size: 16px; 57 | line-height: 27px; 58 | max-width: 260px; 59 | margin: 0 auto; 60 | } 61 | font-size: 17px; 62 | line-height: 32px; 63 | color: #4e5a61; 64 | `; 65 | -------------------------------------------------------------------------------- /public/static/icons/icon-small-location-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/source/javascripts/app/_toc.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_jquery 2 | //= require ../lib/_jquery_ui 3 | //= require ../lib/_jquery.tocify 4 | //= require ../lib/_imagesloaded.min 5 | (function (global) { 6 | 'use strict'; 7 | 8 | var closeToc = function() { 9 | $(".tocify-wrapper").removeClass('open'); 10 | $("#nav-button").removeClass('open'); 11 | }; 12 | 13 | var makeToc = function() { 14 | global.toc = $("#toc").tocify({ 15 | selectors: 'h1, h2', 16 | extendPage: false, 17 | theme: 'none', 18 | smoothScroll: false, 19 | showEffectSpeed: 0, 20 | hideEffectSpeed: 180, 21 | ignoreSelector: '.toc-ignore', 22 | highlightOffset: 60, 23 | scrollTo: -1, 24 | scrollHistory: true, 25 | hashGenerator: function (text, element) { 26 | return element.prop('id'); 27 | } 28 | }).data('toc-tocify'); 29 | 30 | $("#nav-button").click(function() { 31 | $(".tocify-wrapper").toggleClass('open'); 32 | $("#nav-button").toggleClass('open'); 33 | return false; 34 | }); 35 | 36 | $(".page-wrapper").click(closeToc); 37 | $(".tocify-item").click(closeToc); 38 | }; 39 | 40 | // Hack to make already open sections to start opened, 41 | // instead of displaying an ugly animation 42 | function animate() { 43 | setTimeout(function() { 44 | toc.setOption('showEffectSpeed', 180); 45 | }, 50); 46 | } 47 | 48 | $(function() { 49 | makeToc(); 50 | animate(); 51 | setupLanguages($('body').data('languages')); 52 | $('.content').imagesLoaded( function() { 53 | global.toc.calculateHeights(); 54 | }); 55 | }); 56 | })(window); 57 | 58 | -------------------------------------------------------------------------------- /src/components/feature-section/why-join.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import Card from '../content/card'; 4 | 5 | export default props => ( 6 | 7 | 8 | 13 | 18 | 23 | 28 | 29 | 30 | ); 31 | 32 | const Container = styled.section` 33 | width: 100%; 34 | max-width: 1170px; 35 | padding: 0 15px; 36 | margin-right: auto; 37 | margin-left: auto; 38 | `; 39 | 40 | const InfoRow = styled.div` 41 | display: flex; 42 | justify-content: space-evenly; 43 | 44 | @media (max-width: 960px) { 45 | flex-wrap: wrap; 46 | justify-content: center; 47 | } 48 | 49 | @media (max-width: 767px) { 50 | flex-direction: column; 51 | align-items: center; 52 | } 53 | `; 54 | -------------------------------------------------------------------------------- /firebase_functions/functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "scripts": { 4 | "build": "eslint ./src && tsc -p .", 5 | "serve": "npm run build && firebase serve --only functions", 6 | "shell": "npm run build && firebase emulators:start --only functions", 7 | "start": "npm run shell", 8 | "deploy": "firebase deploy --only functions", 9 | "logs": "firebase functions:log" 10 | }, 11 | "main": "lib/index.js", 12 | "license": "Apache-2.0", 13 | "author": { 14 | "name": "Lewis Freiberg, Alexey Sobolev (IOTA Foundation)", 15 | "website": "https://iota.org" 16 | }, 17 | "contributors": [ 18 | { 19 | "name": "Alexey Sobolev" 20 | }, 21 | { 22 | "name": "Lewis Freiberg" 23 | }, 24 | { 25 | "name": "Tim Sigl" 26 | } 27 | ], 28 | "dependencies": { 29 | "@iota/area-codes": "^0.1.1", 30 | "@iota/client": "^2.2.1", 31 | "axios": "^0.24.0", 32 | "bluebird": "^3.7.2", 33 | "cors": "^2.8.5", 34 | "firebase-admin": "^10.0.0", 35 | "firebase-functions": "^3.16.0", 36 | "mailgun-js": "^0.22.0", 37 | "uuid": "^8.3.2" 38 | }, 39 | "devDependencies": { 40 | "@firebase/app-types": "^0.7.0", 41 | "@typescript-eslint/eslint-plugin": "^5.4.0", 42 | "@typescript-eslint/parser": "^5.4.0", 43 | "eslint": "^8.2.0", 44 | "typescript": "^4.4.4" 45 | }, 46 | "engines": { 47 | "node": "14" 48 | }, 49 | "resolutions": { 50 | "acorn": "^7.1.1", 51 | "date-and-time": "^0.14.2", 52 | "lodash": "^4.17.19", 53 | "minimist": "^1.2.5", 54 | "netmask": "^2.0.1", 55 | "node-fetch": "^2.6.1", 56 | "node-forge": "^0.10.0", 57 | "pac-resolver": "^5.0.0", 58 | "websocket-extensions": "^0.1.4" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Data Marketplace 2 | 3 | The Proof of Concept Data Marketplace built using MAM and IOTA Tangle. 4 | 5 | Please read the series of technical blog posts to learn how to create new sensors, publish sensor data, and deploy your own instance of the Data Marketplace application. 6 | 7 | * [Sensor Onboarding](https://medium.com/iotatangle/iota-data-marketplace-tech-intro-d54b29774f1a-d54b29774f1a) 8 | 9 | * [Publishing Sensor Data](https://medium.com/iotatangle/the-iota-data-marketplace-a-tech-intro-part-3-eea5cbcd1eb7) 10 | 11 | * [Cloud Backend Configuration](https://medium.com/iotatangle/the-iota-data-marketplace-a-tech-intro-part4-47b608c527c9) 12 | 13 | * [Checkout and Deploy your application](https://medium.com/iotatangle/the-iota-data-marketplace-a-tech-intro-part5-b33d9856c852) 14 | 15 | 16 | 17 | ## Getting started 18 | 19 | Before you can run this application, you will need to install `Node.js` on your machine. Once you've installed `Node.js`, you can use `npm` to run commands listed below. 20 | 21 | ### To run for Development. 22 | 23 | ```javascript 24 | npm run install-all 25 | 26 | npm run start 27 | ``` 28 | 29 | The application is running on http://localhost:3000 30 | 31 | 32 | ### To run for Production: 33 | 34 | #### 1. Install Firebase CLI 35 | 36 | Install the Firebase CLI by running the following command: 37 | 38 | ```javascript 39 | npm install -g firebase-tools 40 | ``` 41 | 42 | #### 2. Log in fo Firebase 43 | 44 | Log in to Firebase (for the first time use). Follow instructions on the screen. 45 | 46 | ```javascript 47 | firebase login 48 | ``` 49 | 50 | #### 3. Install packages 51 | 52 | ```javascript 53 | npm run install-all 54 | ``` 55 | 56 | #### 4. Build and deploy 57 | 58 | ```javascript 59 | npm run deploy PROJECT_NAME 60 | ``` 61 | -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/icon-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 25 | 26 | -------------------------------------------------------------------------------- /src/utils/iota.js: -------------------------------------------------------------------------------- 1 | import api from './api'; 2 | 3 | export const purchaseStream = (userId, deviceId) => { 4 | return new Promise(async (resolve, reject) => { 5 | // Try purchase 6 | try { 7 | const purchaseStreamResponse = await api.post('purchaseStream', { userId, deviceId }); 8 | if (purchaseStreamResponse && purchaseStreamResponse.success) { 9 | resolve(); 10 | } 11 | console.error('Purchase error', purchaseStreamResponse.error); 12 | reject(purchaseStreamResponse && purchaseStreamResponse.error); 13 | } catch (error) { 14 | console.error('getBundleHashes error', error); 15 | reject(error); 16 | } 17 | }); 18 | }; 19 | 20 | export const getData = async (userId, deviceId, time) => { 21 | try { 22 | const result = await getPackets(userId, deviceId, time); 23 | if (result.error) { 24 | console.error('getData error', result.error); 25 | } 26 | return result; 27 | } catch (error) { 28 | console.error('getData error', error); 29 | return null; 30 | } 31 | }; 32 | 33 | const getPackets = (userId, deviceId, time) => { 34 | return new Promise(async (resolve, reject) => { 35 | const packets = await api.get('stream', { userId, deviceId, time }); 36 | if (packets) { 37 | resolve(packets); 38 | } else { 39 | reject('No packets purchased'); 40 | } 41 | }); 42 | }; 43 | 44 | /** 45 | * Get the balance adjusted for dust protection 46 | * @param {*} address 47 | * @returns real balance - dust protection threshold (currently 1Mi) 48 | */ 49 | export const getBalance = async (address) => { 50 | try { 51 | const balance = await api.get('balance', { address }); 52 | return balance; 53 | } catch (error) { 54 | console.error('getBalance error', error); 55 | return 0; 56 | } 57 | }; 58 | -------------------------------------------------------------------------------- /public/static/template/index.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch'); 2 | const { publish } = require('./mam'); 3 | const { debug, serverUrl } = require('./config.json'); 4 | const data = require('./data.json'); 5 | 6 | // EXAMPLE 1: read static data from file/database 7 | data.forEach(async payload => { 8 | if (debug) { 9 | console.log(payload); 10 | } else { 11 | // Publish sensor data to marketplace 12 | await publish(payload); // your sensor data goes here. Payload is any content in JSON format 13 | } 14 | }); 15 | 16 | // EXAMPLE 2: request data from server or sensor 17 | const queryData = async delay => { 18 | const getRandomInt = max => Math.floor(Math.random() * Math.floor(max)); 19 | while (true) { 20 | // Access public server. URL is configurable in config.json 21 | // In this example a Star Wars API is used for demo purposes 22 | const response = await fetch(serverUrl + getRandomInt(73)); // construct URL to request a random star wars vehicle 23 | const status = response.status; 24 | const json = await response.json(); 25 | 26 | // Continuously check the response status until it's completed, failed or times out. 27 | if (status === 418) { // specify your HTTP status codes here 28 | break; 29 | } else if (status === 200) { 30 | const { name, model, manufacturer, vehicle_class } = json; 31 | const payload = { name, model, manufacturer, vehicle_class }; 32 | 33 | if (debug) { 34 | console.log(payload); 35 | } else { 36 | // Publish sensor data to marketplace 37 | await publish(payload); // your sensor data goes here. Payload is any content in JSON format 38 | } 39 | 40 | // Delay before running the next loop iteration: 41 | await new Promise(resolve => setTimeout(resolve, delay)); 42 | } 43 | } 44 | } 45 | 46 | queryData(60000) // query data every 60 seconds 47 | -------------------------------------------------------------------------------- /src/Router.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { HashRouter, Switch, Route } from 'react-router-dom'; 4 | import { CookiesProvider } from 'react-cookie'; 5 | import HomePage from './pages/home'; 6 | import DemoPage from './pages/demo'; 7 | import TechSpecsPage from './pages/specs'; 8 | import BusinessPage from './pages/business'; 9 | import GetInvolvedPage from './pages/involved'; 10 | import SensorPage from './pages/sensor'; 11 | import DashboardPage from './pages/dashboard'; 12 | import WhitelistPage from './pages/whitelist'; 13 | import FaucetPage from './pages/faucet'; 14 | import { storeProjectSettings } from './store/settings/actions'; 15 | 16 | class Router extends Component { 17 | componentDidMount() { 18 | this.props.storeProjectSettings(); 19 | } 20 | 21 | render() { 22 | return ( 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | ); 40 | } 41 | } 42 | 43 | const mapDispatchToProps = dispatch => ({ 44 | storeProjectSettings: () => dispatch(storeProjectSettings()), 45 | }); 46 | 47 | export default connect(null, mapDispatchToProps)(Router); 48 | -------------------------------------------------------------------------------- /src/components/header/burger.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { withRouter } from 'react-router-dom'; 3 | import styled from 'styled-components'; 4 | import { Link } from 'react-router-dom'; 5 | import BurgerMenu from 'react-burger-menu'; 6 | import '../../assets/scss/menu.scss'; 7 | 8 | const Menu = BurgerMenu['slide']; 9 | 10 | const links = [ 11 | { link: '', text: 'Home' }, 12 | { link: 'demo', text: 'Try the Marketplace' }, 13 | { link: 'specs', text: 'Specifications' }, 14 | { link: 'business', text: 'Co-Creation Ecosystem' }, 15 | { link: 'involved', text: 'Get involved' }, 16 | ]; 17 | 18 | const Burger = props => ( 19 | 20 | 21 | {links.map( 22 | ({ link, text }) => 23 | props.location.pathname.replace(/^\/+/, '') === link ? ( 24 | {text.toUpperCase()} 25 | ) : ( 26 | 27 | {text.toUpperCase()} 28 | 29 | ) 30 | )} 31 | 32 | 33 | ); 34 | 35 | export default withRouter(Burger); 36 | 37 | const MenuContainer = styled.div` 38 | display: none; 39 | 40 | @media (max-width: 910px) { 41 | display: block; 42 | } 43 | `; 44 | 45 | const SubLink = styled.p` 46 | font-size: 14px; 47 | letter-spacing: 1.5px; 48 | font-weight: 600; 49 | line-height: 40px; 50 | padding: 7px 15px 0; 51 | color: #ffffff; 52 | opacity: 0.5; 53 | text-align: left; 54 | -webkit-transition: all 0.3s ease; 55 | -moz-transition: all 0.3s ease; 56 | transition: all 0.3s ease; 57 | cursor: pointer; 58 | &:hover { 59 | opacity: 1; 60 | } 61 | `; 62 | 63 | const SubLinkActive = styled(SubLink)` 64 | opacity: 1; 65 | cursor: default; 66 | `; 67 | -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/icon-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 25 | 26 | -------------------------------------------------------------------------------- /src/utils/zip.js: -------------------------------------------------------------------------------- 1 | import JSZip from 'jszip'; 2 | import FileSaver from 'file-saver'; 3 | import { domain } from '../config.json'; 4 | 5 | const getFileContent = path => { 6 | return new Promise((resolve, reject) => { 7 | try { 8 | const rawFile = new XMLHttpRequest(); 9 | rawFile.open('GET', path); 10 | rawFile.onreadystatechange = () => { 11 | if (rawFile.readyState === 4 && (rawFile.status === 200 || rawFile.status === 0)) { 12 | resolve(rawFile.responseText); 13 | } 14 | }; 15 | rawFile.send(null); 16 | } catch (error) { 17 | console.error('getFileContent error', error); 18 | reject(error); 19 | } 20 | }); 21 | }; 22 | 23 | const getConfigFileContent = (device, provider) => `{ 24 | "sensorId": "${device.sensorId}", 25 | "secretKey": "${device.sk}", 26 | "debug": true, 27 | "provider": "${provider}", 28 | "endpoint": "${domain}/newData", 29 | "serverUrl": "https://swapi.dev/api/vehicles/" 30 | }`; 31 | 32 | export const getZip = async (device, provider) => { 33 | const zip = new JSZip(); 34 | zip.file('config.json', getConfigFileContent(device, provider)); 35 | zip.file('package.json', await getFileContent('/static/template/package.json')); 36 | zip.file('README.md', await getFileContent('/static/template/README.md')); 37 | zip.file('keyStorage.js', await getFileContent('/static/template/keyStorage.js')); 38 | zip.file('mam.js', await getFileContent('/static/template/mam.js')); 39 | zip.file('index.js', await getFileContent('/static/template/index.js')); 40 | zip.file('data.json', await getFileContent('/static/template/data.json')); 41 | 42 | // when everything has been downloaded, we can trigger the dl 43 | zip 44 | .generateAsync({ type: 'blob', compression: 'DEFLATE' }) 45 | .then( 46 | blob => FileSaver.saveAs(blob, device.sensorId + '-template.zip'), 47 | error => console.error('getZip error', error) 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /src/components/banner/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | 4 | export default () => ( 5 | 6 | 11 | 12 | 13 | NEW 14 | 15 |

16 | Visit our new Industry Marketplace
for latest integrations and
collaborations for Industry 4.0 17 |

18 | 19 |
20 |
21 |
22 | ); 23 | 24 | const S = styled.section` 25 | position: relative; 26 | top: 35px; 27 | margin: 20px; 28 | height: 0; 29 | z-index: 1000; 30 | max-width: 420px; 31 | 32 | @media (max-width: 768px) { 33 | height: unset; 34 | top: 0px; 35 | } 36 | `; 37 | 38 | const C = styled.div` 39 | position: relative; 40 | display: flex; 41 | flex-direction: row; 42 | border-radius: 6px; 43 | background-color: #fff; 44 | cursor: pointer; 45 | box-shadow: 0 23px 50px 0 rgba(25, 54, 80, 0.2); 46 | transition: box-shadow 0.19s ease-out; 47 | &:hover { 48 | box-shadow: 0 23px 50px 0 rgba(25, 54, 80, 0.3); 49 | } 50 | `; 51 | 52 | const I = styled.img` 53 | position: absolute; 54 | right: 15px; 55 | top: calc(50% - 7px); 56 | height: 15px; 57 | width: 10px; 58 | `; 59 | 60 | const P = styled.p` 61 | line-height: 27px; 62 | color: #000; 63 | font-size: 17px; 64 | letter-spacing: .04em; 65 | font-weight: 400; 66 | text-align: left; 67 | padding: 18px; 68 | `; 69 | 70 | const New = styled(P)` 71 | max-width: 100px; 72 | background-color: #173a9a; 73 | color: #fff; 74 | text-transform: uppercase; 75 | text-align: center; 76 | font-size: 15px; 77 | font-weight: 900; 78 | border-top-left-radius: 6px; 79 | border-bottom-left-radius: 6px; 80 | `; 81 | -------------------------------------------------------------------------------- /src/components/header/mini-header.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { withRouter } from 'react-router-dom'; 3 | import styled from 'styled-components'; 4 | import { Link } from 'react-router-dom'; 5 | 6 | const links = [ 7 | { link: '', text: 'Home' }, 8 | { link: 'demo', text: 'Try the Marketplace' }, 9 | { link: 'specs', text: 'Specifications' }, 10 | { link: 'business', text: 'Co-Creation Ecosystem' }, 11 | { link: 'involved', text: 'Get involved' }, 12 | ]; 13 | 14 | const MiniHeader = props => ( 15 | 16 | 17 | Logo IOTA 18 | 19 | {links.map( 20 | ({ link, text }) => 21 | props.location.pathname.replace(/^\/+/, '') === link ? ( 22 | {text.toUpperCase()} 23 | ) : ( 24 | 25 | {text.toUpperCase()} 26 | 27 | ) 28 | )} 29 | 30 | ); 31 | 32 | export default withRouter(MiniHeader); 33 | 34 | const Container = styled.div` 35 | display: flex; 36 | justify-content: space-between; 37 | width: 100%; 38 | max-width: 1170px; 39 | padding: 30px 15px 30px; 40 | margin-right: auto; 41 | margin-left: auto; 42 | z-index: 10; 43 | `; 44 | 45 | const SubLink = styled.p` 46 | @media (max-width: 1050px) { 47 | font-size: 12px; 48 | padding: 7px 10px 0; 49 | } 50 | 51 | @media (max-width: 910px) { 52 | display: none; 53 | } 54 | 55 | font-size: 14px; 56 | letter-spacing: 1.5px; 57 | font-weight: 600; 58 | line-height: 28px; 59 | padding: 7px 15px 0; 60 | color: rgba(78, 90, 97, 1); 61 | opacity: 0.5; 62 | text-align: center; 63 | -webkit-transition: all 0.3s ease; 64 | -moz-transition: all 0.3s ease; 65 | transition: all 0.3s ease; 66 | cursor: pointer; 67 | &:hover { 68 | opacity: 1; 69 | } 70 | `; 71 | 72 | const SubLinkActive = styled(SubLink)` 73 | opacity: 1; 74 | cursor: default; 75 | `; 76 | 77 | const A = styled(Link)` 78 | padding-right: 30px; 79 | `; 80 | -------------------------------------------------------------------------------- /src/components/map/markers.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import { Marker } from 'react-map-gl'; 4 | 5 | export default class extends React.Component { 6 | constructor(props) { 7 | super(props); 8 | this.state = { devices: [] }; 9 | 10 | this.sanitiseCoordinates = this.sanitiseCoordinates.bind(this); 11 | this.sanatiseDevice = this.sanatiseDevice.bind(this); 12 | this.updateDevices = this.updateDevices.bind(this); 13 | } 14 | 15 | componentDidMount() { 16 | this.updateDevices(this.props); 17 | } 18 | 19 | updateDevices(props) { 20 | const devices = [ 21 | ...props.devices.filter(device => this.sanatiseDevice(device)).map(device => { 22 | device.lat = this.sanitiseCoordinates(device.lat); 23 | device.lon = this.sanitiseCoordinates(device.lon); 24 | return device; 25 | }), 26 | ]; 27 | this.setState({ devices }); 28 | } 29 | 30 | sanitiseCoordinates(coordinate) { 31 | return typeof coordinate === 'number' ? coordinate : Number(coordinate.replace(/[^0-9.]/g, '')); 32 | } 33 | 34 | sanatiseDevice(device) { 35 | if (!device.lon || !device.lat || device.inactive) return false; 36 | if (device.lat >= 90 || device.lat <= -90) return false; 37 | if (device.lon >= 180 || device.lon <= -180) return false; 38 | return true; 39 | }; 40 | 41 | render() { 42 | return ( 43 |
44 | { 45 | this.state.devices.map((device, i) => ( 46 | 47 | this.props.openPopup(device)} /> 48 | 49 | )) 50 | } 51 |
52 | ); 53 | } 54 | } 55 | 56 | const Pin = styled.div` 57 | background-image: linear-gradient(-140deg, #184490 0%, #0a2056 100%); 58 | position: absolute; 59 | height: 20px; 60 | width: 20px; 61 | top: -20px; 62 | right: -10px; 63 | transform: rotate(-45deg); 64 | border-radius: 50% 50% 50% 0; 65 | cursor: pointer !important; 66 | box-shadow: -10px 9px 12px 0 rgba(10, 32, 87, 0.12); 67 | `; 68 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "build", 4 | "cleanUrls": true, 5 | "headers": [ 6 | { 7 | "source": "**/*", 8 | "headers": [ 9 | { 10 | "key": "Access-Control-Allow-Origin", 11 | "value": "*" 12 | } 13 | ] 14 | }, 15 | { 16 | "source" : "**/*.@(jpg|jpeg|gif|png|svg)", 17 | "headers" : [ 18 | { 19 | "key" : "Cache-Control", 20 | "value" : "max-age=2592000" 21 | } 22 | ] 23 | }, 24 | { 25 | "source" : "**/*.@(eot|otf|ttf|ttc|woff|font.css)", 26 | "headers" : [ 27 | { 28 | "key" : "Cache-Control", 29 | "value" : "max-age=2592000" 30 | } 31 | ] 32 | } 33 | ], 34 | "ignore": [ 35 | "firebase.json", 36 | "package.json", 37 | "README.md", 38 | "**/.*", 39 | "**/node_modules/**", 40 | "node_modules/**", 41 | "public/**", 42 | "src/**", 43 | "firebase_functions/**", 44 | ".git/**" 45 | ], 46 | "redirects": [ 47 | { 48 | "source": "/whitelist", 49 | "destination": "/#/whitelist", 50 | "type": 301 51 | }, 52 | { 53 | "source": "/demo", 54 | "destination": "/#/demo", 55 | "type": 301 56 | }, 57 | { 58 | "source": "/specs", 59 | "destination": "/#/specs", 60 | "type": 301 61 | }, 62 | { 63 | "source": "/involved", 64 | "destination": "/#/involved", 65 | "type": 301 66 | }, 67 | { 68 | "source": "/dashboard", 69 | "destination": "/#/dashboard", 70 | "type": 301 71 | }, 72 | { 73 | "source": "/sensor/:deviceId", 74 | "destination": "/#/sensor/:deviceId", 75 | "type": 301 76 | }, 77 | { 78 | "source": "/faucet", 79 | "destination": "/#/faucet", 80 | "type": 301 81 | }, 82 | { 83 | "source": "/cookies", 84 | "destination": "/#/cookies", 85 | "type": 301 86 | } 87 | ] 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /docs/source/javascripts/app/_search.js: -------------------------------------------------------------------------------- 1 | //= require ../lib/_lunr 2 | //= require ../lib/_jquery 3 | //= require ../lib/_jquery.highlight 4 | (function () { 5 | 'use strict'; 6 | 7 | var content, searchResults; 8 | var highlightOpts = { element: 'span', className: 'search-highlight' }; 9 | 10 | var index = new lunr.Index(); 11 | 12 | index.ref('id'); 13 | index.field('title', { boost: 10 }); 14 | index.field('body'); 15 | index.pipeline.add(lunr.trimmer, lunr.stopWordFilter); 16 | 17 | $(populate); 18 | $(bind); 19 | 20 | function populate() { 21 | $('h1, h2').each(function() { 22 | var title = $(this); 23 | var body = title.nextUntil('h1, h2'); 24 | index.add({ 25 | id: title.prop('id'), 26 | title: title.text(), 27 | body: body.text() 28 | }); 29 | }); 30 | } 31 | 32 | function bind() { 33 | content = $('.content'); 34 | searchResults = $('.search-results'); 35 | 36 | $('#input-search').on('keyup', search); 37 | } 38 | 39 | function search(event) { 40 | unhighlight(); 41 | searchResults.addClass('visible'); 42 | 43 | // ESC clears the field 44 | if (event.keyCode === 27) this.value = ''; 45 | 46 | if (this.value) { 47 | var results = index.search(this.value).filter(function(r) { 48 | return r.score > 0.0001; 49 | }); 50 | 51 | if (results.length) { 52 | searchResults.empty(); 53 | $.each(results, function (index, result) { 54 | var elem = document.getElementById(result.ref); 55 | searchResults.append("
  • " + $(elem).text() + "
  • "); 56 | }); 57 | highlight.call(this); 58 | } else { 59 | searchResults.html('
  • '); 60 | $('.search-results li').text('No Results Found for "' + this.value + '"'); 61 | } 62 | } else { 63 | unhighlight(); 64 | searchResults.removeClass('visible'); 65 | } 66 | } 67 | 68 | function highlight() { 69 | if (this.value) content.highlight(this.value, highlightOpts); 70 | } 71 | 72 | function unhighlight() { 73 | content.unhighlight(highlightOpts); 74 | } 75 | })(); 76 | -------------------------------------------------------------------------------- /public/static/template/mam.js: -------------------------------------------------------------------------------- 1 | const { SingleNodeClient } = require("@iota/iota.js") 2 | const { createChannel, createMessage, mamAttach, TrytesHelper } = require('@iota/mam.js'); 3 | const crypto = require('crypto'); 4 | const { storeKey } = require('./keyStorage'); 5 | const { provider } = require('./config.json'); 6 | 7 | // Channel seed 8 | let seed; 9 | 10 | // Random Key Generator 11 | const generateRandomKey = length => { 12 | const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ9'; 13 | let key = ''; 14 | while (key.length < length) { 15 | const byte = crypto.randomBytes(1); 16 | if (byte[0] < 243) { 17 | key += charset.charAt(byte[0] % 27); 18 | } 19 | } 20 | return key; 21 | }; 22 | 23 | exports.publish = async (payload, mode = 'restricted', tag = 'SENSORDATA') => { 24 | const time = Date.now(); 25 | const packet = { time, data: { ...payload } }; 26 | let mamState; 27 | let secretKey; 28 | if (!seed) { 29 | seed = generateRandomKey(81); 30 | } 31 | try { 32 | // Change MAM encryption key on each loop 33 | secretKey = generateRandomKey(81); 34 | 35 | // Create channel with stored seed & update secretKey 36 | const security = 2; 37 | mamState = createChannel(seed, security, mode, secretKey); 38 | } catch (e) { 39 | console.error("Could not create MAM channel ", e) 40 | } 41 | 42 | let message; 43 | let transaction; 44 | try { 45 | // Create MAM Payload - STRING OF TRYTES 46 | message = createMessage(mamState, TrytesHelper.fromAscii(encodeURI(JSON.stringify(packet)))); 47 | // Attach the payload 48 | transaction = await mamAttach(new SingleNodeClient(provider), message, tag); 49 | } catch (e) { 50 | console.error("Could not attach message to mam stream", e) 51 | } 52 | 53 | // Store encryption key in Firebase 54 | let callbackResponse; 55 | try { 56 | callbackResponse = await storeKey(secretKey, message.root, transaction.messageId, time); 57 | } catch (e) { 58 | console.log("Could not store key", e) 59 | } 60 | 61 | console.log('Saving data: :', packet); 62 | console.log(callbackResponse); 63 | console.log('=============================================================='); 64 | }; 65 | -------------------------------------------------------------------------------- /src/components/data-stream/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import SensorCard from '../sensor-card'; 4 | import Inview from '../inview'; 5 | import Loading from '../loading'; 6 | 7 | const DataStream = ({ packets, newPacketsLength }) => ( 8 | 9 | 10 | {packets && 11 | packets.sort((a, b) => b.time - a.time).map((packet, i) => )} 12 | 13 | 14 | {packets.length > 0 && ( 15 | 16 | {newPacketsLength === 0 &&

    No new data to fetch. Scroll down to try again.

    } 17 | 18 | 19 |
    20 | )} 21 | {newPacketsLength > 0 && packets.length === 0 && } 22 |
    23 | ); 24 | 25 | export default DataStream; 26 | 27 | const InfoCol = styled.main` 28 | position: relative; 29 | width: 880px; 30 | padding-left: 30px; 31 | @media (max-width: 760px) { 32 | width: 100%; 33 | padding: 0; 34 | } 35 | &::before { 36 | content: ''; 37 | position: absolute; 38 | top: 0; 39 | left: 455px; 40 | width: 1px; 41 | height: 100%; 42 | background-color: #738fd4; 43 | @media (max-width: 1195px) { 44 | left: 30px; 45 | } 46 | @media (max-width: 760px) { 47 | visibility: hidden; 48 | } 49 | } 50 | `; 51 | 52 | const CardWrapper = styled.div` 53 | display: flex; 54 | flex-flow: row wrap; 55 | justify-content: space-between; 56 | padding: 40px 0 200px; 57 | @media (max-width: 1195px) { 58 | flex-flow: column nowrap; 59 | padding-bottom: 0; 60 | margin-left: 30px; 61 | } 62 | @media (max-width: 760px) { 63 | width: 100%; 64 | margin-left: 0; 65 | align-items: center; 66 | } 67 | `; 68 | 69 | const Block = styled.div` 70 | width: 10px; 71 | height: 10px; 72 | position: absolute; 73 | bottom: 0; 74 | `; 75 | 76 | const Fetcher = styled.div` 77 | position: relative; 78 | bottom: 10px; 79 | color: white; 80 | padding: 20px 10px; 81 | margin: 10px 0 20px; 82 | @media (max-width: 760px) { 83 | position: relative; 84 | } 85 | `; 86 | -------------------------------------------------------------------------------- /firebase_functions/README.md: -------------------------------------------------------------------------------- 1 | ## Data Marketplace functions 2 | 3 | Firebase functions for Data Marketplace 4 | 5 | #### Install Firebase CLI 6 | 7 | Before you can install the Firebase CLI, you will need to install `Node.js` on your machine. Once you've installed `Node.js`, you can install the Firebase CLI using `npm` by running the following command: 8 | 9 | ```javascript 10 | npm install -g firebase-tools 11 | ``` 12 | 13 | #### Install dependencies 14 | 15 | Install dependencies listed in `functions` package.json files 16 | 17 | ```javascript 18 | cd functions && yarn 19 | ``` 20 | 21 | #### Build project 22 | 23 | Project is written in TypeScript, so you'll need to build it before deploying. This will create a new folder `lib` under `functions`. 24 | 25 | ```javascript 26 | cd functions && yarn build 27 | ``` 28 | 29 | ## Testing 30 | 31 | To test this locally, run 32 | `firebase emulators:start --only functions` 33 | 34 | Then call a function with parameters in request body / query params 35 | `http://localhost:///` 36 | e.g. 37 | `http://localhost:5001/marketplacev2/us-central1/wallet` 38 | 39 | #### Deploy fo Firebase 40 | 41 | 1. Log in to Firebase (for the first time use). Follow instructions on the screen. 42 | 43 | ```javascript 44 | firebase login 45 | ``` 46 | 47 | 2. Deploy 48 | 49 | ```javascript 50 | firebase deploy --project PROJECT_NAME 51 | firebase deploy --only functions:function1,functions:function2 52 | ``` 53 | 54 | ### Handling function timeouts 55 | Default timeout can be changed here https://console.cloud.google.com/functions/list 56 | After you select your function and then press "Edit" it is located under the "More" drop-down at the bottom of the page. The current max is 540 seconds. 57 | Read more https://firebase.google.com/docs/functions/manage-functions#set_timeout_and_memory_allocation 58 | 59 | 60 | ### CORS 61 | 62 | See https://cloud.google.com/storage/docs/configuring-cors 63 | You can also use the `gsutil cors` command to get the CORS configuration of a bucket: 64 | 65 | ``` 66 | gsutil cors get gs://marketplacev2.appspot.com 67 | ``` 68 | 69 | Use the `gsutil cors` command to configure CORS on a bucket: 70 | 71 | ``` 72 | gsutil cors set cors-config.json gs://marketplacev2.appspot.com 73 | ``` 74 | -------------------------------------------------------------------------------- /src/components/login-modal/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import Loading from '../loading'; 4 | 5 | export default ({ auth, loading, show }) => ( 6 | 7 | { 8 | !loading ? ( 9 | 10 | 11 | Login with OAuth 12 | Click one of the login buttons below to generate an account. 13 | 14 | 15 | 16 | ) : ( 17 | 18 | {loading.heading || '--'} 19 | {loading.body || '--'} 20 | 21 | 22 | ) 23 | } 24 | 25 | ); 26 | 27 | const Modal = styled.div` 28 | position: fixed; 29 | top: 0; 30 | left: 0; 31 | width: 100vw; 32 | height: 100vh; 33 | visibility: ${props => (props.show ? 'visible' : 'hidden')}; 34 | opacity: ${props => (props.show ? 1 : 0)}; 35 | transition: all 0.5s ease; 36 | background-color: rgba(14, 56, 160, 0.6); 37 | `; 38 | 39 | const AccessBox = styled.div` 40 | display: flex; 41 | flex-flow: column nowrap; 42 | justify-content: center; 43 | align-items: center; 44 | position: absolute; 45 | top: 50%; 46 | left: 50%; 47 | transform: translate(-50%, -50%); 48 | width: 360px; 49 | height: 280px; 50 | padding: 30px; 51 | border-radius: 6px; 52 | background-color: rgba(10, 32, 86, 0.9); 53 | box-shadow: 0 23px 50px 0 rgba(25, 54, 80, 0.1); 54 | `; 55 | 56 | const Heading = styled.p` 57 | font-size: 28px; 58 | font-weight: 100; 59 | line-height: 42px; 60 | margin-bottom: 12px; 61 | text-align: center; 62 | color: #009fff; 63 | `; 64 | 65 | const Info = styled.p` 66 | font-size: 17px; 67 | line-height: 28px; 68 | color: #fff; 69 | text-align: center; 70 | margin-bottom: auto; 71 | `; 72 | 73 | const Internal = styled.div` 74 | display: flex; 75 | flex-flow: column nowrap; 76 | justify-content: center; 77 | align-items: center; 78 | width: 100%; 79 | `; 80 | 81 | const SignupButton = styled.img` 82 | width: 80%; 83 | margin: 10px 0 0; 84 | `; 85 | -------------------------------------------------------------------------------- /src/components/feature-section/feature-cards.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | 4 | export default class extends React.Component { 5 | render() { 6 | return ( 7 | 8 | {this.props.items.map((item, index) => { 9 | const colored = index === 0 || index === 2; 10 | return ( 11 | 12 |

    {item}

    13 | 14 |
    15 | ); 16 | })} 17 |
    18 | ); 19 | } 20 | } 21 | 22 | const Container = styled.div` 23 | width: 100%; 24 | max-width: 1190px; 25 | display: flex; 26 | flex-direction: row; 27 | flex-wrap: wrap; 28 | align-self: center; 29 | justify-content: center; 30 | margin: 30px 20px; 31 | 32 | @media (max-width: 650px) { 33 | display: none; 34 | } 35 | `; 36 | 37 | const Item = styled.div` 38 | max-width: 376px; 39 | width: 30%; 40 | height: 178px; 41 | border-radius: 10px; 42 | border: solid 1px #4194ff; 43 | padding: 50px 35px; 44 | margin: 20px 10px; 45 | position: relative; 46 | display: flex; 47 | justify-content: center; 48 | flex-direction: column; 49 | background-image: ${props => 50 | props.colored ? 'linear-gradient(219deg, #4194ff, #175fe1)' : 'none'}; 51 | 52 | @media (max-width: 999px) { 53 | height: 240px; 54 | } 55 | 56 | @media (max-width: 860px) { 57 | height: 300px; 58 | } 59 | 60 | @media (max-width: 768px) { 61 | height: 400px; 62 | } 63 | `; 64 | 65 | const P = styled.p` 66 | font-size: 17px; 67 | font-weight: normal; 68 | line-height: 1.88; 69 | text-align: left; 70 | color: ${props => (props.colored ? '#ffffff' : '#4e5a61')}; 71 | `; 72 | 73 | const Image = styled.img` 74 | width: 35%; 75 | opacity: 0.1; 76 | position: absolute; 77 | left: 30%; 78 | bottom: ${props => (props.colored ? 'unset' : '-48px')}; 79 | top: ${props => (props.colored ? '-75px' : 'unset')}; 80 | 81 | @media (max-width: 860px) { 82 | bottom: ${props => (props.colored ? 'unset' : '-37px')}; 83 | top: ${props => (props.colored ? '-60px' : 'unset')}; 84 | } 85 | 86 | @media (max-width: 768px) { 87 | bottom: ${props => (props.colored ? 'unset' : '-30px')}; 88 | top: ${props => (props.colored ? '-50px' : 'unset')}; 89 | } 90 | `; 91 | -------------------------------------------------------------------------------- /src/components/sensor-nav/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { connect } from 'react-redux'; 3 | import styled from 'styled-components'; 4 | import { Link, withRouter } from 'react-router-dom'; 5 | import Wallet from '../wallet'; 6 | 7 | const SensorNav = ({ history, sensor }) => ( 8 |
    9 | 10 | Icon arrow 11 | 12 | 13 |
    14 | 15 | {sensor && sensor.type ? sensor.type : 'Loading Device'} 16 | {sensor && sensor.sensorId} 17 | 18 |
    19 | 20 | 21 | 22 |
    23 | ); 24 | 25 | const mapStateToProps = state => ({ sensor: state.sensor }); 26 | export default connect(mapStateToProps)(withRouter(SensorNav)); 27 | 28 | const Main = styled.nav` 29 | display: flex; 30 | justify-content: space-between; 31 | align-items: center; 32 | position: relative; 33 | z-index: 1000; 34 | height: 100px; 35 | background-color: #fff; 36 | @media (max-width: 1195px) { 37 | height: 90px; 38 | } 39 | @media (max-width: 760px) { 40 | height: 66px; 41 | } 42 | `; 43 | 44 | const Header = styled.header` 45 | margin: 10px auto 0 30px; 46 | display: flex; 47 | `; 48 | 49 | const Img = styled.img` 50 | width: 18px; 51 | `; 52 | 53 | const Back = styled(Link)` 54 | display: flex; 55 | justify-content: center; 56 | height: 100%; 57 | width: 90px; 58 | cursor: pointer; 59 | border-right: 1px solid #eaecee; 60 | @media (max-width: 760px) { 61 | width: 46px; 62 | border: none; 63 | } 64 | `; 65 | 66 | const Desc = styled.span` 67 | font: 12px/16px 'Nunito Sans', sans-serif; 68 | color: #808b92; 69 | `; 70 | 71 | const DeviceID = styled.span` 72 | font-size: 24px; 73 | line-height: 42px; 74 | position: relative; 75 | top: -4px; 76 | color: #009fff; 77 | @media (max-width: 760px) { 78 | font-size: 15px; 79 | top: -4px; 80 | } 81 | `; 82 | 83 | const RightHeader = styled.div` 84 | margin: 5px 30px 0 30px; 85 | display: block; 86 | width: 250px; 87 | text-align: right; 88 | @media (max-width: 760px) { 89 | margin: 10px 20px 0 30px; 90 | width: 120px; 91 | } 92 | `; 93 | 94 | const Block = styled.div` 95 | display: flex; 96 | flex-direction: column; 97 | align-items: flex-start; 98 | `; 99 | -------------------------------------------------------------------------------- /public/static/icons/proof_of_concept/icon-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | Choose 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 23 | 31 | 32 | -------------------------------------------------------------------------------- /public/static/icons/get_involved/icon-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/static/icons/business/icon-9.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 31 | 32 | -------------------------------------------------------------------------------- /public/static/icons/business/icon-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 32 | 33 | -------------------------------------------------------------------------------- /public/static/icons/business/icon-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /public/static/icons/business/icon-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 24 | 30 | 31 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/components/device-nav/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import isEmpty from 'lodash-es/isEmpty'; 4 | import { Link, withRouter } from 'react-router-dom'; 5 | 6 | const DeviceNav = ({ history, logout, user }) => ( 7 |
    8 | 9 | Icon arrow 10 | 11 | 12 |
    13 | 14 | Owner: 15 | {user.displayName || '--'} 16 | 17 |
    18 | 19 | { 20 | !isEmpty(user) && Log Out 21 | } 22 | 23 |
    24 | ); 25 | 26 | export default withRouter(DeviceNav); 27 | 28 | const Main = styled.nav` 29 | display: flex; 30 | justify-content: space-between; 31 | align-items: center; 32 | position: relative; 33 | z-index: 1000; 34 | height: 100px; 35 | background-color: #fff; 36 | @media (max-width: 1195px) { 37 | height: 90px; 38 | } 39 | @media (max-width: 760px) { 40 | height: 66px; 41 | } 42 | `; 43 | 44 | const Header = styled.header` 45 | margin: 10px auto 0 30px; 46 | display: flex; 47 | `; 48 | 49 | const Img = styled.img` 50 | width: 18px; 51 | `; 52 | 53 | const Back = styled(Link)` 54 | display: flex; 55 | justify-content: center; 56 | height: 100%; 57 | width: 90px; 58 | cursor: pointer; 59 | border-right: 1px solid #eaecee; 60 | @media (max-width: 760px) { 61 | width: 46px; 62 | border: none; 63 | } 64 | `; 65 | 66 | const Desc = styled.span` 67 | font: 12px/16px 'Nunito Sans', sans-serif; 68 | color: #808b92; 69 | `; 70 | 71 | const DeviceID = styled.span` 72 | font-size: 24px; 73 | line-height: 42px; 74 | position: relative; 75 | top: -4px; 76 | color: #009fff; 77 | @media (max-width: 760px) { 78 | font-size: 15px; 79 | top: -4px; 80 | } 81 | `; 82 | 83 | const RightHeader = styled.div` 84 | margin: 5px 30px 0 30px; 85 | display: block; 86 | width: 150px; 87 | text-align: right; 88 | @media (max-width: 760px) { 89 | margin: 10px 20px 0 30px; 90 | width: 120px; 91 | } 92 | `; 93 | 94 | const Block = styled.div` 95 | display: flex; 96 | flex-direction: column; 97 | align-items: flex-start; 98 | `; 99 | 100 | const FooterButton = styled.button` 101 | color: ${props => (props.grey ? `rgba(41, 41, 41, 0.4)` : `rgba(41, 41, 41, 0.9)`)}; 102 | padding: 5px 15px; 103 | margin-right: -15px; 104 | font-size: 90%; 105 | background: transparent; 106 | &:first-of-type { 107 | margin-left: -15px; 108 | margin-right: 0; 109 | } 110 | `; 111 | -------------------------------------------------------------------------------- /public/static/template/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "AT-AT", 4 | "model": "All Terrain Armored Transport", 5 | "manufacturer": "Imperial Department of Military Research", 6 | "vehicle_class": "assault walker" 7 | }, 8 | { 9 | "name": "Imperial Speeder Bike", 10 | "model": "74-Z speeder bike", 11 | "manufacturer": "Aratech Repulsor Company", 12 | "vehicle_class": "speeder" 13 | }, 14 | { 15 | "name": "Sith speeder", 16 | "model": "FC-20 speeder bike", 17 | "manufacturer": "Razalon", 18 | "vehicle_class": "speeder" 19 | }, 20 | { 21 | "name": "X-34 landspeeder", 22 | "model": "X-34 landspeeder", 23 | "manufacturer": "SoroSuub Corporation", 24 | "vehicle_class": "repulsorcraft" 25 | }, 26 | { 27 | "name": "C-9979 landing craft", 28 | "model": "C-9979 landing craft", 29 | "manufacturer": "Haor Chall Engineering", 30 | "vehicle_class": "landing craft" 31 | }, 32 | { 33 | "name": "Droid tri-fighter", 34 | "model": "tri-fighter", 35 | "manufacturer": "Phlac-Arphocc Automata Industries", 36 | "vehicle_class": "droid starfighter" 37 | }, 38 | { 39 | "name": "Storm IV Twin-Pod cloud car", 40 | "model": "Storm IV Twin-Pod", 41 | "manufacturer": "Bespin Motors", 42 | "vehicle_class": "repulsorcraft" 43 | }, 44 | { 45 | "name": "Snowspeeder", 46 | "model": "t-47 airspeeder", 47 | "manufacturer": "Incom corporation", 48 | "vehicle_class": "airspeeder" 49 | }, 50 | { 51 | "name": "X-34 landspeeder", 52 | "model": "X-34 landspeeder", 53 | "manufacturer": "SoroSuub Corporation", 54 | "vehicle_class": "repulsorcraft" 55 | }, 56 | { 57 | "name": "Neimoidian shuttle", 58 | "model": "Sheathipede-class transport shuttle", 59 | "manufacturer": "Haor Chall Engineering", 60 | "vehicle_class": "transport" 61 | }, 62 | { 63 | "name": "LAAT/c", 64 | "model": "Low Altitude Assault Transport/carrier", 65 | "manufacturer": "Rothana Heavy Engineering", 66 | "vehicle_class": "gunship" 67 | }, 68 | { 69 | "name": "Sand Crawler", 70 | "model": "Digger Crawler", 71 | "manufacturer": "Corellia Mining Corporation", 72 | "vehicle_class": "wheeled" 73 | }, 74 | { 75 | "name": "X-34 landspeeder", 76 | "model": "X-34 landspeeder", 77 | "manufacturer": "SoroSuub Corporation", 78 | "vehicle_class": "repulsorcraft" 79 | }, 80 | { 81 | "name": "Neimoidian shuttle", 82 | "model": "Sheathipede-class transport shuttle", 83 | "manufacturer": "Haor Chall Engineering", 84 | "vehicle_class": "transport" 85 | }, 86 | { 87 | "name": "TIE/LN starfighter", 88 | "model": "Twin Ion Engine/Ln Starfighter", 89 | "manufacturer": "Sienar Fleet Systems", 90 | "vehicle_class": "starfighter" 91 | } 92 | ] 93 | -------------------------------------------------------------------------------- /public/static/icons/business/icon-6.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 25 | 26 | 27 | 29 | 30 | 33 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/components/cookie/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from 'styled-components'; 3 | import { withCookies } from 'react-cookie'; 4 | 5 | class Cookie extends React.Component { 6 | state = { ack: true } 7 | 8 | componentDidMount() { 9 | const ack = this.props.cookies.get('dmp-ack'); 10 | if (!ack) { 11 | document.body.classList.add('cookie-bar-top-bar'); 12 | this.setState({ ack: false }); 13 | } 14 | } 15 | 16 | dismiss = () => { 17 | this.props.cookies.set('dmp-ack', true, { path: '/' }); 18 | document.body.classList.remove('cookie-bar-top-bar'); 19 | this.setState({ ack: true }) 20 | } 21 | 22 | render() { 23 | if (this.state.ack) return null; 24 | 25 | return ( 26 | 27 | 28 | This website uses cookies to ensure you get the best experience on our 29 | website.  30 | 31 | Learn more 32 | 33 | 34 | Dismiss 35 | 36 | ) 37 | } 38 | } 39 | 40 | export default withCookies(Cookie); 41 | 42 | 43 | const Disclaimer = styled.div` 44 | position: fixed; 45 | display: flex; 46 | justify-content: space-between; 47 | align-items: center; 48 | top: 0; 49 | left: 0; 50 | right: 0; 51 | background: #eeeeee; 52 | width: 100vw; 53 | padding: 8px 20px; 54 | height: 70px; 55 | z-index: 99999; 56 | `; 57 | 58 | const DisclaimerText = styled.span` 59 | font-size: 18px; 60 | color: #3f3f3f; 61 | white-space: normal; 62 | margin-right: 20px; 63 | 64 | @media (max-width: 660px) { 65 | font-size: 90% !important; 66 | } 67 | `; 68 | 69 | const DisclaimerButton = styled.button` 70 | width: 200px; 71 | height: 55px; 72 | background: #009fff; 73 | border-radius: 42px; 74 | border: none; 75 | line-height: 55px; 76 | font-size: 15px; 77 | font-weight: 600; 78 | text-align: center; 79 | color: #ffffff; 80 | text-decoration: none; 81 | cursor: pointer; 82 | overflow: hidden; 83 | white-space: nowrap; 84 | outline: none; 85 | text-transform: uppercase; 86 | 87 | &:hover { 88 | text-decoration: none; 89 | color:rgba(255, 255, 255, 0.7); 90 | } 91 | 92 | @media (max-width: 660px) { 93 | line-height: 37px; 94 | height: 40px; 95 | font-size: 15px; 96 | } 97 | `; 98 | 99 | const DisclaimerLink = styled.a` 100 | font-weight: 600; 101 | font-size: 18px; 102 | color: #009fff; 103 | text-decoration: underline; 104 | 105 | &:hover { 106 | text-decoration: none; 107 | } 108 | 109 | @media (max-width: 660px) { 110 | font-size: 90% !important; 111 | } 112 | `; 113 | -------------------------------------------------------------------------------- /docs/source/fonts/slate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/docs/fonts/slate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/static/icons/get_involved/icon-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 28 | 29 | 31 | 33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/source/index.html: -------------------------------------------------------------------------------- 1 | <%# 2 | Copyright 2008-2013 Concur Technologies, Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | not use this file except in compliance with the License. You may obtain 6 | a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | License for the specific language governing permissions and limitations 14 | under the License. 15 | %> 16 | 17 | 18 | 19 | 20 | 21 | 22 | <%= current_page.data.title || "API Documentation" %> 23 | 24 | <%- stylesheet_link_tag('screen', 'screen') %> 25 | <%- stylesheet_link_tag('print', 'print') %> 26 | <%- stylesheet_link_tag('highlight-' + current_page.data.highlight_theme, 'screen, print') %> 27 | <%- javascript_include_tag('all') %> 28 | 29 | 30 | 31 | 32 | 33 | NAV 34 | <%- image_tag('navbar.png') %> 35 | 36 | 37 |
    38 | <%- image_tag('logo.png') %> 39 | <% if (langs) { %> 40 |
    41 | <% for(var i=0; i 42 | <%= langs[i] %> 43 | <% } %> 44 |
    45 | <% } %> 46 | <% if (current_page.data.search) { %> 47 | 50 |
      51 | <% } %> 52 |
      53 |
      54 | <% if (current_page.data.toc_footers) { %> 55 | 60 | <% } %> 61 |
      62 |
      63 |
      64 |
      65 | <% for(var i=0; i 66 | <%- includes[i] %> 67 | <% } %> 68 |
      69 |
      70 | <% if (langs) { %> 71 |
      72 | <% for(var i=0; i 73 | <%= langs[i] %> 74 | <% } %> 75 |
      76 | <% } %> 77 |
      78 |
      79 | 80 | 81 | --------------------------------------------------------------------------------