From 38f97e1accec847556f272a6554e5e56db6a6b2d Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Thu, 14 Apr 2022 22:25:44 -0300 Subject: [PATCH 1/7] React initial commit --- .gitignore | 24 +++++- index.js | 87 --------------------- package.json | 57 ++++++++------ public/css/auth.css | 29 ------- public/css/global.css | 21 ------ public/css/index.css | 26 ------- public/favicon.ico | Bin 270398 -> 0 bytes public/img/auth_copy.svg | 1 - public/index.html | 43 +++++++++++ public/manifest.json | 25 ++++++ public/robots.txt | 3 + readme.MD | 20 ----- src/App.js | 8 ++ src/index.js | 16 ++++ src/reportWebVitals.js | 13 ++++ src/setupTests.js | 5 ++ views/auth.hbs | 19 ----- views/index.hbs | 14 ---- views/partials/betaBanner.hbs | 3 - views/partials/global.hbs | 13 ---- views/privacy-policy.hbs | 138 ---------------------------------- views/terms-of-use.hbs | 24 ------ 22 files changed, 169 insertions(+), 420 deletions(-) delete mode 100644 index.js delete mode 100644 public/css/auth.css delete mode 100644 public/css/global.css delete mode 100644 public/css/index.css delete mode 100644 public/favicon.ico delete mode 100644 public/img/auth_copy.svg create mode 100644 public/index.html create mode 100644 public/manifest.json create mode 100644 public/robots.txt delete mode 100644 readme.MD create mode 100644 src/App.js create mode 100644 src/index.js create mode 100644 src/reportWebVitals.js create mode 100644 src/setupTests.js delete mode 100644 views/auth.hbs delete mode 100644 views/index.hbs delete mode 100644 views/partials/betaBanner.hbs delete mode 100644 views/partials/global.hbs delete mode 100644 views/privacy-policy.hbs delete mode 100644 views/terms-of-use.hbs diff --git a/.gitignore b/.gitignore index 4b3d9eb..9ce5739 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,26 @@ node_modules package-lock.json -.env \ No newline at end of file +.env# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/index.js b/index.js deleted file mode 100644 index a02e4f6..0000000 --- a/index.js +++ /dev/null @@ -1,87 +0,0 @@ -const Express = require('express') -const app = Express() -const port = (process.env.PORT || 3030) - -const axios = require('axios') -require('dotenv').config() - -const favicon = require('serve-favicon'); -app.use(favicon(__dirname + '/public/favicon.ico')); - -const hbs = require('hbs') - -hbs.registerPartials(__dirname + '/views/partials') -app.set('view engine', 'hbs') - -app.use(Express.static('public')); - -app.get('/', (req, res) => { - res.render('index') -}) - -app.get('/auth', async (req, res) => { - - async function requestAccessToken() { - try { - const reqData = { - code: req.query.code, - grant_type: "authorization_code", - redirect_uri: "https://telegram-to-notion.herokuapp.com/auth" - } - - const auth = { - Authorization: "Basic " + Buffer.from(`${process.env.NOTION_INTEGRATION_ID}:${process.env.NOTION_INTEGRATION_SECRET}`).toString('base64') - } - - console.log(auth) - - const response = await axios({ - method: "POST", - url: "https://api.notion.com/v1/oauth/token", - data: reqData, - auth: { - username: Buffer.from(process.env.NOTION_INTEGRATION_ID.toString('base64')), - password: Buffer.from(process.env.NOTION_INTEGRATION_SECRET.toString('base64')) - } //THANK YOU https://stackoverflow.com/questions/67534080/notion-api-invalid-client-oauth-integration/68699544#68699544?newreg=949504cf865c4a52b2c0ce7afe936c9b - }) - - console.log(response.status) //400 in positive case - console.log(response.data) - - /** - * access_token: string, - * token_type: string, - * bot_id: string, - * workspace_name: string, - * workspace_icon: string, - * workspace_id: string - */ - - return response - } - catch (error) { - console.log("error") - console.log(error) - - return {status: 400} - } - } - - const response = await requestAccessToken() - - res.render('auth', { - name: "fran", - success: response.status === 200 ? true : false, - data: response.data - }) -}) - -app.get('/privacy-policy', (req, res) => { - res.render('privacy-policy') -}) - -app.get('/terms-of-use', (req, res) => { - res.render('terms-of-use') -}) - -app.listen(port, () => console.log('port', port)) \ No newline at end of file diff --git a/package.json b/package.json index 1ac8c52..120fc85 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,38 @@ { "name": "telegram-to-notion-website", - "version": "1.0.0", - "description": "Website for the Telegram to Notion Bot", - "main": "index.js", - "scripts": { - "dev": "nodemon index.js", - "start": "node index.js" - }, - "keywords": [ - "telegram", - "notion", - "bot", - "website" - ], - "author": "FranP-Code", - "license": "ISC", - "devDependencies": { - "nodemon": "^2.0.15" - }, + "version": "0.1.0", + "private": true, "dependencies": { - "axios": "^0.26.1", - "dotenv": "^16.0.0", - "express": "^4.17.3", - "hbs": "^4.2.0", - "path": "^0.12.7", - "serve-favicon": "^2.5.0" + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.0.1", + "@testing-library/user-event": "^13.5.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] } } diff --git a/public/css/auth.css b/public/css/auth.css deleted file mode 100644 index f5a785c..0000000 --- a/public/css/auth.css +++ /dev/null @@ -1,29 +0,0 @@ -.request-success { - - display: flex; - align-items: center; - - background-color: #ffebcd; - - padding: 3vh 0px 3vh 2vw; - - user-select: all; - -webkit-user-select: all; -} - -.request-success code { - overflow-wrap: anywhere; -} - -.request-success img { - - width: 50px; - - margin-right: 3vw; - - user-select: none; -} - -.request-error { - color: rgb(143, 0, 0) -} \ No newline at end of file diff --git a/public/css/global.css b/public/css/global.css deleted file mode 100644 index c20e0a9..0000000 --- a/public/css/global.css +++ /dev/null @@ -1,21 +0,0 @@ -html, body { - margin: 0; - padding: 0; -} - -body { - margin: 0vh 3vw; - font-family: 'Be Vietnam Pro', sans-serif; -} - -#beta-banner { - background-color: #F38181; - color: #393E46; - - padding: 2vh 0.5vw; - margin: 0px -3vw; -} - -#beta-banner p { - margin: 0; -} \ No newline at end of file diff --git a/public/css/index.css b/public/css/index.css deleted file mode 100644 index 2a346e1..0000000 --- a/public/css/index.css +++ /dev/null @@ -1,26 +0,0 @@ -.main { - display: flex; - flex-direction: column; -} - -.button { - width: fit-content; - - background-color: #4797ff; - color: #fff; - - padding: 2vh 5vw; - - border-radius: 5px; - - text-decoration: none; - font-weight: bold; -} - -ul { - margin-top: 5vh; -} -ul li{ - font-size: 20pt; - font-weight: bold; -} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index b69e332f4c64c900d736a330a98c5c3fb9188a70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270398 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 SBnc!5Bnc!5Bnb?>1pYrN|2HxK diff --git a/public/img/auth_copy.svg b/public/img/auth_copy.svg deleted file mode 100644 index 2eb127c..0000000 --- a/public/img/auth_copy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..aa069f2 --- /dev/null +++ b/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/readme.MD b/readme.MD deleted file mode 100644 index 7d112d8..0000000 --- a/readme.MD +++ /dev/null @@ -1,20 +0,0 @@ -# Telegram to Notion Bot's website - -This is the complementary platform to the [Telegram to Notion Bot](https://t.me/TelegrmToNotionBot). - - - -Right now is on **beta version**, because it haves all the features needed but it needs a little more of styling in the differents pages. - -## Link - -**[Here](https://telegram-to-notion.herokuapp.com) you can visit it** - -## Credits - -- Copy icon from [feather](https://feathericons.com) -- Main font is [Be Vietnam Pro](https://fonts.google.com/specimen/Be+Vietnam+Pro) - -## Additional - -Dont forget to check also the [Telegram to Notion Bot](https://github.com/FranP-code/Telegram-to-Notion-Bot) repository. diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..d7991e6 --- /dev/null +++ b/src/App.js @@ -0,0 +1,8 @@ +function App() { + return ( + <> + + ); +} + +export default App; \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..5d4fdcf --- /dev/null +++ b/src/index.js @@ -0,0 +1,16 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js new file mode 100644 index 0000000..5253d3a --- /dev/null +++ b/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 0000000..8f2609b --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/views/auth.hbs b/views/auth.hbs deleted file mode 100644 index bcc32c1..0000000 --- a/views/auth.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{> global cssFile="auth"}} - - - {{> betaBanner }} -
- {{#if success}} -

Copy the following code on the Telegram chat

-
- copy - {{data.access_token}} -
- {{else}} -
-

There has been an error authorizing the app, please try again

-
- {{/if}} -
- - \ No newline at end of file diff --git a/views/index.hbs b/views/index.hbs deleted file mode 100644 index 398aa23..0000000 --- a/views/index.hbs +++ /dev/null @@ -1,14 +0,0 @@ -{{> global cssFile="index"}} - - - {{> betaBanner }} -
-

Telegram to Notion Bot's website

- Here you can visit it! -
    -
  • 100% Free
  • -
  • Unlimited messages
  • -
  • Forever
  • -
-
- \ No newline at end of file diff --git a/views/partials/betaBanner.hbs b/views/partials/betaBanner.hbs deleted file mode 100644 index 54c4b75..0000000 --- a/views/partials/betaBanner.hbs +++ /dev/null @@ -1,3 +0,0 @@ -
-

This website is on beta version. Futures updates will be to make more aesthetic the website for all users. Thanks for the compression

-
\ No newline at end of file diff --git a/views/partials/global.hbs b/views/partials/global.hbs deleted file mode 100644 index 07af0e2..0000000 --- a/views/partials/global.hbs +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - Telegram to Notion Bot - - - \ No newline at end of file diff --git a/views/privacy-policy.hbs b/views/privacy-policy.hbs deleted file mode 100644 index d6e50a2..0000000 --- a/views/privacy-policy.hbs +++ /dev/null @@ -1,138 +0,0 @@ -{{> global }} - - - {{> betaBanner }} -
-

Privacy Policy

-

Last updated: April 11, 2022

-

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

-

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the Privacy Policy Template.

-

Interpretation and Definitions

-

Interpretation

-

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

-

Definitions

-

For the purposes of this Privacy Policy:

-
    -
  • -

    Account means a unique account created for You to access our Service or parts of our Service.

    -
  • -
  • -

    Affiliate means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.

    -
  • -
  • -

    Application means the software program provided by the Company downloaded by You on any electronic device, named Telegram to Notion Bot

    -
  • -
  • -

    Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to Telegram to Notion Bot.

    -
  • -
  • -

    Country refers to: Argentina

    -
  • -
  • -

    Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.

    -
  • -
  • -

    Personal Data is any information that relates to an identified or identifiable individual.

    -
  • -
  • -

    Service refers to the Application.

    -
  • -
  • -

    Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.

    -
  • -
  • -

    Usage Data refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).

    -
  • -
  • -

    You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

    -
  • -
-

Collecting and Using Your Personal Data

-

Types of Data Collected

-

Personal Data

-

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

-
    -
  • Usage Data
  • -
-

Usage Data

-

Usage Data is collected automatically when using the Service.

-

Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

-

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

-

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

-

Use of Your Personal Data

-

The Company may use Personal Data for the following purposes:

-
    -
  • -

    To provide and maintain our Service, including to monitor the usage of our Service.

    -
  • -
  • -

    To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.

    -
  • -
  • -

    For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.

    -
  • -
  • -

    To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.

    -
  • -
  • -

    To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.

    -
  • -
  • -

    To manage Your requests: To attend and manage Your requests to Us.

    -
  • -
  • -

    For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.

    -
  • -
  • -

    For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.

    -
  • -
-

We may share Your personal information in the following situations:

-
    -
  • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.
  • -
  • For business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.
  • -
  • With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.
  • -
  • With business partners: We may share Your information with Our business partners to offer You certain products, services or promotions.
  • -
  • With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.
  • -
  • With Your consent: We may disclose Your personal information for any other purpose with Your consent.
  • -
-

Retention of Your Personal Data

-

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

-

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

-

Transfer of Your Personal Data

-

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

-

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

-

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

-

Disclosure of Your Personal Data

-

Business Transactions

-

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

-

Law enforcement

-

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

-

Other legal requirements

-

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

-
    -
  • Comply with a legal obligation
  • -
  • Protect and defend the rights or property of the Company
  • -
  • Prevent or investigate possible wrongdoing in connection with the Service
  • -
  • Protect the personal safety of Users of the Service or the public
  • -
  • Protect against legal liability
  • -
-

Security of Your Personal Data

-

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

-

Children's Privacy

-

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

-

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

-

Links to Other Websites

-

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

-

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

-

Changes to this Privacy Policy

-

We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

-

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

-

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

-

Contact Us

-

If you have any questions about this Privacy Policy, You can contact us:

-
    -
  • By email: franpessano1@gmail.com
  • -
-
- \ No newline at end of file diff --git a/views/terms-of-use.hbs b/views/terms-of-use.hbs deleted file mode 100644 index 72c20d8..0000000 --- a/views/terms-of-use.hbs +++ /dev/null @@ -1,24 +0,0 @@ -{{> global cssFile="index"}} - - {{> betaBanner }} -
-

Terms and conditions

-

These terms and conditions (“Agreement”) set forth the general terms and conditions of your use of the “Telegram to Notion Bot” mobile application (“Mobile Application” or “Service”) and any of its related products and services (collectively, “Services”). This Agreement is legally binding between you (“User”, “you” or “your”) and this Mobile Application developer (“Operator”, “we”, “us” or “our”). If you are entering into this agreement on behalf of a business or other legal entity, you represent that you have the authority to bind such entity to this agreement, in which case the terms “User”, “you” or “your” shall refer to such entity. If you do not have such authority, or if you do not agree with the terms of this agreement, you must not accept this agreement and may not access and use the Mobile Application and Services. By accessing and using the Mobile Application and Services, you acknowledge that you have read, understood, and agree to be bound by the terms of this Agreement. You acknowledge that this Agreement is a contract between you and the Operator, even though it is electronic and is not physically signed by you, and it governs your use of the Mobile Application and Services. This terms and conditions policy was created with the help of the terms and conditions generator.

-

Accounts and membership

-

You must be at least 16 years of age to use the Mobile Application and Services. By using the Mobile Application and Services and by agreeing to this Agreement you warrant and represent that you are at least 16 years of age.

-

If you create an account in the Mobile Application, you are responsible for maintaining the security of your account and you are fully responsible for all activities that occur under the account and any other actions taken in connection with it. We may, but have no obligation to, monitor and review new accounts before you may sign in and start using the Services. Providing false contact information of any kind may result in the termination of your account. You must immediately notify us of any unauthorized uses of your account or any other breaches of security. We will not be liable for any acts or omissions by you, including any damages of any kind incurred as a result of such acts or omissions. We may suspend, disable, or delete your account (or any part thereof) if we determine that you have violated any provision of this Agreement or that your conduct or content would tend to damage our reputation and goodwill. If we delete your account for the foregoing reasons, you may not re-register for our Services. We may block your email address and Internet protocol address to prevent further registration.

-

Links to other resources

-

Although the Mobile Application and Services may link to other resources (such as websites, mobile applications, etc.), we are not, directly or indirectly, implying any approval, association, sponsorship, endorsement, or affiliation with any linked resource, unless specifically stated herein. We are not responsible for examining or evaluating, and we do not warrant the offerings of, any businesses or individuals or the content of their resources. We do not assume any responsibility or liability for the actions, products, services, and content of any other third parties. You should carefully review the legal statements and other conditions of use of any resource which you access through a link in the Mobile Application. Your linking to any other off-site resources is at your own risk.

-

Dispute resolution

-

The formation, interpretation, and performance of this Agreement and any disputes arising out of it shall be governed by the substantive and procedural laws of Argentina without regard to its rules on conflicts or choice of law and, to the extent applicable, the laws of Argentina. The exclusive jurisdiction and venue for actions related to the subject matter hereof shall be the courts located in Argentina, and you hereby submit to the personal jurisdiction of such courts. You hereby waive any right to a jury trial in any proceeding arising out of or related to this Agreement. The United Nations Convention on Contracts for the International Sale of Goods does not apply to this Agreement.

-

Changes and amendments

-

We reserve the right to modify this Agreement or its terms related to the Mobile Application and Services at any time at our discretion. When we do, we will revise the updated date at the bottom of this page. We may also provide notice to you in other ways at our discretion, such as through the contact information you have provided.

-

An updated version of this Agreement will be effective immediately upon the posting of the revised Agreement unless otherwise specified. Your continued use of the Mobile Application and Services after the effective date of the revised Agreement (or such other act specified at that time) will constitute your consent to those changes.

-

Acceptance of these terms

-

You acknowledge that you have read this Agreement and agree to all its terms and conditions. By accessing and using the Mobile Application and Services you agree to be bound by this Agreement. If you do not agree to abide by the terms of this Agreement, you are not authorized to access or use the Mobile Application and Services.

-

Contacting us

-

If you have any questions, concerns, or complaints regarding this Agreement, we encourage you to contact us using the details below:

-

franpessano1@gmail.com

-

This document was last updated on April 11, 2022

-
- \ No newline at end of file From d5f6c5aee04bfef9b53ed099e774c58afc823840 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Fri, 15 Apr 2022 23:33:57 -0300 Subject: [PATCH 2/7] Index page done --- package.json | 2 + public/favicon.ico | Bin 0 -> 10083 bytes public/index.html | 2 +- src/App.js | 8 -- src/App.jsx | 27 +++++ src/Pages/Auth.jsx | 9 ++ src/Pages/Index/Index.jsx | 112 +++++++++++++++++++++ src/Pages/Index/background.svg | 1 + src/Pages/Index/icon (rounded borders).png | Bin 0 -> 22623 bytes src/components/Header/Header.jsx | 58 +++++++++++ src/components/Header/icon.png | Bin 0 -> 13520 bytes src/index.js | 2 + src/styles.css | 20 ++++ src/styles.css.map | 1 + src/styles.scss | 17 ++++ 15 files changed, 250 insertions(+), 9 deletions(-) create mode 100644 public/favicon.ico delete mode 100644 src/App.js create mode 100644 src/App.jsx create mode 100644 src/Pages/Auth.jsx create mode 100644 src/Pages/Index/Index.jsx create mode 100644 src/Pages/Index/background.svg create mode 100644 src/Pages/Index/icon (rounded borders).png create mode 100644 src/components/Header/Header.jsx create mode 100644 src/components/Header/icon.png create mode 100644 src/styles.css create mode 100644 src/styles.css.map create mode 100644 src/styles.scss diff --git a/package.json b/package.json index 120fc85..6327f03 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "@testing-library/user-event": "^13.5.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", + "styled-components": "^5.3.5", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..04ffce060a67576e0f3afb0def2a9c7c882ae867 GIT binary patch literal 10083 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 VK6=}T>>@u7=xFL|)M9L7{s(+PL~#HB literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index aa069f2..5b58cf0 100644 --- a/public/index.html +++ b/public/index.html @@ -24,7 +24,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + Telegram to Notion Bot diff --git a/src/App.js b/src/App.js deleted file mode 100644 index d7991e6..0000000 --- a/src/App.js +++ /dev/null @@ -1,8 +0,0 @@ -function App() { - return ( - <> - - ); -} - -export default App; \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..197e417 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,27 @@ +import { + BrowserRouter as Router, + Routes, + Route, + Link +} from "react-router-dom"; + +import Header from './components/Header/Header' + +import Auth from './Pages/Auth' +import Index from './Pages/Index/Index' + +function App() { + return ( + <> +
+ + + } /> + } /> + + + + ); +} + +export default App; \ No newline at end of file diff --git a/src/Pages/Auth.jsx b/src/Pages/Auth.jsx new file mode 100644 index 0000000..a6059a2 --- /dev/null +++ b/src/Pages/Auth.jsx @@ -0,0 +1,9 @@ +function Auth() { + + return ( +
+
+ ) +} + +export default Auth \ No newline at end of file diff --git a/src/Pages/Index/Index.jsx b/src/Pages/Index/Index.jsx new file mode 100644 index 0000000..eb74c82 --- /dev/null +++ b/src/Pages/Index/Index.jsx @@ -0,0 +1,112 @@ +import background from './background.svg' +import styled from "styled-components" + +function Index() { + + const IndexStyles = styled.div` + + height: calc(100vh - 15vh - 1px); //Minus header height and 1 pixel for prevent scrollbar + width: 100%; + + display: flex; + flex-direction: column; + + aspect-ratio: 960/300; + + background-image: url(${background}); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + + .title-list { + + color: #000; + + li { + + display: flex; + align-items: flex-end; + + margin-bottom: 1vh; + + a { + + width: fit-content; + color: #000; + text-decoration: none; + + &:hover h2 { + text-decoration: underline!important; + } + } + + h2 { + display: inline-block; + margin: 0; + font-size: 25pt; + } + + span { + display: inline-block; + + color: #999; + + margin-left: 1vw; + margin-top: 5px; + + align-self: center; + } + } + } + + .link-to-bot { + + width: fit-content; + + color: #fff; + background-color: #4797ff; + + border-radius: 5px; + + margin-top: 6vh; + margin-left: 1vw; + padding: 3vh 6vw; + + font-size: 20pt; + font-weight: bold; + text-decoration: none; + + transition: 0.4s ease-in-out; + + &:hover { + background-color: #0088cc; + transition: 0.4s ease-in-out; + } + } + ` + + const listData = [ + {text: "Free"}, + {text: "Open Source", link: "https://github.com/FranP-code/Telegram-to-Notion-Bot"}, + {text: "Unlimited"}, + {text: "Forever", secondaryText: "(while I can afford it)"} + ] + + return ( + + + + + ) +} + +export default Index \ No newline at end of file diff --git a/src/Pages/Index/background.svg b/src/Pages/Index/background.svg new file mode 100644 index 0000000..89d7bdd --- /dev/null +++ b/src/Pages/Index/background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/Pages/Index/icon (rounded borders).png b/src/Pages/Index/icon (rounded borders).png new file mode 100644 index 0000000000000000000000000000000000000000..da6f91a6216d20c7461a1507b7f79c64d7e719ef GIT binary patch literal 22623 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 MwgIAA%P#7F08GD#CjbBd literal 0 HcmV?d00001 diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx new file mode 100644 index 0000000..6f871b7 --- /dev/null +++ b/src/components/Header/Header.jsx @@ -0,0 +1,58 @@ +import icon from './icon.png' +import styled from 'styled-components' + +function Header() { + + const HeaderStyles = styled.header` + + height: 15vh; + + display: flex; + align-items: center; + + padding: 0px 2vw; + + border-bottom: 1px solid #eee; + + .logotype { + display: flex; + align-items: center; + + img { + width: 80px; + height: 80px; + + margin-right: 1vw; + + &:hover { + animation: rotate-image 0.5s cubic-bezier(1.000, 0.000, 0.000, 1.000) both; + } + } + + @keyframes rotate-image { + 0% { + transform: rotate(0deg) + } + + 100% { + transform: rotate(360deg) + } + } + } + + ` + + return ( + +
+ Page icon +

