diff --git a/.github/workflows/sync_translations.yml b/.github/workflows/sync_translations.yml index d1599d0f59..3d1ce59f8d 100644 --- a/.github/workflows/sync_translations.yml +++ b/.github/workflows/sync_translations.yml @@ -15,7 +15,7 @@ jobs: uses: actions/checkout@v4 - name: Download translations - uses: crowdin/github-action@v2.3.0 + uses: crowdin/github-action@v2.4.0 env: GITHUB_TOKEN: ${{github.token}} CROWDIN_PROJECT_ID: 342361 diff --git a/package.json b/package.json index cc0af365d1..4ebcc928e7 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,22 @@ { "dependencies": { - "@wireapp/api-client": "27.8.0", - "@wireapp/commons": "5.2.13", - "@wireapp/react-ui-kit": "9.26.0", + "@wireapp/api-client": "27.11.0", + "@wireapp/commons": "5.4.0", + "@wireapp/react-ui-kit": "9.28.0", + "@wireapp/telemetry": "0.1.3", "core-js": "3.39.0", "dotenv": "16.4.5", "dotenv-extended": "2.9.0", - "i18next": "23.16.4", + "i18next": "24.0.2", "i18next-browser-languagedetector": "8.0.0", "i18next-react-postprocessor": "3.1.0", "jest-environment-jsdom": "29.7.0", "react": "18.3.1", "react-dom": "18.3.1", "react-i18next": "11.18.6", - "react-router": "6.27.0", - "react-router-dom": "6.27.0" + "react-router": "7.0.1", + "react-router-dom": "6.28.0", + "uuid": "11.0.3" }, "devDependencies": { "@babel/core": "7.26.0", @@ -26,13 +28,14 @@ "@emotion/babel-preset-css-prop": "11.12.0", "@testing-library/react": "12.1.4", "@types/jest": "29.5.14", - "@types/node": "22.8.6", + "@types/node": "22.10.1", "@types/platform": "1.3.6", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-router-dom": "5.3.3", + "@types/uuid": "10.0.0", "@types/webpack-env": "1.18.5", - "@typescript-eslint/eslint-plugin": "8.12.2", + "@typescript-eslint/eslint-plugin": "8.16.0", "@typescript-eslint/parser": "7.17.0", "@wireapp/copy-config": "2.2.10", "@wireapp/eslint-config": "1.4.0", @@ -45,8 +48,8 @@ "eslint-config-prettier": "9.1.0", "eslint-plugin-babel": "5.3.1", "eslint-plugin-import": "2.31.0", - "eslint-plugin-jest": "28.8.3", - "eslint-plugin-jsdoc": "50.4.3", + "eslint-plugin-jest": "28.9.0", + "eslint-plugin-jsdoc": "50.6.0", "eslint-plugin-no-unsanitized": "4.1.2", "eslint-plugin-prettier": "5.2", "eslint-plugin-react": "7.37.2", diff --git a/server/Server.ts b/server/Server.ts index b17993e8e5..04c660594a 100644 --- a/server/Server.ts +++ b/server/Server.ts @@ -191,6 +191,7 @@ class Server { this.app.get('/favicon.ico', (_req, res) => res.sendFile(path.join(__dirname, 'img', 'favicon.ico'))); this.app.get('/robots.txt', (_req, res) => res.sendFile(path.join(__dirname, 'robots', 'robots.txt'))); this.app.use('/script', express.static(path.join(__dirname, 'static', 'script'))); + this.app.use('/libs', express.static(path.join(__dirname, 'libs'))); } initTemplateEngine(): void { diff --git a/server/ServerConfig.ts b/server/ServerConfig.ts index abc0eebe8f..82083e46ab 100644 --- a/server/ServerConfig.ts +++ b/server/ServerConfig.ts @@ -48,6 +48,8 @@ export interface ServerConfig { URL_TERMS_OF_USE_TEAMS: string; URL_SUPPORT_BACKUP_HISTORY: string; }; + COUNTLY_SERVER_URL: string; + COUNTLY_API_KEY: string; VERSION: string; }; COMMIT: string; diff --git a/server/bin/copy_server_assets.js b/server/bin/copy_server_assets.js index f7591357ec..0ed104fdab 100755 --- a/server/bin/copy_server_assets.js +++ b/server/bin/copy_server_assets.js @@ -24,9 +24,15 @@ const path = require('path'); const srcFolder = '../'; const distFolder = '../dist/'; +const npmModulesFolder = '../../node_modules/'; const assetFolders = ['.ebextensions/', 'img/', 'robots/', 'templates/', 'certificate']; assetFolders.forEach(assetFolder => { fs.copySync(path.resolve(__dirname, srcFolder, assetFolder), path.resolve(__dirname, distFolder, assetFolder)); }); + +fs.copySync( + path.resolve(__dirname, npmModulesFolder, '@wireapp/telemetry/lib/embed.js'), + path.resolve(__dirname, distFolder, 'libs/wire/telemetry/embed.js'), +); diff --git a/server/config.ts b/server/config.ts index cc6928f09d..fc97b326a4 100644 --- a/server/config.ts +++ b/server/config.ts @@ -134,6 +134,8 @@ const config: ServerConfig = { URL_SUPPORT_BACKUP_HISTORY: process.env.URL_SUPPORT_BACKUP_HISTORY, }, VERSION: readFile(VERSION_FILE, '0.0.0'), + COUNTLY_SERVER_URL: process.env.COUNTLY_SERVER_URL, + COUNTLY_API_KEY: process.env.COUNTLY_API_KEY, }, COMMIT: readFile(COMMIT_FILE, ''), PIWIK_HOSTNAME: process.env.PIWIK_HOSTNAME, diff --git a/server/package.json b/server/package.json index dfd8ff293f..e01d5b5ae3 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@wireapp/commons": "5.2.13", + "@wireapp/commons": "5.4.0", "dotenv": "16.4.5", "dotenv-extended": "2.9.0", "express": "4.21.1", @@ -13,8 +13,8 @@ "logdown": "3.3.1", "moment": "2.30.1", "nocache": "4.0.0", - "pm2": "5.4.2", - "uuid": "11.0.2" + "pm2": "5.4.3", + "uuid": "11.0.3" }, "devDependencies": { "@babel/core": "7.26.0", @@ -34,9 +34,9 @@ "jszip": "3.10.1", "nodemon": "3.1.7", "opn": "6.0.0", - "prettier": "3.3.3", + "prettier": "3.4.1", "rimraf": "6.0.1", - "typescript": "5.6.3", + "typescript": "5.7.2", "webpack-dev-middleware": "7.4.2", "webpack-hot-middleware": "2.26.1" }, diff --git a/server/templates/index.hbs b/server/templates/index.hbs index 259601c82e..128a8e58b9 100644 --- a/server/templates/index.hbs +++ b/server/templates/index.hbs @@ -17,7 +17,9 @@ - + {{#if config.CLIENT.COUNTLY_API_KEY}} + + {{/if}} Wire diff --git a/server/yarn.lock b/server/yarn.lock index 0121c04ce2..c368848d52 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -1981,15 +1981,15 @@ __metadata: languageName: node linkType: hard -"@wireapp/commons@npm:5.2.13": - version: 5.2.13 - resolution: "@wireapp/commons@npm:5.2.13" +"@wireapp/commons@npm:5.4.0": + version: 5.4.0 + resolution: "@wireapp/commons@npm:5.4.0" dependencies: ansi-regex: 5.0.1 fs-extra: 11.2.0 logdown: 3.3.1 platform: 1.3.6 - checksum: 1a330c3dfa7a6e859135bd50dec231682592e11e5b17b5614ef0a4d5ac40d9251ed0fd11cd896663cfd5375f23a49bd18f8018d0cfe380f33bf34cc2bc89f98f + checksum: a0edf8b4276b2f83c5dca5141187b3475a924716711bdc0fcaf02095d79065f5b032daab0392acc6d27e65fc99d7ef5e1fe33f7a8f7d39a465e9f0cb5b474fed languageName: node linkType: hard @@ -2726,13 +2726,13 @@ __metadata: linkType: hard "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" dependencies: path-key: ^3.1.0 shebang-command: ^2.0.0 which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + checksum: 55c50004cb6bbea3649784caac6e7b8ddd03fa8c1e14dbd5a1f15896708378006eb7526a52a0f48770c768c9b8aed48a5888eb8e785ff59ff7749e74f66cd96b languageName: node linkType: hard @@ -4999,9 +4999,9 @@ __metadata: languageName: node linkType: hard -"pm2@npm:5.4.2": - version: 5.4.2 - resolution: "pm2@npm:5.4.2" +"pm2@npm:5.4.3": + version: 5.4.3 + resolution: "pm2@npm:5.4.3" dependencies: "@pm2/agent": ~2.0.0 "@pm2/io": ~6.0.1 @@ -5041,7 +5041,7 @@ __metadata: pm2-dev: bin/pm2-dev pm2-docker: bin/pm2-docker pm2-runtime: bin/pm2-runtime - checksum: 652d80bb754c30bd0f3e7793e0116e1765699ad53aee936788c1043f5dc40432f3d9a2570e3f9abd0ecaebdc896835fa8ec87052f65b88a51222e83c12729327 + checksum: e20dfd191f9100c6f8a4633e7f506b0996d0ca06efddddd2fc5b973e3c94df54381d1089e9aa7ae669b02dfa5a5750e85d269bf37a8e5096c1e59439c7916ae4 languageName: node linkType: hard @@ -5052,12 +5052,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:3.3.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" +"prettier@npm:3.4.1": + version: 3.4.1 + resolution: "prettier@npm:3.4.1" bin: prettier: bin/prettier.cjs - checksum: bc8604354805acfdde6106852d14b045bb20827ad76a5ffc2455b71a8257f94de93f17f14e463fe844808d2ccc87248364a5691488a3304f1031326e62d9276e + checksum: f83ae83e38ae38f42c0b174833f58f820ed6eb063abfc5aa6725e8f9c1d626b54b1cb9d595cace525f8d59de89e186285f6bbcb460dc644ea9d8a7823cc54aca languageName: node linkType: hard @@ -6011,23 +6011,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.6.3": - version: 5.6.3 - resolution: "typescript@npm:5.6.3" +"typescript@npm:5.7.2": + version: 5.7.2 + resolution: "typescript@npm:5.7.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: ba302f8822777ebefb28b554105f3e074466b671e7444ec6b75dadc008a62f46f373d9e57ceced1c433756d06c8b7dc569a7eefdf3a9573122a49205ff99021a + checksum: b55300c4cefee8ee380d14fa9359ccb41ff8b54c719f6bc49b424899d662a5ce62ece390ce769568c7f4d14af844085255e63788740084444eb12ef423b13433 languageName: node linkType: hard -"typescript@patch:typescript@5.6.3#~builtin": - version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#~builtin::version=5.6.3&hash=85af82" +"typescript@patch:typescript@5.7.2#~builtin": + version: 5.7.2 + resolution: "typescript@patch:typescript@npm%3A5.7.2#~builtin::version=5.7.2&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: ade87bce2363ee963eed0e4ca8a312ea02c81873ebd53609bc3f6dc0a57f6e61ad7e3fb8cbb7f7ab8b5081cbee801b023f7c4823ee70b1c447eae050e6c7622b + checksum: 803430c6da2ba73c25a21880d8d4f08a56d9d2444e6db2ea949ac4abceeece8e4a442b7b9b585db7d8a0b47ebda2060e45fe8ee8b8aca23e27ec1d4844987ee6 languageName: node linkType: hard @@ -6184,12 +6184,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:11.0.2": - version: 11.0.2 - resolution: "uuid@npm:11.0.2" +"uuid@npm:11.0.3": + version: 11.0.3 + resolution: "uuid@npm:11.0.3" bin: uuid: dist/esm/bin/uuid - checksum: 9b322963db18623d22f46cf98f51b45830f956715577fb24d272ec29324fe919bedbedc6e29627aced490ac3f982ee53c80441651daf4a6ef74f2af58689f2e0 + checksum: 646181c77e8b8df9bd07254faa703943e1c4d5ccde7d080312edf12f443f6c5750801fd9b27bf2e628594182165e6b1b880c0382538f7eca00b26622203741dc languageName: node linkType: hard @@ -6277,7 +6277,7 @@ __metadata: "@types/helmet": 4.0.0 "@types/moment": 2.13.0 "@types/uuid": 9.0.8 - "@wireapp/commons": 5.2.13 + "@wireapp/commons": 5.4.0 cross-env: 7.0.3 dotenv: 16.4.5 dotenv-extended: 2.9.0 @@ -6296,11 +6296,11 @@ __metadata: nocache: 4.0.0 nodemon: 3.1.7 opn: 6.0.0 - pm2: 5.4.2 - prettier: 3.3.3 + pm2: 5.4.3 + prettier: 3.4.1 rimraf: 6.0.1 - typescript: 5.6.3 - uuid: 11.0.2 + typescript: 5.7.2 + uuid: 11.0.3 webpack-dev-middleware: 7.4.2 webpack-hot-middleware: 2.26.1 languageName: unknown diff --git a/src/i18n/en-US.json b/src/i18n/en-US.json index 977219fbf2..2027f7c84f 100644 --- a/src/i18n/en-US.json +++ b/src/i18n/en-US.json @@ -112,7 +112,7 @@ "confirmPageHeader": "Join your team", "confirmPageSubHeader": "To ensure a secure transfer and prevent unauthorized access, please enter the password of your personal account again.", "termsPageHeader": "Join your team", - "termsPageSubHeader": "You’re about to join the team.", + "termsPageSubHeader": "You’re about to join the team managed by {{email}}.", "termsPageListHeader": "Things to know", "termsPageListItem1": "Your personal account will be transferred to a team account.", "termsPageListItem2": "This change is permanent and irrevocable.", diff --git a/src/script/Environment.ts b/src/script/Environment.ts index 4f77dc892d..a3d8cb476f 100644 --- a/src/script/Environment.ts +++ b/src/script/Environment.ts @@ -33,6 +33,8 @@ declare global { NEW_PASSWORD_MINIMUM_LENGTH: number; RAYGUN_API_KEY: string; STRIPE_API_KEY: string; + COUNTLY_SERVER_URL: string; + COUNTLY_API_KEY: string; URL: { ACCOUNT_DELETE_SURVEY: string; DOWNLOAD_ANDROID_BASE: string; @@ -99,3 +101,5 @@ export const TEAMS_URL = window.wire.env.URL.TEAMS_BASE; export const WEBSITE_URL = window.wire.env.URL.WEBSITE_BASE; export const URL_SUPPORT_BACKUP_HISTORY = window.wire.env.URL.URL_SUPPORT_BACKUP_HISTORY; export const URL_TERMS_OF_USE_TEAMS = window.wire.env.URL.URL_TERMS_OF_USE_TEAMS; +export const COUNTLY_SERVER_URL = window.wire.env.COUNTLY_SERVER_URL; +export const COUNTLY_API_KEY = window.wire.env.COUNTLY_API_KEY; diff --git a/src/script/Root.tsx b/src/script/Root.tsx index da97b81593..7c05e345ec 100644 --- a/src/script/Root.tsx +++ b/src/script/Root.tsx @@ -27,6 +27,7 @@ import {TermsAcknowledgement} from './page/migration/TermsAcknowledgement'; import {ConfirmInvitation} from './page/migration/ConfirmInvitation'; import {Welcome} from './page/migration/Welcome'; import {AcceptInvitation} from './page/migration/AcceptInvitation'; +import {initializeTelemetry} from './util/Tracking/Tracking'; const LazyIndex = lazy(() => import('./page/Index')); const LazyDeleteAccount = lazy(() => import('./page/DeleteAccount')); @@ -45,6 +46,8 @@ const Root = () => { const hlParam = queryParams.get(QUERY_KEY.LANG); const userLocale = navigator.languages?.length ? navigator.languages[0] : navigator.language; + initializeTelemetry(); + if (!hlParam && !userLocale.includes('en')) { queryParams.set(QUERY_KEY.LANG, userLocale); window.history.pushState(null, '', `?${queryParams.toString()}`); diff --git a/src/script/module/action/TeamAction.ts b/src/script/module/action/TeamAction.ts index bd6fa65612..49ce3138a5 100644 --- a/src/script/module/action/TeamAction.ts +++ b/src/script/module/action/TeamAction.ts @@ -36,4 +36,8 @@ export class TeamAction { acceptInvitation = async (payload: {code: string; password: string}) => { return this.apiClient.api.teams.invitation.acceptInvitation(payload); }; + + getInvitationInfo = async (code: string) => { + return this.apiClient.api.teams.invitation.getInvitationFromCode(code); + }; } diff --git a/src/script/page/migration/AcceptInvitation.tsx b/src/script/page/migration/AcceptInvitation.tsx index 8d596a7cd6..85ce2394e2 100644 --- a/src/script/page/migration/AcceptInvitation.tsx +++ b/src/script/page/migration/AcceptInvitation.tsx @@ -40,6 +40,8 @@ import {useTranslation} from 'react-i18next'; import {LoginData} from '@wireapp/api-client/lib/auth'; import {ClientType} from '@wireapp/api-client/lib/client'; import {useActionContext} from 'script/module/action'; +import {reportEvent} from 'script/util/Tracking/Tracking'; +import {EventName, SegmentationKey, SegmentationValue} from 'script/util/Tracking/types'; export const AcceptInvitation = () => { const [searchParams] = useSearchParams(); @@ -54,7 +56,15 @@ export const AcceptInvitation = () => { const code = searchParams.get(QUERY_KEY.TEAM_CODE); const cachedCode = getTeamInvitationCode(); + const trackEvent = (step: SegmentationValue) => { + reportEvent(EventName.USER_MIGRATION_LOGIN, { + [SegmentationKey.STEP]: step, + }); + }; + useEffect(() => { + trackEvent(SegmentationValue.OPENED); + if (!code && !cachedCode) { navigate(ROUTE.HOME); } @@ -75,6 +85,7 @@ export const AcceptInvitation = () => { const handleLogin = async (event: FormEvent) => { event.preventDefault(); setError(''); + trackEvent(SegmentationValue.CONTINUE_CLICKED); const login: LoginData = { clientType: ClientType.PERMANENT, @@ -116,6 +127,7 @@ export const AcceptInvitation = () => { title={t('invitationPagLoginLabel')} value={email} data-uie-name="enter-login-identifier" + onBlur={() => trackEvent(SegmentationValue.EMAIL_ENTERED)} /> { type="password" value={password} data-uie-name="enter-login-password" + onBlur={() => trackEvent(SegmentationValue.PASSWORD_ENTERED)} />
- + trackEvent(SegmentationValue.PASSWORD_FORGOTTEN)} + data-uie-name="go-forgot-password" + > {t('forgotPassword')}
diff --git a/src/script/page/migration/ConfirmInvitation.tsx b/src/script/page/migration/ConfirmInvitation.tsx index 4b35187e84..e617668dad 100644 --- a/src/script/page/migration/ConfirmInvitation.tsx +++ b/src/script/page/migration/ConfirmInvitation.tsx @@ -30,12 +30,14 @@ import { useMatchMedia, } from '@wireapp/react-ui-kit'; import {loginContainerCss, loginSubHeaderCss, headerCss, forgotPasswordCss, buttonCss} from './styles'; -import React, {useState} from 'react'; +import React, {useEffect, useState} from 'react'; import {ROUTE} from 'script/route'; import {useNavigate} from 'react-router-dom'; import {getTeamInvitationCode, removeTeamInvitationCode} from './utils'; import {useTranslation} from 'react-i18next'; import {useActionContext} from 'script/module/action'; +import {reportEvent} from 'script/util/Tracking/Tracking'; +import {EventName, SegmentationKey, SegmentationValue} from 'script/util/Tracking/types'; export const ConfirmInvitation = () => { const isTablet = useMatchMedia(QUERY[QueryKeys.TABLET_DOWN]); @@ -48,8 +50,14 @@ export const ConfirmInvitation = () => { const [loading, setLoading] = useState(false); const code = getTeamInvitationCode(); + const trackEvent = (step: SegmentationValue) => { + reportEvent(EventName.USER_MIGRATION_CONFIRMATION, { + [SegmentationKey.STEP]: step, + }); + }; const handleSubmit = (event: any) => { event.preventDefault(); + trackEvent(SegmentationValue.CONTINUE_CLICKED); setLoading(true); teamAction .acceptInvitation({ @@ -68,6 +76,10 @@ export const ConfirmInvitation = () => { }); }; + useEffect(() => { + trackEvent(SegmentationValue.OPENED); + }, []); + return (
{isTablet && } @@ -86,6 +98,7 @@ export const ConfirmInvitation = () => { type="password" value={password} data-uie-name="enter-login-password" + onBlur={() => trackEvent(SegmentationValue.PASSWORD_ENTERED)} />
diff --git a/src/script/page/migration/TermsAcknowledgement.tsx b/src/script/page/migration/TermsAcknowledgement.tsx index 814c3faca3..836ebcdea1 100644 --- a/src/script/page/migration/TermsAcknowledgement.tsx +++ b/src/script/page/migration/TermsAcknowledgement.tsx @@ -23,6 +23,7 @@ import { Checkbox, COLOR_V2, Link, + Loading, Logo, QUERY, QueryKeys, @@ -36,27 +37,65 @@ import { termsContentHeaderCss, termsListCss, termsListItemCss, - termsContentGrayBox, - termsContentGrayBoxContent, + termsContentWarningBox, + termsContentWarningBoxContent, termsContentBlueBox, termsContentBlueBoxContent, buttonCss, termsCheckboxLabelCss, + loginContainerCss, } from './styles'; import {ShieldIcon} from './ShieldIcon'; import {OutlinedCheckIcon} from './OutlinedCheckIcon'; -import React, {useState} from 'react'; +import React, {useEffect, useState} from 'react'; import {useNavigate} from 'react-router-dom'; import {EXTERNAL_ROUTE, ROUTE} from 'script/route'; import {useTranslation} from 'react-i18next'; import MarkupTranslation from 'script/component/MarkupTranslation'; +import {useActionContext} from 'script/module/action'; +import {getTeamInvitationCode} from './utils'; +import {reportEvent} from 'script/util/Tracking/Tracking'; +import {EventName, SegmentationKey, SegmentationValue} from 'script/util/Tracking/types'; export const TermsAcknowledgement = () => { const navigate = useNavigate(); + const {teamAction} = useActionContext(); const {t} = useTranslation('migration'); const isTablet = useMatchMedia(QUERY[QueryKeys.TABLET_DOWN]); + const code = getTeamInvitationCode(); + const [loading, setLoading] = useState(true); const [isMigrationAccepted, setIsMigrationAccepted] = useState(false); const [isTermOfUseAccepted, setIsTermOfUseAccepted] = useState(false); + const [inviterEmail, setInviterEmail] = useState(''); + + const trackEvent = (step: SegmentationValue) => { + reportEvent(EventName.USER_MIGRATION_TERMS_ACKNOWLEDGEMENT, { + [SegmentationKey.STEP]: step, + }); + }; + + useEffect(() => { + trackEvent(SegmentationValue.OPENED); + teamAction + .getInvitationInfo(code) + .then(res => { + setInviterEmail(res.created_by_email); + }) + .finally(() => setLoading(false)); + }, []); + + if (loading) { + return ( +
+ +
+ ); + } + + const handleSubmit = () => { + navigate(ROUTE.CONFIRM_INVITATION); + trackEvent(SegmentationValue.CONTINUE_CLICKED); + }; return (
@@ -66,7 +105,7 @@ export const TermsAcknowledgement = () => {
)} {t('termsPageHeader')} - {t('termsPageHeader')} + {t('termsPageSubHeader', {email: inviterEmail})}
{t('termsPageListHeader')}
    @@ -87,8 +126,8 @@ export const TermsAcknowledgement = () => {
-
-
+
+
{t('termsPageAccountManagerHeader')}
{t('termsPageAccountManagerText')}
@@ -116,6 +155,7 @@ export const TermsAcknowledgement = () => { checked={isMigrationAccepted} onChange={(event: React.ChangeEvent) => { setIsMigrationAccepted(event.target.checked); + trackEvent(SegmentationValue.AGREE_MIGRATION_TERMS_CHECK); }} id="do-accept-migration" data-uie-name="do-accept-migration" @@ -127,6 +167,7 @@ export const TermsAcknowledgement = () => { checked={isTermOfUseAccepted} onChange={(event: React.ChangeEvent) => { setIsTermOfUseAccepted(event.target.checked); + trackEvent(SegmentationValue.AGREE_TOC_CHECK); }} id="do-accept-terms" data-uie-name="do-accept-terms" @@ -141,7 +182,7 @@ export const TermsAcknowledgement = () => {
{isOwner(selfMember.permissions) && ( @@ -118,7 +132,7 @@ export const Welcome = () => { data-uie-name="do-go-to-team-management" block variant={ButtonVariant.SECONDARY} - onClick={() => secureOpen(EXTERNAL_ROUTE.TEAM_SETTINGS)} + onClick={handleTMOpen} > {t('welcomePageTMOpenText')} diff --git a/src/script/page/migration/styles.ts b/src/script/page/migration/styles.ts index a7da3efff7..b19e1c2cff 100644 --- a/src/script/page/migration/styles.ts +++ b/src/script/page/migration/styles.ts @@ -21,7 +21,6 @@ import {CSSObject} from '@emotion/react'; import {COLOR_V2, QUERY, QueryKeys} from '@wireapp/react-ui-kit'; export const headerCss: CSSObject = { - color: COLOR_V2.GRAY_90, fontSize: '3rem', display: 'block', textAlign: 'center', @@ -32,7 +31,6 @@ export const headerCss: CSSObject = { }; export const loginSubHeaderCss: CSSObject = { - color: COLOR_V2.GRAY_70, lineHeight: '2.5rem', margin: '5rem 0', fontSize: '1.75rem', @@ -101,30 +99,30 @@ export const termsListCss: CSSObject = { export const termsListItemCss: CSSObject = { fontSize: '1.25rem', lineHeight: '1.75rem', - color: COLOR_V2.GRAY_70, [QUERY[QueryKeys.TABLET_DOWN]]: { fontSize: '1rem', }, }; -export const termsContentGrayBox: CSSObject = { - background: COLOR_V2.GRAY_20, +export const termsContentWarningBox: CSSObject = { + background: COLOR_V2.AMBER_DARK_50, + border: '1px solid', + borderColor: COLOR_V2.AMBER_DARK_600, padding: '1rem', borderRadius: '1rem', margin: '0 2rem', }; -export const termsContentGrayBoxContent: CSSObject = { +export const termsContentWarningBoxContent: CSSObject = { fontSize: '1.25rem', lineHeight: '1.75rem', - color: COLOR_V2.GRAY_90, [QUERY[QueryKeys.TABLET_DOWN]]: { fontSize: '1rem', }, }; export const termsContentBlueBox: CSSObject = { - background: COLOR_V2.BLUE_LIGHT_50, - padding: '1rem', + background: COLOR_V2.GRAY_20, + padding: '0.75rem', borderRadius: '1rem', margin: '1rem 0', display: 'flex', @@ -134,7 +132,6 @@ export const termsContentBlueBoxContent: CSSObject = { marginLeft: '1.5rem', fontSize: '1.25rem', lineHeight: '1.75rem', - color: COLOR_V2.GRAY_80, textTransform: 'none', [QUERY[QueryKeys.TABLET_DOWN]]: { fontSize: '1rem', @@ -146,15 +143,12 @@ export const forgotPasswordCss: CSSObject = { marginTop: '-0.25rem', marginBottom: '0.75rem', '& a:link': { - color: COLOR_V2.GRAY_60, + color: COLOR_V2.BLACK, }, }; export const buttonCss: CSSObject = { width: '100%', - ':disabled': { - background: COLOR_V2.GRAY_60, - }, }; export const termsCheckboxLabelCss: CSSObject = { diff --git a/src/script/util/Tracking/Tracking.ts b/src/script/util/Tracking/Tracking.ts new file mode 100644 index 0000000000..43c3adaa36 --- /dev/null +++ b/src/script/util/Tracking/Tracking.ts @@ -0,0 +1,90 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +import {APP_NAME, COUNTLY_API_KEY, COUNTLY_SERVER_URL, VERSION} from 'script/Environment'; +import * as telemetry from '@wireapp/telemetry'; +import {v4 as createUUID} from 'uuid'; +import {EventName, SegmentationKey} from './types'; +import {REPORTING_DEVICE_ID} from './constants'; + +let isProductReportingActivated = false; + +const getDeviceId = () => { + const deviceIdFromStorage = window.localStorage.getItem(REPORTING_DEVICE_ID); + + if (!deviceIdFromStorage) { + const newDeviceId = createUUID(); + window.localStorage.setItem(REPORTING_DEVICE_ID, newDeviceId); + return newDeviceId; + } + + return deviceIdFromStorage; +}; + +export const initializeTelemetry = () => { + if (!COUNTLY_SERVER_URL || !COUNTLY_API_KEY) { + return; + } + + if (!telemetry.isLoaded() || isProductReportingActivated) { + return; + } + + isProductReportingActivated = true; + + telemetry.initialize({ + appVersion: VERSION, + provider: { + apiKey: COUNTLY_API_KEY, + serverUrl: COUNTLY_SERVER_URL, + enableLogging: false, + autoClickTracking: true, + }, + }); + + telemetry.addAllConsentFeatures(); + + const deviceId = getDeviceId(); + + telemetry.changeDeviceId(deviceId); + telemetry.disableOfflineMode(deviceId); + + telemetry.beginSession(); + + window.addEventListener('beforeunload', () => { + telemetry.endSession(); + }); +}; + +export const reportEvent = (eventName: EventName, segmentation?: Record) => { + if (!isProductReportingActivated) { + return; + } + + const telemetryEvent: telemetry.TelemetryEvent = { + name: eventName, + segmentation: { + ...segmentation, + [SegmentationKey.APP]: APP_NAME, + [SegmentationKey.APP_VERSION]: VERSION, + }, + }; + + telemetry.trackEvent(telemetryEvent); +}; diff --git a/src/script/util/Tracking/constants.ts b/src/script/util/Tracking/constants.ts new file mode 100644 index 0000000000..f03ed616c6 --- /dev/null +++ b/src/script/util/Tracking/constants.ts @@ -0,0 +1,21 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +export const REPORTING_DEVICE_ID = 'REPORTING_DEVICE_ID'; +export const APP_NAME = 'account'; diff --git a/src/script/util/Tracking/types.ts b/src/script/util/Tracking/types.ts new file mode 100644 index 0000000000..fecb946ff5 --- /dev/null +++ b/src/script/util/Tracking/types.ts @@ -0,0 +1,43 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +export enum EventName { + USER_MIGRATION_LOGIN = 'user.migration_login', + USER_MIGRATION_CONFIRMATION = 'user.migration_confirmation', + USER_MIGRATION_TERMS_ACKNOWLEDGEMENT = 'user.migration_terms_acknowledgement', + USER_MIGRATION_WELCOME = 'user.migration_welcome', +} + +export enum SegmentationKey { + APP = 'app', + APP_VERSION = 'app_version', + STEP = 'step', +} + +export enum SegmentationValue { + OPENED = 'opened', + EMAIL_ENTERED = 'email_entered', + PASSWORD_ENTERED = 'password_entered', + CONTINUE_CLICKED = 'continue_clicked', + PASSWORD_FORGOTTEN = 'password_forgotten', + AGREE_MIGRATION_TERMS_CHECK = 'agree_migration_terms_check', + AGREE_TOC_CHECK = 'agree_toc_checked', + OPENED_WEB_APP = 'opened_web_app', + OPENED_TM = 'opened_tm', +} diff --git a/yarn.lock b/yarn.lock index 3a86c82eaf..c6b9fe5e7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3252,10 +3252,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.20.0": - version: 1.20.0 - resolution: "@remix-run/router@npm:1.20.0" - checksum: 6bff41117eabb867b17c89baa727580f0a431368b309cd9a1f69767aafa68ea9cac95ff0eeb86d37c2c8655f5cd7c6283d37ae5e6d93e94f648c6112ddb24ede +"@remix-run/router@npm:1.21.0": + version: 1.21.0 + resolution: "@remix-run/router@npm:1.21.0" + checksum: d9477a7772053ad0ffcf03385cfb1a54e56f8a56d1f9f5062de3b1dfcbd019dd73282a00a5a72aa55c120771110982448c165c1405d64540aaef13051a8e45cc languageName: node linkType: hard @@ -3401,6 +3401,13 @@ __metadata: languageName: node linkType: hard +"@types/cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "@types/cookie@npm:0.6.0" + checksum: 5edce7995775b0b196b142883e4d4f71fd93c294eaec973670f1fa2540b70ea7390408ed513ddefef5fcb12a578100c76596e8f2a714b0c2ae9f70ee773f4510 + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.7": version: 3.7.7 resolution: "@types/eslint-scope@npm:3.7.7" @@ -3549,12 +3556,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.8.6": - version: 22.8.6 - resolution: "@types/node@npm:22.8.6" +"@types/node@npm:22.10.1": + version: 22.10.1 + resolution: "@types/node@npm:22.10.1" dependencies: - undici-types: ~6.19.8 - checksum: 3699b6582c433323ed0d6c2f3e9245f0848946e0b4b3b26b11a069ab2ac2c02d3300d544a17dbf4e28899c41afe89811843e41ef5945c98d28561e8abfeb40b1 + undici-types: ~6.20.0 + checksum: 5a9b81500f288a8fb757b61bd939f99f72b6cb59347a5bae52dd1c2c87100ebbaa9da4256ef3cb9add2090e8704cda1d9a1ffc14ccd5db47a6466c8bae10ebcb languageName: node linkType: hard @@ -3678,6 +3685,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:10.0.0": + version: 10.0.0 + resolution: "@types/uuid@npm:10.0.0" + checksum: e3958f8b0fe551c86c14431f5940c3470127293280830684154b91dc7eb3514aeb79fe3216968833cf79d4d1c67f580f054b5be2cd562bebf4f728913e73e944 + languageName: node + linkType: hard + "@types/webpack-env@npm:1.18.5": version: 1.18.5 resolution: "@types/webpack-env@npm:1.18.5" @@ -3701,15 +3715,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/eslint-plugin@npm:8.12.2" +"@typescript-eslint/eslint-plugin@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.16.0" dependencies: "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 8.12.2 - "@typescript-eslint/type-utils": 8.12.2 - "@typescript-eslint/utils": 8.12.2 - "@typescript-eslint/visitor-keys": 8.12.2 + "@typescript-eslint/scope-manager": 8.16.0 + "@typescript-eslint/type-utils": 8.16.0 + "@typescript-eslint/utils": 8.16.0 + "@typescript-eslint/visitor-keys": 8.16.0 graphemer: ^1.4.0 ignore: ^5.3.1 natural-compare: ^1.4.0 @@ -3720,7 +3734,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a1707704d91cd525ece0cf5a978f17cb309bb8918d65ded349e18b0aa364f585555d018a365cb0ab9450f273912fc07fae5600f34294e637151b244ba4485bc2 + checksum: dbb0127eca578a876654b820ea270ef4f2c374447d5c214a8677cc1ccf1ba1b87d9b021cb7586d7e33c4feb9b7b40de1b5ad109f385713cac4627d6ec29bd96b languageName: node linkType: hard @@ -3762,28 +3776,30 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/scope-manager@npm:8.12.2" +"@typescript-eslint/scope-manager@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/scope-manager@npm:8.16.0" dependencies: - "@typescript-eslint/types": 8.12.2 - "@typescript-eslint/visitor-keys": 8.12.2 - checksum: dd960238f1cf0f24e6c16525f0cbdb6cf65bfc3cfe650f376ecda2583c378c2e3a7eb4c2d57e04e009626d009018226b722a670ca283086c2a6cc1931c2268d8 + "@typescript-eslint/types": 8.16.0 + "@typescript-eslint/visitor-keys": 8.16.0 + checksum: 12427e2a95a8b0cb49259be1a8a9a23f734fd0dbabbc5cebf1ba56b48812e2ca7ba32b71ededf24efa1a9da07a13b20ced004e2eea6f4b8c07003438f664ce30 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/type-utils@npm:8.12.2" +"@typescript-eslint/type-utils@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/type-utils@npm:8.16.0" dependencies: - "@typescript-eslint/typescript-estree": 8.12.2 - "@typescript-eslint/utils": 8.12.2 + "@typescript-eslint/typescript-estree": 8.16.0 + "@typescript-eslint/utils": 8.16.0 debug: ^4.3.4 ts-api-utils: ^1.3.0 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: a8f540d84674c4919d6f038848add5b4d41ef39cdf572734a13b75f0f797b00d45903b179dc7c25f7ae7690f9dbaf115e5bda596d9e439b1a0a8d7f9d799260e + checksum: ea3654ff6ae6181911ad6784a7addab9be6b3ce221e6367480061bc8abe8b7ce9f23249f2257f1c5b205e3ea498d5050016596732c66d51ad599dd50aa2c9e16 languageName: node linkType: hard @@ -3801,10 +3817,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/types@npm:8.12.2" - checksum: b0f7effdac842428b15d76710295a8b4f1fe1ff14e40fbb10c8f571c11fd517d75d76decbecf90412bc5eabce0cd4ac0acf53d6b0d8ba2bdde86ab3b627bdac2 +"@typescript-eslint/types@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/types@npm:8.16.0" + checksum: 1ed10343dc65c7fd493cfe789639f547f4c730e6e04472007fa92a00ff1fb77b31fc8016a350a10e553d38b12485f78c331d91c071dc08f69476076f5bbef5cd languageName: node linkType: hard @@ -3846,12 +3862,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/typescript-estree@npm:8.12.2" +"@typescript-eslint/typescript-estree@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.16.0" dependencies: - "@typescript-eslint/types": 8.12.2 - "@typescript-eslint/visitor-keys": 8.12.2 + "@typescript-eslint/types": 8.16.0 + "@typescript-eslint/visitor-keys": 8.16.0 debug: ^4.3.4 fast-glob: ^3.3.2 is-glob: ^4.0.3 @@ -3861,21 +3877,24 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 923d297ba891cbaf4f00618db2313123238657b179f56a5d42d02a4e6433c513f73a9dd9aa62cd2c5b9fb2c5912a59319eb0a14ef2403792e15757142722309a + checksum: 047ae08a7774e4be4307409970d7b8b27d46d10e302ed236199b1b7648242d2aa10b7d1dbeae1fed0f55f683c863f9d399e50108c215e35370fb6a3851bda427 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/utils@npm:8.12.2" +"@typescript-eslint/utils@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/utils@npm:8.16.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 8.12.2 - "@typescript-eslint/types": 8.12.2 - "@typescript-eslint/typescript-estree": 8.12.2 + "@typescript-eslint/scope-manager": 8.16.0 + "@typescript-eslint/types": 8.16.0 + "@typescript-eslint/typescript-estree": 8.16.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 7ae4ef40d0961642fc31644c47e05f751369b47f3d9f5ea4e6c6eaa09d534efc6a2ea89f12368eed7dc8b32a7378e533f84379f70f2acd85418815f63b249b18 + peerDependenciesMeta: + typescript: + optional: true + checksum: 5e3c4b4d453bee6c38715f851d517ad3bbdb9335de5c2ef487e350eea97ae8b2e996046a1d8f3a93109e06a569d1e161b4ef8d33c530766931e4dbc43cb26ed7 languageName: node linkType: hard @@ -3913,13 +3932,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.12.2": - version: 8.12.2 - resolution: "@typescript-eslint/visitor-keys@npm:8.12.2" +"@typescript-eslint/visitor-keys@npm:8.16.0": + version: 8.16.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.16.0" dependencies: - "@typescript-eslint/types": 8.12.2 - eslint-visitor-keys: ^3.4.3 - checksum: 97b919a0f0982e16a46ed568ae195906ec4aed7db358308d2311e9829ceb7f521e4a2017b3bdedad264ee61fdf08d3d12ada7d5622f13b20ac324118fe5b8447 + "@typescript-eslint/types": 8.16.0 + eslint-visitor-keys: ^4.2.0 + checksum: e7444d3d57b4fcdebfa0d7effcdff9c928d77b6a6765da6980f0dbeb6438af707bd4c2c21e24e7ae1638f9c4a5697168f94027fff94ad663da57fa5f44f0983d languageName: node linkType: hard @@ -4114,11 +4133,11 @@ __metadata: languageName: node linkType: hard -"@wireapp/api-client@npm:27.8.0": - version: 27.8.0 - resolution: "@wireapp/api-client@npm:27.8.0" +"@wireapp/api-client@npm:27.11.0": + version: 27.11.0 + resolution: "@wireapp/api-client@npm:27.11.0" dependencies: - "@wireapp/commons": ^5.2.13 + "@wireapp/commons": ^5.4.0 "@wireapp/priority-queue": ^2.1.11 "@wireapp/protocol-messaging": 1.51.0 axios: 1.7.7 @@ -4131,19 +4150,19 @@ __metadata: tough-cookie: 4.1.4 ws: 8.18.0 zod: 3.23.8 - checksum: fe43655eafa13bdeddd0f8e37035b7701e35c4207ce042463ea7cd478e9f762e07429b9da1b18dfe9c49659ea649ae50e525f41551d728e0034e5035f7f9dda4 + checksum: f9f7481ec3556ee471cf8d7c2db4b8833cceac053331fff6a2d389a1a72ea52daab34c2d5cb074d9982d021bf2a46138a30e21fcd457bf7c804ca7059f356622 languageName: node linkType: hard -"@wireapp/commons@npm:5.2.13, @wireapp/commons@npm:^5.2.13": - version: 5.2.13 - resolution: "@wireapp/commons@npm:5.2.13" +"@wireapp/commons@npm:5.4.0, @wireapp/commons@npm:^5.4.0": + version: 5.4.0 + resolution: "@wireapp/commons@npm:5.4.0" dependencies: ansi-regex: 5.0.1 fs-extra: 11.2.0 logdown: 3.3.1 platform: 1.3.6 - checksum: 1a330c3dfa7a6e859135bd50dec231682592e11e5b17b5614ef0a4d5ac40d9251ed0fd11cd896663cfd5375f23a49bd18f8018d0cfe380f33bf34cc2bc89f98f + checksum: a0edf8b4276b2f83c5dca5141187b3475a924716711bdc0fcaf02095d79065f5b032daab0392acc6d27e65fc99d7ef5e1fe33f7a8f7d39a465e9f0cb5b474fed languageName: node linkType: hard @@ -4202,9 +4221,9 @@ __metadata: languageName: node linkType: hard -"@wireapp/react-ui-kit@npm:9.26.0": - version: 9.26.0 - resolution: "@wireapp/react-ui-kit@npm:9.26.0" +"@wireapp/react-ui-kit@npm:9.28.0": + version: 9.28.0 + resolution: "@wireapp/react-ui-kit@npm:9.28.0" dependencies: "@types/color": 3.0.6 color: 4.2.3 @@ -4219,7 +4238,16 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 5d86933b5de6048857164954efa5f292a5f9f7f72913908ff1d4dc31e8098495dea84b165590b325dd155308130dd7ea1c02e80044ffec784b073e4fadc19908 + checksum: ae8f6193ef51f5e0da1f330b7e4e70419889465415e824c4fe65e4ca886924b9927fa2e7cf593eb6a64431692a8d11c7a6c0be700d5141a5e6bbbd886bf3e989 + languageName: node + linkType: hard + +"@wireapp/telemetry@npm:0.1.3": + version: 0.1.3 + resolution: "@wireapp/telemetry@npm:0.1.3" + dependencies: + countly-sdk-web: 24.11.0 + checksum: d172d6ed72c052b0641f25fab64ae994916df3b025e7e60c2220d6fef15f06a68a72ba65aeb0c7f965fa369edcde9521c234c19e9b5271fb4147d2c4c86654d7 languageName: node linkType: hard @@ -5693,6 +5721,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^1.0.1": + version: 1.0.2 + resolution: "cookie@npm:1.0.2" + checksum: 2c5a6214147ffa7135ce41860c781de17e93128689b0d080d3116468274b3593b607bcd462ac210d3a61f081db3d3b09ae106e18d60b1f529580e95cf2db8a55 + languageName: node + linkType: hard + "copy@npm:0.3.2": version: 0.3.2 resolution: "copy@npm:0.3.2" @@ -5778,6 +5813,13 @@ __metadata: languageName: node linkType: hard +"countly-sdk-web@npm:24.11.0": + version: 24.11.0 + resolution: "countly-sdk-web@npm:24.11.0" + checksum: 055bd4cae49d79bea602503de5636db1381f90395057aed373f976ac1e4286fcc2cb569bde57e86229af1b367b3ab4137ad9824ae7ff48a10e03c004cb9dc972 + languageName: node + linkType: hard + "create-jest@npm:^29.7.0": version: 29.7.0 resolution: "create-jest@npm:29.7.0" @@ -5808,13 +5850,13 @@ __metadata: linkType: hard "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" dependencies: path-key: ^3.1.0 shebang-command: ^2.0.0 which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + checksum: 55c50004cb6bbea3649784caac6e7b8ddd03fa8c1e14dbd5a1f15896708378006eb7526a52a0f48770c768c9b8aed48a5888eb8e785ff59ff7749e74f66cd96b languageName: node linkType: hard @@ -6840,9 +6882,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:28.8.3": - version: 28.8.3 - resolution: "eslint-plugin-jest@npm:28.8.3" +"eslint-plugin-jest@npm:28.9.0": + version: 28.9.0 + resolution: "eslint-plugin-jest@npm:28.9.0" dependencies: "@typescript-eslint/utils": ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependencies: @@ -6854,13 +6896,13 @@ __metadata: optional: true jest: optional: true - checksum: e371fcbe2127a403824b6c23b66f6b2e2cc54074c3c70a9965d48bdcdfb461670965a7d7cdddab68f09e703d3a09a281d05591b1cb4315f5246d27fd8baa84ac + checksum: 90863fab5f3f2f033d98042b13769dc82504c489506872ae9926a1d2b6bcc25c5dc41105e28643f5eb81943aff1aa1cd4d44ada5c1add0a43f1c7a619adbc3d2 languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:50.4.3": - version: 50.4.3 - resolution: "eslint-plugin-jsdoc@npm:50.4.3" +"eslint-plugin-jsdoc@npm:50.6.0": + version: 50.6.0 + resolution: "eslint-plugin-jsdoc@npm:50.6.0" dependencies: "@es-joy/jsdoccomment": ~0.49.0 are-docs-informative: ^0.0.2 @@ -6875,7 +6917,7 @@ __metadata: synckit: ^0.9.1 peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 340c432f787a108bfefe8cea58587b68621afda5116f045f3739c9d73c9761ee55b45f295d32ab07cf7a7b859e5f0d4dccfe3e3c4f5b50d537c3030469f5c549 + checksum: 012528306fa67cf76ef6d202d59d1c1834aa33f450950a30eae50805d244d90c4d8a3a2887a508be32f07992239d96fab880b7f5123e6dd1a05239759b5af00e languageName: node linkType: hard @@ -7014,6 +7056,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 779c604672b570bb4da84cef32f6abb085ac78379779c1122d7879eade8bb38ae715645324597cf23232d03cef06032c9844d25c73625bc282a5bfd30247e5b5 + languageName: node + linkType: hard + "eslint@npm:8.57.0": version: 8.57.0 resolution: "eslint@npm:8.57.0" @@ -8369,12 +8418,17 @@ __metadata: languageName: node linkType: hard -"i18next@npm:23.16.4": - version: 23.16.4 - resolution: "i18next@npm:23.16.4" +"i18next@npm:24.0.2": + version: 24.0.2 + resolution: "i18next@npm:24.0.2" dependencies: "@babel/runtime": ^7.23.2 - checksum: a753a23faf87b5028c9b136645b3d6287dd13c6e5ffadcc652edce8c321da2403f57c513aa7168f7ba664e85853aa83acbd291839d622addd701fc85bc991438 + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 4f24f74e42cccff65a589c7dc3b5b5b97511ec4a6a59f57033300cebe79248200a946da26f5282e693b5b4ce2979341f58fc27354c8e4e1ba472874625ae5806 languageName: node linkType: hard @@ -11525,27 +11579,45 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:6.27.0": - version: 6.27.0 - resolution: "react-router-dom@npm:6.27.0" +"react-router-dom@npm:6.28.0": + version: 6.28.0 + resolution: "react-router-dom@npm:6.28.0" dependencies: - "@remix-run/router": 1.20.0 - react-router: 6.27.0 + "@remix-run/router": 1.21.0 + react-router: 6.28.0 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: de3dcc56297a2879a0e3997fa34ba0f3e1b9986a2ad3ef7991f913902ecf38da0282c98f7834f344ce2d881dbab0a382201a57e9f9ef5e9816febdb26dc038b7 + checksum: 0cf4658a92bc66f50ec9d8518c36aa5a402bcadce71fb624ed6f900d73a29ea87ff904a4f2c42279107e75e80cc08c6192563fadcc5d4e642e6d476e38e83b21 languageName: node linkType: hard -"react-router@npm:6.27.0": - version: 6.27.0 - resolution: "react-router@npm:6.27.0" +"react-router@npm:6.28.0": + version: 6.28.0 + resolution: "react-router@npm:6.28.0" dependencies: - "@remix-run/router": 1.20.0 + "@remix-run/router": 1.21.0 peerDependencies: react: ">=16.8" - checksum: d22eedc33bcb11891b431655f90eed2d52c2fb3165ad11ca625f62970caf59c4859e6b1a3f92e78902b31ff1a8b2482ebf97ddebb82e9687d1f98730c14e04e6 + checksum: 23246ca957b5c2bc8d6f9a81fee2df2ce4fc3feca3ec27c2fd85999568fc1299a4e8273e4ab70b6f3acd43a1fb45e0c93cb01ef77e68c9f9e1f7e4f42a1419ea + languageName: node + linkType: hard + +"react-router@npm:7.0.1": + version: 7.0.1 + resolution: "react-router@npm:7.0.1" + dependencies: + "@types/cookie": ^0.6.0 + cookie: ^1.0.1 + set-cookie-parser: ^2.6.0 + turbo-stream: 2.4.0 + peerDependencies: + react: ">=18" + react-dom: ">=18" + peerDependenciesMeta: + react-dom: + optional: true + checksum: 13110d762ce07062b3cfd7097bc2625bfd7df4485836d281338182dd0066517ceb9e9da6bf5dd1070e18fe593f8975031207995c277a4b6fc404b62ba51c91cc languageName: node linkType: hard @@ -12250,6 +12322,13 @@ __metadata: languageName: node linkType: hard +"set-cookie-parser@npm:^2.6.0": + version: 2.7.1 + resolution: "set-cookie-parser@npm:2.7.1" + checksum: 2ef8b351094712f8f7df6d63ed4b10350b24a5b515772690e7dec227df85fcef5bc451c7765f484fd9f36694ece5438d1456407d017f237d0d3351d7dbbd3587 + languageName: node + linkType: hard + "set-function-length@npm:^1.1.1": version: 1.2.0 resolution: "set-function-length@npm:1.2.0" @@ -13268,6 +13347,13 @@ __metadata: languageName: node linkType: hard +"turbo-stream@npm:2.4.0": + version: 2.4.0 + resolution: "turbo-stream@npm:2.4.0" + checksum: e36f52ed40589f01bede79757a143bef484914d579927235be1fd0c205618994cb5779a39ff8c2a80a87a1464d05771cd75320a9412b15bca03c7ff432e3cdf7 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -13530,10 +13616,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.8": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: b7bc50f012dc6afbcce56c9fd62d7e86b20a62ff21f12b7b5cbf1973b9578d90f22a9c7fe50e638e96905d33893bf2f9f16d98929c4673c2480de05c6c96ea8b languageName: node linkType: hard @@ -13687,6 +13773,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:11.0.3": + version: 11.0.3 + resolution: "uuid@npm:11.0.3" + bin: + uuid: dist/esm/bin/uuid + checksum: 646181c77e8b8df9bd07254faa703943e1c4d5ccde7d080312edf12f443f6c5750801fd9b27bf2e628594182165e6b1b880c0382538f7eca00b26622203741dc + languageName: node + linkType: hard + "v8-to-istanbul@npm:^9.0.1": version: 9.2.0 resolution: "v8-to-istanbul@npm:9.2.0" @@ -14136,19 +14231,21 @@ __metadata: "@emotion/babel-preset-css-prop": 11.12.0 "@testing-library/react": 12.1.4 "@types/jest": 29.5.14 - "@types/node": 22.8.6 + "@types/node": 22.10.1 "@types/platform": 1.3.6 "@types/react": 18.3.12 "@types/react-dom": 18.3.1 "@types/react-router-dom": 5.3.3 + "@types/uuid": 10.0.0 "@types/webpack-env": 1.18.5 - "@typescript-eslint/eslint-plugin": 8.12.2 + "@typescript-eslint/eslint-plugin": 8.16.0 "@typescript-eslint/parser": 7.17.0 - "@wireapp/api-client": 27.8.0 - "@wireapp/commons": 5.2.13 + "@wireapp/api-client": 27.11.0 + "@wireapp/commons": 5.4.0 "@wireapp/copy-config": 2.2.10 "@wireapp/eslint-config": 1.4.0 - "@wireapp/react-ui-kit": 9.26.0 + "@wireapp/react-ui-kit": 9.28.0 + "@wireapp/telemetry": 0.1.3 adm-zip: 0.5.16 babel-eslint: 10.1.0 babel-loader: 8.2.5 @@ -14161,8 +14258,8 @@ __metadata: eslint-config-prettier: 9.1.0 eslint-plugin-babel: 5.3.1 eslint-plugin-import: 2.31.0 - eslint-plugin-jest: 28.8.3 - eslint-plugin-jsdoc: 50.4.3 + eslint-plugin-jest: 28.9.0 + eslint-plugin-jsdoc: 50.6.0 eslint-plugin-no-unsanitized: 4.1.2 eslint-plugin-prettier: 5.2 eslint-plugin-react: 7.37.2 @@ -14172,7 +14269,7 @@ __metadata: fs-extra: 11.2.0 generate-changelog: 1.8.0 husky: 4.3.8 - i18next: 23.16.4 + i18next: 24.0.2 i18next-browser-languagedetector: 8.0.0 i18next-react-postprocessor: 3.1.0 i18next-scanner: 4.6.0 @@ -14185,14 +14282,15 @@ __metadata: react: 18.3.1 react-dom: 18.3.1 react-i18next: 11.18.6 - react-router: 6.27.0 - react-router-dom: 6.27.0 + react-router: 7.0.1 + react-router-dom: 6.28.0 simple-git: 3.27.0 sort-json: 2.0.1 svg-inline-loader: 0.8.2 terser-webpack-plugin: 5.3.10 ts-jest: 29.2.5 typescript: 5.6.3 + uuid: 11.0.3 webpack: 5.96.1 webpack-bundle-analyzer: 4.10.2 webpack-cli: 5.1.4