├── 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 |
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 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/public/static/shapes/shape-header-bg-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 | This error section is stored in a separate file in `includes/_errors.md`. Slate allows you to optionally separate out your docs into many files...just save them to the `includes` folder and add them to the top of your `index.md`'s frontmatter. Files are included in the order listed.
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 |
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 |
12 | {items.map(item => (
13 |
14 |
15 |
16 | ))}
17 |
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 | You need to enable JavaScript to run this app.
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 |
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 |
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 |
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 |
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 |
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 |
45 | <% } %>
46 | <% if (current_page.data.search) { %>
47 |
48 |
49 |
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 |
76 | <% } %>
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------