Telegram to Notion Bot

+
+
+ +
+
+ ) +} + +export default Header \ No newline at end of file diff --git a/src/components/Header/icon.png b/src/components/Header/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4cc61c479f5fa49d88b27181475f83f5a6897c GIT binary patch literal 13520 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 literal 0 HcmV?d00001 diff --git a/src/index.js b/src/index.js index 5d4fdcf..0eb610a 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,8 @@ import ReactDOM from 'react-dom/client'; import App from './App'; import reportWebVitals from './reportWebVitals'; +import './styles.css' + const root = ReactDOM.createRoot(document.getElementById('root')); root.render( diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..b5d68ad --- /dev/null +++ b/src/styles.css @@ -0,0 +1,20 @@ +html, body { + margin: 0; + padding: 0; +} + +body { + @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;700;900&display=swap"); + font-family: "Inter", sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +img { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +}/*# sourceMappingURL=styles.css.map */ \ No newline at end of file diff --git a/src/styles.css.map b/src/styles.css.map new file mode 100644 index 0000000..85a73d9 --- /dev/null +++ b/src/styles.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["styles.scss","styles.css"],"names":[],"mappings":"AAAA;EACI,SAAA;EACA,UAAA;ACCJ;;ADEA;EACY,+FAAA;EACR,gCAAA;ACCJ;;ADEA;EACI,SAAA;ACCJ;;ADEA;EACI,yBAAA;KAAA,sBAAA;MAAA,qBAAA;UAAA,iBAAA;ACCJ","file":"styles.css"} \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..54a049f --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,17 @@ +html, body { + margin: 0; + padding: 0; +} + +body { + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;700;900&display=swap'); + font-family: 'Inter', sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +img { + user-select: none; +} \ No newline at end of file From 32404d1104515c858aba84bef3fbb0a81479db35 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Wed, 20 Apr 2022 20:03:57 -0300 Subject: [PATCH 3/7] Auth page done --- .gitignore | 6 ++-- .vscode/settings.json | 22 ++++++++++++ package.json | 1 + public/_redirects | 1 + src/App.jsx | 3 +- src/Pages/Auth.jsx | 74 +++++++++++++++++++++++++++++++++++++++ src/Pages/Index/Index.jsx | 5 ++- 7 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 public/_redirects diff --git a/.gitignore b/.gitignore index 9ce5739..7b65aa4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + node_modules package-lock.json -.env# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +.env # dependencies /node_modules @@ -24,4 +26,4 @@ package-lock.json npm-debug.log* yarn-debug.log* -yarn-error.log* +yarn-error.log* \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3f77cd8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#3399ff", + "activityBar.activeBorder": "#bf0060", + "activityBar.background": "#3399ff", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#bf0060", + "activityBarBadge.foreground": "#e7e7e7", + "sash.hoverBorder": "#3399ff", + "statusBar.background": "#007fff", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#3399ff", + "statusBarItem.remoteBackground": "#007fff", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#007fff", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#007fff99", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.color": "#007fff" +} \ No newline at end of file diff --git a/package.json b/package.json index 6327f03..06ac388 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.0.1", "@testing-library/user-event": "^13.5.0", + "axios": "^0.26.1", "react": "^18.0.0", "react-dom": "^18.0.0", "react-router-dom": "^6.3.0", diff --git a/public/_redirects b/public/_redirects new file mode 100644 index 0000000..f824337 --- /dev/null +++ b/public/_redirects @@ -0,0 +1 @@ +/* /index.html 200 \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index 197e417..c92d77a 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,8 +1,7 @@ import { BrowserRouter as Router, Routes, - Route, - Link + Route } from "react-router-dom"; import Header from './components/Header/Header' diff --git a/src/Pages/Auth.jsx b/src/Pages/Auth.jsx index a6059a2..60be372 100644 --- a/src/Pages/Auth.jsx +++ b/src/Pages/Auth.jsx @@ -1,7 +1,81 @@ +import React, {useState} from "react" +import axios from 'axios' + function Auth() { + + const [loading, setLoading] = useState(true) + const [permanentCode, setPermanentCode] = useState(false) + + React.useEffect(() => { + + async function getPermanentCode() { + + const temporalCode = new URLSearchParams(window.location.search).get("code") + console.log(temporalCode); + + if (!temporalCode) { + console.log("No temporal code") + return + } + + let requestUrl + + if (process.env.REACT_APP_ENV_MODE === "production") { + requestUrl = "https://telegram-to-notion-backend.herokuapp.com/api/v1/auth" + } else { + requestUrl = "http://localhost:5050/api/v1/auth" + } + + axios({ + method: "POST", + url: requestUrl, + headers: { + code: temporalCode, + } + }) + .then(res => { + console.log(res) + setPermanentCode(res ? res.data : null) + }) + .catch(err => { + console.log(err.response) + setPermanentCode(false) + }) + .finally(() => { + setLoading(false) + }) + + } + + getPermanentCode() + }) + return (
+ { + loading ? + // +

Loading

+ : + <> + { + permanentCode ? + <> +

Copy the following code on the Telegram chat

+
+ + {permanentCode} + +
+ + : +
+

There has been an error getting the code. Please try again later.

+
+ } + + }
) } diff --git a/src/Pages/Index/Index.jsx b/src/Pages/Index/Index.jsx index eb74c82..a060059 100644 --- a/src/Pages/Index/Index.jsx +++ b/src/Pages/Index/Index.jsx @@ -51,7 +51,6 @@ function Index() { color: #999; - margin-left: 1vw; margin-top: 5px; align-self: center; @@ -68,7 +67,7 @@ function Index() { border-radius: 5px; - margin-top: 6vh; + margin-top: 3vh; margin-left: 1vw; padding: 3vh 6vw; @@ -99,7 +98,7 @@ function Index() { listData.map((obj, index) => (
  • {obj.link ? › {obj.text}} rel="noreferrer"/> :

    › {obj.text}

    } - {obj.secondaryText ? {obj.secondaryText} : null} + {obj.secondaryText ?  {obj.secondaryText} : null}
  • )) } From bf31475316222071c66d2190c2bcabe10ad6c4c9 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Mon, 25 Apr 2022 17:47:24 -0300 Subject: [PATCH 4/7] Auth page done --- package.json | 5 +- src/App.jsx | 19 +--- src/Pages/Auth.jsx | 83 -------------- src/Pages/Auth/Auth.jsx | 103 ++++++++++++++++++ src/Pages/Auth/auth-style.css | 27 +++++ src/Pages/Auth/auth-style.css.map | 1 + src/Pages/Auth/auth-style.scss | 37 +++++++ src/Pages/Auth/auth_copy.svg | 1 + src/components/Loading/Loading.jsx | 31 ++++++ src/components/Notification/Notification.jsx | 36 ++++++ .../Notification/notification-style.css | 17 +++ .../Notification/notification-style.css.map | 1 + .../Notification/notification-style.scss | 25 +++++ src/index.js | 4 +- src/styles.css | 78 +++++++++++++ src/styles.css.map | 2 +- src/styles.scss | 85 ++++++++++++++- 17 files changed, 453 insertions(+), 102 deletions(-) delete mode 100644 src/Pages/Auth.jsx create mode 100644 src/Pages/Auth/Auth.jsx create mode 100644 src/Pages/Auth/auth-style.css create mode 100644 src/Pages/Auth/auth-style.css.map create mode 100644 src/Pages/Auth/auth-style.scss create mode 100644 src/Pages/Auth/auth_copy.svg create mode 100644 src/components/Loading/Loading.jsx create mode 100644 src/components/Notification/Notification.jsx create mode 100644 src/components/Notification/notification-style.css create mode 100644 src/components/Notification/notification-style.css.map create mode 100644 src/components/Notification/notification-style.scss diff --git a/package.json b/package.json index 06ac388..dda291d 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,14 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.0.1", "@testing-library/user-event": "^13.5.0", + "@uiball/loaders": "^1.2.4", "axios": "^0.26.1", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "styled-components": "^5.3.5", - "web-vitals": "^2.1.4" + "web-vitals": "^2.1.4", + "wouter": "^2.8.0-alpha.2" }, "scripts": { "start": "react-scripts start", diff --git a/src/App.jsx b/src/App.jsx index c92d77a..56991ea 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,24 +1,17 @@ -import { - BrowserRouter as Router, - Routes, - Route -} from "react-router-dom"; +import React from 'react' +import {Route} from 'wouter' import Header from './components/Header/Header' -import Auth from './Pages/Auth' +import Auth from './Pages/Auth/Auth' import Index from './Pages/Index/Index' function App() { return ( <> -
    - - - } /> - } /> - - +
    + } /> + } /> ); } diff --git a/src/Pages/Auth.jsx b/src/Pages/Auth.jsx deleted file mode 100644 index 60be372..0000000 --- a/src/Pages/Auth.jsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, {useState} from "react" -import axios from 'axios' - -function Auth() { - - const [loading, setLoading] = useState(true) - const [permanentCode, setPermanentCode] = useState(false) - - React.useEffect(() => { - - async function getPermanentCode() { - - const temporalCode = new URLSearchParams(window.location.search).get("code") - console.log(temporalCode); - - if (!temporalCode) { - console.log("No temporal code") - return - } - - let requestUrl - - if (process.env.REACT_APP_ENV_MODE === "production") { - requestUrl = "https://telegram-to-notion-backend.herokuapp.com/api/v1/auth" - } else { - requestUrl = "http://localhost:5050/api/v1/auth" - } - - axios({ - method: "POST", - url: requestUrl, - headers: { - code: temporalCode, - } - }) - .then(res => { - console.log(res) - setPermanentCode(res ? res.data : null) - }) - .catch(err => { - console.log(err.response) - setPermanentCode(false) - }) - .finally(() => { - setLoading(false) - }) - - } - - getPermanentCode() - }) - - - return ( -
    - { - loading ? - // -

    Loading

    - : - <> - { - permanentCode ? - <> -

    Copy the following code on the Telegram chat

    -
    - - {permanentCode} - -
    - - : -
    -

    There has been an error getting the code. Please try again later.

    -
    - } - - } -
    - ) -} - -export default Auth \ No newline at end of file diff --git a/src/Pages/Auth/Auth.jsx b/src/Pages/Auth/Auth.jsx new file mode 100644 index 0000000..07b34fa --- /dev/null +++ b/src/Pages/Auth/Auth.jsx @@ -0,0 +1,103 @@ +import React, {useState} from "react" +import axios from 'axios' + +import Loading from "../../components/Loading/Loading" + +import authImage from './auth_copy.svg' + +import './auth-style.css' +import Notification from "../../components/Notification/Notification" + +function Auth() { + + const [loading, setLoading] = useState(true) + const [permanentCode, setPermanentCode] = useState(false) + const [notification, setNotification] = useState(false) + + const getPermanentCode = () => { + + const temporalCode = new URLSearchParams(window.location.search).get("code") + + if (!temporalCode) { + setPermanentCode("empty") + setLoading(false) + return + } + + let requestUrl + + if (process.env.REACT_APP_ENV_MODE === "production") { + requestUrl = "http://localhost:5050/api/v1/auth" + } else { + requestUrl = "https://telegram-to-notion-backend.herokuapp.com/api/v1/auth" + } + + axios({ + method: "POST", + url: requestUrl, + headers: {'Content-Type': 'application/json'}, + data: {code: temporalCode} + }) + .then(res => { + console.log(res) + setPermanentCode(res ? res.data : null) + }) + .catch(err => { + console.log(err.response) + setPermanentCode(false) + }) + .finally(() => { + setLoading(false) + }) + } + React.useEffect(() => { + getPermanentCode() + }, []) + + + return ( +
    + { + loading ? + + : + <> + { + permanentCode && permanentCode !== "empty" ? + <> +

    Copy the following code on Telegram chat

    +
    + Copy text + { + navigator.clipboard.writeText(permanentCode) + setNotification("Text copied to clipboard!") + }} + > + {permanentCode} + +
    + + : + <> + { + permanentCode === "empty" ? +
    +

    There is no temporal code. Please try again later.

    +
    + : +
    +

    There has been an error getting the code. Please try again later.

    +
    + } + + } + + } + +
    + ) +} + +export default Auth \ No newline at end of file diff --git a/src/Pages/Auth/auth-style.css b/src/Pages/Auth/auth-style.css new file mode 100644 index 0000000..9a46685 --- /dev/null +++ b/src/Pages/Auth/auth-style.css @@ -0,0 +1,27 @@ +.auth { + padding: 1vh 3vw; +} +.auth h2, .auth h3 { + margin-top: 5vh; +} +.auth .success { + display: flex; + align-items: center; + background-color: #ffebcd; + padding: 5vh 2vw; + margin-top: 5vh; + border-radius: 20px; +} +.auth .success img { + width: 75px; + height: 75px; + margin-right: 3vw; +} +.auth .success .code-selection { + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + overflow-wrap: anywhere; + color: rgb(73, 70, 50); + font-size: 1.2em; +}/*# sourceMappingURL=auth-style.css.map */ \ No newline at end of file diff --git a/src/Pages/Auth/auth-style.css.map b/src/Pages/Auth/auth-style.css.map new file mode 100644 index 0000000..3fd769f --- /dev/null +++ b/src/Pages/Auth/auth-style.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["auth-style.scss","auth-style.css"],"names":[],"mappings":"AAAA;EACI,gBAAA;ACCJ;ADCI;EACI,eAAA;ACCR;ADEI;EAEI,aAAA;EACA,mBAAA;EAEA,yBAAA;EAEA,gBAAA;EAEA,eAAA;EAEA,mBAAA;ACLR;ADOQ;EACI,WAAA;EACA,YAAA;EAEA,iBAAA;ACNZ;ADSQ;EACI,wBAAA;KAAA,qBAAA;UAAA,gBAAA;EACA,uBAAA;EAEA,sBAAA;EACA,gBAAA;ACRZ","file":"auth-style.css"} \ No newline at end of file diff --git a/src/Pages/Auth/auth-style.scss b/src/Pages/Auth/auth-style.scss new file mode 100644 index 0000000..21915ad --- /dev/null +++ b/src/Pages/Auth/auth-style.scss @@ -0,0 +1,37 @@ +.auth { + padding: 1vh 3vw; + + h2, h3 { + margin-top: 5vh; + } + + .success { + + display: flex; + align-items: center; + + background-color: #ffebcd; + + padding: 5vh 2vw; + + margin-top: 5vh; + + border-radius: 20px; + + img { + width: 75px; + height: 75px; + + margin-right: 3vw; + } + + .code-selection { + user-select: all; + overflow-wrap: anywhere; + + color: rgb(73, 70, 50); + font-size: 1.2em; + + } + } +} \ No newline at end of file diff --git a/src/Pages/Auth/auth_copy.svg b/src/Pages/Auth/auth_copy.svg new file mode 100644 index 0000000..2eb127c --- /dev/null +++ b/src/Pages/Auth/auth_copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Loading/Loading.jsx b/src/components/Loading/Loading.jsx new file mode 100644 index 0000000..164c276 --- /dev/null +++ b/src/components/Loading/Loading.jsx @@ -0,0 +1,31 @@ +import React from 'react' +import styled from 'styled-components' +import {DotSpinner} from '@uiball/loaders' + +const Loading = () => { + + const Styles = styled.div` + width: 100%; + height: 100%; + + display: flex; + justify-content: center; + align-items: center; + + box-sizing: border-box; + + padding-bottom: 20vh; + + * { + width: 10vw !important; + height: 10vw !important; + } + ` + return ( + + + + ) +} + +export default Loading \ No newline at end of file diff --git a/src/components/Notification/Notification.jsx b/src/components/Notification/Notification.jsx new file mode 100644 index 0000000..0daf90f --- /dev/null +++ b/src/components/Notification/Notification.jsx @@ -0,0 +1,36 @@ +import React from 'react' + +import './notification-style.css' + +const Notification = ({notification, setNotification}) => { + React.useEffect(() => { + if (notification === false) { + return + } + + setTimeout(() => { + const elem = document.querySelector("#notification-element") + elem.classList.remove('fade-in') + elem.classList.add('fade-out') + }, 2000) + + setTimeout(() => { + setNotification(false) + }, 2400) + + }, [notification]) + + return ( + <> + { + notification ? +
    +

    {notification}

    +
    + : null + } + + ) +} + +export default Notification \ No newline at end of file diff --git a/src/components/Notification/notification-style.css b/src/components/Notification/notification-style.css new file mode 100644 index 0000000..a2edbe5 --- /dev/null +++ b/src/components/Notification/notification-style.css @@ -0,0 +1,17 @@ +.notification { + width: 15vw; + min-width: 300px; + background-color: rgba(71, 151, 255, 0.1647058824); + box-shadow: 0px 5px 20px rgba(0, 0, 0, 0.541); + position: absolute; + top: 80%; + left: 50%; + transform: translate(-50%, 0); + padding: 2vh 3vw; + border-radius: 10px; +} +.notification p { + overflow-wrap: anywhere; + text-align: center; + font-weight: bold; +}/*# sourceMappingURL=notification-style.css.map */ \ No newline at end of file diff --git a/src/components/Notification/notification-style.css.map b/src/components/Notification/notification-style.css.map new file mode 100644 index 0000000..aab429b --- /dev/null +++ b/src/components/Notification/notification-style.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["notification-style.scss","notification-style.css"],"names":[],"mappings":"AAAA;EAEI,WAAA;EACA,gBAAA;EAEA,kDAAA;EACA,6CAAA;EAEA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,6BAAA;EAEA,gBAAA;EAEA,mBAAA;ACJJ;ADMI;EACI,uBAAA;EACA,kBAAA;EACA,iBAAA;ACJR","file":"notification-style.css"} \ No newline at end of file diff --git a/src/components/Notification/notification-style.scss b/src/components/Notification/notification-style.scss new file mode 100644 index 0000000..3462cc2 --- /dev/null +++ b/src/components/Notification/notification-style.scss @@ -0,0 +1,25 @@ +.notification { + + width: 15vw; + min-width: 300px; + + background-color: #4797ff2a; + box-shadow: 0px 5px 20px rgba(0, 0, 0, 0.541); + + position: absolute; + top: 80%; + left: 50%; + transform: translate(-50%, 0); + + padding: 2vh 3vw; + + border-radius: 10px; + + p { + overflow-wrap: anywhere; + text-align: center; + font-weight: bold; + } + + +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 0eb610a..fac8de9 100644 --- a/src/index.js +++ b/src/index.js @@ -7,9 +7,9 @@ import './styles.css' const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - + // //!WTF React - + // //Thank you: https://stackoverflow.com/a/61091205/18740899 ); // If you want to start measuring performance in your app, pass a function diff --git a/src/styles.css b/src/styles.css index b5d68ad..4dcb48d 100644 --- a/src/styles.css +++ b/src/styles.css @@ -8,6 +8,19 @@ body { font-family: "Inter", sans-serif; } +html, body, #root { + height: 100%; +} + +#root { + display: flex; + flex-direction: column; +} + +.fullscreen { + flex-grow: 1; +} + h1, h2, h3, h4, h5, h6 { margin: 0; } @@ -17,4 +30,69 @@ img { -moz-user-select: none; -ms-user-select: none; user-select: none; +} + +.fade-in { + -webkit-animation: fade-in 0.5s ease-in-out both; + animation: fade-in 0.5s ease-in-out both; +} + +/* ---------------------------------------------- + * Generated by Animista on 2022-4-25 17:26:50 + * Licensed under FreeBSD License. + * See http://animista.net/license for more info. + * w: http://animista.net, t: @cssanimista + * ---------------------------------------------- */ +/** + * ---------------------------------------- + * animation fade-in + * ---------------------------------------- + */ +@-webkit-keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +.fade-out { + -webkit-animation: fade-out 1s ease-in-out both; + animation: fade-out 1s ease-in-out both; +} + +/* ---------------------------------------------- + * Generated by Animista on 2022-4-25 17:27:42 + * Licensed under FreeBSD License. + * See http://animista.net/license for more info. + * w: http://animista.net, t: @cssanimista + * ---------------------------------------------- */ +/** + * ---------------------------------------- + * animation fade-out + * ---------------------------------------- + */ +@-webkit-keyframes fade-out { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@keyframes fade-out { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } }/*# sourceMappingURL=styles.css.map */ \ No newline at end of file diff --git a/src/styles.css.map b/src/styles.css.map index 85a73d9..1eeff8c 100644 --- a/src/styles.css.map +++ b/src/styles.css.map @@ -1 +1 @@ -{"version":3,"sources":["styles.scss","styles.css"],"names":[],"mappings":"AAAA;EACI,SAAA;EACA,UAAA;ACCJ;;ADEA;EACY,+FAAA;EACR,gCAAA;ACCJ;;ADEA;EACI,SAAA;ACCJ;;ADEA;EACI,yBAAA;KAAA,sBAAA;MAAA,qBAAA;UAAA,iBAAA;ACCJ","file":"styles.css"} \ No newline at end of file +{"version":3,"sources":["styles.scss","styles.css"],"names":[],"mappings":"AAAA;EACI,SAAA;EACA,UAAA;ACCJ;;ADEA;EACY,+FAAA;EACR,gCAAA;ACCJ;;ADEA;EACI,YAAA;ACCJ;;ADEA;EACI,aAAA;EACA,sBAAA;ACCJ;;ADEA;EACI,YAAA;ACCJ;;ADEA;EACI,SAAA;ACCJ;;ADEA;EACI,yBAAA;KAAA,sBAAA;MAAA,qBAAA;UAAA,iBAAA;ACCJ;;ADIA;EACC,wEAAA;EACG,gEAAA;ACDJ;;ADIA;;;;;mDAAA;AAOA;;;;EAAA;AAKC;EACG;IACE,UAAA;ECFJ;EDIE;IACE,UAAA;ECFJ;AACF;ADIA;EACI;IACI,UAAA;ECFN;EDIE;IACI,UAAA;ECFN;AACF;ADKA;EACC,4CAAA;EACG,oCAAA;ACHJ;;ADKA;;;;;mDAAA;AAOA;;;;EAAA;AAKC;EACG;IACI,UAAA;ECHN;EDKE;IACI,UAAA;ECHN;AACF;ADKI;EACA;IACI,UAAA;ECHN;EDKE;IACI,UAAA;ECHN;AACF","file":"styles.css"} \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 54a049f..30f497c 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -8,10 +8,93 @@ body { font-family: 'Inter', sans-serif; } +html, body, #root { + height: 100%; +} + +#root { + display: flex; + flex-direction: column; +} + +.fullscreen { + flex-grow: 1; +} + h1, h2, h3, h4, h5, h6 { margin: 0; } img { user-select: none; -} \ No newline at end of file +} + +//Animations + +.fade-in { + -webkit-animation: fade-in 0.5s cubic-bezier(0.390, 0.575, 0.565, 1.000) both; + animation: fade-in 0.5s cubic-bezier(0.390, 0.575, 0.565, 1.000) both; +} + +/* ---------------------------------------------- + * Generated by Animista on 2022-4-25 17:26:50 + * Licensed under FreeBSD License. + * See http://animista.net/license for more info. + * w: http://animista.net, t: @cssanimista + * ---------------------------------------------- */ + +/** + * ---------------------------------------- + * animation fade-in + * ---------------------------------------- + */ + @-webkit-keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } +@keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.fade-out { + -webkit-animation: fade-out 1s ease-out both; + animation: fade-out 1s ease-out both; +} +/* ---------------------------------------------- + * Generated by Animista on 2022-4-25 17:27:42 + * Licensed under FreeBSD License. + * See http://animista.net/license for more info. + * w: http://animista.net, t: @cssanimista + * ---------------------------------------------- */ + +/** + * ---------------------------------------- + * animation fade-out + * ---------------------------------------- + */ + @-webkit-keyframes fade-out { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + @keyframes fade-out { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + \ No newline at end of file From 423e0e051854b395364e05e9febdd56b8da6c905 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Mon, 25 Apr 2022 18:15:19 -0300 Subject: [PATCH 5/7] Header changes --- src/components/Header/Header.jsx | 44 +++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 6f871b7..11367d0 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -1,5 +1,6 @@ import icon from './icon.png' import styled from 'styled-components' +import { Link } from 'wouter' function Header() { @@ -8,12 +9,16 @@ function Header() { height: 15vh; display: flex; + justify-content: space-between; align-items: center; padding: 0px 2vw; border-bottom: 1px solid #eee; + user-select: none; + cursor: pointer; + .logotype { display: flex; align-items: center; @@ -40,16 +45,41 @@ function Header() { } } + .links { + display: flex; + flex-direction: column; + + a { + color: #000; + font-weight: bold; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + } + ` - + return ( -
    - Page icon -

    Telegram to Notion Bot

    -
    -
    - + +
    + Page icon +

    Telegram to Notion Bot

    +
    + +
    + + About + + + Privacy policy + + + Terms of use +
    ) From 0f42cddf095d21ea514b7a0e36e1689aa1cab454 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Mon, 25 Apr 2022 19:41:56 -0300 Subject: [PATCH 6/7] About, privacy policy and terms of use pages added --- src/App.jsx | 8 ++ src/Pages/About/About.jsx | 50 ++++++++ src/Pages/PrivacyPolicy/PrivacyPolicy.jsx | 141 ++++++++++++++++++++++ src/Pages/TermsOfUse/TermsOfUse.jsx | 27 +++++ src/styles.css | 8 +- 5 files changed, 230 insertions(+), 4 deletions(-) create mode 100644 src/Pages/About/About.jsx create mode 100644 src/Pages/PrivacyPolicy/PrivacyPolicy.jsx create mode 100644 src/Pages/TermsOfUse/TermsOfUse.jsx diff --git a/src/App.jsx b/src/App.jsx index 56991ea..2dc65c7 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,16 +1,24 @@ import React from 'react' import {Route} from 'wouter' +//Components import Header from './components/Header/Header' +//Pages +import About from './Pages/About/About' import Auth from './Pages/Auth/Auth' +import PrivacyPolicy from './Pages/PrivacyPolicy/PrivacyPolicy' +import TermsOfUse from './Pages/TermsOfUse/TermsOfUse' import Index from './Pages/Index/Index' function App() { return ( <>
    + } /> } /> + } /> + } /> } /> ); diff --git a/src/Pages/About/About.jsx b/src/Pages/About/About.jsx new file mode 100644 index 0000000..b6e6a4c --- /dev/null +++ b/src/Pages/About/About.jsx @@ -0,0 +1,50 @@ +import React from 'react' +import styled from 'styled-components' +import { Link } from 'wouter' + +const About = () => { + + const Style = styled.main` + padding: 0px 3vw; + + section { + margin-bottom: 5vh; + } + + a { + color: #4d77ff + } + ` + + return ( + + ) +} + +export default About \ No newline at end of file diff --git a/src/Pages/PrivacyPolicy/PrivacyPolicy.jsx b/src/Pages/PrivacyPolicy/PrivacyPolicy.jsx new file mode 100644 index 0000000..59d4439 --- /dev/null +++ b/src/Pages/PrivacyPolicy/PrivacyPolicy.jsx @@ -0,0 +1,141 @@ +import React from 'react' + +const PrivacyPolicy = () => { + return ( +
    +

    Privacy Policy

    +

    Last updated: April 11, 2022

    +

    This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

    +

    We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the Privacy Policy Template.

    +

    Interpretation and Definitions

    +

    Interpretation

    +

    The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

    +

    Definitions

    +

    For the purposes of this Privacy Policy:

    +
      +
    • +

      Account means a unique account created for You to access our Service or parts of our Service.

      +
    • +
    • +

      Affiliate means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.

      +
    • +
    • +

      Application means the software program provided by the Company downloaded by You on any electronic device, named Telegram to Notion Bot

      +
    • +
    • +

      Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to Telegram to Notion Bot.

      +
    • +
    • +

      Country refers to: Argentina

      +
    • +
    • +

      Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.

      +
    • +
    • +

      Personal Data is any information that relates to an identified or identifiable individual.

      +
    • +
    • +

      Service refers to the Application.

      +
    • +
    • +

      Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.

      +
    • +
    • +

      Usage Data refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).

      +
    • +
    • +

      You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

      +
    • +
    +

    Collecting and Using Your Personal Data

    +

    Types of Data Collected

    +

    Personal Data

    +

    While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

    +
      +
    • Usage Data
    • +
    +

    Usage Data

    +

    Usage Data is collected automatically when using the Service.

    +

    Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

    +

    When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

    +

    We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

    +

    Use of Your Personal Data

    +

    The Company may use Personal Data for the following purposes:

    +
      +
    • +

      To provide and maintain our Service, including to monitor the usage of our Service.

      +
    • +
    • +

      To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.

      +
    • +
    • +

      For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.

      +
    • +
    • +

      To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.

      +
    • +
    • +

      To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.

      +
    • +
    • +

      To manage Your requests: To attend and manage Your requests to Us.

      +
    • +
    • +

      For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.

      +
    • +
    • +

      For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.

      +
    • +
    +

    We may share Your personal information in the following situations:

    +
      +
    • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.
    • +
    • For business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.
    • +
    • With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.
    • +
    • With business partners: We may share Your information with Our business partners to offer You certain products, services or promotions.
    • +
    • With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.
    • +
    • With Your consent: We may disclose Your personal information for any other purpose with Your consent.
    • +
    +

    Retention of Your Personal Data

    +

    The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

    +

    The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

    +

    Transfer of Your Personal Data

    +

    Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

    +

    Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

    +

    The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

    +

    Disclosure of Your Personal Data

    +

    Business Transactions

    +

    If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

    +

    Law enforcement

    +

    Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

    +

    Other legal requirements

    +

    The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

    +
      +
    • Comply with a legal obligation
    • +
    • Protect and defend the rights or property of the Company
    • +
    • Prevent or investigate possible wrongdoing in connection with the Service
    • +
    • Protect the personal safety of Users of the Service or the public
    • +
    • Protect against legal liability
    • +
    +

    Security of Your Personal Data

    +

    The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

    +

    Children's Privacy

    +

    Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

    +

    If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

    +

    Links to Other Websites

    +

    Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

    +

    We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

    +

    Changes to this Privacy Policy

    +

    We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

    +

    We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

    +

    You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

    +

    Contact Us

    +

    If you have any questions about this Privacy Policy, You can contact us:

    +
      +
    • By email: franpessano1@gmail.com
    • +
    +
    + ) +} + +export default PrivacyPolicy \ No newline at end of file diff --git a/src/Pages/TermsOfUse/TermsOfUse.jsx b/src/Pages/TermsOfUse/TermsOfUse.jsx new file mode 100644 index 0000000..33cbe57 --- /dev/null +++ b/src/Pages/TermsOfUse/TermsOfUse.jsx @@ -0,0 +1,27 @@ +const TermsOfUse = () => { + + return ( +
    +

    Terms and conditions

    +

    These terms and conditions (“Agreement”) set forth the general terms and conditions of your use of the “Telegram to Notion Bot” mobile application (“Mobile Application” or “Service”) and any of its related products and services (collectively, “Services”). This Agreement is legally binding between you (“User”, “you” or “your”) and this Mobile Application developer (“Operator”, “we”, “us” or “our”). If you are entering into this agreement on behalf of a business or other legal entity, you represent that you have the authority to bind such entity to this agreement, in which case the terms “User”, “you” or “your” shall refer to such entity. If you do not have such authority, or if you do not agree with the terms of this agreement, you must not accept this agreement and may not access and use the Mobile Application and Services. By accessing and using the Mobile Application and Services, you acknowledge that you have read, understood, and agree to be bound by the terms of this Agreement. You acknowledge that this Agreement is a contract between you and the Operator, even though it is electronic and is not physically signed by you, and it governs your use of the Mobile Application and Services. This terms and conditions policy was created with the help of the terms and conditions generator.

    +

    Accounts and membership

    +

    You must be at least 16 years of age to use the Mobile Application and Services. By using the Mobile Application and Services and by agreeing to this Agreement you warrant and represent that you are at least 16 years of age.

    +

    If you create an account in the Mobile Application, you are responsible for maintaining the security of your account and you are fully responsible for all activities that occur under the account and any other actions taken in connection with it. We may, but have no obligation to, monitor and review new accounts before you may sign in and start using the Services. Providing false contact information of any kind may result in the termination of your account. You must immediately notify us of any unauthorized uses of your account or any other breaches of security. We will not be liable for any acts or omissions by you, including any damages of any kind incurred as a result of such acts or omissions. We may suspend, disable, or delete your account (or any part thereof) if we determine that you have violated any provision of this Agreement or that your conduct or content would tend to damage our reputation and goodwill. If we delete your account for the foregoing reasons, you may not re-register for our Services. We may block your email address and Internet protocol address to prevent further registration.

    +

    Links to other resources

    +

    Although the Mobile Application and Services may link to other resources (such as websites, mobile applications, etc.), we are not, directly or indirectly, implying any approval, association, sponsorship, endorsement, or affiliation with any linked resource, unless specifically stated herein. We are not responsible for examining or evaluating, and we do not warrant the offerings of, any businesses or individuals or the content of their resources. We do not assume any responsibility or liability for the actions, products, services, and content of any other third parties. You should carefully review the legal statements and other conditions of use of any resource which you access through a link in the Mobile Application. Your linking to any other off-site resources is at your own risk.

    +

    Dispute resolution

    +

    The formation, interpretation, and performance of this Agreement and any disputes arising out of it shall be governed by the substantive and procedural laws of Argentina without regard to its rules on conflicts or choice of law and, to the extent applicable, the laws of Argentina. The exclusive jurisdiction and venue for actions related to the subject matter hereof shall be the courts located in Argentina, and you hereby submit to the personal jurisdiction of such courts. You hereby waive any right to a jury trial in any proceeding arising out of or related to this Agreement. The United Nations Convention on Contracts for the International Sale of Goods does not apply to this Agreement.

    +

    Changes and amendments

    +

    We reserve the right to modify this Agreement or its terms related to the Mobile Application and Services at any time at our discretion. When we do, we will revise the updated date at the bottom of this page. We may also provide notice to you in other ways at our discretion, such as through the contact information you have provided.

    +

    An updated version of this Agreement will be effective immediately upon the posting of the revised Agreement unless otherwise specified. Your continued use of the Mobile Application and Services after the effective date of the revised Agreement (or such other act specified at that time) will constitute your consent to those changes.

    +

    Acceptance of these terms

    +

    You acknowledge that you have read this Agreement and agree to all its terms and conditions. By accessing and using the Mobile Application and Services you agree to be bound by this Agreement. If you do not agree to abide by the terms of this Agreement, you are not authorized to access or use the Mobile Application and Services.

    +

    Contacting us

    +

    If you have any questions, concerns, or complaints regarding this Agreement, we encourage you to contact us using the details below:

    +

    franpessano1@gmail.com

    +

    This document was last updated on April 11, 2022

    +
    + ) +} + +export default TermsOfUse \ No newline at end of file diff --git a/src/styles.css b/src/styles.css index 4dcb48d..d2ab772 100644 --- a/src/styles.css +++ b/src/styles.css @@ -33,8 +33,8 @@ img { } .fade-in { - -webkit-animation: fade-in 0.5s ease-in-out both; - animation: fade-in 0.5s ease-in-out both; + -webkit-animation: fade-in 0.5s cubic-bezier(0.39, 0.575, 0.565, 1) both; + animation: fade-in 0.5s cubic-bezier(0.39, 0.575, 0.565, 1) both; } /* ---------------------------------------------- @@ -65,8 +65,8 @@ img { } } .fade-out { - -webkit-animation: fade-out 1s ease-in-out both; - animation: fade-out 1s ease-in-out both; + -webkit-animation: fade-out 1s ease-out both; + animation: fade-out 1s ease-out both; } /* ---------------------------------------------- From a1f5ce1f9c993bd302407b3cdbc7547c99fa0359 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Mon, 25 Apr 2022 19:43:29 -0300 Subject: [PATCH 7/7] Header bug fix --- src/components/Header/Header.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 11367d0..f69bfb1 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -17,11 +17,11 @@ function Header() { border-bottom: 1px solid #eee; user-select: none; - cursor: pointer; - + .logotype { display: flex; align-items: center; + cursor: pointer; img { width: 80px;