162 Commits

Author SHA1 Message Date
dad0dd13ae chore(deps): update dependency eslint to v10
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2026-03-03 00:20:04 +00:00
e88961a43a fix: add space around send file button
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-02 23:05:11 +01:00
f6169d690f Remove useless lambda variable
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-02 22:53:50 +01:00
5221260e26 Updated frontend dependencies
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-02 22:53:03 +01:00
c562152019 Merge branch 'master' of https://gitea.communiquons.org/pierre/MatrixGW
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-02 22:49:56 +01:00
2ea20e6de4 feat: can upload files in conversations 2026-03-02 22:49:47 +01:00
29939d598f Merge pull request 'Update dependency react-router to ^7.13.1' (#193) from renovate/react-router-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-02 00:21:09 +00:00
b2ab5aceca Update dependency react-router to ^7.13.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-03-01 00:20:31 +00:00
2a5def11eb fix typo
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-28 15:38:13 +01:00
c9c3eca8f8 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.3' (#192) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-28 00:15:30 +00:00
1bdb130fb4 Update dependency @mui/x-data-grid to ^8.27.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-02-27 00:14:11 +00:00
2c2a81c271 Merge pull request 'Update dependency eslint to ^9.39.3' (#191) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-27 00:14:05 +00:00
09099bce9b Update dependency eslint to ^9.39.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-02-26 00:14:49 +00:00
16595f1fe2 Merge branch 'master' of https://gitea.communiquons.org/pierre/MatrixGW
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-24 23:10:34 +01:00
f19b3e802b Create prod Docker config 2026-02-24 23:10:10 +01:00
f68bfb9bee Merge pull request 'Update dependency @fontsource/roboto to ^5.2.10' (#190) from renovate/fontsource-roboto-5.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-24 00:14:36 +00:00
2d17188fbe Update dependency @fontsource/roboto to ^5.2.10
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-02-23 00:15:23 +00:00
ea0464a5b0 Merge pull request 'Update dependency @mui/x-date-pickers to ^8.27.2' (#189) from renovate/mui-x-date-pickers-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-23 00:15:16 +00:00
ed92669aba Update dependency @mui/x-date-pickers to ^8.27.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-02-22 00:15:37 +00:00
50b0f6d479 Merge pull request 'Update dependency @eslint/js to ^9.39.3' (#188) from renovate/eslint-js-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-22 00:15:30 +00:00
953764a3a4 Update dependency @eslint/js to ^9.39.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-02-21 00:16:21 +00:00
fa4cb2c556 Merge pull request 'Update dependency is-cidr to ^6.0.3' (#185) from renovate/is-cidr-6.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-21 00:16:14 +00:00
23cfda38c6 Update dependency is-cidr to ^6.0.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-02-20 00:15:49 +00:00
894dbe033c Updated project dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2026-02-19 17:57:27 +01:00
ac32758de6 Merge pull request 'Update dependency @mui/x-date-pickers to ^8.27.0' (#187) from renovate/mui-x-date-pickers-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-18 00:28:12 +00:00
c2944f203b Merge pull request 'Update materialui to ^7.3.8' (#186) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-18 00:28:05 +00:00
01dc8bf910 Update dependency @mui/x-date-pickers to ^8.27.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-17 00:28:09 +00:00
4f3ad57d3a Update materialui to ^7.3.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-17 00:28:05 +00:00
94f8a34288 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.1' (#184) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-16 00:27:57 +00:00
1df0855e47 Update dependency @mui/x-data-grid to ^8.27.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-15 00:28:13 +00:00
f87328a1b2 Merge pull request 'Update dependency @vitejs/plugin-react to ^5.1.4' (#183) from renovate/vitejs-plugin-react-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-14 00:28:11 +00:00
8b1356064e Merge pull request 'Update dependency @types/react to ^19.2.14' (#182) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-14 00:28:09 +00:00
b0ceeba74b Update dependency @vitejs/plugin-react to ^5.1.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-13 00:28:13 +00:00
418bffe746 Update dependency @types/react to ^19.2.14
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-13 00:28:10 +00:00
b7c06eb1b6 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.0' (#181) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-10 00:27:19 +00:00
7805412b07 Merge pull request 'Update Rust crate clap to 4.5.57' (#180) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-10 00:27:12 +00:00
d98854e4dd Update dependency @mui/x-data-grid to ^8.27.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-09 00:27:20 +00:00
8cd9da28e0 Update Rust crate clap to 4.5.57
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-09 00:27:18 +00:00
edfcbdd1f8 Merge pull request 'Update Rust crate anyhow to 1.0.101' (#179) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-08 00:27:18 +00:00
7c6520a2ee Merge pull request 'Update dependency @types/react to ^19.2.13' (#178) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-08 00:27:15 +00:00
45609a2ae7 Update Rust crate anyhow to 1.0.101
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-07 00:27:41 +00:00
286a48b3b3 Update dependency @types/react to ^19.2.13
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-07 00:27:32 +00:00
054940716a Merge pull request 'Update Rust crate rust-embed to 8.11.0' (#177) from renovate/rust-embed-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-06 00:27:09 +00:00
0f374f7125 Merge pull request 'Update Rust crate bytes to 1.11.1' (#176) from renovate/bytes-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-06 00:27:03 +00:00
9e35af3341 Update Rust crate rust-embed to 8.11.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-05 00:27:27 +00:00
e864925f63 Update Rust crate bytes to 1.11.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-05 00:27:24 +00:00
f544946d06 Merge pull request 'Update dependency emoji-picker-react to ^4.17.4' (#175) from renovate/emoji-picker-react-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-04 00:26:54 +00:00
0671911d20 Merge pull request 'Update dependency @vitejs/plugin-react to ^5.1.3' (#174) from renovate/vitejs-plugin-react-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-04 00:26:50 +00:00
e5f5fe6e90 Update dependency emoji-picker-react to ^4.17.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-03 00:26:36 +00:00
37d31b42b3 Update dependency @vitejs/plugin-react to ^5.1.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-03 00:26:34 +00:00
474bacfd23 Merge pull request 'Update dependency typescript-eslint to ^8.54.0' (#173) from renovate/typescript-eslint into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-02 00:26:48 +00:00
893ff2cbbe Merge pull request 'Update dependency react-router to ^7.13.0' (#172) from renovate/react-router-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-02 00:26:41 +00:00
a738ab5525 Update dependency typescript-eslint to ^8.54.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-01 00:26:20 +00:00
78c35524d0 Update dependency react-router to ^7.13.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-01 00:26:16 +00:00
f566847809 Merge pull request 'Update Rust crate clap to 4.5.56' (#171) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-31 00:26:32 +00:00
d8e6090717 Merge pull request 'Update dependency emoji-picker-react to ^4.17.3' (#170) from renovate/emoji-picker-react-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-31 00:26:30 +00:00
6a26d9a4c0 Update Rust crate clap to 4.5.56
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-30 00:27:54 +00:00
c2bed332da Update dependency emoji-picker-react to ^4.17.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-30 00:27:46 +00:00
7d2aedef97 Merge pull request 'Update Node.js to v25' (#128) from renovate/node-25.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-30 00:27:42 +00:00
f12a2ca1ba Merge pull request 'Update Rust crate light-openid to 1.1.0' (#169) from renovate/light-openid-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-30 00:27:31 +00:00
f0d7fbf82c Update Node.js to v25
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-29 00:27:27 +00:00
5220f3e873 Update Rust crate light-openid to 1.1.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-29 00:27:25 +00:00
7e6f9bd648 Merge pull request 'Update react' (#168) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-29 00:27:06 +00:00
e3e53abe34 Update react
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-28 00:27:11 +00:00
65ee2ac6dc Merge pull request 'Update Rust crate lazy-regex to 3.5.1' (#167) from renovate/lazy-regex-3.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-28 00:27:04 +00:00
8faa3592c4 Update Rust crate lazy-regex to 3.5.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-27 00:26:21 +00:00
690c305207 Merge pull request 'Update dependency emoji-picker-react to ^4.17.1' (#166) from renovate/emoji-picker-react-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-27 00:26:05 +00:00
5c8b7a2082 Update dependency emoji-picker-react to ^4.17.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-26 00:26:46 +00:00
9f9fd28b6a Merge pull request 'Update dependency is-cidr to ^6.0.2' (#165) from renovate/is-cidr-6.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-26 00:26:41 +00:00
3d98c276b0 Update dependency is-cidr to ^6.0.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-25 00:27:11 +00:00
aec1594a98 Merge pull request 'Update dependency @mui/x-date-pickers to ^8.26.0' (#164) from renovate/mui-x-date-pickers-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-25 00:27:06 +00:00
366238e9b8 Update dependency @mui/x-date-pickers to ^8.26.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-24 00:26:14 +00:00
888f629e8a Merge pull request 'Update dependency @mui/x-data-grid to ^8.26.0' (#163) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-24 00:26:09 +00:00
924433ca40 Update dependency @mui/x-data-grid to ^8.26.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-23 00:26:13 +00:00
99b4f67275 Merge pull request 'Update Rust crate jwt-simple to 0.12.14' (#162) from renovate/jwt-simple-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-23 00:26:08 +00:00
a6ff89e80d Update Rust crate jwt-simple to 0.12.14
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-22 00:27:35 +00:00
6d3ba0ccae Merge pull request 'Update dependency @types/react to ^19.2.9' (#161) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-22 00:27:21 +00:00
ec3377692d Update dependency @types/react to ^19.2.9
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-21 00:15:08 +00:00
574761d39b Merge pull request 'Update dependency date-and-time to ^4.2.0' (#160) from renovate/date-and-time-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-21 00:14:44 +00:00
09c5b9f187 Update dependency date-and-time to ^4.2.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-20 00:11:36 +00:00
11f03f88c6 Merge pull request 'Update Rust crate thiserror to 2.0.18' (#159) from renovate/thiserror-2.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-20 00:11:30 +00:00
2ebf17f065 Update Rust crate thiserror to 2.0.18
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-19 00:11:27 +00:00
b9bfe17314 Merge pull request 'Update dependency @mui/x-date-pickers to ^8.25.0' (#158) from renovate/mui-x-date-pickers-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-19 00:11:11 +00:00
f56c646596 Update dependency @mui/x-date-pickers to ^8.25.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-18 00:12:07 +00:00
697fcc481e Merge pull request 'Update dependency @mui/x-data-grid to ^8.25.0' (#157) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-18 00:12:01 +00:00
2fbca2c411 Update dependency @mui/x-data-grid to ^8.25.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-17 00:11:35 +00:00
399b13fdbc Merge pull request 'Update dependency @types/node to ^24.10.9' (#156) from renovate/node-24.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-17 00:11:28 +00:00
166b860c1a Update dependency @types/node to ^24.10.9
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-16 00:27:29 +00:00
96b02dd73a Merge pull request 'Update Rust crate actix-ws to 0.3.1' (#155) from renovate/actix-ws-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-16 00:27:22 +00:00
5dd4aa6c0e Update Rust crate actix-ws to 0.3.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-15 00:32:56 +00:00
8f4480e555 Merge pull request 'Update dependency @types/node to ^24.10.8' (#154) from renovate/node-24.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-15 00:32:38 +00:00
06e1f60314 Update dependency @types/node to ^24.10.8
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-14 00:31:34 +00:00
a7432a4014 Merge pull request 'Update dependency @mui/x-data-grid to ^8.24.0' (#153) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-14 00:31:25 +00:00
be5e7eb328 Update dependency @mui/x-data-grid to ^8.24.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-13 00:26:02 +00:00
c1e703c4b4 Merge pull request 'Update dependency @types/react to ^19.2.8' (#152) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-13 00:25:55 +00:00
071aad8147 Update dependency @types/react to ^19.2.8
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-12 00:26:27 +00:00
f4b3c0aa16 Merge pull request 'Update dependency @types/node to ^24.10.7' (#151) from renovate/node-24.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-12 00:26:19 +00:00
daca7410d7 Update dependency @types/node to ^24.10.7
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-11 00:26:32 +00:00
23074ac354 Merge pull request 'Update dependency vite to v7.3.1' (#150) from renovate/vite-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-11 00:26:26 +00:00
36bd8d0672 Update dependency vite to v7.3.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-10 00:26:04 +00:00
6162555702 Merge pull request 'Update materialui to ^7.3.7' (#149) from renovate/materialui into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-10 00:25:57 +00:00
951d0db0b7 Update materialui to ^7.3.7
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-09 00:22:36 +00:00
ef90aba489 Merge pull request 'Update dependency react-router to ^7.12.0' (#148) from renovate/react-router-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-09 00:22:31 +00:00
6b39fd11bd Update dependency react-router to ^7.12.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-08 00:22:30 +00:00
bf6561fa87 Merge pull request 'Update Rust crate serde_json to 1.0.149' (#147) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-08 00:22:26 +00:00
e5feecc703 Update Rust crate serde_json to 1.0.149
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-07 00:22:38 +00:00
153ad14a51 Merge pull request 'Update Rust crate url to 2.5.8' (#146) from renovate/url-2.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-07 00:22:23 +00:00
e5494e51a3 Update Rust crate url to 2.5.8
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-06 00:22:56 +00:00
f04ab4591b Merge pull request 'Update Rust crate clap to 4.5.54' (#145) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-06 00:22:43 +00:00
ca2cdb2f79 Update Rust crate clap to 4.5.54
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-01-05 00:23:14 +00:00
795a12c8d0 Merge pull request 'Update dependency vite to v7.3.0' (#144) from renovate/vite-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-05 00:23:04 +00:00
79e78006fa Update dependency vite to v7.3.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-31 00:30:47 +00:00
18c0fbef3c Merge pull request 'Update dependency typescript-eslint to ^8.51.0' (#143) from renovate/typescript-eslint into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-31 00:30:41 +00:00
0ac6fc4ac3 Update dependency typescript-eslint to ^8.51.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-30 00:32:39 +00:00
2aaced17d8 Merge pull request 'Update dependency react-router to ^7.11.0' (#142) from renovate/react-router-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-30 00:32:13 +00:00
9da2a9e9b3 Update dependency react-router to ^7.11.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-29 00:32:02 +00:00
9595ff2e71 Merge pull request 'Update Rust crate serde_json to 1.0.148' (#141) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-29 00:31:44 +00:00
5bd62d7683 Update Rust crate serde_json to 1.0.148
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-28 00:30:14 +00:00
7e747b50f3 Merge pull request 'Update dependency @mui/x-date-pickers to ^8.23.0' (#140) from renovate/mui-x-date-pickers-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-28 00:29:59 +00:00
a9a5d60edd Update dependency @mui/x-date-pickers to ^8.23.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-27 00:31:20 +00:00
89dbc252e8 Merge pull request 'Update dependency @mui/x-data-grid to ^8.23.0' (#139) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-27 00:31:12 +00:00
3a6b2c6cf2 Update dependency @mui/x-data-grid to ^8.23.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-25 00:33:13 +00:00
98c813b220 Merge pull request 'Update Rust crate serde_json to 1.0.147' (#138) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-25 00:33:00 +00:00
ceb7859169 Update Rust crate serde_json to 1.0.147
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-24 00:30:52 +00:00
96e597ca59 Merge pull request 'Update dependency @mui/x-date-pickers to ^8.22.1' (#137) from renovate/mui-x-date-pickers-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-24 00:30:43 +00:00
d9630fbc4c Update dependency @mui/x-date-pickers to ^8.22.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-23 00:30:42 +00:00
4d7db2de2a Merge pull request 'Update dependency @mui/x-data-grid to ^8.22.1' (#136) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-23 00:30:22 +00:00
4c0be88570 Update dependency @mui/x-data-grid to ^8.22.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-22 00:32:09 +00:00
2f933a247f Merge pull request 'Update Rust crate ractor to 0.15.10' (#135) from renovate/ractor-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-22 00:31:59 +00:00
f6a7132d43 Update Rust crate ractor to 0.15.10
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-21 00:30:59 +00:00
1089b5a6a6 Merge pull request 'Update react to ^19.2.3' (#134) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-21 00:30:45 +00:00
28a1b5f4f0 Update react to ^19.2.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-20 00:29:35 +00:00
acf91c3f0e Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.26' (#133) from renovate/eslint-plugin-react-refresh-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-20 00:29:29 +00:00
fadb9e6d46 Update dependency eslint-plugin-react-refresh to ^0.4.26
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-19 00:29:43 +00:00
17bad4fcfd Merge pull request 'Update dependency eslint to ^9.39.2' (#132) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-19 00:29:35 +00:00
b3dfc35103 Update dependency eslint to ^9.39.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-18 00:32:10 +00:00
602f663217 Merge pull request 'Update dependency date-and-time to ^4.1.2' (#131) from renovate/date-and-time-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-18 00:31:58 +00:00
5ebfbf6aec Update dependency date-and-time to ^4.1.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-17 00:30:33 +00:00
aad0a74ad5 Merge pull request 'Update dependency @types/node to ^24.10.4' (#130) from renovate/node-24.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-17 00:30:28 +00:00
382e24e17b Update dependency @types/node to ^24.10.4
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-16 00:30:32 +00:00
1876c7b43d Merge pull request 'Update dependency @eslint/js to ^9.39.2' (#129) from renovate/eslint-js-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-16 00:30:25 +00:00
73af601a16 Update dependency @eslint/js to ^9.39.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-13 00:29:49 +00:00
6247463c70 Merge pull request 'Update dependency @types/node to ^24.10.3' (#127) from renovate/node-24.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-12 00:29:56 +00:00
9425ed9a12 Update dependency @types/node to ^24.10.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-12-11 00:30:39 +00:00
430ad85c37 Merge pull request 'Update dependency @vitejs/plugin-react to ^5.1.2' (#126) from renovate/vitejs-plugin-react-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-11 00:30:33 +00:00
29e50bd70c Update dependency @vitejs/plugin-react to ^5.1.2
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-12-10 00:32:04 +00:00
0e83e804d8 Merge pull request 'Update dependency @types/node to ^24.10.2' (#125) from renovate/node-24.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-10 00:31:56 +00:00
bd674bfb67 Update dependency @types/node to ^24.10.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-09 00:30:40 +00:00
fec81ac92e Remove encryption logic as it is handled by matrix-sdk e2e-encryption feature directly
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-08 19:41:40 +01:00
d3e25eed9e Merge pull request 'Update Rust crate matrix-sdk to 0.16.0' (#124) from renovate/matrix-sdk-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-08 00:31:02 +00:00
ba5f5f2557 Update Rust crate matrix-sdk to 0.16.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-08 00:30:55 +00:00
7e548ad5d1 Merge pull request 'Update react to ^19.2.1' (#123) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-08 00:30:43 +00:00
7b63bb0d05 Update react to ^19.2.1
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-12-07 00:31:00 +00:00
788018451a Merge pull request 'Update dependency react-router to ^7.10.1' (#122) from renovate/react-router-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-07 00:30:53 +00:00
7b3a2d6a3f Update dependency react-router to ^7.10.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-06 00:30:35 +00:00
0d462f848d Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.24' (#121) from renovate/eslint-plugin-react-refresh-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-06 00:30:30 +00:00
9c6c338919 Update dependency eslint-plugin-react-refresh to ^0.4.24
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-12-05 00:15:23 +00:00
8a4570a044 Fix Drone configuration
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-12-04 17:23:06 +01:00
e51fc6b4bb Fix ESLint issues
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
2025-12-04 16:32:06 +01:00
0f68d59798 Fix spaces support in UI
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-04 15:35:16 +01:00
5ad23005be Fix time alignment
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-04 15:03:38 +01:00
4e096a1d49 Can get spaces hierarchy
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-04 09:18:32 +01:00
34 changed files with 2288 additions and 1503 deletions

View File

@@ -6,7 +6,7 @@ name: default
steps:
# Frontend
- name: web_build
image: node:23
image: node:25
volumes:
- name: web_app
path: /tmp/web_build
@@ -89,7 +89,7 @@ steps:
path: /tmp/release
environment:
PLUGIN_API_KEY:
from_secret: API_KEY
from_secret: GITEA_API_KEY # needs permission write:repository
settings:
base_url: https://gitea.communiquons.org
files: /tmp/release/*

6
docker_prod/.env.sample Normal file
View File

@@ -0,0 +1,6 @@
REDIS_PASS=redis_password
WEBSITE_ORIGIN=http://localhost:8000
APP_SECRET=secretsecretsecretsecretsecretsecretsecretsecretsecretsecretsecret
AUTH_SECRET_KEY=secretsecretsecretsecretsecretsecretsecretsecretsecretsecretsecret
OIDC_CLIENT_ID=bar
OIDC_CLIENT_SECRET=foo

3
docker_prod/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.env
storage
auth/users.json

44
docker_prod/README.md Normal file
View File

@@ -0,0 +1,44 @@
# Setup production environment
> Sample release deployment configuration. **MUST BE ADAPTED BEFORE REAL PRODUCTION DEPLOYMENT!**
1. Install prerequisites:
1. `docker`
2. `docker compose`
3. `git`
2. Clone this git repository:
```bash
git clone https://gitea.communiquons.org/pierre/MatrixGW
cd MatrixGW/docker_prod
```
3. Copy and adapt env values
```bash
cp .env.sample .env
nano .env
```
4. Create required directories:
```bash
mkdir -p storage/{redis-data,redis-conf,synapse,maspostgres,matrixgw}
```
5. Start containers
```bash
docker compose up
```
> Note: Before running `docker compose up`, if your user does not belong to the `docker` group, you should run the following command to be able to run docker in rootless mode:
>
> ```bash
> sudo -g docker bash
> ```
6. Done !
* Matrix GW: http://localhost:8000/, the default credentials are `admin` / `admin`
* Element: http://localhost:8080 (you will need to create your accounts)
* Auth platform: http://localhost:5001

View File

@@ -0,0 +1,5 @@
- id: ${OIDC_CLIENT_ID}
name: MatrixGW
description: Matrix Gateway
secret: ${OIDC_CLIENT_SECRET}
redirect_uri: ${APP_ORIGIN}/oidc_cb

View File

@@ -0,0 +1,102 @@
services:
oidc:
image: pierre42100/basic_oidc
user: "1000"
environment:
- LISTEN_ADDRESS=0.0.0.0:9001
- STORAGE_PATH=/storage
- TOKEN_KEY=$AUTH_SECRET_KEY
- WEBSITE_ORIGIN=http://localhost:9001
- OIDC_CLIENT_ID=$OIDC_CLIENT_ID
- OIDC_CLIENT_SECRET=$OIDC_CLIENT_SECRET
- APP_ORIGIN=$WEBSITE_ORIGIN
expose:
- 9001
ports:
- 9001:9001
volumes:
- ./auth:/storage
redis:
image: redis:alpine
user: "1000"
command: redis-server --requirepass ${REDIS_PASS:-secretredis}
expose:
- 6379
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
volumes:
- ./storage/redis-data:/data
- ./storage/redis-conf:/usr/local/etc/redis/redis.conf
mas:
image: ghcr.io/element-hq/matrix-authentication-service:main
user: "1000"
restart: unless-stopped
depends_on:
- masdb
volumes:
- ./mas:/config:ro
command: server -c /config/config.yaml
ports:
- "8778:8778/tcp"
synapse:
image: docker.io/matrixdotorg/synapse:latest
user: "1000"
restart: unless-stopped
environment:
- SYNAPSE_CONFIG_PATH=/config/homeserver.yaml
volumes:
- ./storage/synapse:/data
- ./synapse:/config:ro
ports:
- "8448:8448/tcp"
masdb:
image: docker.io/postgres:18-alpine
user: "1000"
environment:
- POSTGRES_DB=masdb
- POSTGRES_USER=masdb
- POSTGRES_PASSWORD=changeme
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
- PGDATA=/data
volumes:
- ./storage/maspostgres:/data
element:
image: docker.io/vectorim/element-web
ports:
- "8080:80/tcp"
volumes:
- ./element/config.json:/app/config.json:ro
matrixgw:
image: pierre42100/matrix_gateway
user: "1000"
ports:
- 8000:8000
depends_on:
redis:
condition: service_healthy
volumes:
- ./storage/matrixgw:/data
network_mode: host
environment:
- WEBSITE_ORIGIN=${WEBSITE_ORIGIN}
- SECRET=${APP_SECRET}
- OIDC_CONFIGURATION_URL=http://localhost:9001/.well-known/openid-configuration
- OIDC_PROVIDER_NAME=OIDC
- OIDC_CLIENT_ID=$OIDC_CLIENT_ID
- OIDC_CLIENT_SECRET=$OIDC_CLIENT_SECRET
- REDIS_HOSTNAME=localhost #redis
- REDIS_PASSWORD=${REDIS_PASS:-secretredis}
- UNSECURE_AUTO_LOGIN_EMAIL=$UNSECURE_AUTO_LOGIN_EMAIL
- STORAGE_PATH=/data
- MATRIX_HOMESERVER=http://localhost:8448

View File

@@ -0,0 +1,49 @@
{
"default_server_config": {
"m.homeserver": {
"base_url": "http://localhost:8448",
"server_name": "devserver"
},
"m.identity_server": {
"base_url": "https://vector.im"
}
},
"disable_custom_urls": false,
"disable_guests": false,
"disable_login_language_selector": false,
"disable_3pid_login": false,
"brand": "Element",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"integrations_widgets_urls": [
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api"
],
"default_country_code": "GB",
"show_labs_settings": false,
"features": {},
"default_federate": true,
"default_theme": "light",
"room_directory": {
"servers": ["matrix.org"]
},
"enable_presence_by_hs_url": {
"https://matrix.org": false,
"https://matrix-client.matrix.org": false
},
"setting_defaults": {
"breadcrumbs": true
},
"jitsi": {
"preferred_domain": "meet.element.io"
},
"element_call": {
"url": "https://call.element.io",
"participant_limit": 8,
"brand": "Element Call"
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
}

113
docker_prod/mas/config.yaml Normal file
View File

@@ -0,0 +1,113 @@
http:
listeners:
- name: web
resources:
- name: discovery
- name: human
- name: oauth
- name: compat
- name: graphql
- name: assets
binds:
- address: '[::]:8778'
proxy_protocol: false
- name: internal
resources:
- name: health
binds:
- host: localhost
port: 8081
proxy_protocol: false
trusted_proxies:
- 192.168.0.0/16
- 172.16.0.0/12
- 10.0.0.0/10
- 127.0.0.1/8
- fd00::/8
- ::1/128
public_base: http://localhost:8778/
issuer: http://localhost:8778/
database:
uri: postgresql://masdb:changeme@masdb/masdb
max_connections: 10
min_connections: 0
connect_timeout: 30
idle_timeout: 600
max_lifetime: 1800
email:
from: '"Authentication Service" <root@localhost>'
reply_to: '"Authentication Service" <root@localhost>'
transport: blackhole
secrets:
encryption: 12de9ad7bc2bacfa2ab9b1e3f7f1b3feb802195c8ebe66a8293cdb27f00be471
keys:
- kid: Bj2PICQ7mf
key: |
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAsCYCrrCJA7IuGbTYzP5yZN74QszbzudBUCX6MyN/+36HO2r6
xL8x1PRJ+Klx9Y90J9pWuo+cIuEmFLqO+Yfblo9fSQgZVvkWAFpO6Xh8J4z9qg49
M8xm0Ct8EnRDZDCEOBnwoDaAB9RTbpJGa1RPVCiamfi+xU+j47Zl4Er5jvLm81O7
DSlH9eK8Eih8AxuKTkAbKE1zyXquImE26Mj2dmMRfjDrWV/I8oqE3WFViAKR12Av
zw6TUyduiz8nK9pONCF3NIcQvBdHntBz1HlDXv6i0fRvlGIhjNL5LBgo6XQ3rNM1
bW2KYOw/iFP0YbfD4/xRjkBPvK2coQ8aRzK2VwIDAQABAoH/G4XU5Xav8ePlUB7x
wRYAycINCGL59Vos2lkUvujNFn6uopoUlKlLH/sLk87l/3hqrc9vvbayrsB/Mr3z
mQmhReUg/khFrVE+Hs/9hH1O6N8ew3N2HKHTbrNcr4V7AiySfDGRZ3ccihyi7KPu
XNbPjlbJ0UUMicfn06ysPl94nt0So0UAmXg+c7sDDqyzh3cY8emedYZ5FCljo/jA
F8k40rs7CywLJYMJB9O1vtomgt1xkDRO4F8UrZrriMIcYn0iFKe7i4AH8D6nkgNu
/v9Z43Leu8yRKrUvbpH3NaX8DlUSFWAXKpwUWr4sAQgWcLkVgjAXG1v9jCE97qW2
f0nBAoGBAOaKrnY5rWeZ74dERnPhSCsYiqRMneQAh7eJR+Er+xu1yF/bxwkhq2tK
/txheTK448DqhQRtr095t/v7TMZcPl3bSmybT1CQg/wiMJsgDMZqlC9tofvcq6uz
xP8vxMFHd0YSMSP693dkny4MzNY6LuoVWDLT+HxKPJyzGs1alruzAoGBAMOZp5J2
3ODcHQlcsGBtj1yVpQ4UXMvrSZF2ygiGK9bagL/f1iAtwACVOh5rgmbiOLSVgmR2
n4nupTgSAXMYkjmAmDyEh0PDaRl4WWvYEKp8GMvTPVPvjc6N0dT+y8Mf9bu+LcEt
+uZqPOZNbO5Vi+UgGeM9zZpxq/K7dpJmM/jNAoGBALsYHRGxKTsEwFEkZZCxaWIg
HpPL4e8hRwL6FC13BeitFBpHQDX27yi5yi+Lo1I4ngz3xk+bvERhYaDLhrkML0j4
KGQPfsTBI3vBO3UJA5Ua9XuwG19M7L0BvYPjfmfk2bUyGlM63w4zyMMUfD/3JA+w
ls1ZHTWxAZOh/sRdGirlAoGAX16B1+XgmDp6ZeAtlzaUGd5U1eKTxFF6U1SJ+VIB
+gYblHI84v+riB06cy6ULDnM0C+9neJAs24KXKZa0pV+Zk8O6yLrGN0kV2jYoL5+
kcFkDa13T3+TssxvLNz22LKyi9GUWYZjuQi/nMLPg/1t8k+Oj7/Iia822WkRzRvL
51kCgYEAwrN5Us8LR+fThm3C0vhvwv2wap6ccw0qq5+FTN+igAZAmmvKKvhow2Vi
LnPKBkc7QvxvQSNoXkdUo4qs3zOQ7DGvJLqSG9pwxFW5X1+78pNEm5OWe8AlT1uZ
Jz8Z1/Ae7fr/fFaucW9LkWjcuoPwPLiZ3b7ZQ6phs8qzoL+FpBI=
-----END RSA PRIVATE KEY-----
- kid: HcRvLHat12
key: |
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIOCCFSnkfz1ksln6kus8enQstBTu0q62IGJVzuX0WiXPoAoGCCqGSM49
AwEHoUQDQgAEVWPLbvSdxquLAjU3zJLcCWdaxr6QK1tPVbV1IS+87QUMv/zKiCMa
fNpwgBXwU7dF0gY507R2yY9pcdTmRtnRug==
-----END EC PRIVATE KEY-----
- kid: YjMITk5VSn
key: |
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDCoPSjaN7qqnPz+vdzHeIy8RZCCtFOqLTkvylM1gz6xOGaVsS63VJw9
Td9BtpolZ0egBwYFK4EEACKhZANiAAT8tH88HYBHNiQTSqZzlxElSuSDC0+Xn0O9
ukj0xTTVBp8rUM9lCJQAlB8PjS2XK/n0YvYdzysQb3AYqszJa45/rOGvSar30YNE
gwpJvu36xNIKZT+nHalNwg069FdjNBc=
-----END EC PRIVATE KEY-----
- kid: NvFzzeMRU3
key: |
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEILJEmFPDGFZoBVBQf1P6h4YfasYsFiu8a6FrFxiJvKXPoAcGBSuBBAAK
oUQDQgAE4NY5H3+D8r9GNOhrpbUn2dvLZIzi4A+SiwfqvtvPEmZkW+KDbd2tzKmx
maydZBn52QWedVY65snGAEoh9mV1TQ==
-----END EC PRIVATE KEY-----
passwords:
enabled: true
schemes:
- version: 1
algorithm: argon2id
minimum_complexity: 0
account:
password_registration_enabled: true
password_registration_email_required: false
matrix:
kind: synapse
homeserver: localhost
secret: IhKoLn6jWf1qRRZWvqgaKuIdwD6H0Mvx
endpoint: http://synapse:8448/
policy:
data:
client_registration:
allow_insecure_uris: true

View File

@@ -0,0 +1,41 @@
# Configuration file for Synapse.
#
# This is a YAML file: see [1] for a quick introduction. Note in particular
# that *indentation is important*: all the elements of a list or dictionary
# should have the same indentation.
#
# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
#
# For more information on how to configure Synapse, including a complete accounting of
# each option, go to docs/usage/configuration/config_documentation.md or
# https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html
server_name: "localhost"
pid_file: /data/homeserver.pid
listeners:
- port: 8448
tls: false
type: http
x_forwarded: true
resources:
- names: [client, federation]
compress: false
database:
name: sqlite3
args:
database: /data/homeserver.db
log_config: "/config/localhost.log.config"
media_store_path: /data/media_store
registration_shared_secret: "+oJd9zgvkQpXN-tt;95Wy,AFAdRH+FSTg&LxUXh6ZSvwMJHT;h"
report_stats: false
macaroon_secret_key: "d@ck1QkQLxlRg^aB#c#oZeII.oxOS6E2DX;YobP^Vm#iB5pQpd"
form_secret: "P.uleBJUYc6AM.UOrFF1q7OKH2N5T*Ae2;fGh46;vIHLIQ#JBP"
signing_key_path: "/config/localhost.signing.key"
trusted_key_servers:
- server_name: "matrix.org"
# vim:ft=yaml
matrix_authentication_service:
enabled: true
endpoint: http://mas:8778/
secret: "IhKoLn6jWf1qRRZWvqgaKuIdwD6H0Mvx"
# Alternatively, using a file:
#secret_file: /path/to/secret.txt

View File

@@ -0,0 +1,39 @@
version: 1
formatters:
precise:
format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
formatter: precise
loggers:
# This is just here so we can leave `loggers` in the config regardless of whether
# we configure other loggers below (avoid empty yaml dict error).
_placeholder:
level: "INFO"
synapse.storage.SQL:
# beware: increasing this to DEBUG will make synapse log sensitive
# information such as access tokens.
level: INFO
root:
level: INFO
handlers: [console]
disable_existing_loggers: false

View File

@@ -0,0 +1 @@
ed25519 a_HEcG Q2iG1Yy5WTiZ/VIy+zHPyHCRUpqyE3qrVttGULrVQK4

File diff suppressed because it is too large Load Diff

View File

@@ -4,35 +4,36 @@ version = "0.1.0"
edition = "2024"
[dependencies]
env_logger = "0.11.8"
env_logger = "0.11.9"
log = "0.4.29"
clap = { version = "4.5.53", features = ["derive", "env"] }
lazy_static = "1.5.0"
anyhow = "1.0.100"
clap = { version = "4.5.60", features = ["derive", "env"] }
anyhow = "1.0.102"
serde = { version = "1.0.228", features = ["derive"] }
tokio = { version = "1.48.0", features = ["full"] }
actix-web = "4.12.1"
tokio = { version = "1.49.0", features = ["full"] }
actix-web = "4.13.0"
actix-session = { version = "0.11.0", features = ["redis-session"] }
actix-remote-ip = "0.1.0"
actix-cors = "0.7.1"
light-openid = "1.0.4"
bytes = "1.11.0"
sha2 = "0.10.9"
base16ct = { version = "0.3.0", features = ["alloc"] }
futures-util = "0.3.31"
jwt-simple = { version = "0.12.13", default-features = false, features = ["pure-rust"] }
thiserror = "2.0.17"
uuid = { version = "1.19.0", features = ["v4", "serde"] }
actix-multipart = "0.7.2"
light-openid = "1.1.0"
bytes = "1.11.1"
sha2 = "0.11.0-rc.5"
base16ct = { version = "1.0.0", features = ["alloc"] }
futures-util = "0.3.32"
jwt-simple = { version = "0.12.14", default-features = false, features = ["pure-rust"] }
thiserror = "2.0.18"
uuid = { version = "1.21.0", features = ["v4", "serde"] }
ipnet = { version = "2.11.0", features = ["serde"] }
rand = "0.9.2"
rand = "0.10.0"
hex = "0.4.3"
mailchecker = "6.0.19"
matrix-sdk = { version = "0.14.0" }
url = "2.5.7"
ractor = "0.15.9"
serde_json = "1.0.145"
lazy-regex = "3.4.2"
actix-ws = "0.3.0"
matrix-sdk = { version = "0.16.0", features = ["e2e-encryption"] }
matrix-sdk-ui = "0.16.0"
url = "2.5.8"
ractor = "0.15.10"
serde_json = "1.0.149"
lazy-regex = "3.6.0"
actix-ws = "0.4.0"
infer = "0.19.0"
rust-embed = "8.9.0"
rust-embed = "8.11.0"
mime_guess = "2.0.5"

View File

@@ -5,6 +5,7 @@ use matrix_sdk::authentication::oauth::registration::{
ApplicationType, ClientMetadata, Localized, OAuthGrantType,
};
use std::path::{Path, PathBuf};
use std::sync::OnceLock;
use url::Url;
/// Matrix gateway backend API
@@ -89,16 +90,12 @@ pub struct AppConfig {
storage_path: String,
}
lazy_static::lazy_static! {
static ref ARGS: AppConfig = {
AppConfig::parse()
};
}
static ARGS: OnceLock<AppConfig> = OnceLock::new();
impl AppConfig {
/// Get parsed command line arguments
pub fn get() -> &'static AppConfig {
&ARGS
ARGS.get_or_init(AppConfig::parse)
}
/// Get auto login email (if not empty)

View File

@@ -1,6 +1,6 @@
use crate::app_config::AppConfig;
use crate::broadcast_messages::BroadcastSender;
use crate::controllers::{HttpFailure, HttpResult};
use crate::controllers::HttpResult;
use crate::extractors::auth_extractor::{AuthExtractor, AuthenticatedMethod};
use crate::extractors::matrix_client_extractor::MatrixClientExtractor;
use crate::extractors::session_extractor::MatrixGWSession;
@@ -63,9 +63,7 @@ pub async fn finish_oidc(
let prov = AppConfig::get().openid_provider();
let conf = OpenIDConfig::load_from_url(prov.configuration_url)
.await
.map_err(HttpFailure::OpenID)?;
let conf = OpenIDConfig::load_from_url(prov.configuration_url).await?;
let (token, _) = conf
.request_token(
@@ -74,12 +72,8 @@ pub async fn finish_oidc(
&req.code,
&AppConfig::get().openid_provider().redirect_url,
)
.await
.map_err(HttpFailure::OpenID)?;
let (user_info, _) = conf
.request_user_info(&token)
.await
.map_err(HttpFailure::OpenID)?;
.await?;
let (user_info, _) = conf.request_user_info(&token).await?;
if user_info.email_verified != Some(true) {
log::error!("Email is not verified!");

View File

@@ -2,11 +2,14 @@ use crate::controllers::HttpResult;
use crate::controllers::matrix::matrix_media_controller;
use crate::controllers::matrix::matrix_media_controller::MediaQuery;
use crate::controllers::matrix::matrix_room_controller::RoomIdInPath;
use crate::controllers::server_controller::ServerConstraints;
use crate::extractors::matrix_client_extractor::MatrixClientExtractor;
use actix_multipart::form::MultipartForm;
use actix_web::dev::Payload;
use actix_web::{FromRequest, HttpRequest, HttpResponse, web};
use futures_util::{StreamExt, stream};
use matrix_sdk::Room;
use matrix_sdk::attachment::AttachmentConfig;
use matrix_sdk::deserialized_responses::{TimelineEvent, TimelineEventKind};
use matrix_sdk::media::MediaEventContent;
use matrix_sdk::room::MessagesOptions;
@@ -23,6 +26,7 @@ use matrix_sdk::ruma::events::{AnyMessageLikeEvent, AnyTimelineEvent};
use matrix_sdk::ruma::{MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedUserId, RoomId, UInt};
use serde::{Deserialize, Serialize};
use serde_json::value::RawValue;
use std::io::Read;
#[derive(Serialize)]
pub struct APIEvent {
@@ -136,6 +140,55 @@ pub async fn send_text_message(
Ok(HttpResponse::Accepted().finish())
}
#[derive(Debug, actix_multipart::form::MultipartForm)]
pub struct SendFileForm {
#[multipart]
file: actix_multipart::form::tempfile::TempFile,
}
pub async fn send_file(
client: MatrixClientExtractor,
path: web::Path<RoomIdInPath>,
req: HttpRequest,
) -> HttpResult {
let Some(payload) = client.auth.payload else {
return Ok(HttpResponse::BadRequest().body("No payload included in request!"));
};
// Reconstruct multipart form from authenticated request
let mut form = MultipartForm::<SendFileForm>::from_request(
&req,
&mut Payload::from(bytes::Bytes::from(payload)),
)
.await?;
// Read attachment to end
let mut buff = Vec::with_capacity(form.file.size);
form.file.file.read_to_end(&mut buff)?;
if form.file.size > ServerConstraints::default().max_upload_file_size {
return Ok(HttpResponse::NotFound().json("Uploaded file is too large!"));
}
let Some(room) = client.client.client.get_room(&path.room_id) else {
return Ok(HttpResponse::NotFound().json("Room not found!"));
};
let Some(file_name) = form.file.file_name.as_deref() else {
return Ok(HttpResponse::BadRequest().json("File name must be specified!"));
};
let Some(mime_type) = form.file.content_type.as_ref() else {
return Ok(HttpResponse::BadRequest().json("File content type must be specified!"));
};
// Do send the file
room.send_attachment(file_name, mime_type, buff, AttachmentConfig::new())
.await?;
Ok(HttpResponse::Accepted().finish())
}
#[derive(serde::Deserialize)]
pub struct EventIdInPath {
pub(crate) event_id: OwnedEventId,

View File

@@ -4,11 +4,9 @@ use crate::utils::crypt_utils::sha512;
use actix_web::dev::Payload;
use actix_web::http::header;
use actix_web::{FromRequest, HttpRequest, HttpResponse, web};
use matrix_sdk::crypto::{AttachmentDecryptor, MediaEncryptionInfo};
use matrix_sdk::media::{MediaFormat, MediaRequestParameters, MediaThumbnailSettings};
use matrix_sdk::ruma::events::room::MediaSource;
use matrix_sdk::ruma::{OwnedMxcUri, UInt};
use std::io::{Cursor, Read};
#[derive(serde::Deserialize)]
pub struct MediaMXCInPath {
@@ -54,21 +52,6 @@ pub async fn serve_media(req: HttpRequest, source: MediaSource, thumbnail: bool)
)
.await?;
// Decrypt file if needed
let media = if let MediaSource::Encrypted(file) = source {
let mut cursor = Cursor::new(media);
let mut decryptor =
AttachmentDecryptor::new(&mut cursor, MediaEncryptionInfo::from(*file))?;
let mut decrypted_data = Vec::new();
decryptor.read_to_end(&mut decrypted_data)?;
decrypted_data
} else {
media
};
let digest = sha512(&media);
let mime_type = infer::get(&media).map(|x| x.mime_type());

View File

@@ -0,0 +1,34 @@
use crate::controllers::HttpResult;
use crate::extractors::matrix_client_extractor::MatrixClientExtractor;
use actix_web::HttpResponse;
use matrix_sdk_ui::spaces::SpaceService;
use matrix_sdk_ui::spaces::room_list::SpaceRoomListPaginationState;
use std::collections::HashMap;
/// Get space hierarchy
pub async fn hierarchy(client: MatrixClientExtractor) -> HttpResult {
let spaces = client.client.client.joined_space_rooms();
let space_service = SpaceService::new(client.client.client);
let mut hierarchy = HashMap::new();
for space in spaces {
let rooms = space_service
.space_room_list(space.room_id().to_owned())
.await;
while !matches!(
rooms.pagination_state(),
SpaceRoomListPaginationState::Idle { end_reached: true }
) {
rooms.paginate().await?;
}
hierarchy.insert(
space.room_id().to_owned(),
rooms
.rooms()
.into_iter()
.map(|room| room.room_id)
.collect::<Vec<_>>(),
);
}
Ok(HttpResponse::Ok().json(hierarchy))
}

View File

@@ -2,3 +2,4 @@ pub mod matrix_event_controller;
pub mod matrix_media_controller;
pub mod matrix_profile_controller;
pub mod matrix_room_controller;
pub mod matrix_space_controller;

View File

@@ -1,6 +1,6 @@
use actix_web::http::StatusCode;
use actix_web::{HttpResponse, ResponseError};
use std::error::Error;
use light_openid::errors::OpenIdError;
pub mod auth_controller;
pub mod matrix;
@@ -18,7 +18,7 @@ pub enum HttpFailure {
#[error("this resource was not found")]
NotFound,
#[error("an unspecified open id error occurred: {0}")]
OpenID(Box<dyn Error>),
OpenID(#[from] OpenIdError),
#[error("an unspecified internal error occurred: {0}")]
InternalError(#[from] anyhow::Error),
#[error("Actix web error: {0}")]

View File

@@ -39,6 +39,7 @@ pub struct ServerConstraints {
pub token_name: LenConstraints,
pub token_ip_net: LenConstraints,
pub token_max_inactivity: LenConstraints,
pub max_upload_file_size: usize,
}
impl Default for ServerConstraints {
@@ -47,6 +48,7 @@ impl Default for ServerConstraints {
token_name: LenConstraints::new(5, 255),
token_ip_net: LenConstraints::max_only(44),
token_max_inactivity: LenConstraints::new(3600, 3600 * 24 * 365),
max_upload_file_size: 20_000_000,
}
}
}

View File

@@ -58,7 +58,7 @@ pub enum WsMessage {
/// Room reaction event
RoomReactionEvent(WsRoomEvent<ReactionEventContent>),
/// Room reaction event
/// Room redaction event
RoomRedactionEvent(WsRoomEvent<RoomRedactionEventContent>),
/// Fully read message event

View File

@@ -11,8 +11,9 @@ use matrixgw_backend::broadcast_messages::BroadcastMessage;
use matrixgw_backend::constants;
use matrixgw_backend::controllers::matrix::{
matrix_event_controller, matrix_media_controller, matrix_profile_controller,
matrix_room_controller,
matrix_room_controller, matrix_space_controller,
};
use matrixgw_backend::controllers::server_controller::ServerConstraints;
use matrixgw_backend::controllers::{
auth_controller, matrix_link_controller, matrix_sync_thread_controller, server_controller,
static_controller, tokens_controller, ws_controller,
@@ -75,6 +76,9 @@ async fn main() -> std::io::Result<()> {
.wrap(Logger::default())
.wrap(session_mw)
.wrap(cors)
.app_data(web::PayloadConfig::new(
ServerConstraints::default().max_upload_file_size,
))
.app_data(web::Data::new(manager_actor_clone.clone()))
.app_data(web::Data::new(RemoteIPConfig {
proxy: AppConfig::get().proxy_ip.clone(),
@@ -138,6 +142,11 @@ async fn main() -> std::io::Result<()> {
web::get().to(matrix_sync_thread_controller::status),
)
.service(web::resource("/api/ws").route(web::get().to(ws_controller::ws)))
// Matrix spaces controller
.route(
"/api/matrix/space/hierarchy",
web::get().to(matrix_space_controller::hierarchy),
)
// Matrix room controller
.route(
"/api/matrix/room/joined",
@@ -177,6 +186,10 @@ async fn main() -> std::io::Result<()> {
"/api/matrix/room/{room_id}/send_text_message",
web::post().to(matrix_event_controller::send_text_message),
)
.route(
"/api/matrix/room/{room_id}/send_file",
web::post().to(matrix_event_controller::send_file),
)
.route(
"/api/matrix/room/{room_id}/event/{event_id}/set_text_content",
web::post().to(matrix_event_controller::set_text_content),

File diff suppressed because it is too large Load Diff

View File

@@ -12,37 +12,38 @@
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@fontsource/roboto": "^5.2.9",
"@mui/icons-material": "^7.3.6",
"@mui/material": "^7.3.6",
"@mui/x-data-grid": "^8.20.0",
"@mui/x-date-pickers": "^8.19.0",
"date-and-time": "^4.1.1",
"@fontsource/roboto": "^5.2.10",
"@mui/icons-material": "^7.3.8",
"@mui/material": "^7.3.8",
"@mui/x-data-grid": "^8.27.3",
"@mui/x-date-pickers": "^8.27.2",
"date-and-time": "^4.3.0",
"dayjs": "^1.11.19",
"emoji-picker-react": "^4.16.1",
"is-cidr": "^6.0.1",
"emoji-picker-react": "^4.18.0",
"filesize": "^11.0.13",
"is-cidr": "^6.0.3",
"qrcode.react": "^4.2.0",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-favicon": "^2.0.7",
"react-json-view-lite": "^2.5.0",
"react-router": "^7.10.0"
"react-router": "^7.13.1"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@types/node": "^24.10.1",
"@types/react": "^19.2.7",
"@eslint/js": "^9.39.3",
"@types/node": "^25.3.3",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",
"eslint": "^9.39.1",
"@vitejs/plugin-react": "^5.1.4",
"eslint": "^10.0.2",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.4.22",
"globals": "^16.5.0",
"eslint-plugin-react-refresh": "^0.4.26",
"globals": "^17.4.0",
"typescript": "~5.9.3",
"typescript-eslint": "^8.48.1",
"vite": "npm:rolldown-vite@7.2.10"
"typescript-eslint": "^8.56.1",
"vite": "npm:rolldown-vite@7.3.1"
},
"overrides": {
"vite": "npm:rolldown-vite@7.2.10"
"vite": "npm:rolldown-vite@7.3.1"
}
}

View File

@@ -16,6 +16,7 @@ export interface ServerConstraints {
token_name: LenConstraint;
token_ip_net: LenConstraint;
token_max_inactivity: LenConstraint;
max_upload_file_size: number;
}
export interface LenConstraint {

View File

@@ -68,7 +68,7 @@ export class MatrixApiEvent {
*/
static async GetRoomEvents(
room: Room,
from?: string
from?: string,
): Promise<MatrixEventsList> {
return (
await APIClient.exec({
@@ -86,7 +86,7 @@ export class MatrixApiEvent {
static GetEventFileURL(
room: Room,
event_id: string,
thumbnail: boolean
thumbnail: boolean,
): string {
return `${APIClient.ActualBackendURL()}/matrix/room/${
room.id
@@ -104,13 +104,26 @@ export class MatrixApiEvent {
});
}
/**
* Send file message
*/
static async SendFileMessage(room: Room, file: Blob): Promise<void> {
const formData = new FormData();
formData.set("file", file);
await APIClient.exec({
method: "POST",
uri: `/matrix/room/${room.id}/send_file`,
formData,
});
}
/**
* Edit text message content
*/
static async SetTextMessageContent(
room: Room,
event_id: string,
content: string
content: string,
): Promise<void> {
await APIClient.exec({
method: "POST",
@@ -125,7 +138,7 @@ export class MatrixApiEvent {
static async ReactToEvent(
room: Room,
event_id: string,
key: string
key: string,
): Promise<void> {
await APIClient.exec({
method: "POST",

View File

@@ -0,0 +1,40 @@
import { APIClient } from "../ApiClient";
export type SpaceHierarchy = Map<string, string[]>;
export class MatrixApiSpace {
/**
* Request Matrix space hierarchy
*/
static async Hierarchy(): Promise<SpaceHierarchy> {
const hierarchy = new Map(
Object.entries(
(
await APIClient.exec({
method: "GET",
uri: "/matrix/space/hierarchy",
})
).data as { [s: string]: string[] }
)
) as SpaceHierarchy;
// Simplify hierarchy
while (true) {
let changed = false;
for (const [roomid, children] of hierarchy) {
for (const child of children) {
if (!hierarchy.has(child)) continue;
hierarchy.set(roomid, [
...hierarchy.get(roomid)!,
...hierarchy.get(child)!,
]);
hierarchy.delete(child);
changed = true;
}
}
if (!changed) break;
}
return hierarchy;
}
}

View File

@@ -0,0 +1,33 @@
import { filesize } from "filesize";
/**
* Select a file to upload
*/
export async function selectFileToUpload(p: {
allowedTypes?: string[];
maxSize?: number;
}): Promise<Blob | null> {
// Create file element
const fileEl = document.createElement("input");
fileEl.type = "file";
if (p.allowedTypes && p.allowedTypes.length > 0)
fileEl.accept = p.allowedTypes.join(",");
fileEl.click();
// Wait for a file to be chosen
await new Promise((res) =>
fileEl.addEventListener("change", () => res(null)),
);
if ((fileEl.files?.length ?? 0) === 0) return null;
const file = fileEl.files![0];
// Check file size
if (p.maxSize && file.size > p.maxSize) {
throw new Error(
`The file is too big ! (max accepted file size : ${filesize(p.maxSize)})`,
);
}
return file;
}

View File

@@ -6,6 +6,10 @@ import {
type UsersMap,
} from "../../api/matrix/MatrixApiProfile";
import { MatrixApiRoom, type Room } from "../../api/matrix/MatrixApiRoom";
import {
MatrixApiSpace,
type SpaceHierarchy,
} from "../../api/matrix/MatrixApiSpace";
import { MatrixSyncApi } from "../../api/MatrixSyncApi";
import type { WsMessage } from "../../api/WsApi";
import { RoomEventsManager } from "../../utils/RoomEventsManager";
@@ -19,13 +23,19 @@ import { SpaceSelector } from "./SpaceSelector";
export function MainMessageWidget(): React.ReactElement {
const [rooms, setRooms] = React.useState<Room[] | undefined>();
const [hierarchy, setHierarchy] = React.useState<
SpaceHierarchy | undefined
>();
const [users, setUsers] = React.useState<UsersMap | undefined>();
const loadRoomsList = async () => {
await MatrixSyncApi.Start();
const rooms = await MatrixApiRoom.ListJoined();
const hierarchy = await MatrixApiSpace.Hierarchy();
setRooms(rooms);
setHierarchy(hierarchy);
// Get the list of users in rooms
const users = rooms.reduce((prev, r) => {
@@ -40,11 +50,12 @@ export function MainMessageWidget(): React.ReactElement {
<AsyncWidget
loadKey={1}
load={loadRoomsList}
ready={!!rooms && !!users}
ready={!!rooms && !!users && !!hierarchy}
errMsg="Failed to initialize messaging component!"
build={() => (
<MainMessageWidgetInner
rooms={rooms!}
hierarchy={hierarchy!}
users={users!}
onRoomsListUpdate={(cb) => setRooms((r) => cb(r!))}
/>
@@ -55,6 +66,7 @@ export function MainMessageWidget(): React.ReactElement {
function MainMessageWidgetInner(p: {
rooms: Room[];
hierarchy: SpaceHierarchy;
users: UsersMap;
onRoomsListUpdate: (cb: (a: Room[]) => Room[]) => void;
}): React.ReactElement {
@@ -65,11 +77,13 @@ function MainMessageWidgetInner(p: {
const spaceRooms = React.useMemo(() => {
return p.rooms
.filter((r) => !r.is_space && (!space || r.parents.includes(space)))
.filter(
(r) => !r.is_space && (!space || p.hierarchy.get(space)?.includes(r.id))
)
.sort(
(a, b) => (b.latest_event?.time ?? 0) - (a.latest_event?.time ?? 0)
);
}, [space, p.rooms]);
}, [space, p.rooms, p.hierarchy]);
const unreadRooms = React.useMemo(
() =>
@@ -111,7 +125,7 @@ function MainMessageWidgetInner(p: {
p.onRoomsListUpdate((r) => {
const n = [...r];
const idx = r.findIndex((el) => el.id === m.room_id);
if (idx && n[idx].notifications === "AllMessages")
if (idx && n[idx]?.notifications === "AllMessages")
n[idx] = {
...n[idx],
number_unread_messages: n[idx].number_unread_messages + 1,

View File

@@ -322,8 +322,15 @@ function RoomMessage(p: {
"&:hover *": { visibility: "visible" },
}}
>
<Typography variant="caption">
&nbsp; {p.message.time_sent_dayjs.format("HH:mm")}
<Typography
variant="caption"
style={{
paddingLeft: "2px",
display: "inline-flex",
alignItems: "center",
}}
>
{p.message.time_sent_dayjs.format("HH:mm")}
</Typography>
{/** Message itself */}

View File

@@ -31,8 +31,10 @@ export function RoomSelector(p: {
() =>
p.rooms
.filter((r) => !unread || r.number_unread_messages > 0)
.filter((r) =>
r.name?.toLocaleLowerCase()?.includes(filter.toLocaleLowerCase())
.filter(
(r) =>
filter === "" ||
r.name?.toLocaleLowerCase()?.includes(filter.toLocaleLowerCase())
),
[p.rooms, unread, filter]
);

View File

@@ -1,18 +1,23 @@
import AttachFileIcon from "@mui/icons-material/AttachFile";
import SendIcon from "@mui/icons-material/Send";
import { IconButton, TextField } from "@mui/material";
import React, { type FormEvent } from "react";
import { IconButton, TextField, Tooltip } from "@mui/material";
import React, { type SyntheticEvent } from "react";
import { MatrixApiEvent } from "../../api/matrix/MatrixApiEvent";
import type { Room } from "../../api/matrix/MatrixApiRoom";
import { useAlert } from "../../hooks/contexts_provider/AlertDialogProvider";
import { useLoadingMessage } from "../../hooks/contexts_provider/LoadingMessageProvider";
import { selectFileToUpload } from "../../utils/FilesUtils";
import { ServerApi } from "../../api/ServerApi";
import { useSnackbar } from "../../hooks/contexts_provider/SnackbarProvider";
export function SendMessageForm(p: { room: Room }): React.ReactElement {
const loadingMessage = useLoadingMessage();
const alert = useAlert();
const snackbar = useSnackbar();
const [text, setText] = React.useState("");
const handleTextSubmit = async (e: FormEvent) => {
const handleTextSubmit = async (e: SyntheticEvent) => {
e.preventDefault();
if (text === "") return;
@@ -31,6 +36,26 @@ export function SendMessageForm(p: { room: Room }): React.ReactElement {
}
};
const handleFileSubmit = async () => {
try {
const file = await selectFileToUpload({
maxSize: ServerApi.Config.constraints.max_upload_file_size,
});
if (!file) return;
loadingMessage.show("Uploading file...");
await MatrixApiEvent.SendFileMessage(p.room, file);
snackbar("The file was successfully uploaded!");
} catch (e) {
console.error(e);
alert(`Failed to upload file! ${e}`);
} finally {
loadingMessage.hide();
}
};
return (
<form onSubmit={handleTextSubmit}>
<div
@@ -50,6 +75,13 @@ export function SendMessageForm(p: { room: Room }): React.ReactElement {
value={text}
onChange={(e) => setText(e.target.value)}
/>
<span style={{ width: "10px" }}></span>
<Tooltip title="Send a file">
<IconButton size="small" onClick={handleFileSubmit}>
<AttachFileIcon />
</IconButton>
</Tooltip>
<span style={{ width: "10px" }}></span>
<IconButton
size="small"
style={{ visibility: text === "" ? "hidden" : "visible" }}

View File

@@ -3,17 +3,19 @@ import { Button } from "@mui/material";
import React from "react";
import type { UsersMap } from "../../api/matrix/MatrixApiProfile";
import type { Room } from "../../api/matrix/MatrixApiRoom";
import type { SpaceHierarchy } from "../../api/matrix/MatrixApiSpace";
import { RoomIcon } from "./RoomIcon";
export function SpaceSelector(p: {
rooms: Room[];
hierarchy: SpaceHierarchy;
users: UsersMap;
selectedSpace?: string;
onChange: (space?: string) => void;
}): React.ReactElement {
const spaces = React.useMemo(
() => p.rooms.filter((r) => r.is_space),
[p.rooms]
() => p.rooms.filter((r) => r.is_space && p.hierarchy.has(r.id)),
[p.rooms, p.hierarchy]
);
// Do not display space bar if your is not member of any space