Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8da65b46e | ||
|
|
12deb3989c | ||
|
|
f75dd746db | ||
|
|
00b0b34a80 | ||
|
|
7672655d1d | ||
|
|
782e056687 | ||
|
|
35501b4e19 | ||
|
|
39cb97bfaf | ||
|
|
17322cc955 | ||
|
|
a48936ab4a | ||
|
|
53c75e34cf |
@@ -35,12 +35,12 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
# Harden against transient registry network failures (ECONNRESET etc.):
|
# Harden against transient registry network failures (ECONNRESET etc.):
|
||||||
# raise npm's built-in fetch retries/timeouts and retry `npm ci` up to
|
# raise npm's built-in fetch retries/timeouts and retry `npm ci` up to
|
||||||
# 3 times with backoff before failing the build.
|
# 5 times with backoff before failing the build.
|
||||||
run: |
|
run: |
|
||||||
npm config set fetch-retries 5
|
npm config set fetch-retries 5
|
||||||
npm config set fetch-retry-mintimeout 20000
|
npm config set fetch-retry-mintimeout 10000
|
||||||
npm config set fetch-retry-maxtimeout 120000
|
npm config set fetch-retry-maxtimeout 60000
|
||||||
npm config set fetch-timeout 600000
|
npm config set fetch-timeout 300000
|
||||||
for attempt in 1 2 3; do
|
for attempt in 1 2 3; do
|
||||||
echo "npm ci attempt $attempt…"
|
echo "npm ci attempt $attempt…"
|
||||||
npm ci && break
|
npm ci && break
|
||||||
@@ -79,11 +79,13 @@ jobs:
|
|||||||
|
|
||||||
- name: ESLint
|
- name: ESLint
|
||||||
run: npm run check:eslint
|
run: npm run check:eslint
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Prettier Check and Fix
|
- name: Prettier Check and Fix
|
||||||
run: |
|
run: |
|
||||||
npx prettier --write .
|
npx prettier --write .
|
||||||
npm run check:prettier
|
npm run check:prettier
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
# ── Security (informational — findings shouldn't block a deploy) ─────
|
# ── Security (informational — findings shouldn't block a deploy) ─────
|
||||||
- name: Audit (high/critical)
|
- name: Audit (high/critical)
|
||||||
|
|||||||
Vendored
+15
-1
@@ -1,5 +1,19 @@
|
|||||||
{
|
{
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"typescript.tsdk": "node_modules/typescript/lib"
|
"js/ts.tsdk.path": "node_modules/typescript/lib",
|
||||||
|
"prettier.requireConfig": true,
|
||||||
|
|
||||||
|
"[typescript]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[typescriptreact]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[javascript]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[javascriptreact]": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+42
-40
@@ -19,10 +19,11 @@
|
|||||||
*
|
*
|
||||||
* Any failure falls back to the unprocessed mic so calls never break.
|
* Any failure falls back to the unprocessed mic so calls never break.
|
||||||
*/
|
*/
|
||||||
|
// TODO: MAKE THIS A TS FILE
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var params;
|
let params;
|
||||||
try {
|
try {
|
||||||
params = new URLSearchParams(window.location.search);
|
params = new URLSearchParams(window.location.search);
|
||||||
if (params.get('lotusDenoise') !== 'ml') return;
|
if (params.get('lotusDenoise') !== 'ml') return;
|
||||||
@@ -33,31 +34,31 @@
|
|||||||
// Derive the parent origin for postMessage targetOrigin from the parentUrl
|
// Derive the parent origin for postMessage targetOrigin from the parentUrl
|
||||||
// widget param (a full URL) so denoise-status messages aren't broadcast with
|
// widget param (a full URL) so denoise-status messages aren't broadcast with
|
||||||
// '*'. Fall back to this frame's own origin if parentUrl is missing/malformed.
|
// '*'. Fall back to this frame's own origin if parentUrl is missing/malformed.
|
||||||
var targetOrigin;
|
let targetOrigin;
|
||||||
try {
|
try {
|
||||||
var parentUrl = params.get('parentUrl');
|
let parentUrl = params.get('parentUrl');
|
||||||
targetOrigin = parentUrl ? new URL(parentUrl).origin : window.location.origin;
|
targetOrigin = parentUrl ? new URL(parentUrl).origin : window.location.origin;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
targetOrigin = window.location.origin;
|
targetOrigin = window.location.origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
var md = navigator.mediaDevices;
|
let md = navigator.mediaDevices;
|
||||||
if (!md || typeof md.getUserMedia !== 'function') return;
|
if (!md || typeof md.getUserMedia !== 'function') return;
|
||||||
if (typeof AudioWorkletNode === 'undefined' || typeof AudioContext === 'undefined') return;
|
if (typeof AudioWorkletNode === 'undefined' || typeof AudioContext === 'undefined') return;
|
||||||
|
|
||||||
var ASSET_BASE = './denoise/';
|
let ASSET_BASE = './denoise/';
|
||||||
|
|
||||||
var MODEL = params.get('lotusModel') || 'rnnoise';
|
let MODEL = params.get('lotusModel') || 'rnnoise';
|
||||||
// DTLN (@workadventure) targets 16 kHz and does not resample internally, so
|
// DTLN (@workadventure) targets 16 kHz and does not resample internally, so
|
||||||
// its whole graph runs in a 16 kHz context; RNNoise/Speex (sapphi) and
|
// its whole graph runs in a 16 kHz context; RNNoise/Speex (sapphi) and
|
||||||
// DeepFilterNet 3 are 48 kHz fullband. The processed MediaStreamTrack is
|
// DeepFilterNet 3 are 48 kHz fullband. The processed MediaStreamTrack is
|
||||||
// published to LiveKit either way (WebRTC/Opus resamples as needed).
|
// published to LiveKit either way (WebRTC/Opus resamples as needed).
|
||||||
var SAMPLE_RATE = MODEL === 'dtln' ? 16000 : 48000;
|
let SAMPLE_RATE = MODEL === 'dtln' ? 16000 : 48000;
|
||||||
var USE_NATIVE_NS = params.get('lotusNativeNS') === 'true';
|
let USE_NATIVE_NS = params.get('lotusNativeNS') === 'true';
|
||||||
var USE_GATE = params.get('lotusGate') === 'true';
|
let USE_GATE = params.get('lotusGate') === 'true';
|
||||||
var GATE_THRESHOLD = parseFloat(params.get('lotusGateThreshold') || '-45');
|
let GATE_THRESHOLD = parseFloat(params.get('lotusGateThreshold') || '-45');
|
||||||
|
|
||||||
var PROCESSORS = {
|
let PROCESSORS = {
|
||||||
rnnoise: {
|
rnnoise: {
|
||||||
name: '@sapphi-red/web-noise-suppressor/rnnoise',
|
name: '@sapphi-red/web-noise-suppressor/rnnoise',
|
||||||
script: 'rnnoiseWorklet.js',
|
script: 'rnnoiseWorklet.js',
|
||||||
@@ -91,9 +92,9 @@
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
var origGetUserMedia = md.getUserMedia.bind(md);
|
let origGetUserMedia = md.getUserMedia.bind(md);
|
||||||
var wasmPromises = {};
|
let wasmPromises = {};
|
||||||
var ctxPromise = null;
|
let ctxPromise = null;
|
||||||
|
|
||||||
function checkSimd() {
|
function checkSimd() {
|
||||||
try {
|
try {
|
||||||
@@ -112,12 +113,12 @@
|
|||||||
|
|
||||||
function loadWasm(modelId) {
|
function loadWasm(modelId) {
|
||||||
if (wasmPromises[modelId]) return wasmPromises[modelId];
|
if (wasmPromises[modelId]) return wasmPromises[modelId];
|
||||||
var p = PROCESSORS[modelId];
|
let p = PROCESSORS[modelId];
|
||||||
if (!p || !p.wasm) return Promise.resolve(null);
|
if (!p || !p.wasm) return Promise.resolve(null);
|
||||||
|
|
||||||
wasmPromises[modelId] = (modelId === 'rnnoise' ? checkSimd() : Promise.resolve(false)).then(
|
wasmPromises[modelId] = (modelId === 'rnnoise' ? checkSimd() : Promise.resolve(false)).then(
|
||||||
function (simd) {
|
function (simd) {
|
||||||
var file = simd && p.simdWasm ? p.simdWasm : p.wasm;
|
let file = simd && p.simdWasm ? p.simdWasm : p.wasm;
|
||||||
return fetch(ASSET_BASE + file).then(function (r) {
|
return fetch(ASSET_BASE + file).then(function (r) {
|
||||||
if (!r.ok) {
|
if (!r.ok) {
|
||||||
if (simd && p.simdWasm)
|
if (simd && p.simdWasm)
|
||||||
@@ -137,7 +138,7 @@
|
|||||||
function getContext() {
|
function getContext() {
|
||||||
if (!ctxPromise) {
|
if (!ctxPromise) {
|
||||||
ctxPromise = (function () {
|
ctxPromise = (function () {
|
||||||
var ctx = new AudioContext({ sampleRate: SAMPLE_RATE });
|
let ctx = new AudioContext({ sampleRate: SAMPLE_RATE });
|
||||||
if (ctx.sampleRate !== SAMPLE_RATE) {
|
if (ctx.sampleRate !== SAMPLE_RATE) {
|
||||||
try {
|
try {
|
||||||
ctx.close();
|
ctx.close();
|
||||||
@@ -146,7 +147,7 @@
|
|||||||
}
|
}
|
||||||
// Load worklet modules. DTLN registers its own processor via the
|
// Load worklet modules. DTLN registers its own processor via the
|
||||||
// dynamic-imported helper (see buildMlNode), so it needs nothing here.
|
// dynamic-imported helper (see buildMlNode), so it needs nothing here.
|
||||||
var scripts = [];
|
let scripts = [];
|
||||||
if (MODEL === 'rnnoise' || MODEL === 'speex') scripts.push(PROCESSORS[MODEL].script);
|
if (MODEL === 'rnnoise' || MODEL === 'speex') scripts.push(PROCESSORS[MODEL].script);
|
||||||
if (USE_GATE) scripts.push(PROCESSORS.gate.script);
|
if (USE_GATE) scripts.push(PROCESSORS.gate.script);
|
||||||
|
|
||||||
@@ -169,7 +170,7 @@
|
|||||||
return ctxPromise;
|
return ctxPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
var hasNotifiedActive = false;
|
let hasNotifiedActive = false;
|
||||||
|
|
||||||
// Build the ML denoise AudioWorkletNode. RNNoise/Speex are flat sapphi
|
// Build the ML denoise AudioWorkletNode. RNNoise/Speex are flat sapphi
|
||||||
// worklets we instantiate directly with the fetched WASM binary. DTLN comes
|
// worklets we instantiate directly with the fetched WASM binary. DTLN comes
|
||||||
@@ -187,9 +188,9 @@
|
|||||||
if (MODEL === 'deepfilternet') {
|
if (MODEL === 'deepfilternet') {
|
||||||
// Resolve an absolute self-hosted base so the package's cdnUrl override
|
// Resolve an absolute self-hosted base so the package's cdnUrl override
|
||||||
// fetches our vendored df_bg.wasm + ONNX model (never the upstream CDN).
|
// fetches our vendored df_bg.wasm + ONNX model (never the upstream CDN).
|
||||||
var dfnBase = new URL(ASSET_BASE + 'deepfilternet', window.location.href).href;
|
let dfnBase = new URL(ASSET_BASE + 'deepfilternet', window.location.href).href;
|
||||||
return import(ASSET_BASE + PROCESSORS.deepfilternet.esm).then(function (mod) {
|
return import(ASSET_BASE + PROCESSORS.deepfilternet.esm).then(function (mod) {
|
||||||
var core = new mod.DeepFilterNet3Core({
|
let core = new mod.DeepFilterNet3Core({
|
||||||
sampleRate: SAMPLE_RATE,
|
sampleRate: SAMPLE_RATE,
|
||||||
noiseReductionLevel: 80,
|
noiseReductionLevel: 80,
|
||||||
assetConfig: { cdnUrl: dfnBase },
|
assetConfig: { cdnUrl: dfnBase },
|
||||||
@@ -212,7 +213,8 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var node = new AudioWorkletNode(ctx, PROCESSORS[MODEL].name, {
|
|
||||||
|
let node = new AudioWorkletNode(ctx, PROCESSORS[MODEL].name, {
|
||||||
channelCount: 1,
|
channelCount: 1,
|
||||||
numberOfInputs: 1,
|
numberOfInputs: 1,
|
||||||
numberOfOutputs: 1,
|
numberOfOutputs: 1,
|
||||||
@@ -230,21 +232,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function processStream(stream) {
|
function processStream(stream) {
|
||||||
var audioTracks = stream.getAudioTracks();
|
let audioTracks = stream.getAudioTracks();
|
||||||
if (audioTracks.length === 0) return Promise.resolve(stream);
|
if (audioTracks.length === 0) return Promise.resolve(stream);
|
||||||
|
|
||||||
return Promise.all([loadWasm(MODEL), getContext()])
|
return Promise.all([loadWasm(MODEL), getContext()])
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var wasmBinary = res[0];
|
let wasmBinary = res[0];
|
||||||
var ctx = res[1];
|
let ctx = res[1];
|
||||||
|
|
||||||
var source = ctx.createMediaStreamSource(stream);
|
let source = ctx.createMediaStreamSource(stream);
|
||||||
var dest = ctx.createMediaStreamDestination();
|
let dest = ctx.createMediaStreamDestination();
|
||||||
var head = source;
|
let head = source;
|
||||||
|
|
||||||
// 1. Optional Noise Gate
|
// 1. Optional Noise Gate
|
||||||
if (USE_GATE) {
|
if (USE_GATE) {
|
||||||
var gateNode = new AudioWorkletNode(ctx, PROCESSORS.gate.name, {
|
let gateNode = new AudioWorkletNode(ctx, PROCESSORS.gate.name, {
|
||||||
processorOptions: {
|
processorOptions: {
|
||||||
openThreshold: GATE_THRESHOLD,
|
openThreshold: GATE_THRESHOLD,
|
||||||
closeThreshold: GATE_THRESHOLD - 5,
|
closeThreshold: GATE_THRESHOLD - 5,
|
||||||
@@ -258,7 +260,7 @@
|
|||||||
|
|
||||||
// 2. ML Processor
|
// 2. ML Processor
|
||||||
return buildMlNode(ctx, wasmBinary).then(function (ml) {
|
return buildMlNode(ctx, wasmBinary).then(function (ml) {
|
||||||
var mlNode = ml.node;
|
let mlNode = ml.node;
|
||||||
head.connect(mlNode);
|
head.connect(mlNode);
|
||||||
mlNode.connect(dest);
|
mlNode.connect(dest);
|
||||||
|
|
||||||
@@ -266,15 +268,15 @@
|
|||||||
// the track handoff — audio flows via bypassUntilReady meanwhile.
|
// the track handoff — audio flows via bypassUntilReady meanwhile.
|
||||||
if (ml.ready && typeof ml.ready.then === 'function') {
|
if (ml.ready && typeof ml.ready.then === 'function') {
|
||||||
ml.ready.catch(function (err) {
|
ml.ready.catch(function (err) {
|
||||||
var m = err instanceof Error ? err.message : String(err);
|
let m = err instanceof Error ? err.message : String(err);
|
||||||
console.error('[lotus-denoise] ' + MODEL + ' init failed:', m);
|
console.error('[lotus-denoise] ' + MODEL + ' init failed:', m);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var origTrack = audioTracks[0];
|
let origTrack = audioTracks[0];
|
||||||
var processedTrack = dest.stream.getAudioTracks()[0];
|
let processedTrack = dest.stream.getAudioTracks()[0];
|
||||||
|
|
||||||
var torndown = false;
|
let torndown = false;
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
if (torndown) return;
|
if (torndown) return;
|
||||||
torndown = true;
|
torndown = true;
|
||||||
@@ -293,7 +295,7 @@
|
|||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
var rawStop = processedTrack.stop.bind(processedTrack);
|
let rawStop = processedTrack.stop.bind(processedTrack);
|
||||||
processedTrack.stop = function () {
|
processedTrack.stop = function () {
|
||||||
cleanup();
|
cleanup();
|
||||||
rawStop();
|
rawStop();
|
||||||
@@ -319,7 +321,7 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
var out = new MediaStream();
|
let out = new MediaStream();
|
||||||
out.addTrack(processedTrack);
|
out.addTrack(processedTrack);
|
||||||
stream.getVideoTracks().forEach(function (t) {
|
stream.getVideoTracks().forEach(function (t) {
|
||||||
out.addTrack(t);
|
out.addTrack(t);
|
||||||
@@ -328,7 +330,7 @@
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch(function (e) {
|
.catch(function (e) {
|
||||||
var msg = e instanceof Error ? e.message : String(e);
|
let msg = e instanceof Error ? e.message : String(e);
|
||||||
console.error('[lotus-denoise] Setup failed:', msg);
|
console.error('[lotus-denoise] Setup failed:', msg);
|
||||||
window.parent.postMessage(
|
window.parent.postMessage(
|
||||||
{ type: 'lotus-denoise-status', active: false, error: msg },
|
{ type: 'lotus-denoise-status', active: false, error: msg },
|
||||||
@@ -339,10 +341,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
navigator.mediaDevices.getUserMedia = function (constraints) {
|
navigator.mediaDevices.getUserMedia = function (constraints) {
|
||||||
var wantsAudio = !!(constraints && constraints.audio);
|
let wantsAudio = !!(constraints && constraints.audio);
|
||||||
var effective = constraints;
|
let effective = constraints;
|
||||||
if (wantsAudio) {
|
if (wantsAudio) {
|
||||||
var audioC =
|
let audioC =
|
||||||
typeof constraints.audio === 'object' ? Object.assign({}, constraints.audio) : {};
|
typeof constraints.audio === 'object' ? Object.assign({}, constraints.audio) : {};
|
||||||
audioC.noiseSuppression = USE_NATIVE_NS;
|
audioC.noiseSuppression = USE_NATIVE_NS;
|
||||||
audioC.channelCount = 1;
|
audioC.channelCount = 1;
|
||||||
|
|||||||
Generated
+1597
-4576
File diff suppressed because it is too large
Load Diff
+8
-14
@@ -35,7 +35,6 @@
|
|||||||
"@eslint/eslintrc": "3.3.5",
|
"@eslint/eslintrc": "3.3.5",
|
||||||
"@eslint/js": "10.0.1",
|
"@eslint/js": "10.0.1",
|
||||||
"@fontsource-variable/inter": "5.2.8",
|
"@fontsource-variable/inter": "5.2.8",
|
||||||
"@giphy/js-fetch-api": "5.8.0",
|
|
||||||
"@giphy/js-types": "5.1.0",
|
"@giphy/js-types": "5.1.0",
|
||||||
"@giphy/js-util": "2.0.0",
|
"@giphy/js-util": "2.0.0",
|
||||||
"@giphy/react-components": "10.1.2",
|
"@giphy/react-components": "10.1.2",
|
||||||
@@ -43,16 +42,15 @@
|
|||||||
"@tanstack/react-query": "5.100.13",
|
"@tanstack/react-query": "5.100.13",
|
||||||
"@tanstack/react-query-devtools": "5.100.13",
|
"@tanstack/react-query-devtools": "5.100.13",
|
||||||
"@tanstack/react-virtual": "3.13.25",
|
"@tanstack/react-virtual": "3.13.25",
|
||||||
"@workadventure/noise-suppression": "0.0.4",
|
"@workadventure/noise-suppression": "0.1.1",
|
||||||
"await-to-js": "3.0.0",
|
"await-to-js": "3.0.0",
|
||||||
"badwords-list": "2.0.1-4",
|
"badwords-list": "2.0.1-4",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"browser-encrypt-attachment": "0.3.0",
|
"browser-encrypt-attachment": "0.3.0",
|
||||||
"chroma-js": "3.2.0",
|
"chroma-js": "3.2.0",
|
||||||
"classnames": "2.5.1",
|
"classnames": "2.5.1",
|
||||||
"dateformat": "5.0.3",
|
|
||||||
"dayjs": "1.11.20",
|
"dayjs": "1.11.20",
|
||||||
"deepfilternet3-noise-filter": "1.2.1",
|
"deepfilternet3-noise-filter": "1.3.0",
|
||||||
"domhandler": "6.0.1",
|
"domhandler": "6.0.1",
|
||||||
"emojibase": "17.0.0",
|
"emojibase": "17.0.0",
|
||||||
"emojibase-data": "17.0.0",
|
"emojibase-data": "17.0.0",
|
||||||
@@ -69,12 +67,13 @@
|
|||||||
"is-hotkey": "0.2.0",
|
"is-hotkey": "0.2.0",
|
||||||
"jotai": "2.20.0",
|
"jotai": "2.20.0",
|
||||||
"jsqr": "1.4.0",
|
"jsqr": "1.4.0",
|
||||||
"katex": "0.16.11",
|
"katex": "0.16.47",
|
||||||
"linkify-react": "4.3.3",
|
"linkify-react": "4.3.3",
|
||||||
"linkifyjs": "4.3.3",
|
"linkifyjs": "4.3.3",
|
||||||
"matrix-js-sdk": "41.7.0",
|
"matrix-js-sdk": "41.7.0",
|
||||||
"matrix-widget-api": "1.17.0",
|
"matrix-widget-api": "1.17.0",
|
||||||
"millify": "6.1.0",
|
"millify": "6.1.0",
|
||||||
|
"oidc-client-ts": "3.5.0",
|
||||||
"pdfjs-dist": "5.7.284",
|
"pdfjs-dist": "5.7.284",
|
||||||
"prismjs": "1.30.0",
|
"prismjs": "1.30.0",
|
||||||
"qrcode": "1.5.4",
|
"qrcode": "1.5.4",
|
||||||
@@ -88,7 +87,7 @@
|
|||||||
"react-google-recaptcha": "3.1.0",
|
"react-google-recaptcha": "3.1.0",
|
||||||
"react-i18next": "17.0.8",
|
"react-i18next": "17.0.8",
|
||||||
"react-range": "1.10.0",
|
"react-range": "1.10.0",
|
||||||
"react-router-dom": "7.15.1",
|
"react-router": "8.3.0",
|
||||||
"sanitize-html": "2.17.6",
|
"sanitize-html": "2.17.6",
|
||||||
"slate": "0.124.1",
|
"slate": "0.124.1",
|
||||||
"slate-dom": "0.124.1",
|
"slate-dom": "0.124.1",
|
||||||
@@ -105,7 +104,6 @@
|
|||||||
"@types/chroma-js": "3.1.2",
|
"@types/chroma-js": "3.1.2",
|
||||||
"@types/file-saver": "2.0.7",
|
"@types/file-saver": "2.0.7",
|
||||||
"@types/is-hotkey": "0.1.10",
|
"@types/is-hotkey": "0.1.10",
|
||||||
"@types/katex": "0.16.8",
|
|
||||||
"@types/node": "25.9.1",
|
"@types/node": "25.9.1",
|
||||||
"@types/prismjs": "1.26.6",
|
"@types/prismjs": "1.26.6",
|
||||||
"@types/qrcode": "1.5.6",
|
"@types/qrcode": "1.5.6",
|
||||||
@@ -113,29 +111,24 @@
|
|||||||
"@types/react-dom": "19.2.3",
|
"@types/react-dom": "19.2.3",
|
||||||
"@types/react-google-recaptcha": "2.1.9",
|
"@types/react-google-recaptcha": "2.1.9",
|
||||||
"@types/sanitize-html": "2.16.1",
|
"@types/sanitize-html": "2.16.1",
|
||||||
"@types/ua-parser-js": "0.7.39",
|
|
||||||
"@typescript-eslint/eslint-plugin": "8.59.4",
|
"@typescript-eslint/eslint-plugin": "8.59.4",
|
||||||
"@typescript-eslint/parser": "8.59.4",
|
"@typescript-eslint/parser": "8.59.4",
|
||||||
"@vanilla-extract/css": "1.20.1",
|
"@vanilla-extract/css": "1.20.1",
|
||||||
"@vanilla-extract/recipes": "0.5.7",
|
"@vanilla-extract/recipes": "0.5.7",
|
||||||
"@vanilla-extract/vite-plugin": "5.2.2",
|
"@vanilla-extract/vite-plugin": "5.2.2",
|
||||||
"@vitejs/plugin-react": "6.0.2",
|
"@vitejs/plugin-react": "6.0.2",
|
||||||
"buffer": "6.0.3",
|
|
||||||
"cz-conventional-changelog": "3.3.0",
|
|
||||||
"eslint": "9.39.4",
|
"eslint": "9.39.4",
|
||||||
"eslint-config-airbnb": "19.0.4",
|
"eslint-config-airbnb": "19.0.4",
|
||||||
"eslint-config-airbnb-base": "15.0.0",
|
"eslint-config-airbnb-base": "15.0.0",
|
||||||
"eslint-config-prettier": "10.1.8",
|
"eslint-config-prettier": "10.1.8",
|
||||||
"eslint-plugin-import": "2.32.0",
|
|
||||||
"eslint-plugin-jsx-a11y": "6.10.2",
|
"eslint-plugin-jsx-a11y": "6.10.2",
|
||||||
"eslint-plugin-react": "7.37.5",
|
"eslint-plugin-react": "7.37.5",
|
||||||
"eslint-plugin-react-hooks": "7.1.1",
|
"eslint-plugin-react-hooks": "7.1.1",
|
||||||
"husky": "9.1.7",
|
"husky": "9.1.7",
|
||||||
"lint-staged": "17.0.5",
|
|
||||||
"prettier": "3.8.3",
|
"prettier": "3.8.3",
|
||||||
"tsx": "4.22.4",
|
"tsx": "4.22.4",
|
||||||
"typescript": "6.0.3",
|
"typescript": "6.0.3",
|
||||||
"vite": "8.0.14",
|
"vite": "8.2.0",
|
||||||
"vite-plugin-pwa": "1.3.0",
|
"vite-plugin-pwa": "1.3.0",
|
||||||
"vite-plugin-static-copy": "4.1.0"
|
"vite-plugin-static-copy": "4.1.0"
|
||||||
},
|
},
|
||||||
@@ -146,6 +139,7 @@
|
|||||||
"js-cookie": ">=3.0.6"
|
"js-cookie": ">=3.0.6"
|
||||||
},
|
},
|
||||||
"allowScripts": {
|
"allowScripts": {
|
||||||
"esbuild@0.28.1": true
|
"protobufjs": true,
|
||||||
|
"esbuild": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ReactNode, useCallback } from 'react';
|
import { ReactNode, useCallback } from 'react';
|
||||||
import { matchPath, useLocation, useNavigate } from 'react-router-dom';
|
import { matchPath, useLocation, useNavigate } from 'react-router';
|
||||||
import {
|
import {
|
||||||
getDirectPath,
|
getDirectPath,
|
||||||
getExplorePath,
|
getExplorePath,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import React, { ComponentProps, forwardRef } from 'react';
|
import React, { ComponentProps, forwardRef } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router';
|
||||||
import { as } from 'folds';
|
import { as } from 'folds';
|
||||||
import * as css from './styles.css';
|
import * as css from './styles.css';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { MouseEventHandler, useCallback, useMemo, useState } from 'react';
|
import React, { MouseEventHandler, useCallback, useMemo, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { isKeyHotkey } from 'is-hotkey';
|
import { isKeyHotkey } from 'is-hotkey';
|
||||||
import { Room } from 'matrix-js-sdk';
|
import { Room } from 'matrix-js-sdk';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Box, Button, color, config, Icon, IconButton, Icons, Spinner, Text, toRem } from 'folds';
|
import { Box, Button, color, config, Icon, IconButton, Icons, Spinner, Text, toRem } from 'folds';
|
||||||
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { VerificationRequest } from 'matrix-js-sdk/lib/crypto-api';
|
import { VerificationRequest } from 'matrix-js-sdk/lib/crypto-api';
|
||||||
import { AsyncState, AsyncStatus, useAsync } from '../../hooks/useAsyncCallback';
|
import { AsyncState, AsyncStatus, useAsync } from '../../hooks/useAsyncCallback';
|
||||||
import { VerificationStatus } from '../../hooks/useDeviceVerificationStatus';
|
import { VerificationStatus } from '../../hooks/useDeviceVerificationStatus';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Box, Button, color, config, Icon, Icons, Input, Spinner, Switch, Text } from 'folds';
|
import { Box, Button, color, config, Icon, Icons, Input, Spinner, Switch, Text } from 'folds';
|
||||||
import React, { FormEventHandler, useCallback, useState } from 'react';
|
import React, { FormEventHandler, useCallback, useState } from 'react';
|
||||||
import { ICreateRoomStateEvent, MatrixError, Preset, Visibility } from 'matrix-js-sdk';
|
import { ICreateRoomStateEvent, MatrixError, Preset, Visibility } from 'matrix-js-sdk';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { SettingTile } from '../../components/setting-tile';
|
import { SettingTile } from '../../components/setting-tile';
|
||||||
import { SequenceCard } from '../../components/sequence-card';
|
import { SequenceCard } from '../../components/sequence-card';
|
||||||
import { addRoomIdToMDirect, isUserId } from '../../utils/matrix';
|
import { addRoomIdToMDirect, isUserId } from '../../utils/matrix';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { MouseEventHandler, useCallback, useMemo, useRef, useState } from
|
|||||||
import { Box, Chip, Icon, IconButton, Icons, Line, Scroll, Spinner, Text, config } from 'folds';
|
import { Box, Chip, Icon, IconButton, Icons, Line, Scroll, Spinner, Text, config } from 'folds';
|
||||||
import { useVirtualizer } from '@tanstack/react-virtual';
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
||||||
import { useAtom, useAtomValue } from 'jotai';
|
import { useAtom, useAtomValue } from 'jotai';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { JoinRule, RestrictedAllowType, Room } from 'matrix-js-sdk';
|
import { JoinRule, RestrictedAllowType, Room } from 'matrix-js-sdk';
|
||||||
import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types';
|
import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types';
|
||||||
import { IHierarchyRoom } from 'matrix-js-sdk/lib/@types/spaces';
|
import { IHierarchyRoom } from 'matrix-js-sdk/lib/@types/spaces';
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import {
|
|||||||
import { useAtom, useAtomValue } from 'jotai';
|
import { useAtom, useAtomValue } from 'jotai';
|
||||||
import { useVirtualizer } from '@tanstack/react-virtual';
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
||||||
import { useInfiniteQuery } from '@tanstack/react-query';
|
import { useInfiniteQuery } from '@tanstack/react-query';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router';
|
||||||
import { EventTimeline, EventType, Room, SearchOrderBy } from 'matrix-js-sdk';
|
import { EventTimeline, EventType, Room, SearchOrderBy } from 'matrix-js-sdk';
|
||||||
import { RoomPinnedEventsEventContent } from 'matrix-js-sdk/lib/types';
|
import { RoomPinnedEventsEventContent } from 'matrix-js-sdk/lib/types';
|
||||||
import { PageHero, PageHeroEmpty, PageHeroSection } from '../../components/page';
|
import { PageHero, PageHeroEmpty, PageHeroSection } from '../../components/page';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useSetAtom } from 'jotai';
|
import { useSetAtom } from 'jotai';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { Box, Text, TooltipProvider, Tooltip, Icon, Icons, IconButton, toRem } from 'folds';
|
import { Box, Text, TooltipProvider, Tooltip, Icon, Icons, IconButton, toRem } from 'folds';
|
||||||
import { Page, PageHeader } from '../../components/page';
|
import { Page, PageHeader } from '../../components/page';
|
||||||
import { callChatAtom } from '../../state/callEmbed';
|
import { callChatAtom } from '../../state/callEmbed';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { useCallback, useEffect, useRef } from 'react';
|
import React, { useCallback, useEffect, useRef } from 'react';
|
||||||
import { Box, Line } from 'folds';
|
import { Box, Line } from 'folds';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { isKeyHotkey } from 'is-hotkey';
|
import { isKeyHotkey } from 'is-hotkey';
|
||||||
import { useAtomValue, useSetAtom } from 'jotai';
|
import { useAtomValue, useSetAtom } from 'jotai';
|
||||||
import { RoomView } from './RoomView';
|
import { RoomView } from './RoomView';
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import {
|
|||||||
Button,
|
Button,
|
||||||
} from 'folds';
|
} from 'folds';
|
||||||
import { useAtom } from 'jotai';
|
import { useAtom } from 'jotai';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { Room } from 'matrix-js-sdk';
|
import { Room } from 'matrix-js-sdk';
|
||||||
import { useStateEvent } from '../../hooks/useStateEvent';
|
import { useStateEvent } from '../../hooks/useStateEvent';
|
||||||
import { PageHeader } from '../../components/page';
|
import { PageHeader } from '../../components/page';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useMatch } from 'react-router-dom';
|
import { useMatch } from 'react-router';
|
||||||
import { getCreatePath } from '../../pages/pathUtils';
|
import { getCreatePath } from '../../pages/pathUtils';
|
||||||
|
|
||||||
export const useCreateSelected = (): boolean => {
|
export const useCreateSelected = (): boolean => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useMatch } from 'react-router-dom';
|
import { useMatch } from 'react-router';
|
||||||
import { getDirectCreatePath, getDirectPath } from '../../pages/pathUtils';
|
import { getDirectCreatePath, getDirectPath } from '../../pages/pathUtils';
|
||||||
|
|
||||||
export const useDirectSelected = (): boolean => {
|
export const useDirectSelected = (): boolean => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useMatch, useParams } from 'react-router-dom';
|
import { useMatch, useParams } from 'react-router';
|
||||||
import { getExploreFeaturedPath, getExplorePath } from '../../pages/pathUtils';
|
import { getExploreFeaturedPath, getExplorePath } from '../../pages/pathUtils';
|
||||||
|
|
||||||
export const useExploreSelected = (): boolean => {
|
export const useExploreSelected = (): boolean => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useMatch } from 'react-router-dom';
|
import { useMatch } from 'react-router';
|
||||||
import {
|
import {
|
||||||
getHomeCreatePath,
|
getHomeCreatePath,
|
||||||
getHomeJoinPath,
|
getHomeJoinPath,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useMatch } from 'react-router-dom';
|
import { useMatch } from 'react-router';
|
||||||
import {
|
import {
|
||||||
getInboxInvitesPath,
|
getInboxInvitesPath,
|
||||||
getInboxNotificationsPath,
|
getInboxNotificationsPath,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router';
|
||||||
import { getRoomSearchParams } from '../../pages/pathSearchParam';
|
import { getRoomSearchParams } from '../../pages/pathSearchParam';
|
||||||
import { decodeSearchParamValueArray } from '../../pages/pathUtils';
|
import { decodeSearchParamValueArray } from '../../pages/pathUtils';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { getCanonicalAliasRoomId, isRoomAlias } from '../../utils/matrix';
|
import { getCanonicalAliasRoomId, isRoomAlias } from '../../utils/matrix';
|
||||||
import { useMatrixClient } from '../useMatrixClient';
|
import { useMatrixClient } from '../useMatrixClient';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useMatch, useParams } from 'react-router-dom';
|
import { useMatch, useParams } from 'react-router';
|
||||||
import { getCanonicalAliasRoomId, isRoomAlias } from '../../utils/matrix';
|
import { getCanonicalAliasRoomId, isRoomAlias } from '../../utils/matrix';
|
||||||
import { useMatrixClient } from '../useMatrixClient';
|
import { useMatrixClient } from '../useMatrixClient';
|
||||||
import { getSpaceLobbyPath, getSpaceSearchPath } from '../../pages/pathUtils';
|
import { getSpaceLobbyPath, getSpaceSearchPath } from '../../pages/pathUtils';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useCallback, useEffect } from 'react';
|
import { useCallback, useEffect } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { useMatrixClient } from './useMatrixClient';
|
import { useMatrixClient } from './useMatrixClient';
|
||||||
import { useRoomNavigate } from './useRoomNavigate';
|
import { useRoomNavigate } from './useRoomNavigate';
|
||||||
import { isRoomId } from '../utils/matrix';
|
import { isRoomId } from '../utils/matrix';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ReactEventHandler, useCallback } from 'react';
|
import { ReactEventHandler, useCallback } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { useRoomNavigate } from './useRoomNavigate';
|
import { useRoomNavigate } from './useRoomNavigate';
|
||||||
import { useMatrixClient } from './useMatrixClient';
|
import { useMatrixClient } from './useMatrixClient';
|
||||||
import { isRoomId, isUserId } from '../utils/matrix';
|
import { isRoomId, isUserId } from '../utils/matrix';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useSetAtom } from 'jotai';
|
import { useSetAtom } from 'jotai';
|
||||||
import { useLocation } from 'react-router-dom';
|
import { useLocation } from 'react-router';
|
||||||
import { useNavToActivePathAtom } from '../state/hooks/navToActivePath';
|
import { useNavToActivePathAtom } from '../state/hooks/navToActivePath';
|
||||||
|
|
||||||
export const useNavToActivePathMapper = (navId: string) => {
|
export const useNavToActivePathMapper = (navId: string) => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { NavigateOptions, useNavigate } from 'react-router-dom';
|
import { NavigateOptions, useNavigate } from 'react-router';
|
||||||
import { useAtomValue } from 'jotai';
|
import { useAtomValue } from 'jotai';
|
||||||
import { getCanonicalAliasOrRoomId } from '../utils/matrix';
|
import { getCanonicalAliasOrRoomId } from '../utils/matrix';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { MsgType } from 'matrix-js-sdk';
|
import { MsgType } from 'matrix-js-sdk';
|
||||||
import { useMatrixClient } from './useMatrixClient';
|
import { useMatrixClient } from './useMatrixClient';
|
||||||
import { useTauriEvent } from './useTauri';
|
import { useTauriEvent } from './useTauri';
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
toRem,
|
toRem,
|
||||||
TooltipContainerProvider,
|
TooltipContainerProvider,
|
||||||
} from 'folds';
|
} from 'folds';
|
||||||
import { RouterProvider } from 'react-router-dom';
|
import { RouterProvider } from 'react-router';
|
||||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||||||
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
|
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { useMatch } from 'react-router-dom';
|
import { useMatch } from 'react-router';
|
||||||
import { ScreenSize, useScreenSizeContext } from '../hooks/useScreenSize';
|
import { ScreenSize, useScreenSizeContext } from '../hooks/useScreenSize';
|
||||||
import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from './paths';
|
import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from './paths';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useRouteError, isRouteErrorResponse } from 'react-router-dom';
|
import { useRouteError, isRouteErrorResponse } from 'react-router';
|
||||||
import { Box, Button, config, Text, toRem } from 'folds';
|
import { Box, Button, config, Text, toRem } from 'folds';
|
||||||
|
|
||||||
export function RouteError() {
|
export function RouteError() {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
createHashRouter,
|
createHashRouter,
|
||||||
createRoutesFromElements,
|
createRoutesFromElements,
|
||||||
redirect,
|
redirect,
|
||||||
} from 'react-router-dom';
|
} from 'react-router';
|
||||||
import { RoomSkeleton } from '../components/RoomSkeleton';
|
import { RoomSkeleton } from '../components/RoomSkeleton';
|
||||||
import { LobbySkeleton } from '../components/LobbySkeleton';
|
import { LobbySkeleton } from '../components/LobbySkeleton';
|
||||||
import { AuthSkeleton } from '../components/AuthSkeleton';
|
import { AuthSkeleton } from '../components/AuthSkeleton';
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
import React, { useCallback, useEffect } from 'react';
|
import React, { useCallback, useEffect } from 'react';
|
||||||
import { Box, Header, Scroll, Spinner, Text, color } from 'folds';
|
import { Box, Header, Scroll, Spinner, Text, color } from 'folds';
|
||||||
import {
|
import { Outlet, generatePath, matchPath, useLocation, useNavigate, useParams } from 'react-router';
|
||||||
Outlet,
|
|
||||||
generatePath,
|
|
||||||
matchPath,
|
|
||||||
useLocation,
|
|
||||||
useNavigate,
|
|
||||||
useParams,
|
|
||||||
} from 'react-router-dom';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
import { AuthFooter } from './AuthFooter';
|
import { AuthFooter } from './AuthFooter';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { Box, Text, color } from 'folds';
|
import { Box, Text, color } from 'folds';
|
||||||
import { Link, useSearchParams } from 'react-router-dom';
|
import { Link, useSearchParams } from 'react-router';
|
||||||
import { SSOAction } from 'matrix-js-sdk';
|
import { SSOAction } from 'matrix-js-sdk';
|
||||||
import { useAuthFlows } from '../../../hooks/useAuthFlows';
|
import { useAuthFlows } from '../../../hooks/useAuthFlows';
|
||||||
import { useAuthServer } from '../../../hooks/useAuthServer';
|
import { useAuthServer } from '../../../hooks/useAuthServer';
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import {
|
|||||||
config,
|
config,
|
||||||
} from 'folds';
|
} from 'folds';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router';
|
||||||
import { MatrixError } from 'matrix-js-sdk';
|
import { MatrixError } from 'matrix-js-sdk';
|
||||||
import { getMxIdLocalPart, getMxIdServer, isUserId } from '../../../utils/matrix';
|
import { getMxIdLocalPart, getMxIdServer, isUserId } from '../../../utils/matrix';
|
||||||
import { EMAIL_REGEX } from '../../../utils/regex';
|
import { EMAIL_REGEX } from '../../../utils/regex';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import to from 'await-to-js';
|
import to from 'await-to-js';
|
||||||
import { LoginRequest, LoginResponse, MatrixError, createClient } from 'matrix-js-sdk';
|
import { LoginRequest, LoginResponse, MatrixError, createClient } from 'matrix-js-sdk';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { ClientConfig, clientAllowedServer } from '../../../hooks/useClientConfig';
|
import { ClientConfig, clientAllowedServer } from '../../../hooks/useClientConfig';
|
||||||
import { autoDiscovery, specVersions } from '../../../cs-api';
|
import { autoDiscovery, specVersions } from '../../../cs-api';
|
||||||
import { ErrorCode } from '../../../cs-errorcode';
|
import { ErrorCode } from '../../../cs-errorcode';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { Box, Text, color } from 'folds';
|
import { Box, Text, color } from 'folds';
|
||||||
import { Link, useSearchParams } from 'react-router-dom';
|
import { Link, useSearchParams } from 'react-router';
|
||||||
import { SSOAction } from 'matrix-js-sdk';
|
import { SSOAction } from 'matrix-js-sdk';
|
||||||
import { useAuthServer } from '../../../hooks/useAuthServer';
|
import { useAuthServer } from '../../../hooks/useAuthServer';
|
||||||
import { RegisterFlowStatus, useAuthFlows } from '../../../hooks/useAuthFlows';
|
import { RegisterFlowStatus, useAuthFlows } from '../../../hooks/useAuthFlows';
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
RegisterResponse,
|
RegisterResponse,
|
||||||
} from 'matrix-js-sdk';
|
} from 'matrix-js-sdk';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { LoginPathSearchParams } from '../../paths';
|
import { LoginPathSearchParams } from '../../paths';
|
||||||
import { ErrorCode } from '../../../cs-errorcode';
|
import { ErrorCode } from '../../../cs-errorcode';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
color,
|
color,
|
||||||
config,
|
config,
|
||||||
} from 'folds';
|
} from 'folds';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { AuthDict, AuthType, MatrixError, createClient } from 'matrix-js-sdk';
|
import { AuthDict, AuthType, MatrixError, createClient } from 'matrix-js-sdk';
|
||||||
import { useAutoDiscoveryInfo } from '../../../hooks/useAutoDiscoveryInfo';
|
import { useAutoDiscoveryInfo } from '../../../hooks/useAutoDiscoveryInfo';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Box, Text } from 'folds';
|
import { Box, Text } from 'folds';
|
||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { Link, useSearchParams } from 'react-router-dom';
|
import { Link, useSearchParams } from 'react-router';
|
||||||
import { getLoginPath } from '../../pathUtils';
|
import { getLoginPath } from '../../pathUtils';
|
||||||
import { useAuthServer } from '../../../hooks/useAuthServer';
|
import { useAuthServer } from '../../../hooks/useAuthServer';
|
||||||
import { PasswordResetForm } from './PasswordResetForm';
|
import { PasswordResetForm } from './PasswordResetForm';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useAtomValue, useSetAtom } from 'jotai';
|
import { useAtomValue, useSetAtom } from 'jotai';
|
||||||
import React, { ReactNode, useCallback, useEffect, useRef } from 'react';
|
import React, { ReactNode, useCallback, useEffect, useRef } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import {
|
import {
|
||||||
ClientEvent,
|
ClientEvent,
|
||||||
ClientEventHandlerMap,
|
ClientEventHandlerMap,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import {
|
|||||||
} from 'folds';
|
} from 'folds';
|
||||||
import { useVirtualizer } from '@tanstack/react-virtual';
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
||||||
import { factoryRoomIdByActivity } from '../../../utils/sort';
|
import { factoryRoomIdByActivity } from '../../../utils/sort';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useEffect } from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { useNavigate, useSearchParams } from 'react-router-dom';
|
import { useNavigate, useSearchParams } from 'react-router';
|
||||||
import { Box, Icon, IconButton, Icons, Scroll } from 'folds';
|
import { Box, Icon, IconButton, Icons, Scroll } from 'folds';
|
||||||
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
||||||
import { getDirectCreateSearchParams } from '../../pathSearchParam';
|
import { getDirectCreateSearchParams } from '../../pathSearchParam';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { ReactNode } from 'react';
|
import React, { ReactNode } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom';
|
import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom';
|
||||||
import { IsDirectRoomProvider, RoomProvider } from '../../../hooks/useRoom';
|
import { IsDirectRoomProvider, RoomProvider } from '../../../hooks/useRoom';
|
||||||
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { FormEventHandler, useCallback, useRef, useState } from 'react';
|
import React, { FormEventHandler, useCallback, useRef, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import {
|
|||||||
config,
|
config,
|
||||||
toRem,
|
toRem,
|
||||||
} from 'folds';
|
} from 'folds';
|
||||||
import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
|
import { useNavigate, useParams, useSearchParams } from 'react-router';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { useAtomValue } from 'jotai';
|
import { useAtomValue } from 'jotai';
|
||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import React, {
|
|||||||
useRef,
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
Box,
|
Box,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { ReactNode } from 'react';
|
import React, { ReactNode } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom';
|
import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom';
|
||||||
import { IsDirectRoomProvider, RoomProvider } from '../../../hooks/useRoom';
|
import { IsDirectRoomProvider, RoomProvider } from '../../../hooks/useRoom';
|
||||||
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import {
|
|||||||
config,
|
config,
|
||||||
toRem,
|
toRem,
|
||||||
} from 'folds';
|
} from 'folds';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router';
|
||||||
import {
|
import {
|
||||||
INotification,
|
INotification,
|
||||||
INotificationsResponse,
|
INotificationsResponse,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, { MouseEventHandler, useState } from 'react';
|
import React, { MouseEventHandler, useState } from 'react';
|
||||||
import { Box, config, Icon, Icons, Menu, PopOut, RectCords, Text } from 'folds';
|
import { Box, config, Icon, Icons, Menu, PopOut, RectCords, Text } from 'folds';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '../../../components/sidebar';
|
import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '../../../components/sidebar';
|
||||||
import { stopPropagation } from '../../../utils/keyboard';
|
import { stopPropagation } from '../../../utils/keyboard';
|
||||||
import { SequenceCard } from '../../../components/sequence-card';
|
import { SequenceCard } from '../../../components/sequence-card';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { MouseEventHandler, forwardRef, useState } from 'react';
|
import React, { MouseEventHandler, forwardRef, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds';
|
import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
import { useAtomValue } from 'jotai';
|
import { useAtomValue } from 'jotai';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Icon, Icons } from 'folds';
|
import { Icon, Icons } from 'folds';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { useAtomValue } from 'jotai';
|
import { useAtomValue } from 'jotai';
|
||||||
import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '../../../components/sidebar';
|
import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '../../../components/sidebar';
|
||||||
import { useExploreSelected } from '../../../hooks/router/useExploreSelected';
|
import { useExploreSelected } from '../../../hooks/router/useExploreSelected';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { MouseEventHandler, forwardRef, useState } from 'react';
|
import React, { MouseEventHandler, forwardRef, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds';
|
import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds';
|
||||||
import { useAtomValue } from 'jotai';
|
import { useAtomValue } from 'jotai';
|
||||||
import FocusTrap from 'focus-trap-react';
|
import FocusTrap from 'focus-trap-react';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import { Icon, Icons } from 'folds';
|
import { Icon, Icons } from 'folds';
|
||||||
import { useAtomValue } from 'jotai';
|
import { useAtomValue } from 'jotai';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import React, {
|
|||||||
useRef,
|
useRef,
|
||||||
useState,
|
useState,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router';
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Icon,
|
Icon,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { ReactNode } from 'react';
|
import React, { ReactNode } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { useAtom, useAtomValue } from 'jotai';
|
import { useAtom, useAtomValue } from 'jotai';
|
||||||
import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom';
|
import { useSelectedRoom } from '../../../hooks/router/useSelectedRoom';
|
||||||
import { IsDirectRoomProvider, RoomProvider } from '../../../hooks/useRoom';
|
import { IsDirectRoomProvider, RoomProvider } from '../../../hooks/useRoom';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { ReactNode } from 'react';
|
import React, { ReactNode } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router';
|
||||||
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
||||||
import { useSpaces } from '../../../state/hooks/roomList';
|
import { useSpaces } from '../../../state/hooks/roomList';
|
||||||
import { allRoomsAtom } from '../../../state/room-list/roomList';
|
import { allRoomsAtom } from '../../../state/room-list/roomList';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { generatePath, Path } from 'react-router-dom';
|
import { generatePath, Path } from 'react-router';
|
||||||
import {
|
import {
|
||||||
DIRECT_CREATE_PATH,
|
DIRECT_CREATE_PATH,
|
||||||
DIRECT_PATH,
|
DIRECT_PATH,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { test } from 'node:test';
|
|||||||
import assert from 'node:assert/strict';
|
import assert from 'node:assert/strict';
|
||||||
import { createStore } from 'jotai';
|
import { createStore } from 'jotai';
|
||||||
import { enableMapSet } from 'immer';
|
import { enableMapSet } from 'immer';
|
||||||
import type { Path } from 'react-router-dom';
|
import type { Path } from 'react-router';
|
||||||
|
|
||||||
// `makeNavToActivePathAtom(userId)` is a factory: localStorage is read when the
|
// `makeNavToActivePathAtom(userId)` is a factory: localStorage is read when the
|
||||||
// returned atom is first created/accessed (not at module load), but we still
|
// returned atom is first created/accessed (not at module load), but we still
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { WritableAtom, atom } from 'jotai';
|
import { WritableAtom, atom } from 'jotai';
|
||||||
import { produce } from 'immer';
|
import { produce } from 'immer';
|
||||||
import { Path } from 'react-router-dom';
|
import { Path } from 'react-router';
|
||||||
import {
|
import {
|
||||||
atomWithLocalStorage,
|
atomWithLocalStorage,
|
||||||
getLocalStorageItem,
|
getLocalStorageItem,
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ export interface ChromeLanguageDetectorFactory {
|
|||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
// eslint-disable-next-line vars-on-top
|
// eslint-disable-next-line vars-on-top
|
||||||
var Translator: ChromeTranslatorFactory | undefined;
|
let Translator: ChromeTranslatorFactory | undefined;
|
||||||
// eslint-disable-next-line vars-on-top
|
// eslint-disable-next-line vars-on-top
|
||||||
var LanguageDetector: ChromeLanguageDetectorFactory | undefined;
|
let LanguageDetector: ChromeLanguageDetectorFactory | undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-7
@@ -7,7 +7,7 @@ import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
|
|||||||
import { VitePWA } from 'vite-plugin-pwa';
|
import { VitePWA } from 'vite-plugin-pwa';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import buildConfig from './build.config';
|
import buildConfig from './build.config.ts';
|
||||||
|
|
||||||
const copyFiles = {
|
const copyFiles = {
|
||||||
targets: [
|
targets: [
|
||||||
@@ -227,7 +227,7 @@ const vendorChunks = (id) => {
|
|||||||
if (id.includes('node_modules/matrix-js-sdk')) return 'matrix-sdk';
|
if (id.includes('node_modules/matrix-js-sdk')) return 'matrix-sdk';
|
||||||
if (id.includes('node_modules/react-dom')) return 'react-dom';
|
if (id.includes('node_modules/react-dom')) return 'react-dom';
|
||||||
if (
|
if (
|
||||||
id.includes('node_modules/react-router-dom') ||
|
id.includes('node_modules/react-router') ||
|
||||||
id.includes('node_modules/@remix-run') ||
|
id.includes('node_modules/@remix-run') ||
|
||||||
id.includes('node_modules/react-router/')
|
id.includes('node_modules/react-router/')
|
||||||
)
|
)
|
||||||
@@ -282,7 +282,7 @@ export default defineConfig({
|
|||||||
dontCacheBustURLsMatching: /assets\//,
|
dontCacheBustURLsMatching: /assets\//,
|
||||||
// Raised above the 2 MB default so the ~5.5 MB matrix-sdk crypto wasm
|
// Raised above the 2 MB default so the ~5.5 MB matrix-sdk crypto wasm
|
||||||
// (hash-busted and hot on every session) is precached deliberately.
|
// (hash-busted and hot on every session) is precached deliberately.
|
||||||
maximumFileSizeToCacheInBytes: 6 * 1024 * 1024,
|
maximumFileSizeToCacheInBytes: 10 * 1024 * 1024,
|
||||||
// codeSplitting: false is not yet supported by vite-plugin-pwa 1.3.0;
|
// codeSplitting: false is not yet supported by vite-plugin-pwa 1.3.0;
|
||||||
// the inlineDynamicImports deprecation warning from Vite is from pwa internal build
|
// the inlineDynamicImports deprecation warning from Vite is from pwa internal build
|
||||||
},
|
},
|
||||||
@@ -293,10 +293,8 @@ export default defineConfig({
|
|||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
rolldownOptions: {
|
define: {
|
||||||
define: {
|
global: 'globalThis',
|
||||||
global: 'globalThis',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
|
|||||||
Reference in New Issue
Block a user