diff --git a/package.json b/package.json index 7ba69c4272..0e1909f3e3 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "@babel/register": "^7.7.4", "@peculiar/webcrypto": "^1.0.22", "@types/classnames": "^2.2.10", + "@types/modernizr": "^3.5.3", "@types/react": "16.9", "babel-eslint": "^10.0.3", "babel-jest": "^24.9.0", diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts new file mode 100644 index 0000000000..1931c0b1d0 --- /dev/null +++ b/src/@types/global.d.ts @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import * as ModernizrStatic from "modernizr"; + +declare global { + interface Window { + Modernizr: ModernizrStatic; + Olm: { + init: () => Promise; + }; + } + + // workaround for https://github.com/microsoft/TypeScript/issues/30933 + interface ObjectConstructor { + fromEntries?(xs: [string|number|symbol, any][]): object + } + + interface Document { + // https://developer.mozilla.org/en-US/docs/Web/API/Document/hasStorageAccess + hasStorageAccess?: () => Promise; + } + + interface StorageEstimate { + usageDetails?: {[key: string]: number}; + } +} diff --git a/src/rageshake/submit-rageshake.js b/src/rageshake/submit-rageshake.ts similarity index 85% rename from src/rageshake/submit-rageshake.js rename to src/rageshake/submit-rageshake.ts index 55c89427c5..921f3fbf40 100644 --- a/src/rageshake/submit-rageshake.js +++ b/src/rageshake/submit-rageshake.ts @@ -33,6 +33,13 @@ if (!TextEncoder) { TextEncoder = TextEncodingUtf8.TextEncoder; } +interface IOpts { + label?: string; + userText?: string; + sendLogs?: boolean; + progressCallback?: (string) => void; +} + /** * Send a bug report. * @@ -48,7 +55,7 @@ if (!TextEncoder) { * * @return {Promise} Resolved when the bug report is sent. */ -export default async function sendBugReport(bugReportEndpoint, opts) { +export default async function sendBugReport(bugReportEndpoint: string, opts: IOpts) { if (!bugReportEndpoint) { throw new Error("No bug report endpoint has been set."); } @@ -70,13 +77,13 @@ export default async function sendBugReport(bugReportEndpoint, opts) { let installedPWA = "UNKNOWN"; try { // Known to work at least for desktop Chrome - installedPWA = window.matchMedia('(display-mode: standalone)').matches; - } catch (e) { } + installedPWA = String(window.matchMedia('(display-mode: standalone)').matches); + } catch (e) {} let touchInput = "UNKNOWN"; try { // MDN claims broad support across browsers - touchInput = window.matchMedia('(pointer: coarse)').matches; + touchInput = String(window.matchMedia('(pointer: coarse)').matches); } catch (e) { } const client = MatrixClientPeg.get(); @@ -118,21 +125,21 @@ export default async function sendBugReport(bugReportEndpoint, opts) { // add storage persistence/quota information if (navigator.storage && navigator.storage.persisted) { try { - body.append("storageManager_persisted", await navigator.storage.persisted()); + body.append("storageManager_persisted", String(await navigator.storage.persisted())); } catch (e) {} } else if (document.hasStorageAccess) { // Safari try { - body.append("storageManager_persisted", await document.hasStorageAccess()); + body.append("storageManager_persisted", String(await document.hasStorageAccess())); } catch (e) {} } if (navigator.storage && navigator.storage.estimate) { try { const estimate = await navigator.storage.estimate(); - body.append("storageManager_quota", estimate.quota); - body.append("storageManager_usage", estimate.usage); + body.append("storageManager_quota", String(estimate.quota)); + body.append("storageManager_usage", String(estimate.usage)); if (estimate.usageDetails) { Object.keys(estimate.usageDetails).forEach(k => { - body.append(`storageManager_usage_${k}`, estimate.usageDetails[k]); + body.append(`storageManager_usage_${k}`, String(estimate.usageDetails[k])); }); } } catch (e) {} @@ -163,7 +170,7 @@ export default async function sendBugReport(bugReportEndpoint, opts) { await _submitReport(bugReportEndpoint, body, progressCallback); } -function _submitReport(endpoint, body, progressCallback) { +function _submitReport(endpoint: string, body: FormData, progressCallback: (string) => void) { return new Promise((resolve, reject) => { const req = new XMLHttpRequest(); req.open("POST", endpoint); diff --git a/yarn.lock b/yarn.lock index c42828e461..c601e37340 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1257,6 +1257,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/modernizr@^3.5.3": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@types/modernizr/-/modernizr-3.5.3.tgz#8ef99e6252191c1d88647809109dc29884ba6d7a" + integrity sha512-jhMOZSS0UGYTS9pqvt6q3wtT3uvOSve5piTEmTMx3zzTuBLvSIMxSIBIc3d5lajVD5h4xc41AMZD2M5orN3PxA== + "@types/node@*": version "13.11.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b"