├── .nvmrc ├── public ├── robots.txt ├── favicon.ico ├── images │ └── og_image.png ├── favicons │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── android-icon-36x36.png │ ├── android-icon-48x48.png │ ├── android-icon-72x72.png │ ├── android-icon-96x96.png │ ├── android-icon-144x144.png │ └── android-icon-192x192.png ├── fonts │ ├── TitilliumWeb-Bold.woff2 │ ├── TitilliumWeb-Regular.woff2 │ ├── TitilliumWeb-Bold-ext.woff2 │ └── TitilliumWeb-Regular-ext.woff2 ├── manifest.json └── index.html ├── src ├── images │ ├── dsu.png │ ├── gov.png │ ├── conduita │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 19.png │ │ ├── 2.png │ │ ├── 20.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ ├── rovaccinare.jpg │ ├── banda_sponsori.png │ ├── mituri │ │ ├── fumatul.jpeg │ │ ├── sa-stam-acasa.jpeg │ │ ├── tuse-stranut.jpeg │ │ ├── ajuta-sa-beau-apa.jpeg │ │ ├── ce-sa-fac-daca-am-febra.jpeg │ │ ├── infectare-fructe-legume.jpeg │ │ ├── lamaia-si-coronovirusul.jpeg │ │ ├── cat-dureaza-sa-te-vindeci.jpeg │ │ ├── exista-vaccin-sau-tratament.jpeg │ │ ├── vitamina-c-si-coronavirusul.jpeg │ │ └── copiii-sa-evite-locurile-de-joaca.jpeg │ ├── pages │ │ ├── 7_cumsefolosestamasca.jpg │ │ └── covid_ro_ceicareneoferajutor.svg │ ├── check.svg │ ├── logo.svg │ ├── code4romania-gray.svg │ └── code4romania-taskforce.svg ├── components │ ├── Card │ │ ├── Card.scss │ │ └── index.js │ ├── Conduita │ │ ├── styles.scss │ │ └── index.js │ ├── Form │ │ ├── Form.scss │ │ ├── singleChoice.js │ │ ├── multipleChoice.js │ │ ├── index.jsx │ │ └── results.js │ ├── SearchResults │ │ ├── styles.scss │ │ └── index.js │ ├── Home │ │ ├── styles.scss │ │ └── index.js │ ├── About │ │ ├── About.scss │ │ └── index.js │ ├── Footer │ │ └── index.js │ ├── ContentPage │ │ └── index.js │ ├── TermsAndConditions.js │ └── PrivacyPolicy.js ├── config │ └── mailchimp.js ├── setupTests.js ├── analyticsTracker.js ├── App.scss ├── index.js ├── _fonts.scss ├── utils │ └── instruments.utils.js ├── data │ └── useful-apps.js ├── App.js └── serviceWorker.js ├── .gitignore ├── .editorconfig ├── .github ├── CODEOWNERS └── dependabot.yml ├── package.json ├── README.md └── LICENSE /.nvmrc: -------------------------------------------------------------------------------- 1 | 16 2 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/images/dsu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/dsu.png -------------------------------------------------------------------------------- /src/images/gov.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/gov.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | /api/Decisions.Api/staticPages 3 | */node_modules/ 4 | /node_modules 5 | build 6 | 7 | /.idea 8 | -------------------------------------------------------------------------------- /src/components/Card/Card.scss: -------------------------------------------------------------------------------- 1 | .cardImage { 2 | margin-right: 15px; 3 | max-width: 120px; 4 | width: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /public/images/og_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/images/og_image.png -------------------------------------------------------------------------------- /src/images/conduita/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/1.png -------------------------------------------------------------------------------- /src/images/conduita/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/10.png -------------------------------------------------------------------------------- /src/images/conduita/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/11.png -------------------------------------------------------------------------------- /src/images/conduita/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/12.png -------------------------------------------------------------------------------- /src/images/conduita/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/13.png -------------------------------------------------------------------------------- /src/images/conduita/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/14.png -------------------------------------------------------------------------------- /src/images/conduita/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/15.png -------------------------------------------------------------------------------- /src/images/conduita/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/16.png -------------------------------------------------------------------------------- /src/images/conduita/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/17.png -------------------------------------------------------------------------------- /src/images/conduita/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/18.png -------------------------------------------------------------------------------- /src/images/conduita/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/19.png -------------------------------------------------------------------------------- /src/images/conduita/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/2.png -------------------------------------------------------------------------------- /src/images/conduita/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/20.png -------------------------------------------------------------------------------- /src/images/conduita/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/3.png -------------------------------------------------------------------------------- /src/images/conduita/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/4.png -------------------------------------------------------------------------------- /src/images/conduita/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/5.png -------------------------------------------------------------------------------- /src/images/conduita/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/6.png -------------------------------------------------------------------------------- /src/images/conduita/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/7.png -------------------------------------------------------------------------------- /src/images/conduita/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/8.png -------------------------------------------------------------------------------- /src/images/conduita/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/conduita/9.png -------------------------------------------------------------------------------- /src/images/rovaccinare.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/rovaccinare.jpg -------------------------------------------------------------------------------- /src/images/banda_sponsori.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/banda_sponsori.png -------------------------------------------------------------------------------- /src/images/mituri/fumatul.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/fumatul.jpeg -------------------------------------------------------------------------------- /public/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/favicon-96x96.png -------------------------------------------------------------------------------- /public/fonts/TitilliumWeb-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/fonts/TitilliumWeb-Bold.woff2 -------------------------------------------------------------------------------- /src/images/mituri/sa-stam-acasa.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/sa-stam-acasa.jpeg -------------------------------------------------------------------------------- /src/images/mituri/tuse-stranut.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/tuse-stranut.jpeg -------------------------------------------------------------------------------- /public/favicons/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/android-icon-36x36.png -------------------------------------------------------------------------------- /public/favicons/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/android-icon-48x48.png -------------------------------------------------------------------------------- /public/favicons/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/android-icon-72x72.png -------------------------------------------------------------------------------- /public/favicons/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/android-icon-96x96.png -------------------------------------------------------------------------------- /public/fonts/TitilliumWeb-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/fonts/TitilliumWeb-Regular.woff2 -------------------------------------------------------------------------------- /public/favicons/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/android-icon-144x144.png -------------------------------------------------------------------------------- /public/favicons/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/favicons/android-icon-192x192.png -------------------------------------------------------------------------------- /public/fonts/TitilliumWeb-Bold-ext.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/fonts/TitilliumWeb-Bold-ext.woff2 -------------------------------------------------------------------------------- /src/images/mituri/ajuta-sa-beau-apa.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/ajuta-sa-beau-apa.jpeg -------------------------------------------------------------------------------- /public/fonts/TitilliumWeb-Regular-ext.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/public/fonts/TitilliumWeb-Regular-ext.woff2 -------------------------------------------------------------------------------- /src/images/pages/7_cumsefolosestamasca.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/pages/7_cumsefolosestamasca.jpg -------------------------------------------------------------------------------- /src/config/mailchimp.js: -------------------------------------------------------------------------------- 1 | export const mailchimpURL = 2 | "https://stirioficiale.us19.list-manage.com/subscribe/post?u=046bd86a80966c2ecaa0d84bf&id=10738ac8bf"; 3 | -------------------------------------------------------------------------------- /src/images/mituri/ce-sa-fac-daca-am-febra.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/ce-sa-fac-daca-am-febra.jpeg -------------------------------------------------------------------------------- /src/images/mituri/infectare-fructe-legume.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/infectare-fructe-legume.jpeg -------------------------------------------------------------------------------- /src/images/mituri/lamaia-si-coronovirusul.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/lamaia-si-coronovirusul.jpeg -------------------------------------------------------------------------------- /src/images/mituri/cat-dureaza-sa-te-vindeci.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/cat-dureaza-sa-te-vindeci.jpeg -------------------------------------------------------------------------------- /src/images/mituri/exista-vaccin-sau-tratament.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/exista-vaccin-sau-tratament.jpeg -------------------------------------------------------------------------------- /src/images/mituri/vitamina-c-si-coronavirusul.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/vitamina-c-si-coronavirusul.jpeg -------------------------------------------------------------------------------- /src/images/mituri/copiii-sa-evite-locurile-de-joaca.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/code4romania/covid-19-ce-trebuie-sa-fac/HEAD/src/images/mituri/copiii-sa-evite-locurile-de-joaca.jpeg -------------------------------------------------------------------------------- /src/images/check.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Conduita/styles.scss: -------------------------------------------------------------------------------- 1 | .content iframe { 2 | margin: 20px auto; 3 | display: block; 4 | } 5 | 6 | 7 | @media (max-width: 1024px) { 8 | .content iframe { 9 | width: 100%; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import "@testing-library/jest-dom/extend-expect"; 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | ; top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | 7 | trim_trailing_whitespace = true 8 | 9 | ; Unix style line endings 10 | end_of_line = lf 11 | 12 | ; Always end file on newline 13 | insert_final_newline = true 14 | 15 | ; Indentation 16 | indent_style = space 17 | indent_size = 2 -------------------------------------------------------------------------------- /src/components/Form/Form.scss: -------------------------------------------------------------------------------- 1 | .action-buttons { 2 | padding: 10px 0; 3 | display: flex; 4 | } 5 | 6 | @media (max-width: 768px) { 7 | .action-buttons { 8 | padding: 0; 9 | .level-left { 10 | margin-top: 1.5rem; 11 | display: flex; 12 | 13 | .level-item { 14 | margin: 0 1rem 0 0; 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # These owners will be the default owners for everything in 2 | # the repo. Unless a later match takes precedence, 3 | # they will be requested for review when someone 4 | # opens a pull request. 5 | * @Utwo @aniri @catileptic 6 | 7 | # More details on creating a codeowners file: 8 | # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners 9 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Maintain dependencies for npm 4 | - package-ecosystem: "npm" 5 | directory: "/" 6 | schedule: 7 | interval: "monthly" 8 | versioning-strategy: increase 9 | # This option has no impact on security updates, which have a separate, 10 | # internal limit of ten open pull requests. 11 | open-pull-requests-limit: 0 12 | -------------------------------------------------------------------------------- /src/analyticsTracker.js: -------------------------------------------------------------------------------- 1 | import ReactGA from "react-ga4"; 2 | 3 | export const initializeGA = () => { 4 | if (document.location.hostname !== "cetrebuiesafac.ro") { 5 | return; 6 | } 7 | ReactGA.initialize("G-JRHJS1JFC5"); 8 | }; 9 | 10 | export const logPageView = (history) => { 11 | history.listen((location) => { 12 | const page = location.pathname || window.location.pathname; 13 | ReactGA.set({ page: page }); 14 | }); 15 | }; 16 | -------------------------------------------------------------------------------- /src/App.scss: -------------------------------------------------------------------------------- 1 | @import "./fonts"; 2 | 3 | .container { 4 | padding-right: 1.25rem; 5 | padding-left: 1.25rem; 6 | } 7 | 8 | .App-header__logo .logo img { 9 | height: 2rem; 10 | } 11 | 12 | .__social-share-container { 13 | margin-bottom: 1.6rem; 14 | } 15 | 16 | .incubated-by-wrapper { 17 | margin-top: 2rem; 18 | } 19 | 20 | @media (max-width: 768px) { 21 | .banner-wrapper { 22 | text-align: center; 23 | } 24 | } 25 | .incubated-by-wrapper { 26 | margin-top: 2rem; 27 | } 28 | -------------------------------------------------------------------------------- /src/components/SearchResults/styles.scss: -------------------------------------------------------------------------------- 1 | .search-results-container { 2 | padding-top: 10px; 3 | .results-description { 4 | font-size: 1.3rem; 5 | color: #000; 6 | margin: 1rem 0; 7 | line-height: 1.2; 8 | } 9 | .list-item { 10 | padding-bottom: 10px; 11 | .read-more { 12 | cursor: pointer; 13 | text-decoration: underline; 14 | color: #00478f; 15 | 16 | &:hover { 17 | color: #363636; 18 | text-decoration: none; 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/components/Card/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import "./Card.scss"; 4 | 5 | const Card = (props) => { 6 | const { image, children } = props; 7 | return ( 8 |
9 | 10 |

{children}

11 |
12 | ); 13 | }; 14 | 15 | Card.propTypes = { 16 | image: PropTypes.string, 17 | children: PropTypes.node, 18 | }; 19 | 20 | export default Card; 21 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import AppWrapper from "./App"; 4 | import * as serviceWorker from "./serviceWorker"; 5 | import "@code4ro/taskforce-fe-components/dist/index.css"; 6 | import { initializeGA } from "./analyticsTracker"; 7 | 8 | initializeGA(); 9 | ReactDOM.render(, document.getElementById("root")); 10 | 11 | // If you want your app to work offline and load faster, you can change 12 | // unregister() to register() below. Note this comes with some pitfalls. 13 | // Learn more about service workers: https://bit.ly/CRA-PWA 14 | serviceWorker.register(); 15 | -------------------------------------------------------------------------------- /src/components/Home/styles.scss: -------------------------------------------------------------------------------- 1 | .newsletter { 2 | margin-top: 20px; 3 | } 4 | 5 | .search-input { 6 | margin-bottom: 2em; 7 | } 8 | 9 | .homepage-content { 10 | .message .message-body img { 11 | max-width: 750px; 12 | width: 100%; 13 | } 14 | 15 | .content iframe { 16 | margin: 20px auto; 17 | display: block; 18 | } 19 | } 20 | 21 | @media (max-width: 1024px) { 22 | .homepage-content .content iframe { 23 | width: 100%; 24 | } 25 | } 26 | 27 | /* media queries are inclussive, so to avoid overlap, min-width query must be one pixel more than the max-width */ 28 | @media (min-width: 769px) { 29 | .homepage-columns { 30 | flex-direction: row-reverse; 31 | } 32 | 33 | .homepage-content .instruments-wrapper, 34 | .homepage-content .newsletter { 35 | display: none; 36 | } 37 | } 38 | 39 | @media (max-width: 768px) { 40 | .homepage-sidebar .instruments-wrapper, 41 | .homepage-sidebar .newsletter, 42 | .pages-list { 43 | display: none; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "CeTrebuieSaFac", 3 | "name": "Ce Trebuie Să Fac", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "theme_color": "#233780", 7 | "background_color": "#ffffff", 8 | "icons": [ 9 | { 10 | "src": "./favicons/android-icon-36x36.png", 11 | "sizes": "36x36", 12 | "type": "image/png", 13 | "density": "0.75" 14 | }, 15 | { 16 | "src": "./favicons/android-icon-48x48.png", 17 | "sizes": "48x48", 18 | "type": "image/png", 19 | "density": "1.0" 20 | }, 21 | { 22 | "src": "./favicons/android-icon-72x72.png", 23 | "sizes": "72x72", 24 | "type": "image/png", 25 | "density": "1.5" 26 | }, 27 | { 28 | "src": "./favicons/android-icon-96x96.png", 29 | "sizes": "96x96", 30 | "type": "image/png", 31 | "density": "2.0" 32 | }, 33 | { 34 | "src": "./favicons/android-icon-144x144.png", 35 | "sizes": "144x144", 36 | "type": "image/png", 37 | "density": "3.0" 38 | }, 39 | { 40 | "src": "./favicons/android-icon-192x192.png", 41 | "sizes": "192x192", 42 | "type": "image/png", 43 | "density": "4.0" 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /src/components/Form/singleChoice.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import "./Form.scss"; 4 | import { ListHeader, List, ListItem } from "@code4ro/taskforce-fe-components"; 5 | 6 | function SingleChoice({ question, onAnswer, currentResponse }) { 7 | const isSelected = (option) => { 8 | return currentResponse === option.value; 9 | }; 10 | 11 | return ( 12 |
13 | 14 |
15 | 16 | {question.options.map((option) => ( 17 | 22 | onAnswer({ 23 | questionId: question.questionId, 24 | value: option.value, 25 | }) 26 | } 27 | /> 28 | ))} 29 | 30 |
31 |
32 | ); 33 | } 34 | 35 | SingleChoice.propTypes = { 36 | question: PropTypes.shape({ 37 | questionId: PropTypes.number.isRequired, 38 | questionText: PropTypes.string.isRequired, 39 | type: PropTypes.oneOf(["FINAL", "SINGLE_CHOICE", "MULTIPLE_CHOICE"]), 40 | options: PropTypes.arrayOf( 41 | PropTypes.shape({ 42 | label: PropTypes.string.isRequired, 43 | value: PropTypes.number.isRequired, 44 | }) 45 | ), 46 | }), 47 | onAnswer: PropTypes.func, 48 | currentResponse: PropTypes.number, 49 | }; 50 | 51 | export default SingleChoice; 52 | -------------------------------------------------------------------------------- /src/_fonts.scss: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: "Titillium Web"; 4 | font-style: normal; 5 | font-weight: 400; 6 | font-display: swap; 7 | src: local("Titillium Web Regular"), local("TitilliumWeb-Regular"), 8 | url(/fonts/TitilliumWeb-Regular-ext.woff2) format("woff2"); 9 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, 10 | U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 11 | } 12 | /* latin */ 13 | @font-face { 14 | font-family: "Titillium Web"; 15 | font-style: normal; 16 | font-weight: 400; 17 | font-display: swap; 18 | src: local("Titillium Web Regular"), local("TitilliumWeb-Regular"), 19 | url(/fonts/TitilliumWeb-Regular.woff2) format("woff2"); 20 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, 21 | U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, 22 | U+FEFF, U+FFFD; 23 | } 24 | /* latin-ext */ 25 | @font-face { 26 | font-family: "Titillium Web"; 27 | font-style: normal; 28 | font-weight: 700; 29 | font-display: swap; 30 | src: local("Titillium Web Bold"), local("TitilliumWeb-Bold"), 31 | url(/fonts/TitilliumWeb-Bold-ext.woff2) format("woff2"); 32 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, 33 | U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 34 | } 35 | /* latin */ 36 | @font-face { 37 | font-family: "Titillium Web"; 38 | font-style: normal; 39 | font-weight: 700; 40 | font-display: swap; 41 | src: local("Titillium Web Bold"), local("TitilliumWeb-Bold"), 42 | url(/fonts/TitilliumWeb-Bold.woff2) format("woff2"); 43 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, 44 | U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, 45 | U+FEFF, U+FFFD; 46 | } 47 | -------------------------------------------------------------------------------- /src/components/Form/multipleChoice.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import PropTypes from "prop-types"; 3 | import "./Form.scss"; 4 | import { ListHeader, List, ListItem } from "@code4ro/taskforce-fe-components"; 5 | 6 | function MultipleChoice({ question, onAnswer, currentResponse = [] }) { 7 | const [answers, setAnswers] = useState([]); 8 | const isSelected = (option) => { 9 | return currentResponse.includes(option.value); 10 | }; 11 | 12 | const handleClick = (option) => { 13 | let newAnswers; 14 | if (answers.includes(option.value)) { 15 | newAnswers = answers.filter((item) => item !== option.value); 16 | } else { 17 | newAnswers = [...answers, option.value]; 18 | } 19 | setAnswers(newAnswers); 20 | onAnswer({ 21 | questionId: question.questionId, 22 | value: newAnswers, 23 | }); 24 | }; 25 | 26 | return ( 27 |
28 | 29 |
30 | 31 | {question.options.map((option) => ( 32 | handleClick(option)} 37 | /> 38 | ))} 39 | 40 |
41 |
42 | ); 43 | } 44 | 45 | MultipleChoice.propTypes = { 46 | question: PropTypes.shape({ 47 | questionId: PropTypes.number.isRequired, 48 | questionText: PropTypes.string.isRequired, 49 | type: PropTypes.oneOf(["FINAL", "SINGLE_CHOICE", "MULTIPLE_CHOICE"]), 50 | options: PropTypes.arrayOf( 51 | PropTypes.shape({ 52 | label: PropTypes.string.isRequired, 53 | value: PropTypes.number.isRequired, 54 | }) 55 | ), 56 | }), 57 | onAnswer: PropTypes.func, 58 | currentResponse: PropTypes.arrayOf(PropTypes.number), 59 | }; 60 | 61 | export default MultipleChoice; 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ce-trebuie-sa-fac", 3 | "author": "code4romania", 4 | "description": "Arbore decizional pentru informarea publicului", 5 | "private": true, 6 | "dependencies": { 7 | "@code4ro/taskforce-fe-components": "^2.0.1", 8 | "fuse.js": "^6.0.0", 9 | "query-string": "^6.12.1", 10 | "react": "^16.13.0", 11 | "react-dom": "^16.13.0", 12 | "react-ga4": "^2.1.0", 13 | "react-router-dom": "^5.1.2", 14 | "react-scripts": "3.4.1" 15 | }, 16 | "scripts": { 17 | "start": "react-scripts start", 18 | "build": "react-scripts build", 19 | "test": "react-scripts test", 20 | "eject": "react-scripts eject", 21 | "lint": "eslint ./src --ext .js,.jsx,.ts,.tsx", 22 | "lint:fix": "npm run lint -- --fix" 23 | }, 24 | "husky": { 25 | "hooks": { 26 | "pre-commit": "npm run lint" 27 | } 28 | }, 29 | "eslintConfig": { 30 | "env": { 31 | "browser": true, 32 | "jest": true 33 | }, 34 | "plugins": [ 35 | "prettier" 36 | ], 37 | "extends": [ 38 | "react-app", 39 | "eslint:recommended", 40 | "plugin:react/recommended", 41 | "plugin:prettier/recommended" 42 | ], 43 | "ignorePatterns": [ 44 | "**/serviceWorker.js", 45 | "src/data/**/*.js", 46 | "node_modules/" 47 | ] 48 | }, 49 | "browserslist": { 50 | "production": [ 51 | ">0.2%", 52 | "not dead", 53 | "not op_mini all" 54 | ], 55 | "development": [ 56 | "last 1 chrome version", 57 | "last 1 firefox version", 58 | "last 1 safari version" 59 | ] 60 | }, 61 | "repository": { 62 | "type": "git", 63 | "url": "git+https://github.com/code4romania/ce-ma-fac.git" 64 | }, 65 | "license": "MPL-2.0", 66 | "bugs": { 67 | "url": "https://github.com/code4romania/ce-ma-fac/issues" 68 | }, 69 | "devDependencies": { 70 | "@testing-library/jest-dom": "^5.8.0", 71 | "@testing-library/react": "^10.0.4", 72 | "@testing-library/user-event": "^10.3.5", 73 | "eslint-config-prettier": "^6.11.0", 74 | "eslint-plugin-prettier": "^3.1.3", 75 | "husky": "^4.2.5", 76 | "prettier": "^2.0.5", 77 | "sass": "^1.63.6" 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/components/About/About.scss: -------------------------------------------------------------------------------- 1 | .about-page { 2 | display: flex; 3 | flex-direction: column; 4 | padding-bottom: 30px; 5 | } 6 | 7 | .sponsors { 8 | margin: auto; 9 | width: 50%; 10 | padding-bottom: 30px; 11 | text-align: center; 12 | } 13 | 14 | section.has-border-bottom { 15 | border-bottom: 1px solid #e5e5e5; 16 | } 17 | 18 | section.has-horizontal-paddding { 19 | padding: 50px 0; 20 | } 21 | 22 | .about-section-logo { 23 | display: flex; 24 | } 25 | 26 | .useful-instruments { 27 | display: flex; 28 | flex-direction: column; 29 | section { 30 | margin: 10px 0; 31 | display: grid; 32 | grid-template-columns: 100%; 33 | row-gap: 20px; 34 | } 35 | } 36 | 37 | .info-card { 38 | .card-title { 39 | border-left: 16px solid; 40 | background: #f2f2f2; 41 | font-size: 16px; 42 | display: flex; 43 | padding: 20px; 44 | } 45 | .card-content { 46 | background: rgba(247, 247, 247, 0.5); 47 | font-size: 14px; 48 | display: flex; 49 | flex-direction: column; 50 | padding: 0px 16px 16px 16px; 51 | button { 52 | outline: none; 53 | border: none; 54 | padding: 8px; 55 | cursor: pointer; 56 | } 57 | } 58 | &.info-card-news { 59 | .card-title { 60 | border-color: #05d6c7; 61 | } 62 | button { 63 | background: #05d6c7; 64 | color: #ffffff; 65 | } 66 | } 67 | &.info-card-help { 68 | .card-title { 69 | border-color: #ff1616; 70 | } 71 | button { 72 | background: #ff1616; 73 | color: #ffffff; 74 | } 75 | } 76 | &.info-card-data { 77 | .card-title { 78 | border-color: #f5bcd6; 79 | } 80 | button { 81 | background: #f5bcd6; 82 | color: #ffffff; 83 | } 84 | } 85 | } 86 | 87 | @media (min-width: 801px) { 88 | .about-page { 89 | display: grid; 90 | column-gap: 32px; 91 | grid-template-columns: 1fr 1fr; 92 | } 93 | .useful-instruments { 94 | display: grid; 95 | grid-template-columns: repeat(3, 1fr); 96 | column-gap: 10px; 97 | section { 98 | margin: 0; 99 | } 100 | } 101 | .about-section-useful-instruments { 102 | grid-column: 1 / 3; 103 | display: "grid"; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/utils/instruments.utils.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { InstrumentsItem } from "@code4ro/taskforce-fe-components"; 3 | 4 | const hasButtons = (buttons) => { 5 | return buttons && buttons.length; 6 | }; 7 | 8 | const getCategoryItems = (usefulApps, category) => { 9 | return usefulApps.filter((usefulApp) => usefulApp.app_type === category); 10 | }; 11 | const remapInstrumentsData = (data) => { 12 | const sortedData = data.sort((a, b) => { 13 | return a.display_order - b.display_order; 14 | }); 15 | return { 16 | info: getCategoryItems(sortedData, "INFO"), 17 | news: getCategoryItems(sortedData, "NEWS"), 18 | data: getCategoryItems(sortedData, "DATA"), 19 | offer_help: getCategoryItems(sortedData, "OFFER_HELP"), 20 | diaspora: getCategoryItems(sortedData, "DIASPORA"), 21 | medical: getCategoryItems(sortedData, "MEDICAL"), 22 | }; 23 | }; 24 | 25 | const renderInstrumentItem = (usefulApp) => { 26 | const cartegoryMap = { 27 | NEWS: "green", 28 | OFFER_HELP: "red", 29 | DATA: "pink", 30 | INFO: "yellow", 31 | DIASPORA: "blue", 32 | MEDICAL: "orange", 33 | }; 34 | return ( 35 | 47 | ); 48 | }; 49 | 50 | const scrollRefIntoView = (scrollAnchorRef) => { 51 | try { 52 | scrollAnchorRef.current.scrollIntoView({ 53 | block: "start", 54 | behavior: "smooth", 55 | }); 56 | } catch (e) { 57 | scrollAnchorRef.current.scrollIntoView(true); 58 | } 59 | }; 60 | 61 | const navigate = (history, slug, anchor) => { 62 | // Fix SecurityError of pushState on History 63 | const cleanSlug = (slug || "") 64 | .replace(/\/+/g, "/") // delete duplicated slashes 65 | .replace(/\/$/g, "") // delete trailing slash 66 | .replace(/^\//g, ""); //remove leading slash 67 | history.push("/" + cleanSlug); 68 | scrollRefIntoView(anchor); 69 | }; 70 | 71 | export { renderInstrumentItem, remapInstrumentsData, navigate }; 72 | -------------------------------------------------------------------------------- /src/components/Footer/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | import { 4 | Footer, 5 | FooterLinkHeader, 6 | FooterLinks, 7 | FooterLinkItem, 8 | } from "@code4ro/taskforce-fe-components"; 9 | 10 | const FooterWrapper = () => { 11 | return ( 12 | 75 | ); 76 | }; 77 | 78 | export default FooterWrapper; 79 | -------------------------------------------------------------------------------- /src/components/SearchResults/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { SearchResultListItem } from "@code4ro/taskforce-fe-components"; 3 | import "./styles.scss"; 4 | import PropTypes from "prop-types"; 5 | import Fuse from "fuse.js"; 6 | 7 | const SearchResults = ({ query, data = [], readMore }) => { 8 | /** 9 | * remove diacritics and turn all to lowercase 10 | */ 11 | const normalize = (text) => { 12 | return text 13 | .normalize("NFD") 14 | .replace(/[\u0300-\u036f]/g, "") 15 | .toLowerCase(); 16 | }; 17 | 18 | const docs = data.flatMap((parentDoc) => { 19 | parentDoc.content.forEach((doc) => { 20 | doc.fullSlug = `${parentDoc.slug}/${doc.slug}`; 21 | doc.searchText = normalize(doc.page); 22 | }); 23 | return parentDoc.content; 24 | }); 25 | 26 | // set the threshold based on the number of words in the query. 27 | // multiple words should generate a fuzzier search 28 | let threshold; 29 | const words = query.split(" ").length; 30 | switch (words) { 31 | case 1: 32 | threshold = 0.2; 33 | break; 34 | case 2: 35 | threshold = 0.4; 36 | break; 37 | default: 38 | threshold = 0.5; 39 | } 40 | 41 | const options = { 42 | shouldSort: true, 43 | threshold, 44 | distance: 100000, 45 | minMatchCharLength: 1, 46 | keys: ["title", "searchText"], 47 | }; 48 | 49 | const searchQuery = normalize(query); 50 | const fuse = new Fuse(docs, options); 51 | const results = fuse.search(searchQuery); 52 | return ( 53 |
54 |

