











Como pode ser observado nos últimos códigos postados, o grupo decidiu considerar uma tecnologia diferente do Android: utilizou-se o Javascript para abranger uma gama maior de usuários. Ao invés de arriscar que o usuário use o aplicativo e o desinstale de seu smartphone, busca-se por uma solução mais atrativa e que faça diferença na vida de quem está preocupado com o impactos ambientais. Portanto:
Tecnologias envolvidas: Javascript/react para criação de um aplicativo web
Público-alvo: as pessoas preocupadas com os impactos ambientais. Tendo ainda como estratégia de aproximação: parcerias com instituições não governamentais e gamification através do conhecimento.
GitHub link for project of Iglu app: https://github.com/gustavo-depaula/iglu
#SpaceApps #SpaceAppsSP #FatecOsasco
| importReact,{Component}from'react'; | |
| import'bulma/css/bulma.css' | |
| import{Spring}from'react-spring' | |
| classBottomInfoextendsComponent{ | |
| state={toggle: true} | |
| toggle=()=>this.setState(state=>({toggle: !state.toggle})) | |
| render(){ | |
| return( | |
| <Spring | |
| from={{h: '10vh',w: '90%'}} | |
| to={{ | |
| h: this.state.toggle ? '15vh' : '100vh', | |
| w: this.state.toggle ? '90%' : '100%' | |
| }} | |
| toggle={this.toggle}// Additional props will be spread over the child | |
| children={({h, w, toggle})=>{ | |
| return( | |
| <divstyle={{ | |
| display: 'flex', | |
| justifyContent: 'center' | |
| }}> | |
| <div | |
| onClick={toggle} | |
| style={{ | |
| borderRadius: '5px 5px 0 0', | |
| backgroundColor: 'white', | |
| position: 'absolute', | |
| width: w, | |
| zIndex: toggle ? 5 : 0, | |
| height: h, | |
| bottom: '-20px', | |
| padding: '15px 20px' | |
| }} | |
| > | |
| <h3className="title is-4"style={{ | |
| fontWeight: 100 | |
| }}> | |
| O que é a Criosfera? | |
| </h3> | |
| </div> | |
| </div> | |
| ) | |
| }} | |
| /> | |
| ) | |
| } | |
| } | |
| exportdefaultBottomInfo; |
| importReactfrom'react' | |
| import{Link}from'react-router-dom' | |
| import{cities}from'../data' | |
| functionCityItem({ name, slug }){ | |
| return( | |
| <Linkto={`/cities/${slug}`}> | |
| <divclassName='columns'style={{ | |
| borderBottom: '1px solid #ddd', | |
| padding: '16px 12px' | |
| }}> | |
| <divclassName='column'> | |
| <divstyle={{ | |
| display: 'inline', | |
| padding: '15px 20px' | |
| }}> | |
| <iclassName='fas fa-map-pin'/> | |
| </div> | |
| <divstyle={{display: 'inline'}}> | |
| <h3className='title is-4'style={{ | |
| display: 'inline', | |
| fontWeight: 100 | |
| }}> | |
| {name} | |
| </h3> | |
| </div> | |
| </div> | |
| </div> | |
| </Link> | |
| ) | |
| } | |
| functionCitiesList({ searchTerm =''}){ | |
| return( | |
| <divstyle={{ | |
| overflow: 'scroll' | |
| }}> | |
| {cities.filter(city=>city.name.toUpperCase().includes(searchTerm.toUpperCase())).map((city,index)=>( | |
| <CityItemkey={index}name={city.name}slug={city.value}/> | |
| ))} | |
| </div> | |
| ) | |
| } | |
| exportdefaultCitiesList |
| importReactfrom'react' | |
| import{Link}from'react-router-dom' | |
| import{Map}from'../App' | |
| import{cities}from'../data' | |
| functionCityPage({ match, ...props}){ | |
| constcity=cities.find(city=>city.value===match.params.city) | |
| return( | |
| <> | |
| <Map | |
| center={[121.450496,31.165072]} | |
| style='mapbox://styles/mapbox/light-v9' | |
| containerStyle={{ | |
| height: '200px', | |
| width: '100vw' | |
| }} | |
| zoom={[7]} | |
| /> | |
| <divstyle={{ | |
| padding: '20px' | |
| }}> | |
| <Linkto='/'>voltar</Link> | |
| <h1className='title'>{city.name}</h1> | |
| {city.data.map((data,index)=>( | |
| <divkey={index}style={{paddingBottom: '15px'}}> | |
| <pstyle={{fontWeight: 'bold'}}>{data.title}</p> | |
| <pstyle={{textAlign: 'justify',textJustify: 'inter-word'}}>{data.value}</p> | |
| </div> | |
| ))} | |
| </div> | |
| </> | |
| ) | |
| } | |
| exportdefaultCityPage |
| importReactfrom'react' | |
| importBottomInfofrom'../components/bottom-info' | |
| importSearchBoxfrom'../components/search-box' | |
| import{Map}from'../App' | |
| functionMainPage(){ | |
| return( | |
| <div> | |
| <SearchBox/> | |
| <BottomInfo/> | |
| <Map | |
| style='mapbox://styles/mapbox/light-v9' | |
| containerStyle={{ | |
| height: '100vh', | |
| width: '100vw' | |
| }} | |
| zoom={[1]} | |
| /> | |
| </div> | |
| ) | |
| } | |
| exportdefaultMainPage |
| importReactfrom'react'; | |
| import{Spring}from'react-spring' | |
| importCitiesListfrom'./cities-list' | |
| constactivatedStyles={ | |
| width: '100%', | |
| height: '100vh', | |
| left: '0', | |
| top: '0', | |
| icon: 'fas fa-chevron-left' | |
| } | |
| constdefaultStyles={ | |
| width: '90%', | |
| height: '4vh',//56px | |
| left: '20px', | |
| top: '21px', | |
| icon: 'fas fa-bars' | |
| } | |
| classSearchBoxextendsReact.Component{ | |
| state={fullscreen: false,searchTerm: ''} | |
| activate=()=>this.setState({fullscreen: true}) | |
| close=()=>this.setState({fullscreen: false}) | |
| handleSearchTerm=(event)=>this.setState({searchTerm: event.target.value}); | |
| render(){ | |
| return( | |
| <Spring | |
| from={defaultStyles} | |
| to={this.state.fullscreen ? activatedStyles : defaultStyles} | |
| children={ | |
| ({toggle, ...styles})=>( | |
| <divstyle={{ | |
| ...styles, | |
| borderRadius: this.state.fullscreen ? '0' : '5px', | |
| position: 'absolute', | |
| zIndex: this.state.fullscreen ? 10 : 2, | |
| backgroundColor: 'white' | |
| }}> | |
| <divclassName="field is-horizontal"> | |
| <divclassName="field-body"> | |
| <divclassName="field is-expanded"> | |
| <divclassName="field has-addons"> | |
| <pclassName="control"> | |
| {this.state.fullscreen&& | |
| <aclassName="button"onClick={this.close}style={{ | |
| borderColor: 'white', | |
| borderRadius: this.state.fullscreen ? '0' : '5px 0 0 5px', | |
| height: '56px', | |
| fontSize: '21px', | |
| fontWeight: '300', | |
| boxShadow: '-2px 4px 7px 0px rgba(0, 0, 0, 0.25)', | |
| }}> | |
| <iclassName='fas fa-chevron-left'/> | |
| </a> | |
| } | |
| {!this.state.fullscreen&& | |
| <aclassName="button"onClick={this.close}style={{ | |
| borderColor: 'white', | |
| borderRadius: this.state.fullscreen ? '0' : '5px 0 0 5px', | |
| height: '56px', | |
| fontSize: '21px', | |
| fontWeight: '300', | |
| boxShadow: '-2px 4px 7px 0px rgba(0, 0, 0, 0.25)', | |
| }}> | |
| <iclassName='fas fa-bars'/> | |
| </a> | |
| } | |
| </p> | |
| <pclassName="control is-expanded"> | |
| <inputclassName="input"type="text"onChange={this.handleSearchTerm}onFocus={this.activate}placeholder="Onde?"style={{ | |
| borderColor: 'white', | |
| borderRadius: this.state.fullscreen ? '0' : '0 5px 5px 0', | |
| height: '56px', | |
| fontSize: '21px', | |
| fontWeight: '300', | |
| boxShadow: '2px 4px 7px 0px rgba(0, 0, 0, 0.25)', | |
| }}/> | |
| </p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| {this.state.fullscreen&&<CitiesListsearchTerm={this.state.searchTerm}/>} | |
| </div> | |
| ) | |
| } | |
| /> | |
| ) | |
| } | |
| } | |
| exportdefaultSearchBox; |
Definição dos elementos de gamification:
-> Formas de ganhar pontos
1 ponto:
5 pontos:
10 pontos:
30 pontos:
-> Ranking
-> Níveis


O que é criosfera?
Compreende os lugares da Terra que a água é encontrada em estado sólido (gelo ou neve).
São definidas de acordo os seus componentes:
– Água congelada – Lençóis de gelo – Neve e solo congelado (permafrost)
Ideia e público-alvo
- Aplicativo educativo que utiliza conceitos de gamification para aproximar a criosfera ao cotidiano da população mundial
- Comunidades que são diretamente afetadas pela criosfera, pessoas que possuem um smartphone e com acesso à Internet
Metodologia de desenvolvimento
- Coleta de informações dos sites da Nasa disponibilizados - Prototipação evolutiva de software
Funcionalidades do app
- Mapeamento dos componentes da crioesfera mais próximos ao usuário
- Exibição das características biológicas e físicas da criosfera
- Atribuição de pontuação e conquistas (gamification) conforme o usuário avança pelo appTecnologias envolvidas
- Java (aplicativo para Android) - Ferramenta Adobe XD CC para prototipação das telas do app e Figma
Referência






SpaceApps is a NASA incubator innovation program.