From 7f3b1087a1c780a146665353a3ae6c92c66432ed Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 2 Mar 2022 22:23:03 -0800 Subject: [PATCH 01/25] Fix check-lang script. Ignore all en-GB. --- lang-ignore.json | 5 +++-- scripts/check-lang.js | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lang-ignore.json b/lang-ignore.json index 2d3c38d1..079d8b98 100644 --- a/lang-ignore.json +++ b/lang-ignore.json @@ -9,6 +9,7 @@ "metrics.device.tablet", "metrics.referrers" ], + "en-GB": "*", "fr-FR": ["metrics.actions", "metrics.pages"], "lt-LT": [ "metrics.device.desktop", @@ -31,6 +32,6 @@ "message.powered-by", "metrics.device.desktop", "metrics.device.tablet", - "metrics.filter.raw", - ], + "metrics.filter.raw" + ] } diff --git a/scripts/check-lang.js b/scripts/check-lang.js index 823d7115..a916180a 100644 --- a/scripts/check-lang.js +++ b/scripts/check-lang.js @@ -23,7 +23,7 @@ files.forEach(file => { keys.forEach(key => { const orig = messages[key]; const check = lang[key]; - const ignored = ignore[id]?.includes(key); + const ignored = ignore[id] === '*' || ignore[id]?.includes(key); if (!ignored && (!check || check === orig)) { console.log(chalk.redBright('*'), chalk.greenBright(`${key}:`), orig); @@ -32,7 +32,7 @@ files.forEach(file => { }); if (count === 0) { - console.log('**👍 Complete!**'); + console.log('**Complete!**'); } } }); From fd8a6a39af9e67993a1a0bb1e8d279a67c818958 Mon Sep 17 00:00:00 2001 From: Klooven Date: Thu, 3 Mar 2022 09:35:34 +0000 Subject: [PATCH 02/25] Missing translations added --- lang/fi-FI.json | 22 +++++++++++----------- lang/sv-SE.json | 24 ++++++++++++------------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lang/fi-FI.json b/lang/fi-FI.json index d83731b8..04200fca 100644 --- a/lang/fi-FI.json +++ b/lang/fi-FI.json @@ -4,8 +4,8 @@ "label.add-website": "Lisää verkkosivu", "label.administrator": "Järjestelmänvalvoja", "label.all": "Kaikki", - "label.all-events": "All events", - "label.all-time": "All time", + "label.all-events": "Kaikki tapahtumat", + "label.all-time": "Alusta lähtien", "label.all-websites": "Kaikki verkkosivut", "label.back": "Takaisin", "label.cancel": "Peruuta", @@ -28,7 +28,7 @@ "label.enable-share-url": "Ota jakamisen URL-osoite käyttöön", "label.invalid": "Virheellinen", "label.invalid-domain": "Virheellinen verkkotunnus", - "label.language": "Language", + "label.language": "Kieli", "label.last-days": "Viimeisimmät {x} päivät", "label.last-hours": "Viimeisimmät {x} tunnit", "label.logged-in-as": "Kirjautuneena sisään nimellä {username}", @@ -37,7 +37,7 @@ "label.more": "Lisää", "label.name": "Nimi", "label.new-password": "Uusi salasana", - "label.owner": "Owner", + "label.owner": "Omistaja", "label.password": "Salasana", "label.passwords-dont-match": "Salasanat eivät täsmää", "label.profile": "Profiili", @@ -46,12 +46,12 @@ "label.refresh": "Päivitä", "label.required": "Vaaditaan", "label.reset": "Nollaa", - "label.reset-website": "Reset statistics", + "label.reset-website": "Nollaa tilastot", "label.save": "Tallenna", "label.settings": "Asetukset", "label.share-url": "Jaa URL", "label.single-day": "Yksi päivä", - "label.theme": "Theme", + "label.theme": "Teema", "label.this-month": "Tämä kuukausi", "label.this-week": "Tämä viikko", "label.this-year": "Tämä vuosi", @@ -64,7 +64,7 @@ "label.websites": "Verkkosivut", "message.active-users": "{x} nykyinen {x, plural, one {yksi} other {muut}}", "message.confirm-delete": "Haluatko varmasti poistaa {target}?", - "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?", + "message.confirm-reset": "Haluatko varmasti poistaa sivuston {target} tilastot?", "message.copied": "Kopioitu!", "message.delete-warning": "Kaikki siihen liittyvät tiedot poistetaan.", "message.failure": "Jotain meni väärin.", @@ -78,13 +78,13 @@ "message.no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.", "message.page-not-found": "Sivua ei löydetty.", "message.powered-by": "Voimanlähteenä {name}", - "message.reset-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.", + "message.reset-warning": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana.", "message.save-success": "Tallennettu onnistuneesti.", "message.share-url": "Tämä on julkisesti jaettu URL-osoitteelle {target}.", - "message.toggle-charts": "Toggle charts", + "message.toggle-charts": "Kytke kaaviot päälle/pois", "message.track-stats": "Jos haluat seurata kohteen {target} tilastoja, aseta seuraava koodi verkkosivustosi {head} osioon.", "message.type-delete": "Kirjoita {delete} alla olevaan ruutuun vahvistaaksesi.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Kirjoita {reset} kenttään vahvistaaksesi.", "metrics.actions": "Toiminnat", "metrics.average-visit-time": "Keskimääräinen vierailuaika", "metrics.bounce-rate": "Välitön poistuminen", @@ -99,7 +99,7 @@ "metrics.filter.combined": "Yhdistetty", "metrics.filter.domain-only": "Vain verkkotunnus", "metrics.filter.raw": "Käsittelemätön", - "metrics.languages": "Languages", + "metrics.languages": "Kielet", "metrics.operating-systems": "Käyttöjärjestelmät", "metrics.page-views": "Sivun näyttökertoja", "metrics.pages": "Sivut", diff --git a/lang/sv-SE.json b/lang/sv-SE.json index 0d868f4d..5eb983a9 100644 --- a/lang/sv-SE.json +++ b/lang/sv-SE.json @@ -4,8 +4,8 @@ "label.add-website": "Lägg till webbsajt", "label.administrator": "Administratör", "label.all": "Alla", - "label.all-events": "All events", - "label.all-time": "All time", + "label.all-events": "Alla händelser", + "label.all-time": "Sedan början", "label.all-websites": "Alla sajter", "label.back": "Tillbaka", "label.cancel": "Avbryt", @@ -28,7 +28,7 @@ "label.enable-share-url": "Aktivera delnings-URL", "label.invalid": "Ogiltig", "label.invalid-domain": "Ogiltig domän", - "label.language": "Language", + "label.language": "Språk", "label.last-days": "Senaste {x} dagarna", "label.last-hours": "Senaste {x} timmarna", "label.logged-in-as": "Inloggad som {username}", @@ -37,7 +37,7 @@ "label.more": "Mer", "label.name": "Namn", "label.new-password": "Nytt lösenord", - "label.owner": "Owner", + "label.owner": "Ägare", "label.password": "Lösenord", "label.passwords-dont-match": "Lösenorden är inte samma", "label.profile": "Profil", @@ -46,12 +46,12 @@ "label.refresh": "Uppdatera", "label.required": "Krävs", "label.reset": "Återställ", - "label.reset-website": "Reset statistics", + "label.reset-website": "Återställ statistik", "label.save": "Spara", "label.settings": "Inställningar", "label.share-url": "Delnings-URL", "label.single-day": "En dag", - "label.theme": "Theme", + "label.theme": "Tema", "label.this-month": "Denna månad", "label.this-week": "Denna vecka", "label.this-year": "Detta år", @@ -64,27 +64,27 @@ "label.websites": "Webbsajt", "message.active-users": "{x} {x, plural, one {besökare} other {besökare}} just nu", "message.confirm-delete": "Är du säker på att du vill radera {target}?", - "message.confirm-reset": "Are your sure you want to reset {target}'s statistics?", + "message.confirm-reset": "Är du säker på att du vill återställa statistiken för {target}?", "message.copied": "Kopierad!", "message.delete-warning": "All tillhörande data kommer också raderas.", "message.failure": "Något gick fel.", "message.get-share-url": "Visa delnings-URL", "message.get-tracking-code": "Visa spårningskod", "message.go-to-settings": "Gå till inställningar", - "message.incorrect-username-password": "Felaktikt användarnamn/lösenord.", + "message.incorrect-username-password": "Felaktigt användarnamn/lösenord.", "message.log.visitor": "Besökare från {country} med {browser} på {os} {device}", "message.new-version-available": "En ny version av umami {version} är tillgänglig!", "message.no-data-available": "Ingen data tillgänglig.", "message.no-websites-configured": "Du har inga webbsajter.", "message.page-not-found": "Sidan kan inte hittas.", "message.powered-by": "Drivs av {name}", - "message.reset-warning": "All statistics for this website will be deleted, but your tracking code will remain intact.", + "message.reset-warning": "All statistik för webbsajten tas bort men spårningskoden förblir oförändrad.", "message.save-success": "Sparades!", "message.share-url": "Det här är den offentliga delnings-URL:en {target}.", - "message.toggle-charts": "Toggle charts", + "message.toggle-charts": "Visa/göm grafer", "message.track-stats": "För att spåra statistik för {target}, placera följande kod i {head}-avsnittet på din webbsajt.", "message.type-delete": "Skriv {delete} i rutan nedan för att radera.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Skriv {reset} i rutan nedan för att bekräfta.", "metrics.actions": "Händelser", "metrics.average-visit-time": "Medelbesökstid", "metrics.bounce-rate": "Avvisningfrekvens", @@ -99,7 +99,7 @@ "metrics.filter.combined": "Kombinerade", "metrics.filter.domain-only": "Endast domän", "metrics.filter.raw": "Rådata", - "metrics.languages": "Languages", + "metrics.languages": "Språk", "metrics.operating-systems": "Operativsystem", "metrics.page-views": "Sidvisningar", "metrics.pages": "Sidor", From 2f5d85ce15dccb3f0124c6ba363dbc8e337efc2d Mon Sep 17 00:00:00 2001 From: Klooven Date: Thu, 3 Mar 2022 10:49:38 +0000 Subject: [PATCH 03/25] Proofreading --- lang/fi-FI.json | 32 ++++++++++++++++---------------- lang/sv-SE.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lang/fi-FI.json b/lang/fi-FI.json index 04200fca..eb643478 100644 --- a/lang/fi-FI.json +++ b/lang/fi-FI.json @@ -13,7 +13,7 @@ "label.confirm-password": "Vahvista salasana", "label.copy-to-clipboard": "Kopioi leikepöydälle", "label.current-password": "Nykyinen salasana", - "label.custom-range": "Mukautettu jakso", + "label.custom-range": "Mukautettu ajanjakso", "label.dashboard": "Ohjauspaneeli", "label.date-range": "Ajanjakso", "label.default-date-range": "Oletusajanjakso", @@ -29,8 +29,8 @@ "label.invalid": "Virheellinen", "label.invalid-domain": "Virheellinen verkkotunnus", "label.language": "Kieli", - "label.last-days": "Viimeisimmät {x} päivät", - "label.last-hours": "Viimeisimmät {x} tunnit", + "label.last-days": "Viimeisimmät {x} päivää", + "label.last-hours": "Viimeisimmät {x} tuntia", "label.logged-in-as": "Kirjautuneena sisään nimellä {username}", "label.login": "Kirjaudu sisään", "label.logout": "Kirjaudu ulos", @@ -41,7 +41,7 @@ "label.password": "Salasana", "label.passwords-dont-match": "Salasanat eivät täsmää", "label.profile": "Profiili", - "label.realtime": "Reaaliaikainen", + "label.realtime": "Juuri nyt", "label.realtime-logs": "Reaaliaikaiset lokit", "label.refresh": "Päivitä", "label.required": "Vaaditaan", @@ -62,17 +62,17 @@ "label.username": "Käyttäjänimi", "label.view-details": "Katso tiedot", "label.websites": "Verkkosivut", - "message.active-users": "{x} nykyinen {x, plural, one {yksi} other {muut}}", - "message.confirm-delete": "Haluatko varmasti poistaa {target}?", + "message.active-users": "{x} {x, plural, one {vierailija} other {vierailijaa}}", + "message.confirm-delete": "Haluatko varmasti poistaa sivuston {target}?", "message.confirm-reset": "Haluatko varmasti poistaa sivuston {target} tilastot?", "message.copied": "Kopioitu!", "message.delete-warning": "Kaikki siihen liittyvät tiedot poistetaan.", - "message.failure": "Jotain meni väärin.", + "message.failure": "Jotain meni pieleen.", "message.get-share-url": "Hanki jakamisen URL-osoite", "message.get-tracking-code": "Hanki seurantakoodi", "message.go-to-settings": "Mene asetuksiin", "message.incorrect-username-password": "Väärä käyttäjänimi/salasana.", - "message.log.visitor": "Vierailija maasta {country} käyttäen selainta {browser} {os}-laitteella: {device}", + "message.log.visitor": "Vierailija maasta {country} selaimella {browser} laitteella {os} {device}", "message.new-version-available": "Uusi versio umamista {version} on käytettävissä!", "message.no-data-available": "Tietoja ei ole käytettävissä.", "message.no-websites-configured": "Sinulla ei ole määritettyjä verkkosivustoja.", @@ -80,11 +80,11 @@ "message.powered-by": "Voimanlähteenä {name}", "message.reset-warning": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana.", "message.save-success": "Tallennettu onnistuneesti.", - "message.share-url": "Tämä on julkisesti jaettu URL-osoitteelle {target}.", + "message.share-url": "Tämä on julkisesti jaettu URL sivustolle {target}.", "message.toggle-charts": "Kytke kaaviot päälle/pois", - "message.track-stats": "Jos haluat seurata kohteen {target} tilastoja, aseta seuraava koodi verkkosivustosi {head} osioon.", - "message.type-delete": "Kirjoita {delete} alla olevaan ruutuun vahvistaaksesi.", - "message.type-reset": "Kirjoita {reset} kenttään vahvistaaksesi.", + "message.track-stats": "Jos haluat seurata sivuston {target} tilastoja, aseta seuraava koodi verkkosivustosi {head}-osioon.", + "message.type-delete": "Kirjoita {delete} alla olevaan kenttään vahvistaaksesi.", + "message.type-reset": "Kirjoita {reset} alla olevaan kenttään vahvistaaksesi.", "metrics.actions": "Toiminnat", "metrics.average-visit-time": "Keskimääräinen vierailuaika", "metrics.bounce-rate": "Välitön poistuminen", @@ -92,7 +92,7 @@ "metrics.countries": "Maat", "metrics.device.desktop": "Pöytäkone", "metrics.device.laptop": "Kannettava tietokone", - "metrics.device.mobile": "Mobiili", + "metrics.device.mobile": "Puhelin", "metrics.device.tablet": "Tabletti", "metrics.devices": "Laitteet", "metrics.events": "Tapahtumat", @@ -101,10 +101,10 @@ "metrics.filter.raw": "Käsittelemätön", "metrics.languages": "Kielet", "metrics.operating-systems": "Käyttöjärjestelmät", - "metrics.page-views": "Sivun näyttökertoja", + "metrics.page-views": "Sivun näyttökerrat", "metrics.pages": "Sivut", "metrics.referrers": "Viittaajat", - "metrics.unique-visitors": "Uniikit vierailijat", - "metrics.views": "Näyttökertoja", + "metrics.unique-visitors": "Yksittäiset kävijät", + "metrics.views": "Näyttökerrat", "metrics.visitors": "Vierailijat" } diff --git a/lang/sv-SE.json b/lang/sv-SE.json index 5eb983a9..2cc8ab6f 100644 --- a/lang/sv-SE.json +++ b/lang/sv-SE.json @@ -80,7 +80,7 @@ "message.powered-by": "Drivs av {name}", "message.reset-warning": "All statistik för webbsajten tas bort men spårningskoden förblir oförändrad.", "message.save-success": "Sparades!", - "message.share-url": "Det här är den offentliga delnings-URL:en {target}.", + "message.share-url": "Det här är den offentliga delnings-URL:en för {target}.", "message.toggle-charts": "Visa/göm grafer", "message.track-stats": "För att spåra statistik för {target}, placera följande kod i {head}-avsnittet på din webbsajt.", "message.type-delete": "Skriv {delete} i rutan nedan för att radera.", From 33c921a32fa1fc232c49d42bfa5b20d462c5024d Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 3 Mar 2022 14:23:57 -0800 Subject: [PATCH 04/25] Fix update notice styling. --- components/common/UpdateNotice.js | 2 +- components/common/UpdateNotice.module.css | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/components/common/UpdateNotice.js b/components/common/UpdateNotice.js index bc6eacc4..a31c2abf 100644 --- a/components/common/UpdateNotice.js +++ b/components/common/UpdateNotice.js @@ -34,7 +34,7 @@ export default function UpdateNotice() { values={{ version: `v${latest}` }} /> - + diff --git a/components/common/UpdateNotice.module.css b/components/common/UpdateNotice.module.css index 52a97c3b..52bac611 100644 --- a/components/common/UpdateNotice.module.css +++ b/components/common/UpdateNotice.module.css @@ -2,12 +2,17 @@ display: flex; justify-content: center; align-items: center; - padding-top: 10px; - font-size: var(--font-size-small); - font-weight: 600; + padding-top: 20px; } .message { + font-size: var(--font-size-small); + font-weight: 600; + flex: 1; text-align: center; margin-right: 20px; } + +.buttons { + flex: 0; +} From 20622116a8a5e8defc9adb60ea63dba0cf845db3 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 3 Mar 2022 19:45:49 -0800 Subject: [PATCH 05/25] New Dashboard component. --- components/common/MenuButton.js | 3 +- components/metrics/ActiveUsers.js | 3 +- components/pages/Dashboard.js | 46 +++++++++++++++++++ components/pages/WebsiteList.js | 39 +++------------- components/pages/WebsiteList.module.css | 14 +----- .../settings/DashboardSettingsButton.js | 4 +- components/settings/LanguageButton.js | 1 + components/settings/UserButton.js | 1 + pages/dashboard/[[...id]].js | 8 +--- store/app.js | 2 +- 10 files changed, 64 insertions(+), 57 deletions(-) create mode 100644 components/pages/Dashboard.js diff --git a/components/common/MenuButton.js b/components/common/MenuButton.js index eb8d62fe..efe150f0 100644 --- a/components/common/MenuButton.js +++ b/components/common/MenuButton.js @@ -11,6 +11,7 @@ function MenuButton({ value, options, buttonClassName, + buttonVariant, menuClassName, menuPosition = 'bottom', menuAlign = 'right', @@ -43,7 +44,7 @@ function MenuButton({ icon={icon} className={classNames(styles.button, buttonClassName, { [styles.open]: showMenu })} onClick={toggleMenu} - variant="light" + variant={buttonVariant} > {!hideLabel && (
{renderValue ? renderValue(selectedOption) : value}
diff --git a/components/metrics/ActiveUsers.js b/components/metrics/ActiveUsers.js index 41ab7694..b739861b 100644 --- a/components/metrics/ActiveUsers.js +++ b/components/metrics/ActiveUsers.js @@ -9,7 +9,8 @@ import styles from './ActiveUsers.module.css'; export default function ActiveUsers({ websiteId, className, value, interval = 60000 }) { const shareToken = useShareToken(); - const { data } = useFetch(!value && `/website/${websiteId}/active`, { + const url = value !== undefined && websiteId ? `/website/${websiteId}/active` : null; + const { data } = useFetch(url, { interval, headers: { [TOKEN_HEADER]: shareToken?.token }, }); diff --git a/components/pages/Dashboard.js b/components/pages/Dashboard.js new file mode 100644 index 00000000..4ac7f85d --- /dev/null +++ b/components/pages/Dashboard.js @@ -0,0 +1,46 @@ +import { useState } from 'react'; +import { FormattedMessage } from 'react-intl'; +import { useRouter } from 'next/router'; +import Page from 'components/layout/Page'; +import PageHeader from 'components/layout/PageHeader'; +import WebsiteList from 'components/pages/WebsiteList'; +import Button from 'components/common/Button'; +import DashboardSettingsButton from 'components/settings/DashboardSettingsButton'; +import useFetch from 'hooks/useFetch'; +import useStore from 'store/app'; +import styles from './WebsiteList.module.css'; + +const selector = state => state.dashboard; + +export default function Dashboard() { + const router = useRouter(); + const { id } = router.query; + const userId = id?.[0]; + const store = useStore(selector); + const { showCharts, limit } = store; + const [max, setMax] = useState(limit); + const { data } = useFetch('/websites', { params: { user_id: userId } }); + + function handleMore() { + setMax(max + limit); + } + + if (!data) { + return null; + } + + return ( + + +
Dashboard
+ +
+ + {max < data.length && ( + + )} +
+ ); +} diff --git a/components/pages/WebsiteList.js b/components/pages/WebsiteList.js index f2094f03..e2cba6b2 100644 --- a/components/pages/WebsiteList.js +++ b/components/pages/WebsiteList.js @@ -1,32 +1,13 @@ -import React, { useState } from 'react'; import { FormattedMessage } from 'react-intl'; import Link from 'components/common/Link'; import WebsiteChart from 'components/metrics/WebsiteChart'; import Page from 'components/layout/Page'; import EmptyPlaceholder from 'components/common/EmptyPlaceholder'; -import useFetch from 'hooks/useFetch'; -import DashboardSettingsButton from 'components/settings/DashboardSettingsButton'; -import Button from 'components/common/Button'; -import useStore from 'store/app'; import Arrow from 'assets/arrow-right.svg'; import styles from './WebsiteList.module.css'; -const selector = state => state.dashboard; - -export default function WebsiteList({ userId }) { - const { data } = useFetch('/websites', { params: { user_id: userId } }); - const { showCharts, limit } = useStore(selector); - const [max, setMax] = useState(limit); - - function handleMore() { - setMax(max + limit); - } - - if (!data) { - return null; - } - - if (data.length === 0) { +export default function WebsiteList({ websites, showCharts, limit }) { + if (websites.length === 0) { return ( -
- -
- {data.map(({ website_id, name, domain }, index) => - index < max ? ( +
+ {websites.map(({ website_id, name, domain }, index) => + index < limit ? (
) : null, )} - {max < data.length && ( - - )} - +
); } diff --git a/components/pages/WebsiteList.module.css b/components/pages/WebsiteList.module.css index d9899574..fc6a94c2 100644 --- a/components/pages/WebsiteList.module.css +++ b/components/pages/WebsiteList.module.css @@ -7,17 +7,5 @@ .website:last-child { border-bottom: 0; - margin-bottom: 0; -} - -.menubar { - display: flex; - align-items: center; - justify-content: flex-end; - padding-top: 10px; -} - -.button { - align-self: center; - margin-bottom: 40px; + margin-bottom: 20px; } diff --git a/components/settings/DashboardSettingsButton.js b/components/settings/DashboardSettingsButton.js index 41dc3bf2..8c04aa00 100644 --- a/components/settings/DashboardSettingsButton.js +++ b/components/settings/DashboardSettingsButton.js @@ -2,7 +2,7 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import MenuButton from 'components/common/MenuButton'; import Gear from 'assets/gear.svg'; -import useStore, { setDashboard } from 'store/app'; +import useStore, { setDashboard, defaultDashboardConfig } from 'store/app'; const selector = state => state.dashboard; @@ -18,7 +18,7 @@ export default function DashboardSettingsButton() { function handleSelect(value) { if (value === 'charts') { - setDashboard({ showCharts: !settings.showCharts }); + setDashboard({ ...defaultDashboardConfig, showCharts: !settings.showCharts }); } //setDashboard(value); } diff --git a/components/settings/LanguageButton.js b/components/settings/LanguageButton.js index 5cce137a..8df96a20 100644 --- a/components/settings/LanguageButton.js +++ b/components/settings/LanguageButton.js @@ -19,6 +19,7 @@ export default function LanguageButton() { options={menuOptions} value={locale} menuClassName={styles.menu} + buttonVariant="light" onSelect={handleSelect} hideLabel /> diff --git a/components/settings/UserButton.js b/components/settings/UserButton.js index cba96234..27d9890c 100644 --- a/components/settings/UserButton.js +++ b/components/settings/UserButton.js @@ -43,6 +43,7 @@ export default function UserButton() { } size="large" />} value={} size="small" />} + buttonVariant="light" options={menuOptions} onSelect={handleSelect} /> diff --git a/pages/dashboard/[[...id]].js b/pages/dashboard/[[...id]].js index d3ce1301..452a425e 100644 --- a/pages/dashboard/[[...id]].js +++ b/pages/dashboard/[[...id]].js @@ -1,14 +1,10 @@ import React from 'react'; -import { useRouter } from 'next/router'; import Layout from 'components/layout/Layout'; -import WebsiteList from 'components/pages/WebsiteList'; +import Dashboard from 'components/pages/Dashboard'; import useRequireLogin from 'hooks/useRequireLogin'; export default function DashboardPage() { const { loading } = useRequireLogin(); - const router = useRouter(); - const { id } = router.query; - const userId = id?.[0]; if (loading) { return null; @@ -16,7 +12,7 @@ export default function DashboardPage() { return ( - + ); } diff --git a/store/app.js b/store/app.js index 4182abed..6aa85fa6 100644 --- a/store/app.js +++ b/store/app.js @@ -9,7 +9,7 @@ import { } from 'lib/constants'; import { getItem } from 'lib/web'; -const defaultDashboardConfig = { +export const defaultDashboardConfig = { showCharts: true, limit: DEFAULT_WEBSITE_LIMIT, }; From a71377eca02be27bdbb1050d4f97812f5d76d8ab Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 4 Mar 2022 18:20:13 -0800 Subject: [PATCH 06/25] Updated language files. --- lang/ar-SA.json | 2 +- lang/cs-CZ.json | 2 +- lang/da-DK.json | 2 +- lang/el-GR.json | 2 +- lang/fa-IR.json | 2 +- lang/fo-FO.json | 2 +- lang/he-IL.json | 2 +- lang/hi-IN.json | 2 +- lang/hu-HU.json | 2 +- lang/id-ID.json | 2 +- lang/ja-JP.json | 2 +- lang/ko-KR.json | 2 +- lang/mn-MN.json | 2 +- lang/ms-MY.json | 2 +- lang/nb-NO.json | 2 +- lang/nl-NL.json | 2 +- lang/pl-PL.json | 2 +- lang/pt-BR.json | 2 +- lang/sk-SK.json | 2 +- lang/sl-SI.json | 2 +- lang/ta-IN.json | 2 +- lang/tr-TR.json | 2 +- lang/vi-VN.json | 2 +- lang/zh-CN.json | 2 +- lang/zh-TW.json | 2 +- public/messages/ar-SA.json | 4 +-- public/messages/cs-CZ.json | 4 +-- public/messages/da-DK.json | 4 +-- public/messages/el-GR.json | 4 +-- public/messages/fa-IR.json | 10 +----- public/messages/fi-FI.json | 66 +++++++++++++++++++------------------- public/messages/fo-FO.json | 4 +-- public/messages/he-IL.json | 4 +-- public/messages/hi-IN.json | 4 +-- public/messages/hu-HU.json | 4 +-- public/messages/id-ID.json | 4 +-- public/messages/ja-JP.json | 4 +-- public/messages/ko-KR.json | 4 +-- public/messages/mn-MN.json | 4 +-- public/messages/ms-MY.json | 4 +-- public/messages/nb-NO.json | 4 +-- public/messages/nl-NL.json | 2 +- public/messages/pl-PL.json | 4 +-- public/messages/pt-BR.json | 4 +-- public/messages/sk-SK.json | 4 +-- public/messages/sl-SI.json | 4 +-- public/messages/sv-SE.json | 30 ++++++++--------- public/messages/ta-IN.json | 4 +-- public/messages/tr-TR.json | 4 +-- public/messages/vi-VN.json | 4 +-- public/messages/zh-CN.json | 4 +-- public/messages/zh-TW.json | 4 +-- 52 files changed, 121 insertions(+), 129 deletions(-) diff --git a/lang/ar-SA.json b/lang/ar-SA.json index eabad373..19a3689b 100644 --- a/lang/ar-SA.json +++ b/lang/ar-SA.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "لتتبع الاحصاىيات لـ {target}, ضع الكود التالي في منطقة {head} في موقعك.", "message.type-delete": "اكتب {delete} في الحقل التالي لتأكيد الحذف.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "اكتب {reset} في الحقل التالي لتأكيد الحذف.", "metrics.actions": "اجراءات", "metrics.average-visit-time": "متوسط وقت الزيارة", "metrics.bounce-rate": "معدل الارتداد", diff --git a/lang/cs-CZ.json b/lang/cs-CZ.json index 9963efce..eac8cc06 100644 --- a/lang/cs-CZ.json +++ b/lang/cs-CZ.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Pro sledování návštěv na {target}, přidejte následující kód do {head} části vašeho webu.", "message.type-delete": "Napište {delete} pro potvrzení.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Napište {reset} pro potvrzení.", "metrics.actions": "Akce", "metrics.average-visit-time": "Průměrný čas návštěvy", "metrics.bounce-rate": "Okamžité opuštění", diff --git a/lang/da-DK.json b/lang/da-DK.json index 630af55f..d143fdde 100644 --- a/lang/da-DK.json +++ b/lang/da-DK.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "For at spore statistik for {target} skal du placere følgende kode i {head} sektionen på dit websted.", "message.type-delete": "Skriv {delete} i boksen nedenfor, for at bekræfte.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Skriv {reset} i boksen nedenfor, for at bekræfte.", "metrics.actions": "Handlinger", "metrics.average-visit-time": "Gennemsnitlig besøgstid", "metrics.bounce-rate": "Afvisningsprocent", diff --git a/lang/el-GR.json b/lang/el-GR.json index 80559577..205133d2 100644 --- a/lang/el-GR.json +++ b/lang/el-GR.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Για να παρακολουθείτε στατιστικά στοιχεία για {target}, τοποθετήστε τον ακόλουθο κώδικα στην ενότητα {head} του ιστότοπού σας.", "message.type-delete": "Πληκτρολογήστε {delete} στο παρακάτω πλαίσιο για επιβεβαίωση.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Πληκτρολογήστε {reset} στο παρακάτω πλαίσιο για επιβεβαίωση.", "metrics.actions": "Ενέργειες", "metrics.average-visit-time": "Μέσος χρόνος επίσκεψης", "metrics.bounce-rate": "Ποσοστό αναπήδησης", diff --git a/lang/fa-IR.json b/lang/fa-IR.json index b5594762..36c1dedc 100644 --- a/lang/fa-IR.json +++ b/lang/fa-IR.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "برای ردیابی آمار {target}, کد روبرو را در قسمت {head} وب‌سایت قرار دهید.", "message.type-delete": "جهت اطمینان '{delete}' را در کادر زیر بنویسید.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "جهت اطمینان '{reset}' را در کادر زیر بنویسید.", "metrics.actions": "اقدامات", "metrics.average-visit-time": "میانگین زمان بازدید", "metrics.bounce-rate": "نرخ Bounce", diff --git a/lang/fo-FO.json b/lang/fo-FO.json index 039c7948..698d6dd2 100644 --- a/lang/fo-FO.json +++ b/lang/fo-FO.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Fyri at spora hagtøl fyri {target}, koyr kotuna í {head} partin á tínari heimasíðu.", "message.type-delete": "Skriva {delete} í feltið fyri at vátta", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Skriva {reset} í feltið fyri at vátta", "metrics.actions": "Gerðir", "metrics.average-visit-time": "Miðal vitjurnartíð ", "metrics.bounce-rate": "Bounce prosenttal", diff --git a/lang/he-IL.json b/lang/he-IL.json index d2cbb132..2b384898 100644 --- a/lang/he-IL.json +++ b/lang/he-IL.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "יש להוסיף את הקוד הבא לאזור ה-{head} של האתר", "message.type-delete": "הקלידו {delete} בתיבה על מנת לאשר", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "הקלידו {reset} בתיבה על מנת לאשר", "metrics.actions": "פעולות", "metrics.average-visit-time": "זמן ביקור ממוצע", "metrics.bounce-rate": "Bounce rate", diff --git a/lang/hi-IN.json b/lang/hi-IN.json index cb0643e2..56bab323 100644 --- a/lang/hi-IN.json +++ b/lang/hi-IN.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target} के आँकड़ों को ट्रैक करने के लिए, अपनी वेबसाइट के {head} अनुभाग में निम्नलिखित कोड रखें।", "message.type-delete": "पुष्टि करने के लिए नीचे दिए गए बॉक्स में {delete} टाइप करें।", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "ुष्टि करने के लिए नीचे दिए गए बॉक्स में {reset} टाइप करें।", "metrics.actions": "कार्य", "metrics.average-visit-time": "औसत दृश्य समय", "metrics.bounce-rate": "उछाल दर", diff --git a/lang/hu-HU.json b/lang/hu-HU.json index 63bec74c..df0c97ad 100644 --- a/lang/hu-HU.json +++ b/lang/hu-HU.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target} statisztikáinak nyomon követéséhez, helyezd el az alábbi kódot a weboldalad {head} részébe.", "message.type-delete": "Megerősítéshez írd be az alábbi mezőbe azt, hogy {delete}.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Megerősítéshez írd be az alábbi mezőbe azt, hogy {reset}.", "metrics.actions": "Műveletek", "metrics.average-visit-time": "Átlagos látogatási idő", "metrics.bounce-rate": "Visszafordulási arány", diff --git a/lang/id-ID.json b/lang/id-ID.json index 20a8cc51..8da792d4 100644 --- a/lang/id-ID.json +++ b/lang/id-ID.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Untuk melacak statistik {target}, tempatkan kode berikut di bagian {head} situs web anda.", "message.type-delete": "Ketikkan {delete} pada kotak di bawah untuk konfirmasi.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Ketikkan {reset} pada kotak di bawah untuk konfirmasi.", "metrics.actions": "Aksi", "metrics.average-visit-time": "Waktu kunjungan rata-rata", "metrics.bounce-rate": "Rasio pentalan", diff --git a/lang/ja-JP.json b/lang/ja-JP.json index fbdd9c7b..8106fe73 100644 --- a/lang/ja-JP.json +++ b/lang/ja-JP.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target}のアクセス解析を開始するには、次のコードをWebサイトの{head}セクションへ追加してください。", "message.type-delete": "確認のため、下のフォームに{delete}と入力してください。", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "確認のため、下のフォームに{reset}と入力してください。", "metrics.actions": "アクション", "metrics.average-visit-time": "平均滞在時間", "metrics.bounce-rate": "直帰率", diff --git a/lang/ko-KR.json b/lang/ko-KR.json index 5043d133..c3c4b877 100644 --- a/lang/ko-KR.json +++ b/lang/ko-KR.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target}에 대한 통계를 추적하려면 웹사이트의 {head} 섹션에 다음 코드를 입력하십시오.", "message.type-delete": "확인을 위해 아래 박스에 {delete}값을 입력하십시오.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "확인을 위해 아래 박스에 {reset}값을 입력하십시오.", "metrics.actions": "액션", "metrics.average-visit-time": "평균 방문 시간", "metrics.bounce-rate": "이탈률", diff --git a/lang/mn-MN.json b/lang/mn-MN.json index 1e9f7f9d..ca071e2f 100644 --- a/lang/mn-MN.json +++ b/lang/mn-MN.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target} вебийн статистикийг бүртгэхийн тулд доорх кодыг вебийнхээ {head} хэсэгт байрлуулна уу.", "message.type-delete": "Доорх хэсэгт {delete} гэж бичиж баталгаажуулна уу.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Доорх хэсэгт {reset} гэж бичиж баталгаажуулна уу.", "metrics.actions": "Үйлдлүүд", "metrics.average-visit-time": "Зочилсон дундаж хугацаа", "metrics.bounce-rate": "Нэг хуудас үзээд гарсан", diff --git a/lang/ms-MY.json b/lang/ms-MY.json index ca4ed5c1..be44f363 100644 --- a/lang/ms-MY.json +++ b/lang/ms-MY.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Untuk menjejak statistik bagi {target}, letakkan kod berikut di bahagian {head} laman web anda.", "message.type-delete": "Taip {delete} di dalam kotak di bawah untuk pengesahan.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Taip {reset} di dalam kotak di bawah untuk pengesahan.", "metrics.actions": "Aksi", "metrics.average-visit-time": "Purata tempoh masa lawatan", "metrics.bounce-rate": "Kadar lantunan", diff --git a/lang/nb-NO.json b/lang/nb-NO.json index 8c745b8f..95df6dd5 100644 --- a/lang/nb-NO.json +++ b/lang/nb-NO.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "For å spore statistikk for {target}, plasser følgende kode i {head}-delen av nettstedet ditt.", "message.type-delete": "Skriv inn {delete} i boksen nedenfor for å bekrefte.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Skriv inn {reset} i boksen nedenfor for å bekrefte.", "metrics.actions": "Handlinger", "metrics.average-visit-time": "Gjennomsnittlig besøkelsestid", "metrics.bounce-rate": "Avvisningsfrekvens", diff --git a/lang/nl-NL.json b/lang/nl-NL.json index 61083dc3..ae9cf6da 100644 --- a/lang/nl-NL.json +++ b/lang/nl-NL.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Om statistieken voor {target} bij te houden, plaats je de volgende code in het {head} gedeelte van je website.", "message.type-delete": "Type {delete} in onderstaande veld om dit te bevestigen.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Type {reset} in onderstaande veld om dit te bevestigen.", "metrics.actions": "Acties", "metrics.average-visit-time": "Gemiddelde bezoektijd", "metrics.bounce-rate": "Bouncepercentage", diff --git a/lang/pl-PL.json b/lang/pl-PL.json index 1b0fbdee..5856ac9c 100644 --- a/lang/pl-PL.json +++ b/lang/pl-PL.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Aby śledzić statystyki dla {target}, umieść poniższy kod w sekcji {head} swojej witryny.", "message.type-delete": "Wpisz {delete} w polu poniżej, aby potwierdzić.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Wpisz {reset} w polu poniżej, aby potwierdzić.", "metrics.actions": "Działania", "metrics.average-visit-time": "Średni czas wizyty", "metrics.bounce-rate": "Współczynnik odrzuceń", diff --git a/lang/pt-BR.json b/lang/pt-BR.json index cea0fe61..ed04c870 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Para gerar estatística para {target}, coloque o seguinte código no {head} do html do seu site.", "message.type-delete": "Escreva {delete} abaixo para continuar.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Escreva {reset} abaixo para continuar.", "metrics.actions": "Ações", "metrics.average-visit-time": "Tempo médio da visita", "metrics.bounce-rate": "Taxa de rejeição", diff --git a/lang/sk-SK.json b/lang/sk-SK.json index 45f2f7e3..78af4751 100644 --- a/lang/sk-SK.json +++ b/lang/sk-SK.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Pre sledovanie návštev na {target}, pridajte následujúci kód do {head} časti vašeho webu.", "message.type-delete": "Napíšte {delete} pre potvrdenie.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Napíšte {reset} pre potvrdenie.", "metrics.actions": "Akcie", "metrics.average-visit-time": "Priemerný čas návštevy", "metrics.bounce-rate": "Okamžité opustenie", diff --git a/lang/sl-SI.json b/lang/sl-SI.json index 003e4945..059ab473 100644 --- a/lang/sl-SI.json +++ b/lang/sl-SI.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Če želite spremljati statistične podatke za {target}, v {head} del vašega spletnega mesta namestite naslednjo kodo.", "message.type-delete": "V spodnje polje vnesite {delete} za potrditev.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "V spodnje polje vnesite {reset} za potrditev.", "metrics.actions": "Dejanja", "metrics.average-visit-time": "Povprečni čas obiska", "metrics.bounce-rate": "Zapustna stopnja", diff --git a/lang/ta-IN.json b/lang/ta-IN.json index e02cb322..2917cddb 100644 --- a/lang/ta-IN.json +++ b/lang/ta-IN.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target}க்கான புள்ளிவிவரங்களைக் கண்காணிக்க, {head}ல் பின்வரும் குறியீட்டை வைக்கவும்.", "message.type-delete": "உறுதிப்படுத்த கீழே உள்ள பெட்டியில் {delete} என தட்டச்சு செய்க.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "உறுதிப்படுத்த கீழே உள்ள பெட்டியில் {reset} என தட்டச்சு செய்க.", "metrics.actions": "செயல்கள்", "metrics.average-visit-time": "சராசரி வருகை நேரம்", "metrics.bounce-rate": "துள்ளல் விகிதம்", diff --git a/lang/tr-TR.json b/lang/tr-TR.json index fed17bc8..dcc88fdc 100644 --- a/lang/tr-TR.json +++ b/lang/tr-TR.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "{target} alanı adı istatistiklerini takip etmek için, aşağıdaki kodu web sitenizin {head} bloğuna yerleştirin.", "message.type-delete": "Onaylamak için kutuya {delete} yazın.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Onaylamak için kutuya {reset} yazın.", "metrics.actions": "Hareketler", "metrics.average-visit-time": "Ortalama ziyaret süresi", "metrics.bounce-rate": "Çıkma oranı", diff --git a/lang/vi-VN.json b/lang/vi-VN.json index 0daec1ba..7e454641 100644 --- a/lang/vi-VN.json +++ b/lang/vi-VN.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "Để theo dõi {target}, dán mã theo dõi vào {head} của website bạn.", "message.type-delete": "Nhập {delete} bên dưới để xác nhận.", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "Nhập {reset} bên dưới để xác nhận.", "metrics.actions": "Hành động", "metrics.average-visit-time": "Thời gian truy cập trung bình", "metrics.bounce-rate": "Tỷ lệ thoát trang", diff --git a/lang/zh-CN.json b/lang/zh-CN.json index 832e1409..2efe028c 100644 --- a/lang/zh-CN.json +++ b/lang/zh-CN.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "把以下代码放到你的网站的 {head} 部分来收集 {target} 的数据。", "message.type-delete": "在下方输入框输入 {delete} 以确认删除。", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "在下方输入框输入 {reset} 以确认删除。", "metrics.actions": "用户行为", "metrics.average-visit-time": "平均访问时间", "metrics.bounce-rate": "跳出率", diff --git a/lang/zh-TW.json b/lang/zh-TW.json index 024a6d75..280dd9ad 100644 --- a/lang/zh-TW.json +++ b/lang/zh-TW.json @@ -84,7 +84,7 @@ "message.toggle-charts": "Toggle charts", "message.track-stats": "將以下代碼放入被設定網站的 {head} 部分來收集 {target} 的資料。", "message.type-delete": "在下方空格輸入 {delete} 確認", - "message.type-reset": "Type {reset} in the box below to confirm.", + "message.type-reset": "在下方空格輸入 {reset} 確認", "metrics.actions": "用戶行為", "metrics.average-visit-time": "平均訪問時間", "metrics.bounce-rate": "跳出率", diff --git a/public/messages/ar-SA.json b/public/messages/ar-SA.json index 4380f71d..d49db52f 100644 --- a/public/messages/ar-SA.json +++ b/public/messages/ar-SA.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "اكتب " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " في الحقل التالي لتأكيد الحذف." } ], "metrics.actions": [ diff --git a/public/messages/cs-CZ.json b/public/messages/cs-CZ.json index 1e61e4cb..f1055112 100644 --- a/public/messages/cs-CZ.json +++ b/public/messages/cs-CZ.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Napište " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " pro potvrzení." } ], "metrics.actions": [ diff --git a/public/messages/da-DK.json b/public/messages/da-DK.json index a9117023..2e281ae5 100644 --- a/public/messages/da-DK.json +++ b/public/messages/da-DK.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Skriv " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " i boksen nedenfor, for at bekræfte." } ], "metrics.actions": [ diff --git a/public/messages/el-GR.json b/public/messages/el-GR.json index b017fc84..4c2fa2ac 100644 --- a/public/messages/el-GR.json +++ b/public/messages/el-GR.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Πληκτρολογήστε " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " στο παρακάτω πλαίσιο για επιβεβαίωση." } ], "metrics.actions": [ diff --git a/public/messages/fa-IR.json b/public/messages/fa-IR.json index 8cff4cf6..15b22079 100644 --- a/public/messages/fa-IR.json +++ b/public/messages/fa-IR.json @@ -640,15 +640,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " - }, - { - "type": 1, - "value": "reset" - }, - { - "type": 0, - "value": " in the box below to confirm." + "value": "جهت اطمینان {reset} را در کادر زیر بنویسید." } ], "metrics.actions": [ diff --git a/public/messages/fi-FI.json b/public/messages/fi-FI.json index 39d0d764..da6c9b95 100644 --- a/public/messages/fi-FI.json +++ b/public/messages/fi-FI.json @@ -32,13 +32,13 @@ "label.all-events": [ { "type": 0, - "value": "All events" + "value": "Kaikki tapahtumat" } ], "label.all-time": [ { "type": 0, - "value": "All time" + "value": "Alusta lähtien" } ], "label.all-websites": [ @@ -86,7 +86,7 @@ "label.custom-range": [ { "type": 0, - "value": "Mukautettu jakso" + "value": "Mukautettu ajanjakso" } ], "label.dashboard": [ @@ -176,7 +176,7 @@ "label.language": [ { "type": 0, - "value": "Language" + "value": "Kieli" } ], "label.last-days": [ @@ -190,7 +190,7 @@ }, { "type": 0, - "value": " päivät" + "value": " päivää" } ], "label.last-hours": [ @@ -204,7 +204,7 @@ }, { "type": 0, - "value": " tunnit" + "value": " tuntia" } ], "label.logged-in-as": [ @@ -250,7 +250,7 @@ "label.owner": [ { "type": 0, - "value": "Owner" + "value": "Omistaja" } ], "label.password": [ @@ -274,7 +274,7 @@ "label.realtime": [ { "type": 0, - "value": "Reaaliaikainen" + "value": "Juuri nyt" } ], "label.realtime-logs": [ @@ -304,7 +304,7 @@ "label.reset-website": [ { "type": 0, - "value": "Reset statistics" + "value": "Nollaa tilastot" } ], "label.save": [ @@ -334,7 +334,7 @@ "label.theme": [ { "type": 0, - "value": "Theme" + "value": "Teema" } ], "label.this-month": [ @@ -404,7 +404,7 @@ }, { "type": 0, - "value": " nykyinen " + "value": " " }, { "offset": 0, @@ -413,7 +413,7 @@ "value": [ { "type": 0, - "value": "yksi" + "value": "vierailija" } ] }, @@ -421,7 +421,7 @@ "value": [ { "type": 0, - "value": "muut" + "value": "vierailijaa" } ] } @@ -434,7 +434,7 @@ "message.confirm-delete": [ { "type": 0, - "value": "Haluatko varmasti poistaa " + "value": "Haluatko varmasti poistaa sivuston " }, { "type": 1, @@ -448,7 +448,7 @@ "message.confirm-reset": [ { "type": 0, - "value": "Are your sure you want to reset " + "value": "Haluatko varmasti poistaa sivuston " }, { "type": 1, @@ -456,7 +456,7 @@ }, { "type": 0, - "value": "'s statistics?" + "value": " tilastot?" } ], "message.copied": [ @@ -474,7 +474,7 @@ "message.failure": [ { "type": 0, - "value": "Jotain meni väärin." + "value": "Jotain meni pieleen." } ], "message.get-share-url": [ @@ -512,7 +512,7 @@ }, { "type": 0, - "value": " käyttäen selainta " + "value": " selaimella " }, { "type": 1, @@ -520,7 +520,7 @@ }, { "type": 0, - "value": " " + "value": " laitteella " }, { "type": 1, @@ -528,7 +528,7 @@ }, { "type": 0, - "value": "-laitteella: " + "value": " " }, { "type": 1, @@ -580,7 +580,7 @@ "message.reset-warning": [ { "type": 0, - "value": "All statistics for this website will be deleted, but your tracking code will remain intact." + "value": "Kaikki sivuston tilastot poistetaan, mutta seurantakoodi pysyy muuttumattomana." } ], "message.save-success": [ @@ -592,7 +592,7 @@ "message.share-url": [ { "type": 0, - "value": "Tämä on julkisesti jaettu URL-osoitteelle " + "value": "Tämä on julkisesti jaettu URL sivustolle " }, { "type": 1, @@ -606,13 +606,13 @@ "message.toggle-charts": [ { "type": 0, - "value": "Toggle charts" + "value": "Kytke kaaviot päälle/pois" } ], "message.track-stats": [ { "type": 0, - "value": "Jos haluat seurata kohteen " + "value": "Jos haluat seurata sivuston " }, { "type": 1, @@ -628,7 +628,7 @@ }, { "type": 0, - "value": " osioon." + "value": "-osioon." } ], "message.type-delete": [ @@ -642,13 +642,13 @@ }, { "type": 0, - "value": " alla olevaan ruutuun vahvistaaksesi." + "value": " alla olevaan kenttään vahvistaaksesi." } ], "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Kirjoita " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " alla olevaan kenttään vahvistaaksesi." } ], "metrics.actions": [ @@ -704,7 +704,7 @@ "metrics.device.mobile": [ { "type": 0, - "value": "Mobiili" + "value": "Puhelin" } ], "metrics.device.tablet": [ @@ -746,7 +746,7 @@ "metrics.languages": [ { "type": 0, - "value": "Languages" + "value": "Kielet" } ], "metrics.operating-systems": [ @@ -758,7 +758,7 @@ "metrics.page-views": [ { "type": 0, - "value": "Sivun näyttökertoja" + "value": "Sivun näyttökerrat" } ], "metrics.pages": [ @@ -776,13 +776,13 @@ "metrics.unique-visitors": [ { "type": 0, - "value": "Uniikit vierailijat" + "value": "Yksittäiset kävijät" } ], "metrics.views": [ { "type": 0, - "value": "Näyttökertoja" + "value": "Näyttökerrat" } ], "metrics.visitors": [ diff --git a/public/messages/fo-FO.json b/public/messages/fo-FO.json index 9df7954d..356f0790 100644 --- a/public/messages/fo-FO.json +++ b/public/messages/fo-FO.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Skriva " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " í feltið fyri at vátta" } ], "metrics.actions": [ diff --git a/public/messages/he-IL.json b/public/messages/he-IL.json index 8fd1cc80..60e865ce 100644 --- a/public/messages/he-IL.json +++ b/public/messages/he-IL.json @@ -628,7 +628,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "הקלידו " }, { "type": 1, @@ -636,7 +636,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " בתיבה על מנת לאשר" } ], "metrics.actions": [ diff --git a/public/messages/hi-IN.json b/public/messages/hi-IN.json index 7998945f..42675c43 100644 --- a/public/messages/hi-IN.json +++ b/public/messages/hi-IN.json @@ -636,7 +636,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "ुष्टि करने के लिए नीचे दिए गए बॉक्स में " }, { "type": 1, @@ -644,7 +644,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " टाइप करें।" } ], "metrics.actions": [ diff --git a/public/messages/hu-HU.json b/public/messages/hu-HU.json index 7531b3a7..c60cfd7a 100644 --- a/public/messages/hu-HU.json +++ b/public/messages/hu-HU.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Megerősítéshez írd be az alábbi mezőbe azt, hogy " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": "." } ], "metrics.actions": [ diff --git a/public/messages/id-ID.json b/public/messages/id-ID.json index 0b899262..f506af36 100644 --- a/public/messages/id-ID.json +++ b/public/messages/id-ID.json @@ -616,7 +616,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Ketikkan " }, { "type": 1, @@ -624,7 +624,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " pada kotak di bawah untuk konfirmasi." } ], "metrics.actions": [ diff --git a/public/messages/ja-JP.json b/public/messages/ja-JP.json index 608e6899..25c005e2 100644 --- a/public/messages/ja-JP.json +++ b/public/messages/ja-JP.json @@ -620,7 +620,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "確認のため、下のフォームに" }, { "type": 1, @@ -628,7 +628,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": "と入力してください。" } ], "metrics.actions": [ diff --git a/public/messages/ko-KR.json b/public/messages/ko-KR.json index 41ff2de2..c065e43f 100644 --- a/public/messages/ko-KR.json +++ b/public/messages/ko-KR.json @@ -620,7 +620,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "확인을 위해 아래 박스에 " }, { "type": 1, @@ -628,7 +628,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": "값을 입력하십시오." } ], "metrics.actions": [ diff --git a/public/messages/mn-MN.json b/public/messages/mn-MN.json index 8d1aec34..b740cbc3 100644 --- a/public/messages/mn-MN.json +++ b/public/messages/mn-MN.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Доорх хэсэгт " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " гэж бичиж баталгаажуулна уу." } ], "metrics.actions": [ diff --git a/public/messages/ms-MY.json b/public/messages/ms-MY.json index 922c6faf..5eeecc81 100644 --- a/public/messages/ms-MY.json +++ b/public/messages/ms-MY.json @@ -640,7 +640,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Taip " }, { "type": 1, @@ -648,7 +648,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " di dalam kotak di bawah untuk pengesahan." } ], "metrics.actions": [ diff --git a/public/messages/nb-NO.json b/public/messages/nb-NO.json index 2e23bf97..703b8303 100644 --- a/public/messages/nb-NO.json +++ b/public/messages/nb-NO.json @@ -652,7 +652,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Skriv inn " }, { "type": 1, @@ -660,7 +660,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " i boksen nedenfor for å bekrefte." } ], "metrics.actions": [ diff --git a/public/messages/nl-NL.json b/public/messages/nl-NL.json index 4d8dadac..3d103208 100644 --- a/public/messages/nl-NL.json +++ b/public/messages/nl-NL.json @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " in onderstaande veld om dit te bevestigen." } ], "metrics.actions": [ diff --git a/public/messages/pl-PL.json b/public/messages/pl-PL.json index 2dbbf047..f627d631 100644 --- a/public/messages/pl-PL.json +++ b/public/messages/pl-PL.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Wpisz " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " w polu poniżej, aby potwierdzić." } ], "metrics.actions": [ diff --git a/public/messages/pt-BR.json b/public/messages/pt-BR.json index 7a10357b..66af371c 100644 --- a/public/messages/pt-BR.json +++ b/public/messages/pt-BR.json @@ -652,7 +652,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Escreva " }, { "type": 1, @@ -660,7 +660,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " abaixo para continuar." } ], "metrics.actions": [ diff --git a/public/messages/sk-SK.json b/public/messages/sk-SK.json index ca14b73e..b81f5da1 100644 --- a/public/messages/sk-SK.json +++ b/public/messages/sk-SK.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Napíšte " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " pre potvrdenie." } ], "metrics.actions": [ diff --git a/public/messages/sl-SI.json b/public/messages/sl-SI.json index a8f4fbe5..74d4c3a9 100644 --- a/public/messages/sl-SI.json +++ b/public/messages/sl-SI.json @@ -648,7 +648,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "V spodnje polje vnesite " }, { "type": 1, @@ -656,7 +656,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " za potrditev." } ], "metrics.actions": [ diff --git a/public/messages/sv-SE.json b/public/messages/sv-SE.json index d26462ab..3567fb63 100644 --- a/public/messages/sv-SE.json +++ b/public/messages/sv-SE.json @@ -32,13 +32,13 @@ "label.all-events": [ { "type": 0, - "value": "All events" + "value": "Alla händelser" } ], "label.all-time": [ { "type": 0, - "value": "All time" + "value": "Sedan början" } ], "label.all-websites": [ @@ -176,7 +176,7 @@ "label.language": [ { "type": 0, - "value": "Language" + "value": "Språk" } ], "label.last-days": [ @@ -250,7 +250,7 @@ "label.owner": [ { "type": 0, - "value": "Owner" + "value": "Ägare" } ], "label.password": [ @@ -304,7 +304,7 @@ "label.reset-website": [ { "type": 0, - "value": "Reset statistics" + "value": "Återställ statistik" } ], "label.save": [ @@ -334,7 +334,7 @@ "label.theme": [ { "type": 0, - "value": "Theme" + "value": "Tema" } ], "label.this-month": [ @@ -452,7 +452,7 @@ "message.confirm-reset": [ { "type": 0, - "value": "Are your sure you want to reset " + "value": "Är du säker på att du vill återställa statistiken för " }, { "type": 1, @@ -460,7 +460,7 @@ }, { "type": 0, - "value": "'s statistics?" + "value": "?" } ], "message.copied": [ @@ -502,7 +502,7 @@ "message.incorrect-username-password": [ { "type": 0, - "value": "Felaktikt användarnamn/lösenord." + "value": "Felaktigt användarnamn/lösenord." } ], "message.log.visitor": [ @@ -584,7 +584,7 @@ "message.reset-warning": [ { "type": 0, - "value": "All statistics for this website will be deleted, but your tracking code will remain intact." + "value": "All statistik för webbsajten tas bort men spårningskoden förblir oförändrad." } ], "message.save-success": [ @@ -596,7 +596,7 @@ "message.share-url": [ { "type": 0, - "value": "Det här är den offentliga delnings-URL:en " + "value": "Det här är den offentliga delnings-URL:en för " }, { "type": 1, @@ -610,7 +610,7 @@ "message.toggle-charts": [ { "type": 0, - "value": "Toggle charts" + "value": "Visa/göm grafer" } ], "message.track-stats": [ @@ -652,7 +652,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Skriv " }, { "type": 1, @@ -660,7 +660,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " i rutan nedan för att bekräfta." } ], "metrics.actions": [ @@ -750,7 +750,7 @@ "metrics.languages": [ { "type": 0, - "value": "Languages" + "value": "Språk" } ], "metrics.operating-systems": [ diff --git a/public/messages/ta-IN.json b/public/messages/ta-IN.json index cbd29d26..ef9edde6 100644 --- a/public/messages/ta-IN.json +++ b/public/messages/ta-IN.json @@ -640,7 +640,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "உறுதிப்படுத்த கீழே உள்ள பெட்டியில் " }, { "type": 1, @@ -648,7 +648,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " என தட்டச்சு செய்க." } ], "metrics.actions": [ diff --git a/public/messages/tr-TR.json b/public/messages/tr-TR.json index 5fce01d8..cd732f54 100644 --- a/public/messages/tr-TR.json +++ b/public/messages/tr-TR.json @@ -612,7 +612,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Onaylamak için kutuya " }, { "type": 1, @@ -620,7 +620,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " yazın." } ], "metrics.actions": [ diff --git a/public/messages/vi-VN.json b/public/messages/vi-VN.json index f7a85acd..797c93b7 100644 --- a/public/messages/vi-VN.json +++ b/public/messages/vi-VN.json @@ -632,7 +632,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "Nhập " }, { "type": 1, @@ -640,7 +640,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " bên dưới để xác nhận." } ], "metrics.actions": [ diff --git a/public/messages/zh-CN.json b/public/messages/zh-CN.json index b1cce954..acca0bb6 100644 --- a/public/messages/zh-CN.json +++ b/public/messages/zh-CN.json @@ -636,7 +636,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "在下方输入框输入 " }, { "type": 1, @@ -644,7 +644,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " 以确认删除。" } ], "metrics.actions": [ diff --git a/public/messages/zh-TW.json b/public/messages/zh-TW.json index 30dd838d..5c3eb34c 100644 --- a/public/messages/zh-TW.json +++ b/public/messages/zh-TW.json @@ -632,7 +632,7 @@ "message.type-reset": [ { "type": 0, - "value": "Type " + "value": "在下方空格輸入 " }, { "type": 1, @@ -640,7 +640,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " 確認" } ], "metrics.actions": [ From de50109b3e2ce21ee372f8d495a6fed170d9782a Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Fri, 4 Mar 2022 20:36:13 -0800 Subject: [PATCH 07/25] Use beacon api for links. Closes #446. --- tracker/index.js | 70 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/tracker/index.js b/tracker/index.js index 97976ec0..e5277ed6 100644 --- a/tracker/index.js +++ b/tracker/index.js @@ -58,20 +58,24 @@ import { removeTrailingSlash } from '../lib/url'; req.send(JSON.stringify(data)); }; - const collect = (type, params, uuid) => { - if (disableTracking()) return; + const getPayload = () => ({ + website, + hostname, + screen, + language, + cache: useCache && sessionStorage.getItem(cacheKey), + url: currentUrl, + }); - const payload = { - website: uuid, - hostname, - screen, - language, - cache: useCache && sessionStorage.getItem(cacheKey), - }; - - Object.keys(params).forEach(key => { - payload[key] = params[key]; + const assign = (a, b) => { + Object.keys(b).forEach(key => { + a[key] = b[key]; }); + return a; + }; + + const collect = (type, payload) => { + if (disableTracking()) return; post( `${root}/api/collect`, @@ -86,28 +90,46 @@ import { removeTrailingSlash } from '../lib/url'; const trackView = (url = currentUrl, referrer = currentRef, uuid = website) => { collect( 'pageview', - { + assign(getPayload(), { + website: uuid, url, referrer, - }, - uuid, + }), ); }; const trackEvent = (event_value, event_type = 'custom', url = currentUrl, uuid = website) => { collect( 'event', - { + assign(getPayload(), { + website: uuid, + url, event_type, event_value, - url, - }, - uuid, + }), ); }; /* Handle events */ + const sendEvent = (value, type) => { + const payload = getPayload(); + payload.event_type = type; + payload.event_value = value; + + const blob = new Blob( + [ + JSON.stringify({ + type: 'event', + payload, + }), + ], + { type: 'application/json' }, + ); + + navigator.sendBeacon(`${root}/api/collect`, blob); + }; + const addEvents = node => { const elements = node.querySelectorAll(eventSelect); Array.prototype.forEach.call(elements, addEvent); @@ -120,7 +142,13 @@ import { removeTrailingSlash } from '../lib/url'; const [, type, value] = className.split('--'); const listener = listeners[className] ? listeners[className] - : (listeners[className] = () => trackEvent(value, type)); + : (listeners[className] = () => { + if (element.tagName === 'A') { + sendEvent(value, type); + } else { + trackEvent(value, type); + } + }); element.addEventListener(type, listener, true); }); @@ -178,7 +206,9 @@ import { removeTrailingSlash } from '../lib/url'; observer.observe(document, { childList: true, subtree: true }); } }; + document.addEventListener('readystatechange', update, true); + update(); } })(window); From 3e8dd815b7c9e27dd2c35e8e8ae6df80a23c91a8 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Sat, 5 Mar 2022 09:42:32 -0800 Subject: [PATCH 08/25] Fix CSS in header. --- components/layout/Header.module.css | 4 +++- components/metrics/EventsChart.js | 3 +-- components/pages/TestConsole.js | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/components/layout/Header.module.css b/components/layout/Header.module.css index 45df94ca..4fbadd5e 100644 --- a/components/layout/Header.module.css +++ b/components/layout/Header.module.css @@ -6,6 +6,7 @@ } .title { + flex: 1; font-size: var(--font-size-large); display: flex; align-items: center; @@ -17,7 +18,7 @@ } .links { - flex: 1; + flex: 2; display: flex; justify-content: center; align-items: center; @@ -30,6 +31,7 @@ } .buttons { + flex: 1; display: flex; justify-content: flex-end; align-items: center; diff --git a/components/metrics/EventsChart.js b/components/metrics/EventsChart.js index 6b478b90..b44aa22d 100644 --- a/components/metrics/EventsChart.js +++ b/components/metrics/EventsChart.js @@ -10,8 +10,7 @@ import useShareToken from 'hooks/useShareToken'; import { EVENT_COLORS, TOKEN_HEADER } from 'lib/constants'; export default function EventsChart({ websiteId, className, token }) { - const [dateRange] = useDateRange(websiteId); - const { startDate, endDate, unit, modified } = dateRange; + const [{ startDate, endDate, unit, modified }] = useDateRange(websiteId); const [timezone] = useTimezone(); const { query } = usePageQuery(); const shareToken = useShareToken(); diff --git a/components/pages/TestConsole.js b/components/pages/TestConsole.js index c4297acc..ea1f0290 100644 --- a/components/pages/TestConsole.js +++ b/components/pages/TestConsole.js @@ -68,7 +68,7 @@ export default function TestConsole() { {show && (
- Page linksNmo + Page links
page one From 48db7708deac97696b3ba611601860b957ccb4f0 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 10 Mar 2022 11:49:47 -0800 Subject: [PATCH 09/25] Updated CORS options. --- lib/middleware.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/middleware.js b/lib/middleware.js index 0c6fd081..228b2287 100644 --- a/lib/middleware.js +++ b/lib/middleware.js @@ -3,6 +3,11 @@ import { getSession } from './session'; import { getAuthToken } from './auth'; import { unauthorized, badRequest, serverError } from './response'; +const corsOptions = { + origin: '*', + credentials: true, +}; + export function createMiddleware(middleware) { return (req, res) => new Promise((resolve, reject) => { @@ -15,7 +20,7 @@ export function createMiddleware(middleware) { }); } -export const useCors = createMiddleware(cors()); +export const useCors = createMiddleware(cors(corsOptions)); export const useSession = createMiddleware(async (req, res, next) => { let session; From 17790aa5a8912ecf2eb90142b429f96b8d61e726 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 10 Mar 2022 19:01:33 -0800 Subject: [PATCH 10/25] Fix issue with sendBeacon request. --- .eslintrc.json | 3 ++- lib/middleware.js | 7 +------ lib/request.js | 8 ++++++++ lib/session.js | 4 ++-- pages/api/collect.js | 5 +++-- tracker/index.js | 18 +++++++----------- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 168665fc..e5f0cc94 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,7 +16,8 @@ "rules": { "react/display-name": "off", "react/react-in-jsx-scope": "off", - "react/prop-types": "off" + "react/prop-types": "off", + "import/no-anonymous-default-export": "off" }, "globals": { "React": "writable" diff --git a/lib/middleware.js b/lib/middleware.js index 228b2287..0c6fd081 100644 --- a/lib/middleware.js +++ b/lib/middleware.js @@ -3,11 +3,6 @@ import { getSession } from './session'; import { getAuthToken } from './auth'; import { unauthorized, badRequest, serverError } from './response'; -const corsOptions = { - origin: '*', - credentials: true, -}; - export function createMiddleware(middleware) { return (req, res) => new Promise((resolve, reject) => { @@ -20,7 +15,7 @@ export function createMiddleware(middleware) { }); } -export const useCors = createMiddleware(cors(corsOptions)); +export const useCors = createMiddleware(cors()); export const useSession = createMiddleware(async (req, res, next) => { let session; diff --git a/lib/request.js b/lib/request.js index 725dc383..89e9c655 100644 --- a/lib/request.js +++ b/lib/request.js @@ -86,3 +86,11 @@ export async function getClientInfo(req, { screen }) { return { userAgent, browser, os, ip, country, device }; } + +export function getJsonBody(req) { + if (req.headers['content-type'].indexOf('text/plain') !== -1) { + return JSON.parse(req.body); + } + + return req.body; +} diff --git a/lib/session.js b/lib/session.js index 167fda9c..694465bc 100644 --- a/lib/session.js +++ b/lib/session.js @@ -1,9 +1,9 @@ import { getWebsiteByUuid, getSessionByUuid, createSession } from 'lib/queries'; -import { getClientInfo } from 'lib/request'; +import { getJsonBody, getClientInfo } from 'lib/request'; import { uuid, isValidUuid, parseToken } from 'lib/crypto'; export async function getSession(req) { - const { payload } = req.body; + const { payload } = getJsonBody(req); if (!payload) { throw new Error('Invalid request'); diff --git a/pages/api/collect.js b/pages/api/collect.js index 2f001758..a6ea8f1e 100644 --- a/pages/api/collect.js +++ b/pages/api/collect.js @@ -2,7 +2,7 @@ import isbot from 'isbot'; import ipaddr from 'ipaddr.js'; import { savePageView, saveEvent } from 'lib/queries'; import { useCors, useSession } from 'lib/middleware'; -import { getIpAddress } from 'lib/request'; +import { getJsonBody, getIpAddress } from 'lib/request'; import { ok, badRequest } from 'lib/response'; import { createToken } from 'lib/crypto'; import { removeTrailingSlash } from 'lib/url'; @@ -39,10 +39,11 @@ export default async (req, res) => { await useSession(req, res); const { - body: { type, payload }, session: { website_id, session_id }, } = req; + const { type, payload } = getJsonBody(req); + let { url, referrer, event_type, event_value } = payload; if (process.env.REMOVE_TRAILING_SLASH) { diff --git a/tracker/index.js b/tracker/index.js index e5277ed6..37eea631 100644 --- a/tracker/index.js +++ b/tracker/index.js @@ -47,7 +47,7 @@ import { removeTrailingSlash } from '../lib/url'; const post = (url, data, callback) => { const req = new XMLHttpRequest(); req.open('POST', url, true); - req.setRequestHeader('Content-Type', 'application/json'); + req.setRequestHeader('Content-Type', 'text/plain'); req.onreadystatechange = () => { if (req.readyState === 4) { @@ -114,20 +114,16 @@ import { removeTrailingSlash } from '../lib/url'; const sendEvent = (value, type) => { const payload = getPayload(); + payload.event_type = type; payload.event_value = value; - const blob = new Blob( - [ - JSON.stringify({ - type: 'event', - payload, - }), - ], - { type: 'application/json' }, - ); + const data = JSON.stringify({ + type: 'event', + payload, + }); - navigator.sendBeacon(`${root}/api/collect`, blob); + navigator.sendBeacon(`${root}/api/collect`, data); }; const addEvents = node => { From 5ca6f76daab5957b1fcb2a36afeb64b10b86a35f Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 10 Mar 2022 20:39:11 -0800 Subject: [PATCH 11/25] Updated collect API response. --- components/pages/TestConsole.js | 8 +++++++- lib/response.js | 8 ++++++++ pages/api/collect.js | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/components/pages/TestConsole.js b/components/pages/TestConsole.js index ea1f0290..9f4d7ca2 100644 --- a/components/pages/TestConsole.js +++ b/components/pages/TestConsole.js @@ -44,7 +44,13 @@ export default function TestConsole() { {typeof window !== 'undefined' && website && ( -