55 | Rezultatele căutării pentru {`"${query}"`}: 56 |

57 | {results.map((doc) => { 58 | return ( 59 |
60 | 61 | readMore(doc.item.fullSlug)} 64 | > 65 | Citește mai mult 66 | 67 | 68 |
69 | ); 70 | })} 71 |
72 | ); 73 | }; 74 | 75 | SearchResults.propTypes = { 76 | query: PropTypes.string.isRequired, 77 | data: PropTypes.array.isRequired, 78 | readMore: PropTypes.func, 79 | }; 80 | 81 | export default SearchResults; 82 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 27 | 28 | 37 | Ce trebuie să fac 38 | 39 | 40 | 41 |
42 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/data/useful-apps.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | title: "Recomandări oficiale", 4 | doc_type: "USEFUL_APP", 5 | doc_id: 1, 6 | active: true, 7 | display_order: 1, 8 | app_type: "INFO", 9 | content: "15 RECOMANDĂRI privind conduita socială responsabilă în prevenirea răspândirii coronavirus", 10 | buttons: [ 11 | { 12 | title: "Citește aici", 13 | link: "https://stirioficiale.ro/15-recomandari-privind-conduita-sociala-responsabila-in-prevenirea-raspandirii-coronavirus" 14 | } 15 | ] 16 | } 17 | , 18 | { 19 | title: "Instalează-ți extensia de Chrome pentru a depista știrile false", 20 | doc_type: "USEFUL_APP", 21 | doc_id: 2, 22 | active: true, 23 | display_order: 2, 24 | app_type: "NEWS", 25 | content: null, 26 | buttons: [ 27 | { 28 | title: "Instalează extensie", 29 | link: "https://chrome.google.com/webstore/detail/covid-19-stiri-oficiale/pdcpkplohipjhdfdchpmgekifmcdbnha" 30 | } 31 | ] 32 | } 33 | , 34 | { 35 | title: "Instalează-ți extensia de Firefox pentru a depista știrile false", 36 | doc_type: "USEFUL_APP", 37 | doc_id: 3, 38 | active: true, 39 | display_order: 3, 40 | app_type: "NEWS", 41 | content: null, 42 | buttons: [ 43 | { 44 | title: "Instalează extensie", 45 | link: "https://addons.mozilla.org/en-US/firefox/addon/covid-19-%C8%99tiri-oficiale/" 46 | } 47 | ] 48 | } 49 | , 50 | { 51 | title: "Știri oficiale și informații la zi", 52 | doc_type: "USEFUL_APP", 53 | doc_id: 4, 54 | active: true, 55 | display_order: 4, 56 | app_type: "NEWS", 57 | content: null, 58 | buttons: [ 59 | { 60 | title: "Cele mai noi informații oficiale", 61 | link: "https://stirioficiale.ro/" 62 | } 63 | ] 64 | }, 65 | { 66 | title: "Vrei să ajuți. Intră aici", 67 | doc_type: "USEFUL_APP", 68 | doc_id: 5, 69 | active: true, 70 | display_order: 5, 71 | app_type: "OFFER_HELP", 72 | content: null, 73 | buttons: [ 74 | { 75 | title: "Donează prin RoHelp", 76 | link: "https://rohelp.ro/" 77 | } 78 | ] 79 | }, 80 | { 81 | title: "Date la zi", 82 | doc_type: "USEFUL_APP", 83 | doc_id: 6, 84 | active: true, 85 | display_order: 6, 86 | app_type: "DATA", 87 | content: null, 88 | buttons: [ 89 | { 90 | title: "Vezi aici date la zi", 91 | link: "https://datelazi.ro/" 92 | } 93 | ] 94 | }, 95 | { 96 | title: "Ești în afara țării și ai nevoie de ajutor?", 97 | doc_type: "USEFUL_APP", 98 | doc_id: 7, 99 | active: true, 100 | display_order: 7, 101 | app_type: "DIASPORA", 102 | content: null, 103 | buttons: [ 104 | { 105 | title: "Intră pe DiasporaHub", 106 | link: "https://diasporahub.ro" 107 | } 108 | ] 109 | }, 110 | { 111 | title: "Monitorizează-ți starea de sănătate", 112 | doc_type: "USEFUL_APP", 113 | doc_id: 8, 114 | active: true, 115 | display_order: 8, 116 | app_type: "MEDICAL", 117 | content: null, 118 | buttons: [ 119 | { 120 | title: "Fă-ți cont pe Jurnal Medical", 121 | link: "https://jurnalmedical.ro/" 122 | } 123 | ] 124 | } 125 | ]; 126 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, Suspense, lazy } from "react"; 2 | import { 3 | BrowserRouter as Router, 4 | Link, 5 | Route, 6 | Switch, 7 | useHistory, 8 | } from "react-router-dom"; 9 | import { logPageView } from "./analyticsTracker"; 10 | import Home from "./components/Home"; 11 | 12 | import { 13 | Logo, 14 | Header, 15 | DevelopedBy, 16 | IncubatedBy, 17 | BackToTop, 18 | } from "@code4ro/taskforce-fe-components"; 19 | import LogoSvg from "./images/logo.svg"; 20 | import gov from "./images/gov.png"; 21 | import DSU from "./images/dsu.png"; 22 | import "./App.scss"; 23 | 24 | const About = lazy(() => import("./components/About")); 25 | const Conduita = lazy(() => import("./components/Conduita")); 26 | const PrivacyPolicy = lazy(() => import("./components/PrivacyPolicy")); 27 | const TermsAndConditions = lazy(() => 28 | import("./components/TermsAndConditions") 29 | ); 30 | const FooterWrapper = lazy(() => import("./components/Footer")); 31 | 32 | const customPartnerLogos = [ 33 | 34 | Guvernul României 35 | , 36 | 37 | Departamentul pentru Situații de Urgență 38 | , 39 | ]; 40 | 41 | const MenuItems = [ 42 | 48 | Date la zi 49 | , 50 | 56 | Știri oficiale 57 | , 58 | 59 | Conduită 60 | , 61 | 62 | Despre 63 | , 64 | ]; 65 | 66 | const AppWrapper = () => { 67 | return ( 68 | 69 | 70 | 71 | ); 72 | }; 73 | 74 | const App = () => { 75 | const history = useHistory(); 76 | useEffect(() => { 77 | logPageView(history); 78 | }, [history]); 79 | 80 | return ( 81 | <> 82 |
85 | Covid-19. Ce trebuie să fac? 91 | 92 | } 93 | MenuItems={MenuItems} 94 | /> 95 | 96 | }> 97 |
98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 |
117 | 118 | 119 |
120 | 121 | ); 122 | }; 123 | 124 | export default AppWrapper; 125 | -------------------------------------------------------------------------------- /src/components/ContentPage/index.js: -------------------------------------------------------------------------------- 1 | import React, { useRef } from "react"; 2 | import { useHistory } from "react-router-dom"; 3 | import PropTypes from "prop-types"; 4 | import Form from "../Form"; 5 | import { List, ListItem } from "@code4ro/taskforce-fe-components"; 6 | import { 7 | Hero, 8 | Accordion, 9 | SocialsShare, 10 | } from "@code4ro/taskforce-fe-components"; 11 | 12 | import { navigate } from "../../utils/instruments.utils"; 13 | 14 | function ContentPage({ page, subPage }) { 15 | const history = useHistory(); 16 | 17 | const scrollAnchorRef = useRef(null); 18 | 19 | const renderContent = () => { 20 | return ( 21 | subPage && 22 | subPage.page && ( 23 |
27 | ) 28 | ); 29 | }; 30 | 31 | const renderSubPages = () => { 32 | if (!page || !page.content || page.content.length < 2) { 33 | return; 34 | } 35 | const items = page.content 36 | .filter((item) => item.slug !== subPage.slug) 37 | .map((item) => ( 38 | 42 | navigate(history, `/${page.slug}/${item.slug}`, scrollAnchorRef) 43 | } 44 | value={item} 45 | /> 46 | )); 47 | return ( 48 |
49 |

Află mai multe:

50 | {items} 51 |
52 | ); 53 | }; 54 | 55 | return ( 56 |
57 | 58 | 59 | {renderContent()} 60 | {renderSubPages()} 61 | {page.form &&
} 62 | {page.accordion && 63 | page.accordion.map((accordion, index) => ( 64 | 72 | } 73 | /> 74 | ))} 75 |
76 | ); 77 | } 78 | 79 | ContentPage.propTypes = { 80 | page: PropTypes.shape({ 81 | title: PropTypes.string.isRequired, 82 | slug: PropTypes.string.isRequired, 83 | content: PropTypes.arrayOf( 84 | PropTypes.shape({ 85 | title: PropTypes.string.isRequired, 86 | page: PropTypes.string.isRequired, 87 | slug: PropTypes.string, 88 | }) 89 | ), 90 | first_node_id: PropTypes.number, 91 | form: PropTypes.arrayOf( 92 | PropTypes.shape({ 93 | questionId: PropTypes.number.isRequired, 94 | questionText: PropTypes.string.isRequired, 95 | type: PropTypes.oneOf(["FINAL", "SINGLE_CHOICE", "MULTIPLE_CHOICE"]), 96 | options: PropTypes.arrayOf( 97 | PropTypes.shape({ 98 | label: PropTypes.string.isRequired, 99 | value: PropTypes.number.isRequired, 100 | }) 101 | ), 102 | }) 103 | ), 104 | accordion: PropTypes.arrayOf( 105 | PropTypes.shape({ 106 | title: PropTypes.string.isRequired, 107 | content: PropTypes.string.isRequired, 108 | }) 109 | ), 110 | }), 111 | subPage: PropTypes.shape({ 112 | title: PropTypes.string.isRequired, 113 | page: PropTypes.string.isRequired, 114 | slug: PropTypes.string, 115 | }), 116 | }; 117 | 118 | export default ContentPage; 119 | -------------------------------------------------------------------------------- /src/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/images/code4romania-gray.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Form/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import PropTypes from "prop-types"; 3 | import SingleChoice from "./singleChoice"; 4 | import MultipleChoice from "./multipleChoice"; 5 | import Results from "./results"; 6 | import "./Form.scss"; 7 | import { Button } from "@code4ro/taskforce-fe-components"; 8 | 9 | function Form({ data }) { 10 | // TODO: at some point, allow for answers to some questions to affect the visibility of other questions 11 | const [formState, setFormState] = useState({}); 12 | const [currentNode, setCurrentNode] = useState(0); 13 | const init = () => { 14 | setCurrentNode(data.firstNodeId); 15 | setFormState({}); 16 | }; 17 | 18 | useEffect(() => { 19 | init(); 20 | }, [data.form]); // eslint-disable-line 21 | 22 | const answerCurrentQuestion = (answer) => { 23 | setFormState({ 24 | ...formState, 25 | [answer.questionId]: answer.value, 26 | }); 27 | }; 28 | 29 | const questionView = () => { 30 | const currentQuestion = data.form[currentNode]; 31 | // TODO: add components for other question types 32 | switch (currentQuestion.type) { 33 | case "SINGLE_CHOICE": { 34 | return ( 35 | 40 | ); 41 | } 42 | case "MULTIPLE_CHOICE": { 43 | return ( 44 | 49 | ); 50 | } 51 | case "FINAL": { 52 | return ; 53 | } 54 | default: 55 | return null; 56 | } 57 | }; 58 | 59 | const goToNextQuestion = () => { 60 | // TODO use the disabled prop once the Button component implements it 61 | if (formState[data.form[currentNode].questionId] !== undefined) { 62 | setCurrentNode(currentNode + 1); 63 | } 64 | }; 65 | const goToPreviousQuestion = () => { 66 | setCurrentNode(currentNode - 1); 67 | }; 68 | 69 | return ( 70 |
71 | {questionView()} 72 |
73 |
74 | {currentNode > 0 && ( 75 |
76 | 79 |
80 | )} 81 | {currentNode < data.form.length - 1 && ( 82 |
83 | 84 |
85 | )} 86 |
87 |
88 | {data.form && ( 89 | 92 | )} 93 |
94 |
95 |
96 | ); 97 | } 98 | 99 | Form.propTypes = { 100 | data: PropTypes.shape({ 101 | title: PropTypes.string.isRequired, 102 | content: PropTypes.arrayOf( 103 | PropTypes.shape({ 104 | title: PropTypes.string.isRequired, 105 | page: PropTypes.string.isRequired, 106 | }) 107 | ), 108 | firstNodeId: PropTypes.number.isRequired, 109 | form: PropTypes.arrayOf( 110 | PropTypes.shape({ 111 | questionId: PropTypes.number.isRequired, 112 | questionText: PropTypes.string.isRequired, 113 | type: PropTypes.oneOf(["FINAL", "SINGLE_CHOICE", "MULTIPLE_CHOICE"]), 114 | options: PropTypes.arrayOf( 115 | PropTypes.shape({ 116 | label: PropTypes.string.isRequired, 117 | value: PropTypes.number.isRequired, 118 | }) 119 | ), 120 | }) 121 | ), 122 | }), 123 | }; 124 | 125 | export default Form; 126 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ce trebuie să fac - Web platform with guides & questionnaires 2 | 3 | [![GitHub contributors](https://img.shields.io/github/contributors/code4romania/ce-ma-fac.svg?style=for-the-badge)](https://github.com/code4romania/ce-ma-fac/graphs/contributors) [![GitHub last commit](https://img.shields.io/github/last-commit/code4romania/ce-ma-fac.svg?style=for-the-badge)](https://github.com/code4romania/ce-ma-fac/commits/master) [![License: MPL 2.0](https://img.shields.io/badge/license-MPL%202.0-brightgreen.svg?style=for-the-badge)](https://opensource.org/licenses/MPL-2.0) 4 | 5 | [See the project live](https://cetrebuiesafac.ro/) and [the preview environment](https://ce-ma-fac.now.sh/) with the work in progress. 6 | 7 | Objective: Clear information of the public, increase in the level of proper actions taken. 8 | 9 | How: Web platform with guides, questionnaires, and decision trees which can help the population understand the current situation and guides them through what steps need to be taken. 10 | 11 | [Contributing](#contributing) | [Built with](#built-with) | [Repos and projects](#repos-and-projects) | [Development](#development) | [Deployment](#deployment) | [Feedback](#feedback) | [License](#license) | [About Code4Ro](#about-code4ro) 12 | 13 | ## Contributing 14 | 15 | This project is built by amazing volunteers and you can be one of them! Here's a list of ways in [which you can contribute to this project](https://github.com/code4romania/.github/blob/master/CONTRIBUTING.md). If you want to make any change to this repository, please **make a fork first**. 16 | 17 | Help us out by testing this project in the [staging environment](https://ce-ma-fac-git-develop.code4romania.now.sh). If you see something that doesn't quite work the way you expect it to, open an Issue. Make sure to describe what you _expect to happen_ and _what is actually happening_ in detail. 18 | 19 | If you would like to suggest new functionality, open an Issue and mark it as a **[Feature request]**. Please be specific about why you think this functionality will be of use. If you can, please include some visual description of what you would like the UI to look like, if you are suggesting new UI elements. 20 | 21 | Also, this is [the workflow we follow](https://github.com/code4romania/.github/blob/master/WORKFLOW.md). 22 | 23 | ## Built With 24 | 25 | ### Programming languages 26 | 27 | - Javascript 28 | 29 | ### Frontend frameworks 30 | 31 | - [React (16.13.\*)](https://reactjs.org/) 32 | - [Bulma (0.8.\*)](https://bulma.io/) 33 | 34 | ### Package managers 35 | 36 | - Frontend - [NPM](https://docs.npmjs.com/) 37 | 38 | ## Repos and projects 39 | 40 | Uses reusable components from: https://www.npmjs.com/package/@code4ro/taskforce-fe-components 41 | 42 | ## Development 43 | 44 | ### Repo setup 45 | 46 | - Fork this repo 47 | - Clone your fork 48 | - Open the directory where you have cloned the repo 49 | 50 | ### Install node dependencies 51 | 52 | ```sh 53 | $ npm install 54 | ``` 55 | 56 | ### Run the app in the development mode 57 | 58 | ```sh 59 | $ npm start 60 | ``` 61 | 62 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. The page will reload if you make edits. You will also see any lint errors in the console. 63 | 64 | ### Run the tests 65 | 66 | ```sh 67 | $ npm test 68 | ``` 69 | 70 | Launches the test runner in the interactive watch mode. See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 71 | 72 | ## Deployment 73 | 74 | - preview environments available automatically on each PR powered by [Vercel](https://vercel.com/). Preview environment for `develop` branch: https://ce-ma-fac.now.sh/ 75 | - uses [github actions](https://github.com/features/actions) for deploying in prod 76 | 77 | ## Feedback 78 | 79 | - Request a new feature on GitHub. 80 | - Vote for popular feature requests. 81 | - File a bug in GitHub Issues. 82 | - Email us with other feedback contact@code4.ro 83 | 84 | ## License 85 | 86 | This project is licensed under the MPL 2.0 License - see the [LICENSE](LICENSE) file for details 87 | 88 | ## About Code4Ro 89 | 90 | Started in 2016, Code for Romania is a civic tech NGO, official member of the Code for All network. We have a community of over 500 volunteers (developers, ux/ui, communications, data scientists, graphic designers, devops, it security and more) who work pro-bono for developing digital solutions to solve social problems. #techforsocialgood. If you want to learn more details about our projects [visit our site](https://www.code4.ro/en/) or if you want to talk to one of our staff members, please e-mail us at contact@code4.ro. 91 | 92 | Last, but not least, we rely on donations to ensure the infrastructure, logistics and management of our community that is widely spread across 11 timezones, coding for social change to make Romania and the world a better place. If you want to support us, [you can do it here](https://code4.ro/en/donate/). 93 | -------------------------------------------------------------------------------- /src/images/code4romania-taskforce.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.0/8 are considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl, { 104 | headers: { 'Service-Worker': 'script' } 105 | }) 106 | .then(response => { 107 | // Ensure service worker exists, and that we really are getting a JS file. 108 | const contentType = response.headers.get('content-type'); 109 | if ( 110 | response.status === 404 || 111 | (contentType != null && contentType.indexOf('javascript') === -1) 112 | ) { 113 | // No service worker found. Probably a different app. Reload the page. 114 | navigator.serviceWorker.ready.then(registration => { 115 | registration.unregister().then(() => { 116 | window.location.reload(); 117 | }); 118 | }); 119 | } else { 120 | // Service worker found. Proceed as normal. 121 | registerValidSW(swUrl, config); 122 | } 123 | }) 124 | .catch(() => { 125 | console.log( 126 | 'No internet connection found. App is running in offline mode.' 127 | ); 128 | }); 129 | } 130 | 131 | export function unregister() { 132 | if ('serviceWorker' in navigator) { 133 | navigator.serviceWorker.ready 134 | .then(registration => { 135 | registration.unregister(); 136 | }) 137 | .catch(error => { 138 | console.error(error.message); 139 | }); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/components/About/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import logo from "../../images/logo.svg"; 3 | import bandaSponsori from "../../images/banda_sponsori.png"; 4 | import { 5 | Hero, 6 | BannerImage, 7 | Instruments, 8 | SocialsShare, 9 | MailchimpSubscribe, 10 | } from "@code4ro/taskforce-fe-components"; 11 | import UsefulApps from "../../data/useful-apps"; 12 | import "./About.scss"; 13 | import { 14 | renderInstrumentItem, 15 | remapInstrumentsData, 16 | } from "../../utils/instruments.utils"; 17 | import { mailchimpURL } from "../../config/mailchimp"; 18 | import rovaccinareImage from "../../images/rovaccinare.jpg"; 19 | 20 | const About = () => { 21 | const instrumentsData = remapInstrumentsData(UsefulApps); 22 | 23 | return ( 24 | <> 25 |
26 |
27 | 37 |
38 | 39 |
40 |
41 |
42 | 43 |
44 |
45 |

46 | Cetrebuiesafac.ro este o platformă care ajută populația să înțeleagă 47 | mai bine care sunt regulile ce trebuie respectate în timpul 48 | pandemieii COVID-19. Un ghid simplu și practic, redactat pe 49 | înțelesul tuturor cu sprijinul  50 | 55 | Brigăzii de Comunicare Nonprofit 56 | 57 | , avizat de  58 | 63 | Departamentul pentru Situații de Urgență 64 | 65 | , bazat pe scenarii posibile prin care populația poate trece. 66 | Această platformă te va ghida prin situații variate și te va aduce 67 | mai aproape de măsurile recomandate pentru o mai bună protejare a 68 | ta, a familiei și a comunității tale în această situație de urgență. 69 |

70 |
71 |
72 |

73 | Platforma cetrebuiesafac.ro este construită de Code for Romania Task 74 | Force în parteneriat cu  75 | 80 | Guvernul României 81 | 82 | , prin  83 | 88 | Autoritatea pentru Digitalizarea României 89 | 90 | , și  91 | 96 | Departamentul pentru Situații de Urgență 97 | 98 |

99 |
100 |
101 | 102 |
103 |
104 |
105 |

106 | 107 | Programul Code for Romania Task Force este susținut de: 108 | 109 |

110 |
111 | 112 |
113 |
114 | 146 |
147 | 148 | ); 149 | }; 150 | 151 | export default About; 152 | -------------------------------------------------------------------------------- /src/components/Home/index.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect, useRef } from "react"; 2 | import { useParams, useHistory } from "react-router-dom"; 3 | import ContentPage from "../ContentPage"; 4 | import data from "../../data/static-pages"; 5 | import { 6 | Hero, 7 | BannerImage, 8 | Instruments, 9 | List, 10 | ListItem, 11 | SidebarMenu, 12 | SidebarMenuItem, 13 | MailchimpSubscribe, 14 | SearchInput, 15 | } from "@code4ro/taskforce-fe-components"; 16 | import UsefulApps from "../../data/useful-apps"; 17 | import { 18 | renderInstrumentItem, 19 | remapInstrumentsData, 20 | navigate, 21 | } from "../../utils/instruments.utils"; 22 | import "./styles.scss"; 23 | import { mailchimpURL } from "../../config/mailchimp"; 24 | import * as queryString from "query-string"; 25 | import SearchResults from "../SearchResults/index"; 26 | import rovaccinareImage from "../../images/rovaccinare.jpg"; 27 | 28 | const SEARCH_SLUG = "search"; 29 | 30 | const Home = () => { 31 | const [selectedPage, setSelectedPage] = useState(null); 32 | const [selectedSubPage, setSelectedSubPage] = useState(null); 33 | const { pageSlug, subPageSlug } = useParams(); 34 | const history = useHistory(); 35 | const scrollAnchorRef = useRef(null); 36 | 37 | useEffect(() => { 38 | if (pageSlug === SEARCH_SLUG) { 39 | setSelectedPage(undefined); 40 | setSelectedSubPage(undefined); 41 | return; 42 | } 43 | 44 | data.sort((a, b) => { 45 | return a.display_order - b.display_order; 46 | }); 47 | 48 | // Find the page 49 | const page = data.find((doc) => doc.slug === (pageSlug || "/")); 50 | let subPage = null; 51 | 52 | if (page) { 53 | // Find the subPage 54 | if (subPageSlug) { 55 | subPage = page.content.find((page) => page.slug === subPageSlug); 56 | } else if (page.content.length) { 57 | [subPage] = page.content; 58 | } 59 | 60 | setSelectedPage(page); 61 | setSelectedSubPage(subPage); 62 | } else { 63 | // Fallback to the first page if there is no slug 64 | const [firstPage] = data; 65 | const destinationSlug = (firstPage && firstPage.slug) || "/"; 66 | navigate(history, destinationSlug, scrollAnchorRef); 67 | } 68 | }, [pageSlug, subPageSlug, history]); 69 | 70 | const navigateToPage = (slug) => navigate(history, slug, scrollAnchorRef); 71 | 72 | const triggerSearch = (query) => { 73 | if (!query) { 74 | return; 75 | } 76 | navigateToPage("/search?q=" + query); 77 | }; 78 | 79 | const topMenuData = data.filter((doc) => doc.showInTopMenu); 80 | 81 | const instrumentsData = remapInstrumentsData(UsefulApps); 82 | 83 | const extraInfo = ( 84 | <> 85 |
86 | 87 | 88 | 96 | {Object.keys(instrumentsData).map((category) => { 97 | return instrumentsData[category].map((usefulApp) => 98 | renderInstrumentItem(usefulApp) 99 | ); 100 | })} 101 | 102 |
103 |
104 | 105 |
106 | 107 | ); 108 | 109 | // get the search query from the url 110 | const queryParams = queryString.parse(window.location.search); 111 | const searchQuery = queryParams.q; 112 | 113 | return ( 114 | <> 115 |
116 | 123 |
124 |
125 | 126 | {topMenuData.map((doc) => ( 127 | navigateToPage(doc.slug)} 132 | value={doc} 133 | /> 134 | ))} 135 | 136 |
137 | 138 |
139 |
140 | 194 |
195 | {!selectedPage && searchQuery && ( 196 | 201 | )} 202 | {selectedPage && ( 203 | 207 | )} 208 | {extraInfo} 209 |
210 |
211 |
212 | 213 | ); 214 | }; 215 | 216 | export default Home; 217 | -------------------------------------------------------------------------------- /src/components/Conduita/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { 3 | Hero, 4 | BannerImage, 5 | Instruments, 6 | } from "@code4ro/taskforce-fe-components"; 7 | import UsefulApps from "../../data/useful-apps"; 8 | import Card from "./../Card"; 9 | import "./styles.scss"; 10 | import conduitaImge1 from "../../images/conduita/1.png"; 11 | import conduitaImge2 from "../../images/conduita/2.png"; 12 | import conduitaImge3 from "../../images/conduita/3.png"; 13 | import conduitaImge4 from "../../images/conduita/4.png"; 14 | import conduitaImge5 from "../../images/conduita/5.png"; 15 | import conduitaImge6 from "../../images/conduita/6.png"; 16 | import conduitaImge7 from "../../images/conduita/7.png"; 17 | import conduitaImge8 from "../../images/conduita/8.png"; 18 | import conduitaImge9 from "../../images/conduita/9.png"; 19 | import conduitaImge10 from "../../images/conduita/10.png"; 20 | import conduitaImge11 from "../../images/conduita/11.png"; 21 | import conduitaImge12 from "../../images/conduita/12.png"; 22 | import conduitaImge13 from "../../images/conduita/13.png"; 23 | import conduitaImge14 from "../../images/conduita/14.png"; 24 | import conduitaImge15 from "../../images/conduita/15.png"; 25 | import conduitaImge16 from "../../images/conduita/16.png"; 26 | import conduitaImge17 from "../../images/conduita/17.png"; 27 | import conduitaImge18 from "../../images/conduita/18.png"; 28 | import conduitaImge19 from "../../images/conduita/19.png"; 29 | import conduitaImge20 from "../../images/conduita/20.png"; 30 | import { 31 | renderInstrumentItem, 32 | remapInstrumentsData, 33 | } from "../../utils/instruments.utils"; 34 | import rovaccinareImage from "../../images/rovaccinare.jpg"; 35 | 36 | const Conduita = () => { 37 | const instrumentsData = remapInstrumentsData(UsefulApps); 38 | 39 | return ( 40 |
41 |
42 |
43 |
44 | 45 |
46 |
47 |

Ai grijă să:

48 |
49 |
50 | 51 | Îți speli/dezinfectezi mâinile înainte să atingi masca. 52 | 53 | 54 | Verifici ca masca să nu fie ruptă sau găurită. 55 | 56 | 57 | Pui partea colorată a măștii în exterior. 58 | 59 | 60 | Identifici latura cu fir metalic a măștii și să o pliezi pe 61 | forma nasului. 62 | 63 | 64 | Fixezi masca cu ajutorul firelor elastice trecute prin spatele 65 | urechilor. 66 | 67 |
68 |
69 | 70 | Poziționezi masca astfel încât să acopere atât nasul, cât și 71 | gura. 72 | 73 | 74 | Îndepărtezi masca întotdeauna trăgând de elasticul din spatele 75 | urechilor. 76 | 77 | 78 | Ții masca folosită la distanță de tine și de suprafețe. 79 | 80 | 81 | Arunci întotdeauna masca la un coș de gunoi, preferabil cu 82 | capac. 83 | 84 | 85 | Speli mâinile sau să le dezinfectezi după ce ai aruncat masca. 86 | 87 |
88 |
89 | 90 |

91 | Ai grijă să porți corect masca de protecție! 92 |

93 | 102 | 103 |

Ai grijă să NU:

104 |
105 |
106 | 107 | Folosești o mască ruptă sau umedă. 108 | 109 | 110 | Acoperi cu masca doar gura sau doar nasul. 111 | 112 | 113 | Rămână spațiu între mască și față. 114 | 115 | 116 | Atingi masca cu mâinile în timpul folosirii. 117 | 118 | 119 | Porți o masca nepotrivită, care nu stă fixă pe față. 120 | 121 |
122 |
123 | 124 | Atingi partea din față a măștii. 125 | 126 | 127 | Înlături masca atunci când stai de vorbă cu cineva. 128 | 129 | Porți masca sub bărbie. 130 | 131 | Lași masca folosită de tine la îndemâna altcuiva. 132 | 133 | 134 | Refolosești măștile de unică folosință. 135 | 136 |
137 |
138 | 139 |

140 | Ce nu trebuie să faci atunci când porți mască! 141 |

142 | 151 | 152 |

153 | Masca de protecție îți poate salva viața! 154 |

155 | 164 | 165 |

166 | Păstrează distanța! Păstrează-ți sănătatea! 167 |

168 | 177 | 178 |

179 | Dezinfectează-ți mâinile și obiectele pe care le folosești! 180 |

181 | 190 |
191 |
192 | 221 |
222 |
223 | ); 224 | }; 225 | 226 | export default Conduita; 227 | -------------------------------------------------------------------------------- /src/components/TermsAndConditions.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Hero } from "@code4ro/taskforce-fe-components"; 3 | 4 | const TermsAndConditions = () => ( 5 | <> 6 |
7 |
8 | 9 |
10 |
11 |

12 | Termenii și Condițiile generale de utilizare stabilesc termenii și 13 | condițiile generale de utilizare a site-ului{" "} 14 | cetrebuiesafac.ro de către 15 | potențialii vizitatori sau beneficiari. 16 |

17 |

18 | “cetrebuiesafac.ro” (în 19 | continuare denumit „Site”, „Platformă”, ” 20 | cetrebuiesafac.ro”) este o 21 | platformă digitală de informare publică, dezvoltată de Asociația Code 22 | for Romania (denumită în continuare “Code for Romania”) în parteneriat 23 | cu Guvernul României prin Autoritatea pentru Digitalizarea României și 24 | Departamentul pentru Situații de Urgență. 25 |

26 |

27 | Informațiile publicate pe cetrebuiesafac.ro au ca scop comunicare de 28 | ghiduri cu reguli de interacțiune, acțiune și comportament recomandate 29 | în această perioadă de criză în care ne confruntăm cu răspândirea 30 | foarte rapidă a infecției cu coronavirus. Proiectul digital 31 | cetrebuiesafac.ro face parte dintr-un ecosistem de mai multe soluții 32 | digitale dezvoltate de voluntarii Code for Romania, menit să lupte cu 33 | efectele COVID-19 și va funcționa ca punct central de informare despre 34 | situația din România. 35 |

36 |

37 | Asociația Code for Romania este o persoană juridică, având sediul în 38 |

39 | Mun. București, Piața Alba Iulia nr. 7, bloc I6, etaj 1, ap. 6, 40 | înregistrată în registrul special, Partea A, secțiunea I 41 | 67/06.07.2016 42 |
43 | . 44 |

45 |

Obiectivul Platformei

46 |

47 | Obiectivul cetrebuiesafac.ro este de a pune la dispoziția publicului 48 | un ghid cu reguli de interacțiune, acțiune și comportament recomandate 49 | în această perioadă de criză în care ne confruntăm cu răspândirea 50 | foarte rapidă a infecției cu coronavirus. 51 |

52 |
    53 |
  • 54 | Site-ul permite abonarea publicului la un serviciu de newsletter, 55 | gestionat prin intermediul platformei de e-mailing Mailchimp. Datele 56 | din acest formular sunt folosite exclusiv în scopul de a facilita 57 | transferul de informații către utilizatorii care doresc acest lucru. 58 |
  • 59 |
60 |

Transmiterea datelor personale către terți

61 |

62 | Code for Romania nu transmite datele colectate prin intermediul 63 | acestei platforme către terți. Organizația își asumă un angajament de 64 | confidențialitate, prin care garantează că datele personale sunt 65 | păstrate în siguranță. Datele pot fi furnizate și către instituții sau 66 | autorități publice, precum și altor organe abilitate ale statului, în 67 | baza și în limitele prevederilor legale, ca urmare a unor cereri 68 | expres formulate de acestea. 69 |

70 |

Drepturile tale

71 |

72 | În calitate de utilizator al platformei cetrebuiesafac.ro, potrivit 73 | Legii nr. 679/2016, precum și, începând cu 25 mai 2018, potrivit 74 | Regulamentului General privind protecția datelor, ai următoarele 75 | drepturi: 76 |

77 |
    78 |
  • 79 | Dreptul la informare cu privire la prelucrarea datelor personale de 80 | către Code for Romania; 81 |
  • 82 |
  • 83 | Dreptul de acces la datele personale, la cerere și în mod gratuit 84 | pentru o solicitare pe an; 85 |
  • 86 |
  • 87 | Dreptul de intervenție, rectificarea, ștergerea sau portabilitatea 88 | datelor personale, la cerere și în mod gratuit; 89 |
  • 90 |
  • 91 | Dreptul de a te adresa Autorității Naționale de Supraveghere privind 92 | Prelucrarea Datelor cu Caracter Personal (cu sediul în Bucureşti, 93 | sector 1, B-dul G-ral. Gheorghe Magheru,{" "} 94 | dataprotection.ro) sau 95 | justiției, pentru apărarea oricăror drepturi garantate de lege; 96 |
  • 97 |
  • 98 | Dreptul la opoziţie şi procesul decizional individual automatizat; 99 |
  • 100 |
  • 101 | începând cu 25 mai 2018, potrivit Regulamentului general privind 102 | protecția datelor, dreptul la restricționarea prelucrării. 103 |
  • 104 |
105 |

Securitate și confidențialitate

106 |

107 | Protecția informațiilor în cursul prelucrării datelor tale personale 108 | este o preocupare majoră a Code for Romania, de aceea toate datele 109 | personale colectate în cursul vizitelor pe cetrebuiesafac.ro sunt 110 | prelucrate conform prevederilor legale în vigoare în România. Code for 111 | Romania folosește tehnologii de ultimă generație și ia toate măsurile 112 | tehnice rezonabile pentru transmiterea și păstrarea datelor personale 113 | în condiții de deplină securitate și confidențialitate. 114 |

115 |

116 | Toate datele personale de pe site sunt stocate și procesate pe servere 117 | situate în Uniunea Europeană, ce cad sub incidența legislației 118 | europene de protecție a datelor personale. Nicio informație oferită pe 119 | acest site nu părăsește teritoriul Uniunii Europene. 120 |

121 |

122 | Code for Romania se angajează să nu dezvăluie datele personale cu 123 | privire la vizitele tale pe cetrebuiesafac.ro, exceptând situațiile 124 | legale sau situațiile prezentate în acest document de Termeni și 125 | Condiții. 126 |

127 |

128 | Dacă descoperim un incident cu privire la securitatea datelor 129 | personale care prezintă un risc pentru drepturile și libertățile 130 | utilizatorilor noștri, vom notifica Autoritatea Națională de 131 | Supraveghere privind Prelucrarea Datelor cu Caracter Personale în 132 | termen de 72 de ore. Dacă incidentul de securitate este de natură să 133 | prezinte un risc ridicat pentru drepturile și libertățile tale, vei 134 | fi, de asemenea, notificat. 135 |

136 |

Marca și dreptul de autor

137 |

138 | Dreptul de autor pentru toate informațiile existente pe acest site 139 | este deținut de Code for Romania în parteneriat cu Guvernul României 140 | prin Autoritatea pentru Digitalizarea României și Departamentul pentru 141 | Situații de Urgență. 142 |

143 |
    144 |
  • Toate drepturile sunt rezervate.
  • 145 |
  • 146 | Este strict interzisă folosirea acestui Site în scopul distrugerii 147 | sau alterării lui, a conținutului său a securității acestuia ori 148 | pentru discreditarea sau hărțuirea cetrebuiesafac.ro sau a Code for 149 | Romania. 150 |
  • 151 |
  • 152 | Code for Romania va aplica toate măsurile de securitate tehnică și 153 | organizatorică pentru protejarea datelor asupra cărora deține 154 | controlul împotriva oricărei situații de manipulare accidentală sau 155 | intenționată, pierdere, distrugere sau împotriva accesului unei 156 | persoane neautorizate. 157 |
  • 158 |
159 |

Modificari Termeni și Condiții generale de utilizare Site

160 |

161 | "Termenii și Condițiile generale de utilizare" constituie, 162 | în întregime, un acord încheiat între dumneavoastră și Code for 163 | Romania în privința utilizării{" "} 164 | 169 | cetrebuiesafac.ro 170 | 171 | . 172 |

173 |

174 | Code for Romania își rezervă dreptul de a revizui și aduce la zi 175 | "Termenii și Condițiile generale de utilizare" în orice 176 | moment, fără o anunțare sau o acceptare prealabilă a utilizatorilor. 177 |

178 |

179 | Dacă aveți întrebări cu privire la informațiile cuprinse în această 180 | pagină vă rugăm să ne scrieți la adresa{" "} 181 | contact@code4.ro 182 |

183 |

Despre Code for Romania

184 |

185 | Code for Romania este o organizație neguvernamentală independentă, 186 | neafiliată politic și apolitică, înființată în anul 2016, al cărei 187 | scop este de a mobiliza tinerii profesioniști din domeniul IT să 188 | creeze instrumente digitale care ajută în soluționarea problemelor 189 | sociale. Code for Romania este înființată și funcționează în 190 | conformitate cu legea română, actul constitutiv și statutul său și 191 | 196 | codul de conduită 197 | 198 | . 199 |

200 |

Contactează Code for Romania

201 |

202 | Pentru orice întrebări sau preocupări, precum și pentru exercitarea 203 | drepturilor tale legate de prelucrarea datelor personale de către Code 204 | for Romania, ne poti contacta la: 205 |

206 | Adresa: Piața Alba Iulia nr. 7, bloc I6, etaj 1, ap. 6, mun. 207 | București, Romania E-mail:{" "} 208 | contact@code4.ro 209 |
210 |

211 |
212 |
213 | 214 | ); 215 | 216 | export default TermsAndConditions; 217 | -------------------------------------------------------------------------------- /src/images/pages/covid_ro_ceicareneoferajutor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Form/results.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | import React from "react"; 3 | import PropTypes from "prop-types"; 4 | import "./Form.scss"; 5 | import { ListHeader, ListItem } from "@code4ro/taskforce-fe-components"; 6 | 7 | function Results({ question, answers }) { 8 | const calculateResults = () => { 9 | const a = answers; 10 | // Sorry :( 11 | if ( 12 | a[1] && 13 | a[3] && 14 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 15 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 16 | a[15] && 17 | a[16] 18 | ) 19 | return 0; 20 | if ( 21 | a[1] && 22 | a[3] && 23 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 24 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 25 | a[15] && 26 | !a[16] 27 | ) 28 | return 0; 29 | if ( 30 | a[1] && 31 | a[3] && 32 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 33 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 34 | !a[15] && 35 | !a[16] 36 | ) 37 | return 0; 38 | if ( 39 | a[1] && 40 | a[3] && 41 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 42 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 43 | !a[15] && 44 | a[16] 45 | ) 46 | return 0; 47 | 48 | if ( 49 | a[1] && 50 | a[3] && 51 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 52 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 53 | a[15] && 54 | a[16] 55 | ) 56 | return 0; 57 | if ( 58 | a[1] && 59 | a[3] && 60 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 61 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 62 | !a[15] && 63 | !a[16] 64 | ) 65 | return 0; 66 | if ( 67 | a[1] && 68 | a[3] && 69 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 70 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 71 | a[15] && 72 | !a[16] 73 | ) 74 | return 0; 75 | if ( 76 | a[1] && 77 | a[3] && 78 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 79 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 80 | !a[15] && 81 | a[16] 82 | ) 83 | return 0; 84 | 85 | if ( 86 | a[1] && 87 | a[3] && 88 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 89 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 90 | a[15] && 91 | a[16] 92 | ) 93 | return 0; 94 | if ( 95 | a[1] && 96 | a[3] && 97 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 98 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 99 | a[15] && 100 | !a[16] 101 | ) 102 | return 1; 103 | if ( 104 | a[1] && 105 | a[3] && 106 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 107 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 108 | !a[15] && 109 | !a[16] 110 | ) 111 | return 2; 112 | if ( 113 | a[1] && 114 | a[3] && 115 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 116 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 117 | !a[15] && 118 | a[16] 119 | ) 120 | return 1; 121 | 122 | if ( 123 | a[1] && 124 | !a[3] && 125 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 126 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 127 | a[15] && 128 | a[16] 129 | ) 130 | return 0; 131 | if ( 132 | a[1] && 133 | !a[3] && 134 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 135 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 136 | a[15] && 137 | !a[16] 138 | ) 139 | return 0; 140 | if ( 141 | a[1] && 142 | !a[3] && 143 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 144 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 145 | !a[15] && 146 | a[16] 147 | ) 148 | return 0; 149 | if ( 150 | a[1] && 151 | !a[3] && 152 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 153 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 154 | !a[15] && 155 | !a[16] 156 | ) 157 | return 0; 158 | 159 | if ( 160 | a[1] && 161 | !a[3] && 162 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 163 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 164 | a[15] && 165 | a[16] 166 | ) 167 | return 1; 168 | if ( 169 | a[1] && 170 | !a[3] && 171 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 172 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 173 | a[15] && 174 | !a[16] 175 | ) 176 | return 1; 177 | if ( 178 | a[1] && 179 | !a[3] && 180 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 181 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 182 | !a[15] && 183 | a[16] 184 | ) 185 | return 1; 186 | if ( 187 | a[1] && 188 | !a[3] && 189 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 190 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 191 | !a[15] && 192 | !a[16] 193 | ) 194 | return 2; 195 | 196 | if ( 197 | a[1] && 198 | !a[3] && 199 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 200 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 201 | a[15] && 202 | !a[16] 203 | ) 204 | return 0; 205 | if ( 206 | a[1] && 207 | !a[3] && 208 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 209 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 210 | !a[15] && 211 | a[16] 212 | ) 213 | return 0; 214 | if ( 215 | a[1] && 216 | !a[3] && 217 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 218 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 219 | !a[15] && 220 | !a[16] 221 | ) 222 | return 1; 223 | if ( 224 | a[1] && 225 | !a[3] && 226 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 227 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 228 | a[15] && 229 | a[16] 230 | ) 231 | return 0; 232 | 233 | if ( 234 | a[1] && 235 | !a[3] && 236 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 237 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 238 | a[15] && 239 | a[16] 240 | ) 241 | return 1; 242 | if ( 243 | a[1] && 244 | !a[3] && 245 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 246 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 247 | a[15] && 248 | !a[16] 249 | ) 250 | return 1; 251 | if ( 252 | a[1] && 253 | !a[3] && 254 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 255 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 256 | !a[15] && 257 | a[16] 258 | ) 259 | return 1; 260 | if ( 261 | a[1] && 262 | !a[3] && 263 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 264 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 265 | !a[15] && 266 | !a[16] 267 | ) 268 | return 2; 269 | 270 | if ( 271 | !a[1] && 272 | a[3] && 273 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 274 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 275 | a[15] && 276 | a[16] 277 | ) 278 | return 0; 279 | if ( 280 | !a[1] && 281 | a[3] && 282 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 283 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 284 | !a[15] && 285 | a[16] 286 | ) 287 | return 0; 288 | if ( 289 | !a[1] && 290 | a[3] && 291 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 292 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 293 | a[15] && 294 | !a[16] 295 | ) 296 | return 0; 297 | if ( 298 | !a[1] && 299 | a[3] && 300 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 301 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 302 | !a[15] && 303 | !a[16] 304 | ) 305 | return 0; 306 | 307 | if ( 308 | !a[1] && 309 | a[3] && 310 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 311 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 312 | a[15] && 313 | a[16] 314 | ) 315 | return 1; 316 | if ( 317 | !a[1] && 318 | a[3] && 319 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 320 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 321 | a[15] && 322 | !a[16] 323 | ) 324 | return 1; 325 | if ( 326 | !a[1] && 327 | a[3] && 328 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 329 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 330 | !a[15] && 331 | a[16] 332 | ) 333 | return 1; 334 | if ( 335 | !a[1] && 336 | a[3] && 337 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 338 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 339 | !a[15] && 340 | !a[16] 341 | ) 342 | return 2; 343 | 344 | if ( 345 | !a[1] && 346 | a[3] && 347 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 348 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 349 | a[15] && 350 | a[16] 351 | ) 352 | return 0; 353 | if ( 354 | !a[1] && 355 | a[3] && 356 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 357 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 358 | a[15] && 359 | !a[16] 360 | ) 361 | return 1; 362 | if ( 363 | !a[1] && 364 | a[3] && 365 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 366 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 367 | !a[15] && 368 | a[16] 369 | ) 370 | return 1; 371 | if ( 372 | !a[1] && 373 | a[3] && 374 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 375 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 376 | !a[15] && 377 | !a[16] 378 | ) 379 | return 1; 380 | 381 | if ( 382 | !a[1] && 383 | a[3] && 384 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 385 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 386 | a[15] && 387 | a[16] 388 | ) 389 | return 1; 390 | if ( 391 | !a[1] && 392 | a[3] && 393 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 394 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 395 | a[15] && 396 | !a[16] 397 | ) 398 | return 1; 399 | if ( 400 | !a[1] && 401 | a[3] && 402 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 403 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 404 | !a[15] && 405 | a[16] 406 | ) 407 | return 1; 408 | if ( 409 | !a[1] && 410 | a[3] && 411 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 412 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 413 | !a[15] && 414 | !a[16] 415 | ) 416 | return 2; 417 | 418 | if ( 419 | !a[1] && 420 | !a[3] && 421 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 422 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 423 | a[15] && 424 | a[16] 425 | ) 426 | return 0; 427 | if ( 428 | !a[1] && 429 | !a[3] && 430 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 431 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 432 | !a[15] && 433 | a[16] 434 | ) 435 | return 0; 436 | if ( 437 | !a[1] && 438 | !a[3] && 439 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 440 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 441 | a[15] && 442 | !a[16] 443 | ) 444 | return 0; 445 | if ( 446 | !a[1] && 447 | !a[3] && 448 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 449 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 450 | !a[15] && 451 | !a[16] 452 | ) 453 | return 0; 454 | 455 | if ( 456 | !a[1] && 457 | !a[3] && 458 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 459 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 460 | a[15] && 461 | a[16] 462 | ) 463 | return 0; 464 | if ( 465 | !a[1] && 466 | !a[3] && 467 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 468 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 469 | !a[15] && 470 | a[16] 471 | ) 472 | return 0; 473 | if ( 474 | !a[1] && 475 | !a[3] && 476 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 477 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 478 | a[15] && 479 | !a[16] 480 | ) 481 | return 1; 482 | if ( 483 | !a[1] && 484 | !a[3] && 485 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 486 | (a[10] || a[11] || a[12] || a[13] || a[14]) && 487 | !a[15] && 488 | !a[16] 489 | ) 490 | return 1; 491 | 492 | if ( 493 | !a[1] && 494 | !a[3] && 495 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 496 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 497 | a[15] && 498 | a[16] 499 | ) 500 | return 1; 501 | if ( 502 | !a[1] && 503 | !a[3] && 504 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 505 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 506 | !a[15] && 507 | a[16] 508 | ) 509 | return 1; 510 | if ( 511 | !a[1] && 512 | !a[3] && 513 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 514 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 515 | a[15] && 516 | !a[16] 517 | ) 518 | return 1; 519 | if ( 520 | !a[1] && 521 | !a[3] && 522 | (a[4] || a[5] || a[6] || a[7] || a[8]) && 523 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 524 | !a[15] && 525 | !a[16] 526 | ) 527 | return 2; 528 | 529 | if ( 530 | !a[1] && 531 | !a[3] && 532 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 533 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 534 | a[15] && 535 | a[16] 536 | ) 537 | return 1; 538 | if ( 539 | !a[1] && 540 | !a[3] && 541 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 542 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 543 | a[15] && 544 | !a[16] 545 | ) 546 | return 2; 547 | if ( 548 | !a[1] && 549 | !a[3] && 550 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 551 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 552 | !a[15] && 553 | !a[16] 554 | ) 555 | return 2; 556 | if ( 557 | !a[1] && 558 | !a[3] && 559 | (!a[4] || !a[5] || !a[6] || !a[7] || !a[8]) && 560 | (!a[10] || !a[11] || !a[12] || !a[13] || !a[14]) && 561 | !a[15] && 562 | a[16] 563 | ) 564 | return 1; 565 | 566 | return 3; 567 | }; 568 | 569 | const showResults = () => { 570 | return question.options[calculateResults()].label; 571 | }; 572 | return ( 573 |
574 | 575 |
576 | 577 |
578 |
579 | ); 580 | } 581 | 582 | Results.propTypes = { 583 | question: PropTypes.shape({ 584 | questionId: PropTypes.number.isRequired, 585 | questionText: PropTypes.string.isRequired, 586 | type: PropTypes.oneOf(["FINAL", "SINGLE_CHOICE", "MULTIPLE_CHOICE"]), 587 | options: PropTypes.arrayOf( 588 | PropTypes.shape({ 589 | label: PropTypes.string.isRequired, 590 | value: PropTypes.number.isRequired, 591 | }) 592 | ), 593 | }), 594 | answers: PropTypes.object, 595 | }; 596 | 597 | export default Results; 598 | -------------------------------------------------------------------------------- /src/components/PrivacyPolicy.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Hero } from "@code4ro/taskforce-fe-components"; 3 | 4 | const PrivacyPolicy = () => ( 5 | <> 6 |
7 |
8 | 9 |
10 |
11 |

12 | Acest website folosește cookie-uri pentru a furniza vizitatorilor o 13 | experiență mult mai bună de navigare și servicii adaptate nevoilor și 14 | interesului fiecăruia. 15 |

16 |

17 | “Cookie“-urile au rolul de a facilita accesul și livrarea serviciilor 18 | folosite de utilizator de internet, cum ar fi personalizarea anumitor 19 | setări (limba, țara, prețuri afișate în moneda națională. 20 | “Cookie“-urile, pe baza informațiilor pe care le adună despre 21 | utilizatori, îi ajută pe deținătorii de site-uri să își eficientizeze 22 | produsul astfel încât acesta să fie cât mai ușor accesat de către 23 | utilizatori, de asemenea cresc gradul de eficiență a publicității 24 | online și nu în ultimul rând pot permite aplicațiilor multimedia sau 25 | de alt tip de pe alte site-uri să fie incluse într-un anumit site 26 | pentru a face navigarea mai utilă. 27 |

28 |

Ce este un “cookie“?

29 |

30 | Cookie (“browser cookie“ sau “HTTP cookie“) este un fișier de mici 31 | dimensiuni, format din litere și numere, care este stocat pe orice 32 | terminal cu acces la internet (computer, telefon mobil, tabletă etc.) 33 | și este instalat prin solicitare emisă de către un web-server unui 34 | browser (ex: Internet Explorer, Chrome). De reținut: “Cookie“-urile nu 35 | conțin programe software, viruși sau spyware și nu pot accesa 36 | informațiile de pe hard drive-ul utilizatorului. 37 |

38 |

39 | Un cookie este format din nume și conținut, durata de existență a 40 | acestuia fiind determinată, putând fi accesat din nou de webserver în 41 | momentul în care un utilizator se întoarce pe website-ul asociat 42 | webserverului respectiv. 43 |

44 |

45 | Cookie-urile nu solicită informații cu caracter personal și nu 46 | identifică personal utilizatorii de internet. 47 |

48 |

49 | Cookieuri de sesiune - acestea sunt stocate temporar în istoricul 50 | browser-ului care le memorează până când utilizatorul iese de pe 51 | web-siteul respectiv sau închide fereastra browserului. 52 |

53 |

54 | Cookieuri Persistente - Acestea sunt stocate, în funcție de durata 55 | prestabilită, pe hard-drive-ul unui computer sau echipament. 56 | Cookie-urile persistente le includ și pe cele plasate de un alt 57 | website decât cel pe care îl vizitează utilizatorul la momentul 58 | respectiv - cunoscute sub numele de “third party cookies“ - care pot 59 | fi folosite în mod anonim pentru a memora interesele unui utilizator, 60 | astfel încât să fie livrată publicitate cât mai relevantă pentru 61 | utilizatori. 62 |

63 |

Care sunt avantajele cookie-urilor?

64 |

65 | Un cookie conține informații care fac legătura între utilizatori și un 66 | anume website. Dacă un browser accesează acel web-server din nou, 67 | acesta poate citi informația deja stocată și reacționa în consecință. 68 |

69 |

Care este durata de viață a unui cookie?

70 |

71 | Exista cookie-uri folosite exclusiv pentru o singură sesiune - acestea 72 | nu mai sunt reținute după ce utilizatorul iese de pe website. 73 | Cookie-uri permanente - sunt reținute și refolosite de fiecare dată 74 | când utilizatorul revine pe acel website, însă pot fi șterse oricând 75 | de utilizator. 76 |

77 |

Ce sunt cookie-urile plasate de terți?

78 |

79 | Părți de conținut sau servicii pot fi plasate pe website-ul accesat, 80 | de către terțe părți prin intermediul bannerelor, boxurilor sau 81 | linkurilor - iar toate aceste instrumente pot conține cookie-uri. Ele 82 | se numesc “third party cookies“ pentru că nu sunt plasate de 83 | proprietarul website-ului respectiv, iar furnizorii terți se supun 84 | legilor îin vigoare și politicilor de confidențialitate ale 85 | deținătorului site-ului. 86 |

87 |

Cum sunt folosite cookie-urile de către acest site?

88 |

O vizită pe acest site poate plasa cookie-uri în scopuri de:

89 |
    90 |
  • Cookie-uri folosite pentru finalizarea unei donații
  • 91 |
  • Cookie-uri de analiză a vizitatorilor
  • 92 |
  • Cookie-uri de înregistrare
  • 93 |
94 |

Unele cookie-uri pot proveni de la terți.

95 |

Cookie-uri folosite pentru finalizarea unei donații

96 |

97 | Completarea formularului de donație cuprinde mai multi pași. Pentru a 98 | ține evidența unei persoane și pentru a-i oferi informația necesară 99 | vom salva un fisier cookie ce ne oferă o metodă de a-l identifica 100 | (precum un număr de ordine). Pentru fiecare completare a formularului 101 | se va crea un cookie nou sau se va suprascrie cel deja existent. 102 |

103 |

Cookie-uri pentru analiza vizitatorilor

104 |

105 | De fiecare dată când un utilizator vizitează acest site softul de 106 | analytics furnizat de o terță parte generează un cookie de analiză a 107 | utilizatorului. Acest cookie ne spune dacă ați mai vizitat acest site 108 | până acum. Browser-ul ne va spune dacă aveți acest cookie, iar dacă 109 | nu, vom genera unul. Acesta permite monitorizarea utilizatorilor unici 110 | care ne vizitează și cât de des o fac. Acest cookie nu poate fi 111 | folosit pentru a identifica persoanele fizice, ele sunt folosite doar 112 | în scop statistic. 113 |

114 |

Cookie-uri pentru înregistrare

115 |

116 | Atunci când va înregistrați pe acest site, generăm un cookie cu datele 117 | de pe acesta. Cookie-ul ne ajută în pașii următori pentru a comunica 118 | cu server-ul. Este posibil ca acesta să rămână dacă nu urmați toți 119 | pașii înregistrării, dar el va fi rescris data următoare când vă veți 120 | înregistra din nou. 121 |

122 |

Alte cookie-uri ale terțelor părți

123 |

124 | Pe unele pagini, terții pot seta propriile cookie-uri anonime, în 125 | scopul de a urmări succesul unei aplicații, sau pentru a customiza o 126 | aplicație. Datorită modului de utilizare, acest site nu poate accesa 127 | aceste cookie-uri, la fel cum terțele părți nu pot accesa cookie-urile 128 | deținute de acest site. De exemplu, când distribuiți o pagină folosind 129 | butonul pentru rețelele sociale aflat pe acest site, acea rețea 130 | socială va înregistra activitatea dvs. 131 |

132 |

133 | Ce tip de informații sunt stocate și accesate prin intermediul 134 | cookie-urilor? 135 |

136 |

137 | Cookie-urile păstrează informații într-un fișier text de mici 138 | dimensiuni care permit unui website să recunoască un browser. 139 | Webserver-ul va recunoaște browserul până când cookie-ul expiră sau 140 | este șters. Cookie-ul stochează informații importante care 141 | îmbunătățesc experiența de navigare pe Internet (ex: un număr de 142 | ordine pentru donația ta). 143 |

144 |

De ce sunt cookie-urile importante pentru Internet?

145 |

146 | Cookie-urile reprezintă punctul central al funcționării eficiente a 147 | Internetului, ajutând la generarea unei experiențe de navigare 148 | prietenoase și adaptată preferințelor și intereselor fiecărui 149 | utilizator. Refuzarea sau dezactivarea cookieurilor poate face unele 150 | site-uri imposibil de folosit. 151 |

152 |

153 | Refuzarea sau dezactivarea cookie-urilor nu înseamnă că nu veți mai 154 | primi publicitate online - ci doar că aceasta nu va mai putea ține 155 | cont de preferințele și interesele dvs, evidențiate prin 156 | comportamentul de navigare. 157 |

158 |

Securitate si probleme legate de confidentialitate

159 |

160 | Cookie-urile NU sunt viruși! Ele folosesc formate tip plain text. Nu 161 | sunt alcătuite din bucăți de cod așa că nu pot fi executate nici nu 162 | pot auto-rula. În consecință, nu se pot duplica sau replica pe alte 163 | rețele pentru a se rula sau replica din nou. Deoarece nu pot îndeplini 164 | aceste funcții, nu pot fi considerate viruși. 165 |

166 |

167 | Cookie-urile pot fi totuși folosite pentru scopuri negative. Deoarece 168 | stochează informații despre preferințele și istoricul de navigare al 169 | utilizatorilor, atât pe un anume site cât și pe mai multe alte 170 | siteuri, cookieurile pot fi folosite ca o formă de Spyware. Multe 171 | produse anti-spyware sunt conștiente de acest fapt și în mod constant 172 | marchează cookie-urile pentru a fi șterse în cadrul procedurilor de 173 | ștergere/scanare anti-virus/anti-spyware. 174 |

175 |

176 | În general browserele au integrate setari de confidențialitate care 177 | furnizează diferite nivele de acceptare a cookieurilor, perioada de 178 | valabilitate și ștergere automată dupa ce utilizatorul a vizitat un 179 | anumit site. 180 |

181 |

Alte aspecte de securitate legate de cookie-uri

182 |

183 | Deoarece protecția identității este foarte valoroasă și reprezintă 184 | dreptul fiecărui utilizator de internet, este indicat să se știe ce 185 | eventuale probleme pot crea cookieurile. Pentru că prin intermediul 186 | lor se transmit în mod constant în ambele sensuri informații între 187 | browser și website, dacă un atacator sau persoana neautorizată 188 | intervine în parcursul de transmitere a datelor, informațiile 189 | conținute de cookie pot fi interceptate. Deși foarte rar, acest lucru 190 | se poate întâmpla dacă browserul se conectează la server folosind o 191 | rețea necriptată (ex: o rețea WiFi nesecurizată). 192 |

193 |

194 | Alte atacuri bazate pe cookie implică setări greșite ale cookieurilor 195 | pe servere. Dacă un website nu solicită browserului să folosească doar 196 | canale criptate, atacatorii pot folosi această vulnerabilitate pentru 197 | a păcăli browserele în a trimite informații prin intermediul canalelor 198 | nesecurizate. Atacatorii utilizează apoi informațiile în scopuri de a 199 | accesa neautorizat anumite site-uri. Este foarte important să fiți 200 | atenți în alegerea metodei celei mai potrivite de protecție a 201 | informațiilor personale. 202 |

203 |

204 | Sfaturi pentru o navigare sigură și responsabilă, bazată pe cookies 205 |

206 |

207 | Datorită flexibilitatii lor și a faptului ca majoritatea dintre cele 208 | mai vizitate site-uri și cele mai mari folosesc cookieuri, acestea 209 | sunt aproape inevitabile. Dezactivarea cookie-urilor nu va permite 210 | accesul utilizatorului pe site-urile cele mai răspândite și utilizate 211 | printre care Youtube, Gmail, Yahoo și altele. Iată câteva sfaturi care 212 | vă pot asigura că navigați fără griji însă cu ajutorul cookie-urilor: 213 |

214 |
    215 |
  • 216 | Particularizați-vă setările browserului în ceea ce privește 217 | cookie-urile pentru a reflecta un nivel confortabil pentru voi al 218 | securității utilizării cookie-urilor. Dacă nu vă deranjează 219 | cookie-urile și sunteți singura persoană care utilizează computerul, 220 | puteți seta termene lungi de expirare pentru stocarea istoricului de 221 | navigare și al datelor personale de acces. Dacă împărțiți accesul la 222 | calculator, puteți lua în considerare setarea browserului pentru a 223 | șterge datele individuale de navigare de fiecare dată când închideți 224 | browserul. Aceasta este o variantă de a accesa site-urile care 225 | plasează cookie-uri și de a șterge orice informație de vizitare la 226 | închiderea sesiunii navigare. 227 |
  • 228 |
  • Instalați-vă și updatați-vă constant aplicații antispyware.
  • 229 |
230 |

231 | Multe dintre aplicațiile de detectare și prevenire a spyware-ului 232 | includ detectarea atacurilor pe site-uri. Astfel, impiedică browserul 233 | de la a accesa website-uri care ar putea să exploateze 234 | vulnerabilitățile browserului sau să descarce software periculos. 235 | Asigurați-vă că aveți browserul mereu updatat. Multe dintre atacurile 236 | bazate pe cookies se realizează exploatând punctele slabe ale 237 | versiunilor vechi ale browserelor. 238 |

239 |

240 | Cookie-urile sunt pretutindeni și nu pot fi evitate dacă doriți să vă 241 | bucurați de acces pe cele mai bune și cele mai mari site-uri de pe 242 | Internet - locale sau internaționale. Cu o înțelegere clară a modului 243 | lor de operare și a beneficiilor pe care le aduc, puteți lua măsurile 244 | necesare de securitate astel încât să puteți naviga cu încredere pe 245 | internet. 246 |

247 |

Cum pot opri cookie-urile?

248 |

249 | Dezactivarea și refuzul de a primi cookie-uri pot face anumite 250 | site-uri impracticabile sau dificil de vizitat și folosit. De 251 | asemenea, refuzul de a accepta cookie-uri nu înseamnă că nu veți mai 252 | primi/vedea publicitate online. 253 |

254 |

255 | Este posibilă setarea din browser pentru ca aceste cookie-uri să nu 256 | mai fie acceptate sau poți seta browserul să accepte cookie-uri de la 257 | un site anume. Dar, de exemplu, dacă nu dorești să folosești 258 | cookie-urile nu poți să urmezi și pașii următori după înregistrarea 259 | completarea formularului. 260 |

261 |

262 | Toate browserele moderne oferă posibilitatea de a schimba setarile 263 | cookie-urilor. Aceste setari se găsesc de regula în “opțiuni“ sau în 264 | meniul de “preferințe“ al browserului tău. 265 |

266 |

267 | Pentru setarile cookie-urilor generate de terți, și pentru mai multe 268 | informații privind confidențialitatea legată de publicitatea online, 269 | IAB Romania pune la dispoziție{" "} 270 | 275 | http://youronlinechoices.com/ro 276 | 277 |

278 |
279 |
280 | 281 | ); 282 | 283 | export default PrivacyPolicy; 284 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | --------------------------------------------------------------------------------