Add link preview in new chat (#9090)

Signed-off-by: Kristina Fefelova <kristin.fefelova@gmail.com>
This commit is contained in:
Kristina
2025-05-26 13:14:54 +07:00
committed by GitHub
parent 0c8c2cc84e
commit 8dd1e19685
30 changed files with 805 additions and 255 deletions
+126 -126
View File
@@ -35,26 +35,26 @@ importers:
specifier: ^8.4.1
version: 8.4.1
'@hcengineering/communication-client-query':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hcengineering/communication-rest-client':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hcengineering/communication-sdk-types':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hcengineering/communication-server':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hcengineering/communication-shared':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hcengineering/communication-yaml':
specifier: 0.1.191
version: 0.1.191(typescript@5.3.3)
specifier: 0.1.192
version: 0.1.192(typescript@5.3.3)
'@hocuspocus/provider':
specifier: ^2.15.2
version: 2.15.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)(y-protocols@1.0.6(yjs@13.6.23))(yjs@13.6.23)
@@ -3003,48 +3003,48 @@ packages:
'@hcengineering/card@0.7.88':
resolution: {integrity: sha512-3JDgocHFSGmQuKsrtQ5CTTm4rpd/PHahIx6oNX8sshDGpS2hnvNtrHNkJf39seIKiq0NNKmJ//Etl4I21h4c6w==, tarball: https://npm.pkg.github.com/download/@hcengineering/card/0.7.88/e39b9e182325945494f162f2dd6f16ef9bea0f3e}
'@hcengineering/communication-client-query@0.1.191':
resolution: {integrity: sha512-a6TPy3EblgbeVXoLjXFDRIHgstmcWhksrsZaAjKlNE1mXSapPjBQLKVTrsSMxs9heoJnHyhZjK8gDV4W801OCw==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-client-query/0.1.191/856547affa48dfa8d14fc93aeb1dd37dc1cb1aea}
'@hcengineering/communication-client-query@0.1.192':
resolution: {integrity: sha512-+6WyS8FNCCtkB3Jxn5RA1PHI2OV5+/3fALjLtcMafgdIo3KsXe7EPCY88+KJS+iJR9ODw3zSGwZb/KHVpFnkwQ==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-client-query/0.1.192/6f59aae10df1eb88572c04bff5a043cff722bf7f}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-cockroach@0.1.191':
resolution: {integrity: sha512-QtwLF6DsuitfXqAgKEgBpBgfcgLppjPLUuHM82yjay1T00ulr2RjEPpEVTT8cnWX8wPT6Y1HwEN+A8Cd+rhB3A==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-cockroach/0.1.191/2ce82718ed7a90aff789e65f7ba4dac349801668}
'@hcengineering/communication-cockroach@0.1.192':
resolution: {integrity: sha512-zBTtPClYE4Nw8z6QR7g6rETCr1Ja4IctypzlXFCWkVZhqH4xH4qyCpFTdZ1FafgRGGAs+ZD4942DdmLf6P+yyg==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-cockroach/0.1.192/61de4a5e268df02a855e98e550893209c47faf11}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-query@0.1.191':
resolution: {integrity: sha512-LdxVdBkEz1iIQblecvG5ykBA5taBkxPZHmYOHOFeemqj/i1vih8N881PAPF50V2ZAT3EmG0wbVl95GaeqxR7Hg==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-query/0.1.191/ab41a7246216182d8943907db0ff1d6c349a3514}
'@hcengineering/communication-query@0.1.192':
resolution: {integrity: sha512-G/OGij01wPvjetnRyIKJOtZxTMiAlz2Rx1UoWfueOgAz9OJ1lnUUwMnELdSM94FXf/x3Vk4Qo2HV4ZURzYA8sQ==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-query/0.1.192/6d159a91ea996989eb8066fdd9447af1d52f9cc0}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-rest-client@0.1.191':
resolution: {integrity: sha512-dMXPCbvZSo5TOmoq9lyWlmym6hhv5YZi3uSy0EoWn5dTStVm+1qEB+alcJ6YNAeTJlqAZ7armS3xluZzsrPH/Q==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-rest-client/0.1.191/8d96a4e67447ae975986939c50b075698bd79f55}
'@hcengineering/communication-rest-client@0.1.192':
resolution: {integrity: sha512-7BMJw03svbN2zbznik2dUfeup8IwOL/9bgB8Yl6JmpCAB9IkdXLpn68jSRtLN8nCe7OfqSAFs2Q2glSrIZo8Xw==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-rest-client/0.1.192/3dcb1c69921470cf80ef5f1c9e90b59bf8488ea6}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-sdk-types@0.1.191':
resolution: {integrity: sha512-xZoik0nH0acXKttxy1F6Fz24ZxrA4JkBLVSHMWsuVHC+rwwSrHAR0sF17fpnldElrMBqCG/dhFlx2pIQE3GYCQ==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-sdk-types/0.1.191/2afe5877009aba60fe474ec936b2cbb25a394de0}
'@hcengineering/communication-sdk-types@0.1.192':
resolution: {integrity: sha512-V8gGlX4aR/LZdgzyu8q+ZUtDYtMW3TyancFLkDS5Uqim2lbGl+Jfd/kGs7YOr1O8LJUMwpdgD8wPVcS6egA+rA==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-sdk-types/0.1.192/55a3516f97ca9ea7e4c77bab981fb857ea71085a}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-server@0.1.191':
resolution: {integrity: sha512-p5VAMQVS5c7lovmHljZRPqvnsULgA/Slvi7BvGzMD/mtyx3uy0OrHmIsM278s/bmBb2GaShxZZuwemCNu2Ayrw==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-server/0.1.191/11ef8e29bb59c8c668ed6b19d7d3bfdf4a4693b8}
'@hcengineering/communication-server@0.1.192':
resolution: {integrity: sha512-Wt8gRIE5wRmxRD8CSQE72TLzOcdGpni8c+eknoGrgOnUNNX0Mz0jsZXNGBNgtYf485bTEQt9umeTdr0M9ZINDg==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-server/0.1.192/31c1c4fe5019da50afcdb1956e106875251356d6}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-shared@0.1.191':
resolution: {integrity: sha512-yIArgk8zmgv7gQ0tzZKpIApQ5hLUdq0CySHveH+nvPr8+Gd9NXCo1giztPXNF0mfZzXJh79rACxqiz3C1eIEEQ==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-shared/0.1.191/55aafcdc28c987971fa7d39d3486c8341819da3a}
'@hcengineering/communication-shared@0.1.192':
resolution: {integrity: sha512-XtuJM81xzI3ory+EcqTNvVcEmBYDgHzddfPjvMnl1eOJKOcCHHkshiGjOdYYo1Er3XX4iPRFj7FSQSEQXLpz2A==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-shared/0.1.192/3737f15c6f549d183f514b1576ebdc2c8251580c}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-types@0.1.191':
resolution: {integrity: sha512-p8I9dnlYpfmxzAW+ZaTjflnQ4n0QMIBk34ABdDB8OEUdt6ZXUJRBAIYbrNz+nJM4DjoqKP+eZ5jNqL/7srTYMw==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-types/0.1.191/cf603c1b5d581eefe5ed3c04f2eb41da3ea50fe2}
'@hcengineering/communication-types@0.1.192':
resolution: {integrity: sha512-e9gAro6QEtvCatDXOjitETeh9ejSr+NhF59VuHIHHLdCWtePc1vKxf38aRi/reDTLU1JPHoFlvFRRC7BRr+Gag==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-types/0.1.192/96ec931f063fc51603dd5bc1058640a3bfdbbe07}
peerDependencies:
typescript: ^5.6.3
'@hcengineering/communication-yaml@0.1.191':
resolution: {integrity: sha512-Z7CSFkrYHkQ8KzrLiIodAu7t4QIFkdAWaDJO08YnJ/Oz9gS/Md1AJfKbf7Ihrsd7RrFs8efVd+NvrChmaFBdSA==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-yaml/0.1.191/46df9300079d369915108a2c0e63171976b1f945}
'@hcengineering/communication-yaml@0.1.192':
resolution: {integrity: sha512-EJ4/J4rUyqtkpREdSq+EZDZJbs1Ekzx0BlojSIoIjv6T4KJCTCgTv0UtOVTmL2YUXdOXuahLjFz6/LgqGcaLww==, tarball: https://npm.pkg.github.com/download/@hcengineering/communication-yaml/0.1.192/6d4dacda71fe80da832cc4114c9fbf6fa43e6262}
peerDependencies:
typescript: ^5.6.3
@@ -3972,7 +3972,7 @@ packages:
version: 0.0.0
'@rush-temp/activity-resources@file:projects/activity-resources.tgz':
resolution: {integrity: sha512-MHhQ94/bpbr9FIby6Mko1AwxSL24Rd5evB1sIBqJIeOuTrmw6NoVRGleXXTV2tyKiLMGHLRKZX8l82O7HqkQcg==, tarball: file:projects/activity-resources.tgz}
resolution: {integrity: sha512-BWIT2EhUenDoip7W0Z72cy+bk3w0cIIPzRr0LUP6++lUaeTR1m4EqVCehaH7z+rG8Es24TGjL2NSuBcFS6luKg==, tarball: file:projects/activity-resources.tgz}
version: 0.0.0
'@rush-temp/activity@file:projects/activity.tgz':
@@ -4076,7 +4076,7 @@ packages:
version: 0.0.0
'@rush-temp/card-resources@file:projects/card-resources.tgz':
resolution: {integrity: sha512-taQdkoguI2POW2F4bfevBiG3fHB38UML1AbsJf7u20skavJPxt2cFYATCUsILjfwyJDyYxcBa1704vhlK9qTgQ==, tarball: file:projects/card-resources.tgz}
resolution: {integrity: sha512-GTOrrnhZ+pfTFPVQ24GNCJy7yhTz6QYmO+c1PxrRYHloRfhnFeAc/vmEJleN1JtdpPAktfyQCbXBaTiv9YgpRA==, tarball: file:projects/card-resources.tgz}
version: 0.0.0
'@rush-temp/card@file:projects/card.tgz':
@@ -4088,7 +4088,7 @@ packages:
version: 0.0.0
'@rush-temp/chat-resources@file:projects/chat-resources.tgz':
resolution: {integrity: sha512-MmF5dJfYC52k87iKDfZfSxwjUdfMl+tjeT5+RuMDCIPg23rN8Pt0GCoPzhHbBspKGJW3iG6Fnsg8y0soUFlbMw==, tarball: file:projects/chat-resources.tgz}
resolution: {integrity: sha512-I6mGrf3YaAqL6RK4EtBVn5CNVfxf7pWKEv47xgeMswHtfEffsTPYkDUHyNsCyaDpWY97lMTnVBEFr+T7b87X2Q==, tarball: file:projects/chat-resources.tgz}
version: 0.0.0
'@rush-temp/chat@file:projects/chat.tgz':
@@ -4108,7 +4108,7 @@ packages:
version: 0.0.0
'@rush-temp/client-resources@file:projects/client-resources.tgz':
resolution: {integrity: sha512-zIr+wGXLwhWw3K7H6DdXJ86K2KRYVzhNEG1/RVjLBhC9DkyceCi4PtgKR01+Gq6BFWBEFcwII/B37xdVdzDPOA==, tarball: file:projects/client-resources.tgz}
resolution: {integrity: sha512-VX5kl5O5Yf6uYwEk060mM9Rn6wgUmRgtJnDyqwB2JoDAme4q8IBghUz4tLoa1rp/28RpH6tIrHGFWwRpSC0nHw==, tarball: file:projects/client-resources.tgz}
version: 0.0.0
'@rush-temp/client@file:projects/client.tgz':
@@ -4132,7 +4132,7 @@ packages:
version: 0.0.0
'@rush-temp/communication-resources@file:projects/communication-resources.tgz':
resolution: {integrity: sha512-Qb3to4molkfpLYNQK5WP+Dj7UH8141h32JqoV/7YgdBsw1SJeS52IBGLftHwa1FEhM7gwiHjgRlJnL0aQ8L8nA==, tarball: file:projects/communication-resources.tgz}
resolution: {integrity: sha512-Z0riTqBWeYsD+GjJIV9V4D2JNMRMIcKgaeiBOS0TSZihg5906HgaFcfSIS0d8ag45M2mIRWpAXjhted9jlbh/w==, tarball: file:projects/communication-resources.tgz}
version: 0.0.0
'@rush-temp/communication@file:projects/communication.tgz':
@@ -4340,7 +4340,7 @@ packages:
version: 0.0.0
'@rush-temp/inbox-resources@file:projects/inbox-resources.tgz':
resolution: {integrity: sha512-MXE7we34ENFD437n5kF+2DyEBOxWoyXTqSFtVPWqocrMzBKxG9DhSr4oU3ReaMPIgmgDCz6sC/2bhEJ+v+2nIw==, tarball: file:projects/inbox-resources.tgz}
resolution: {integrity: sha512-gtpffGRh/iYJwvYAohHZVDhuS3vThmMaIrgFD/muIDzUoOir8hp7RIgCOp5tjz7osMWpnKiBcuReyjsf5CwwxQ==, tarball: file:projects/inbox-resources.tgz}
version: 0.0.0
'@rush-temp/inbox@file:projects/inbox.tgz':
@@ -4412,7 +4412,7 @@ packages:
version: 0.0.0
'@rush-temp/mail-common@file:projects/mail-common.tgz':
resolution: {integrity: sha512-SCDM0zbw4I2GnH9iQlfXmfdVLp/ypeYI4tN4IS96J+z2jpCDQShfXLpvGQceCWXHKmtSUaKDQI/qXVoRFk066w==, tarball: file:projects/mail-common.tgz}
resolution: {integrity: sha512-l/lLdriz6ZeNYmyAJov0gBRqYKx6Ixt+lbrcEe5UNvY3mq0o2dYT2qBktiVOXRBovU37KRuetux3OIHyzTXdTw==, tarball: file:projects/mail-common.tgz}
version: 0.0.0
'@rush-temp/mail@file:projects/mail.tgz':
@@ -4896,11 +4896,11 @@ packages:
version: 0.0.0
'@rush-temp/pod-gmail@file:projects/pod-gmail.tgz':
resolution: {integrity: sha512-iLarvkzk5YrsNPLs+u8QC8nA7cFy/JOQGCDgZigFU9wF0ajA9XE404ZSFDGdj41eelpjIlFDOnwlAufBLcWvlQ==, tarball: file:projects/pod-gmail.tgz}
resolution: {integrity: sha512-M3P9ahGc/bgDUe2gd++nUOSZZDQB81HJneVErjj57b/cMMESYP7aKnQg3OAxgwB7Hy+k/dE/sk3qNzOgvnhsHw==, tarball: file:projects/pod-gmail.tgz}
version: 0.0.0
'@rush-temp/pod-inbound-mail@file:projects/pod-inbound-mail.tgz':
resolution: {integrity: sha512-j9HCnmxyXpZ7uqALbQ7DQ0Oy+PpdKIA49BYkkQ0kwU42sddLu1U1yWBRKILZ4IcuXeAfkwnHdMnpLuENPBwH9A==, tarball: file:projects/pod-inbound-mail.tgz}
resolution: {integrity: sha512-wJEzWSq4Gb57La2Tej86OK3Ve3sYmqagQ8w/Ira6MqwdVRCqCVFXChqw5UWUyihnpI/nLudwKIKB2UMPJQ1THA==, tarball: file:projects/pod-inbound-mail.tgz}
version: 0.0.0
'@rush-temp/pod-love@file:projects/pod-love.tgz':
@@ -4912,7 +4912,7 @@ packages:
version: 0.0.0
'@rush-temp/pod-msg2file@file:projects/pod-msg2file.tgz':
resolution: {integrity: sha512-AgwjAt7FQ+D6cdcBOCALKL1tcqlW9pas7SdXZhrXUjyafMYFk2Rejr4+daQqCzy7AdvktRdzaZqlhOA31eVluw==, tarball: file:projects/pod-msg2file.tgz}
resolution: {integrity: sha512-GHaObyopiK8FJ50Lu2PlpYq60M6GiK5fufsy8doalubepR+rJ9nfivEQ6wNK1fKxeamybOTYd9acloQS/ZiiIg==, tarball: file:projects/pod-msg2file.tgz}
version: 0.0.0
'@rush-temp/pod-print@file:projects/pod-print.tgz':
@@ -4920,7 +4920,7 @@ packages:
version: 0.0.0
'@rush-temp/pod-server@file:projects/pod-server.tgz':
resolution: {integrity: sha512-KIYdQyioTgMz2rXe1vMupICntZ/Go/oYDH0VkQ6sDC5kGFNJujvU0NAW6bJ4/ACLvEYS2AQyacStB5NfOlqfDA==, tarball: file:projects/pod-server.tgz}
resolution: {integrity: sha512-8gQ3m2rACoaCYgbC/E7fCfp3/pzo43Lz5II41z3BihbCpi/FGVk/r3aCEwQu2LWvCa/O313ye6nHIZ5w/Mmk8Q==, tarball: file:projects/pod-server.tgz}
version: 0.0.0
'@rush-temp/pod-ses@file:projects/pod-ses.tgz':
@@ -4968,7 +4968,7 @@ packages:
version: 0.0.0
'@rush-temp/presentation@file:projects/presentation.tgz':
resolution: {integrity: sha512-Y8C7mjkaLouFCdOkaf8se0GrcQ6qRMtjtPUREsrEQI0y6l6Qc/W2kjrY9KnBMpvrDlmUcuxTK5LphZYfz82OKQ==, tarball: file:projects/presentation.tgz}
resolution: {integrity: sha512-ljHTHhvbM5t3LkZWLan/evFJWvi9hJXgNEEwanmt1hH3NCVFisyHjetQup851XKL7m8imTWcEISYWxbky5eYvQ==, tarball: file:projects/presentation.tgz}
version: 0.0.0
'@rush-temp/print-assets@file:projects/print-assets.tgz':
@@ -5096,7 +5096,7 @@ packages:
version: 0.0.0
'@rush-temp/server-activity-resources@file:projects/server-activity-resources.tgz':
resolution: {integrity: sha512-hdZkjpqJm6lB9dPlF4VgBbNd6nsTf8eTa6CbKhQikn3Yw8rCZYw4jPUO6jZDziYdiqZTE0FmEgpsz6aM1P6XLA==, tarball: file:projects/server-activity-resources.tgz}
resolution: {integrity: sha512-8FMY6q0vlJ7lQ18MlJuQnFyYweIxcFMSNUDgMSaK+BWTzYUVsMv2OvTPvijkjvIeRhMlCv9rR2jAGkSiH4GYiA==, tarball: file:projects/server-activity-resources.tgz}
version: 0.0.0
'@rush-temp/server-activity@file:projects/server-activity.tgz':
@@ -5140,7 +5140,7 @@ packages:
version: 0.0.0
'@rush-temp/server-card-resources@file:projects/server-card-resources.tgz':
resolution: {integrity: sha512-prxa83jp7ZNdgmjyEZHWZo0D+1urgkCC2cROpItEWXua5aA7OvlWh8IQLzgS+XcEecQjXoAgZag45jCg0Q5KgA==, tarball: file:projects/server-card-resources.tgz}
resolution: {integrity: sha512-ljEU2tExqCjn4gp/im4z1ipJNRv7TEl9ywljnou/rJe/jPaRnz6prsNiEZdVVz/JmTOsIFkpevhRzpn4WzRQyg==, tarball: file:projects/server-card-resources.tgz}
version: 0.0.0
'@rush-temp/server-card@file:projects/server-card.tgz':
@@ -5184,7 +5184,7 @@ packages:
version: 0.0.0
'@rush-temp/server-core@file:projects/server-core.tgz':
resolution: {integrity: sha512-rD6zNjGNT6qXHPsZd5uHscPqMyvlkhN83xRtrbnEKEXfXjCYQTcbI7NxwY+jYEieQhC2XjE+gJtVP1TmxdPobQ==, tarball: file:projects/server-core.tgz}
resolution: {integrity: sha512-E44hzsxxjYIXKOcxDe05hZux3TyxZik8YdWgM6hj1G50MH0sTrHUCirs3VXAbxmK11dWV+kn6qIFEMdadzz5yQ==, tarball: file:projects/server-core.tgz}
version: 0.0.0
'@rush-temp/server-document-resources@file:projects/server-document-resources.tgz':
@@ -5388,7 +5388,7 @@ packages:
version: 0.0.0
'@rush-temp/server@file:projects/server.tgz':
resolution: {integrity: sha512-zXF/IlnYJRqX70mhaWr8+CJQuq2iuvE0LttvzPzRe0R+nGdxOGyvNpiLQ2FDUkSvW9BQKIFCFwyfeEBUjWQ9cQ==, tarball: file:projects/server.tgz}
resolution: {integrity: sha512-Ah+wT1irFcBEym9jmGOjdD3Q8QhfT8uS95XgxFG0T9vyB/gtDtCh92i+AQKszMJHKwmqZmyh3GvXtei0WtprAQ==, tarball: file:projects/server.tgz}
version: 0.0.0
'@rush-temp/setting-assets@file:projects/setting-assets.tgz':
@@ -5580,7 +5580,7 @@ packages:
version: 0.0.0
'@rush-temp/ui-next@file:projects/ui-next.tgz':
resolution: {integrity: sha512-9l5aWhbY/13d7Wr2D4SArufYCGblKDD4XUauk+DlAOc6XHo/XqAJaLk0kiUSkmNh8VdO3e2fbC+T5hIL1LQrsw==, tarball: file:projects/ui-next.tgz}
resolution: {integrity: sha512-wER85AntwnQmHpxDwtB1pltm65UK6Jbq5WdpPyFGIRm82xCC2NIBqsPTzEMCNBkRDur/ODhiDGO1eu6zHZMVww==, tarball: file:projects/ui-next.tgz}
version: 0.0.0
'@rush-temp/ui@file:projects/ui.tgz':
@@ -14950,70 +14950,70 @@ snapshots:
'@hcengineering/platform': 0.7.88
'@hcengineering/ui': 0.7.88
'@hcengineering/communication-client-query@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-client-query@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-query': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-query': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
fast-equals: 5.2.2
typescript: 5.3.3
'@hcengineering/communication-cockroach@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-cockroach@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
postgres: 3.4.5
typescript: 5.3.3
uuid: 11.1.0
'@hcengineering/communication-query@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-query@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-yaml': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-yaml': 0.1.192(typescript@5.3.3)
fast-equals: 5.2.2
typescript: 5.3.3
uuid: 11.1.0
'@hcengineering/communication-rest-client@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-rest-client@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@hcengineering/core': 0.7.88
snappyjs: 0.7.0
typescript: 5.3.3
'@hcengineering/communication-rest-client@0.1.191(typescript@5.7.3)':
'@hcengineering/communication-rest-client@0.1.192(typescript@5.7.3)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@hcengineering/core': 0.7.88
snappyjs: 0.7.0
typescript: 5.7.3
'@hcengineering/communication-sdk-types@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-sdk-types@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@hcengineering/core': 0.7.88
typescript: 5.3.3
'@hcengineering/communication-sdk-types@0.1.191(typescript@5.7.3)':
'@hcengineering/communication-sdk-types@0.1.192(typescript@5.7.3)':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@hcengineering/core': 0.7.88
typescript: 5.7.3
'@hcengineering/communication-server@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-server@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/account-client': 0.7.88
'@hcengineering/communication-cockroach': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-yaml': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-cockroach': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-yaml': 0.1.192(typescript@5.3.3)
'@hcengineering/core': 0.7.88
'@hcengineering/platform': 0.7.88
'@hcengineering/server-token': 0.7.88
@@ -15022,50 +15022,50 @@ snapshots:
typescript: 5.3.3
zod: 3.24.2
'@hcengineering/communication-shared@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-shared@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
typescript: 5.3.3
'@hcengineering/communication-shared@0.1.191(typescript@5.7.3)':
'@hcengineering/communication-shared@0.1.192(typescript@5.7.3)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
typescript: 5.7.3
'@hcengineering/communication-types@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-types@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/card': 0.7.88
'@hcengineering/core': 0.7.88
'@hcengineering/tags': 0.7.88
typescript: 5.3.3
'@hcengineering/communication-types@0.1.191(typescript@5.6.2)':
'@hcengineering/communication-types@0.1.192(typescript@5.6.2)':
dependencies:
'@hcengineering/card': 0.7.88
'@hcengineering/core': 0.7.88
'@hcengineering/tags': 0.7.88
typescript: 5.6.2
'@hcengineering/communication-types@0.1.191(typescript@5.7.3)':
'@hcengineering/communication-types@0.1.192(typescript@5.7.3)':
dependencies:
'@hcengineering/card': 0.7.88
'@hcengineering/core': 0.7.88
'@hcengineering/tags': 0.7.88
typescript: 5.7.3
'@hcengineering/communication-yaml@0.1.191(typescript@5.3.3)':
'@hcengineering/communication-yaml@0.1.192(typescript@5.3.3)':
dependencies:
'@hcengineering/communication-shared': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
js-yaml: 4.1.0
typescript: 5.3.3
'@hcengineering/communication-yaml@0.1.191(typescript@5.7.3)':
'@hcengineering/communication-yaml@0.1.192(typescript@5.7.3)':
dependencies:
'@hcengineering/communication-shared': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
js-yaml: 4.1.0
typescript: 5.7.3
@@ -16521,7 +16521,7 @@ snapshots:
'@rush-temp/activity-resources@file:projects/activity-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@types/jest': 29.5.12
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
@@ -17349,7 +17349,7 @@ snapshots:
'@rush-temp/card-resources@file:projects/card-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@tiptap/pm@2.11.7)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.6.2)
'@hcengineering/communication-types': 0.1.192(typescript@5.6.2)
'@tiptap/core': 2.11.7(@tiptap/pm@2.11.7)
'@types/html-to-text': 8.1.1
'@types/jest': 29.5.12
@@ -17444,7 +17444,7 @@ snapshots:
'@rush-temp/chat-resources@file:projects/chat-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@types/jest': 29.5.12
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
@@ -17604,8 +17604,8 @@ snapshots:
'@rush-temp/client-resources@file:projects/client-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@types/jest': 29.5.12
'@types/snappyjs': 0.7.1
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
@@ -17791,7 +17791,7 @@ snapshots:
'@rush-temp/communication-resources@file:projects/communication-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@types/jest': 29.5.12
'@types/node': 20.11.19
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
@@ -19454,7 +19454,7 @@ snapshots:
'@rush-temp/inbox-resources@file:projects/inbox-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@types/jest': 29.5.12
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
@@ -20012,10 +20012,10 @@ snapshots:
'@rush-temp/mail-common@file:projects/mail-common.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))':
dependencies:
'@hcengineering/communication-rest-client': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-rest-client': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@tsconfig/node16': 1.0.4
'@types/express': 4.17.21
'@types/jest': 29.5.12
@@ -22415,7 +22415,7 @@ snapshots:
'@rush-temp/pod-gmail@file:projects/pod-gmail.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@tsconfig/node16': 1.0.4
'@types/cors': 2.8.17
'@types/express': 4.17.21
@@ -22467,9 +22467,9 @@ snapshots:
'@rush-temp/pod-inbound-mail@file:projects/pod-inbound-mail.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))':
dependencies:
'@hcengineering/communication-rest-client': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-rest-client': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@tsconfig/node16': 1.0.4
'@types/cors': 2.8.17
'@types/express': 4.17.21
@@ -22593,11 +22593,11 @@ snapshots:
'@rush-temp/pod-msg2file@file:projects/pod-msg2file.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))':
dependencies:
'@hcengineering/communication-rest-client': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-yaml': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-rest-client': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-shared': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@hcengineering/communication-yaml': 0.1.192(typescript@5.7.3)
'@tsconfig/node16': 1.0.4
'@types/cors': 2.8.17
'@types/express': 4.17.21
@@ -22679,7 +22679,7 @@ snapshots:
'@rush-temp/pod-server@file:projects/pod-server.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))':
dependencies:
'@hcengineering/communication-server': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-server': 0.1.192(typescript@5.3.3)
'@types/body-parser': 1.19.5
'@types/cors': 2.8.17
'@types/express': 4.17.21
@@ -23132,9 +23132,9 @@ snapshots:
'@rush-temp/presentation@file:projects/presentation.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-client-query': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-client-query': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@types/jest': 29.5.12
'@types/png-chunks-extract': 1.0.2
'@types/uuid': 8.3.4
@@ -24136,8 +24136,8 @@ snapshots:
'@rush-temp/server-activity-resources@file:projects/server-activity-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@types/jest': 29.5.12
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
@@ -24416,7 +24416,7 @@ snapshots:
'@rush-temp/server-card-resources@file:projects/server-card-resources.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.7.3)
'@types/jest': 29.5.12
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.7.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.7.3)
@@ -24699,8 +24699,8 @@ snapshots:
'@rush-temp/server-core@file:projects/server-core.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@types/jest': 29.5.12
'@types/node': 20.11.19
'@types/uuid': 8.3.4
@@ -26004,8 +26004,8 @@ snapshots:
'@rush-temp/server@file:projects/server.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-sdk-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.191(typescript@5.3.3)
'@hcengineering/communication-sdk-types': 0.1.192(typescript@5.3.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.3.3)
'@types/jest': 29.5.12
'@types/node': 20.11.19
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
@@ -27546,7 +27546,7 @@ snapshots:
'@rush-temp/ui-next@file:projects/ui-next.tgz(@babel/core@7.23.9)(@jest/types@29.6.3)(@types/node@20.11.19)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3)))(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.11.19)(typescript@5.3.3))':
dependencies:
'@hcengineering/communication-types': 0.1.191(typescript@5.7.3)
'@hcengineering/communication-types': 0.1.192(typescript@5.7.3)
'@tiptap/core': 2.11.7(@tiptap/pm@2.11.7)
'@tiptap/pm': 2.11.7
'@types/dompurify': 3.0.5
+3 -3
View File
@@ -44,9 +44,9 @@
"@hcengineering/client": "^0.6.18",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/collaborator-client": "^0.6.4",
"@hcengineering/communication-client-query": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-client-query": "0.1.192",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/core": "^0.6.32",
"@hcengineering/diffview": "^0.6.0",
"@hcengineering/notification": "^0.6.23",
+39 -19
View File
@@ -34,7 +34,10 @@ import {
type Label,
type FindLabelsParams,
type FindCollaboratorsParams,
type Collaborator
type Collaborator,
type FileData,
type LinkPreviewData,
type LinkPreviewID
} from '@hcengineering/communication-types'
import {
type CreateFileEvent,
@@ -55,15 +58,16 @@ import {
NotificationRequestEventType,
type RemoveNotificationContextEvent,
type UpdateNotificationEvent,
type UpdateNotificationQuery
type UpdateNotificationQuery,
type CreateLinkPreviewEvent,
type RemoveLinkPreviewEvent
} from '@hcengineering/communication-sdk-types'
import {
type Client as PlatformClient,
type ClientConnection as PlatformConnection,
getCurrentAccount,
SocialIdType,
generateId,
type BlobMetadata
generateId
} from '@hcengineering/core'
import { onDestroy } from 'svelte'
import {
@@ -223,26 +227,13 @@ class Client {
await this.sendEvent(event)
}
async createFile (
card: CardID,
message: MessageID,
messageCreated: Date,
blobId: BlobID,
fileType: string,
filename: string,
size: number,
meta?: BlobMetadata
): Promise<void> {
async createFile (card: CardID, message: MessageID, messageCreated: Date, data: FileData): Promise<void> {
const event: CreateFileEvent = {
type: MessageRequestEventType.CreateFile,
card,
message,
messageCreated,
blobId,
fileType,
filename,
size,
meta,
data,
creator: this.getSocialId()
}
await this.sendEvent(event)
@@ -260,6 +251,35 @@ class Client {
await this.sendEvent(event)
}
async createLinkPreview (
card: CardID,
message: MessageID,
messageCreated: Date,
data: LinkPreviewData
): Promise<void> {
const event: CreateLinkPreviewEvent = {
type: MessageRequestEventType.CreateLinkPreview,
card,
message,
messageCreated,
data,
creator: this.getSocialId()
}
await this.sendEvent(event)
}
async removeLinkPreview (card: CardID, message: MessageID, messageCreated: Date, id: LinkPreviewID): Promise<void> {
const event: RemoveLinkPreviewEvent = {
type: MessageRequestEventType.RemoveLinkPreview,
card,
message,
messageCreated,
id,
creator: this.getSocialId()
}
await this.sendEvent(event)
}
async updateNotificationContext (context: ContextID, lastView: Date): Promise<void> {
const event: UpdateNotificationContextEvent = {
type: NotificationRequestEventType.UpdateNotificationContext,
+1 -1
View File
@@ -43,7 +43,7 @@
"@hcengineering/attachment-resources": "^0.6.0",
"@hcengineering/card": "^0.6.0",
"@hcengineering/chat": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/contact-resources": "^0.6.0",
"@hcengineering/core": "^0.6.32",
@@ -14,11 +14,11 @@
-->
<script lang="ts">
import { getClient } from '@hcengineering/presentation'
import { getClient, getCommunicationClient } from '@hcengineering/presentation'
import cardPlugin, { Card } from '@hcengineering/card'
import { Ref } from '@hcengineering/core'
import { AttachmentPreview } from '@hcengineering/attachment-resources'
import { Message, MessageType } from '@hcengineering/communication-types'
import { Ref, getCurrentAccount } from '@hcengineering/core'
import { AttachmentPreview, LinkPreview } from '@hcengineering/attachment-resources'
import { Message, MessageType, LinkPreviewID } from '@hcengineering/communication-types'
import { openDoc } from '@hcengineering/view-resources'
import ReactionsList from '../ReactionsList.svelte'
@@ -29,6 +29,9 @@
export let replies: boolean = true
export let files: boolean = true
const me = getCurrentAccount()
const communicationClient = getCommunicationClient()
function canReply (): boolean {
return message.type === MessageType.Message || message.type === MessageType.Thread
}
@@ -52,6 +55,10 @@
}
$: isThread = message.thread != null || message.type === MessageType.Thread
async function removeLinkPreview (id: LinkPreviewID): Promise<void> {
await communicationClient.removeLinkPreview(message.card, message.id, message.created, id)
}
</script>
<!-- svelte-ignore a11y-click-events-have-key-events -->
@@ -66,6 +73,29 @@
{/each}
</div>
{/if}
{#if !isThread && (message.links ?? []).length > 0}
<div class="message__links">
{#each message.links as link (link.id)}
<LinkPreview
isOwn={me.socialIds.includes(message.creator)}
on:delete={() => {
void removeLinkPreview(link.id)
}}
linkPreview={{
url: link.url,
host: link.host,
title: link.title,
description: link.description,
hostname: link.hostname,
image: link.image?.url,
imageWidth: link.image?.width,
imageHeight: link.image?.height,
icon: link.favicon
}}
/>
{/each}
</div>
{/if}
{#if message.reactions.length > 0}
<div class="message__reactions">
<ReactionsList reactions={message.reactions} on:click={handleReaction} />
@@ -105,4 +135,13 @@
width: 100%;
overflow: hidden;
}
.message__links {
display: grid;
grid-gap: 0.75rem;
grid-template-columns: repeat(auto-fit, 25rem);
min-height: 2.5rem;
width: 100%;
overflow: hidden;
}
</style>
@@ -21,21 +21,23 @@
deleteFile,
getCommunicationClient,
getClient,
getFileMetadata
getFileMetadata,
isLinkPreviewEnabled
} from '@hcengineering/presentation'
import { Message, MessageID } from '@hcengineering/communication-types'
import { AttachmentPresenter } from '@hcengineering/attachment-resources'
import { areEqualMarkups, isEmptyMarkup, EmptyMarkup } from '@hcengineering/text'
import { Message, MessageID, FileData, LinkPreviewData } from '@hcengineering/communication-types'
import { AttachmentPresenter, LinkPreviewCard } from '@hcengineering/attachment-resources'
import { areEqualMarkups, isEmptyMarkup } from '@hcengineering/text'
import { updateMyPresence } from '@hcengineering/presence-resources'
import { ThrottledCaller } from '@hcengineering/ui'
import { getCurrentEmployee } from '@hcengineering/contact'
import { Card } from '@hcengineering/card'
import { setPlatformStatus, unknownError } from '@hcengineering/platform'
import TextInput from '../TextInput.svelte'
import { defaultMessageInputActions, toMarkdown } from '../../utils'
import { defaultMessageInputActions, toMarkdown, toMarkup, loadLinkPreviewData } from '../../utils'
import uiNext from '../../plugin'
import IconPlus from '../icons/IconPlus.svelte'
import { type TextInputAction, UploadedFile, type PresenceTyping, MessageDraft } from '../../types'
import { type TextInputAction, type PresenceTyping, MessageDraft } from '../../types'
import TypingPresenter from '../TypingPresenter.svelte'
import { getDraft, messageToDraft, saveDraft, getEmptyDraft, removeDraft } from '../../draft'
@@ -43,7 +45,7 @@
export let message: Message | undefined = undefined
export let title: string = ''
export let onCancel: (() => void) | undefined = undefined
export let onSubmit: ((markdown: string, files: UploadedFile[]) => Promise<void>) | undefined = undefined
export let onSubmit: ((markdown: string, files: FileData[]) => Promise<void>) | undefined = undefined
const throttle = new ThrottledCaller(500)
const dispatch = createEventDispatcher()
@@ -51,11 +53,16 @@
const client = getClient()
const me = getCurrentEmployee()
const maxLinkPreviewCount = 4
const previewUrls = new Map<string, boolean>()
const linksData = new Map<string, LinkPreviewData | null>()
let prevCard: Ref<Card> | undefined = card._id
let prevMessage: MessageID | undefined = message?.id
let draft: MessageDraft = message != null ? messageToDraft(message) : getDraft(card._id)
let inputElement: HTMLInputElement
let refContainer: HTMLElement | undefined | null = undefined
let progress = false
@@ -73,9 +80,13 @@
function initDraft (): void {
draft = message != null ? messageToDraft(message) : getDraft(card._id)
previewUrls.clear()
}
function _saveDraft (draft: MessageDraft): void {
for (const link of draft.links) {
previewUrls.set(link.url, true)
}
if (message === undefined) {
saveDraft(card._id, draft)
}
@@ -87,8 +98,11 @@
const markup = event.detail
const filesToLoad = draft.files
const linksToLoad = draft.links
const urlsToLoad = Array.from(previewUrls.keys()).filter((it) => previewUrls.get(it) === true)
draft = getEmptyDraft()
previewUrls.clear()
if (message === undefined) {
removeDraft(card._id)
}
@@ -101,54 +115,60 @@
}
if (message === undefined) {
await createMessage(markdown, filesToLoad)
await createMessage(markdown, filesToLoad, linksToLoad, urlsToLoad)
dispatch('sent')
} else {
await editMessage(message, markdown, filesToLoad)
await editMessage(message, markdown, filesToLoad, linksToLoad)
}
}
async function createMessage (markdown: string, files: UploadedFile[]): Promise<void> {
async function createMessage (
markdown: string,
files: FileData[],
links: LinkPreviewData[],
urlsToLoad: string[]
): Promise<void> {
const { id, created } = await communicationClient.createMessage(card._id, card._class, markdown)
for (const file of files) {
await communicationClient.createFile(
card._id,
id,
created,
file.blobId,
file.type,
file.filename,
file.size,
file.metadata
)
void client.update(card, {}, false, Date.now())
void Promise.all(files.map((file) => communicationClient.createFile(card._id, id, created, file)))
for (const link of links) {
void communicationClient.createLinkPreview(card._id, id, created, link)
}
for (const url of urlsToLoad) {
if (links.some((it) => it.url === url)) continue
const fetchedData = linksData.get(url)
if (fetchedData === null) continue
const data = fetchedData ?? (await loadLinkPreviewData(url))
if (data === undefined) continue
void communicationClient.createLinkPreview(card._id, id, created, data)
}
await client.update(card, {}, false, Date.now())
}
async function editMessage (message: Message, markdown: string, files: UploadedFile[]): Promise<void> {
async function editMessage (
message: Message,
markdown: string,
files: FileData[],
links: LinkPreviewData[]
): Promise<void> {
await communicationClient.updateMessage(card._id, message.id, message.created, markdown)
for (const file of files) {
if (message.files.find((it) => it.blobId === file.blobId)) continue
await communicationClient.createFile(
card._id,
message.id,
message.created,
file.blobId,
file.type,
file.filename,
file.size,
file.metadata
)
if (message.files.some((it) => it.blobId === file.blobId)) continue
await communicationClient.createFile(card._id, message.id, message.created, file)
}
for (const file of message.files) {
if (files.find((it) => it.blobId === file.blobId)) continue
if (files.some((it) => it.blobId === file.blobId)) continue
void deleteFile(file.blobId)
await communicationClient.removeFile(card._id, message.id, message.created, file.blobId)
}
for (const link of links) {
if (message.links.some((it) => it.url === link.url)) continue
await communicationClient.createLinkPreview(card._id, message.id, message.created, link)
}
dispatch('edited')
}
@@ -171,7 +191,7 @@
async function addFile (file: File): Promise<void> {
const uuid = await uploadFile(file)
const metadata = await getFileMetadata(file, uuid)
const meta = await getFileMetadata(file, uuid)
draft = {
...draft,
@@ -182,7 +202,7 @@
type: file.type,
filename: file.name,
size: file.size,
metadata
meta
}
]
}
@@ -258,15 +278,79 @@
progress = false
}
let newMarkup: Markup | undefined = undefined
function isValidUrl (s: string): boolean {
let url: URL
try {
url = new URL(s)
} catch {
return false
}
return url.protocol.startsWith('http')
}
function updateLinkPreview (): void {
if (refContainer == null) return
const hrefs = refContainer.getElementsByTagName('a')
const validUrls = Array.from(hrefs)
.filter((it) => it.target === '_blank' && isValidUrl(it.href) && it.rel !== '')
.map((it) => it.href)
const newUrls = new Set<string>()
const removedUrls = new Set<string>()
for (const [url] of previewUrls.entries()) {
const found = validUrls.find((it) => it === url)
if (found === undefined) {
removedUrls.add(url)
}
}
for (const url of validUrls) {
if (previewUrls.has(url)) continue
previewUrls.set(url, true)
newUrls.add(url)
}
for (const url of removedUrls) {
previewUrls.delete(url)
draft = {
...draft,
links: draft.links.filter((it) => it.url !== url)
}
}
if (newUrls.size > 0) {
void loadLinks(Array.from(newUrls))
}
}
async function loadLinks (urls: string[]): Promise<void> {
const draftId = draft._id
for (const url of urls) {
try {
const data = linksData.get(url) ?? (await loadLinkPreviewData(url))
linksData.set(url, data ?? null)
if (data === undefined || !previewUrls.has(url)) continue
if (draftId !== draft._id) return
draft = {
...draft,
links: [...draft.links, data]
}
} catch (err: any) {
void setPlatformStatus(unknownError(err))
}
}
}
async function onUpdate (event: CustomEvent<Markup>): Promise<void> {
draft = {
...draft,
content: event.detail
}
const visiblePreviewUrls = Array.from(previewUrls.keys()).filter((it) => previewUrls.get(it) === true)
if (isLinkPreviewEnabled() && visiblePreviewUrls.length < maxLinkPreviewCount) {
updateLinkPreview()
}
if (message !== undefined) return
newMarkup = event.detail
if (!isEmptyMarkup(newMarkup)) {
if (!isEmptyMarkup(draft.content)) {
throttle.call(() => {
const room = { objectId: card._id, objectClass: card._class }
const typing: PresenceTyping = { person: me, lastTyping: Date.now() }
@@ -279,20 +363,20 @@
return isEmptyMarkup(draft.content) && draft.files.length === 0
}
function hasChanges (files: UploadedFile[], message: Message | undefined): boolean {
function hasChanges (files: FileData[], message: Message | undefined): boolean {
if (isEmptyDraft()) return false
if (message === undefined) return files.length > 0
if (message.files.length !== files.length) return true
if (message.files.some((it) => !files.some((f) => f.blobId === it.blobId))) return true
if (newMarkup === undefined || draft.content === undefined) return false
return !areEqualMarkups(draft.content, newMarkup ?? EmptyMarkup)
return !areEqualMarkups(draft.content, toMarkup(message.content))
}
</script>
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
bind:this={refContainer}
class="flex-col no-print w-full"
on:dragover|preventDefault={() => {}}
on:dragleave={() => {}}
@@ -321,7 +405,7 @@
onPaste={pasteAction}
>
<div slot="header" class="header">
{#if draft.files.length > 0}
{#if draft.files.length > 0 || draft.links.length > 0}
<div class="flex-row-center files-list scroll-divider-color flex-gap-2 mt-2">
{#each draft.files as file (file.blobId)}
<div class="item flex">
@@ -331,7 +415,7 @@
name: file.filename,
type: file.type,
size: file.size,
metadata: file.metadata
metadata: file.meta
}}
showPreview
removable
@@ -350,6 +434,37 @@
/>
</div>
{/each}
{#if draft.links.length > 0 && draft.files.length > 0}
<div class="divider" />
{/if}
{#each draft.links as link}
<div class="item flex">
<LinkPreviewCard
value={{
url: link.url,
host: link.host,
title: link.title,
description: link.description,
hostname: link.hostname,
image: link.image?.url,
imageWidth: link.image?.width,
imageHeight: link.image?.height,
icon: link.favicon
}}
on:remove={(event) => {
const result = event.detail
if (result !== undefined) {
previewUrls.set(result.url, false)
draft = {
...draft,
links: draft.links.filter((it) => it.url !== result.url)
}
}
}}
/>
</div>
{/each}
</div>
{/if}
</div>
@@ -368,13 +483,14 @@
width: 100%;
}
.divider {
height: 100%;
border-left: 1px solid var(--theme-divider-color);
}
.files-list {
overflow-x: auto;
overflow-y: hidden;
.item + .item {
padding-left: 1rem;
border-left: 1px solid var(--theme-divider-color);
}
display: flex;
gap: 0.5rem;
}
</style>
+21 -6
View File
@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import { getCurrentAccount, type Ref } from '@hcengineering/core'
import { getCurrentAccount, type Ref, generateId } from '@hcengineering/core'
import { derived, get } from 'svelte/store'
import { type Location, location } from '@hcengineering/ui'
import { type Card } from '@hcengineering/card'
@@ -32,19 +32,21 @@ function geLocalStorageKey (card: Ref<Card>): string | undefined {
export function getEmptyDraft (): MessageDraft {
return {
_id: generateId(),
content: EmptyMarkup,
files: []
files: [],
links: []
}
}
export function getDraft (card: Ref<Card>): MessageDraft {
const key = geLocalStorageKey(card)
console.log('getDraft ket', key)
if (key === undefined) {
return getEmptyDraft()
}
const stored = localStorage.getItem(key)
console.log('getDraft stored', stored)
if (stored == null) {
return getEmptyDraft()
}
@@ -52,8 +54,10 @@ export function getDraft (card: Ref<Card>): MessageDraft {
try {
const data = JSON.parse(stored)
return {
content: data.content,
files: data.files
_id: data._id ?? generateId(),
content: data.content ?? EmptyMarkup,
files: data.files ?? [],
links: data.links ?? []
}
} catch (e) {
console.error(e)
@@ -75,7 +79,18 @@ export function saveDraft (card: Ref<Card>, draft: MessageDraft): void {
export function messageToDraft (message: Message): MessageDraft {
return {
_id: message.id,
content: toMarkup(message.content),
links: message.links.map((it) => ({
id: it.id,
url: it.url,
host: it.host,
hostname: it.hostname,
title: it.title,
description: it.description,
favicon: it.favicon,
image: it.image
})),
files: message.files.map((it) => ({
blobId: it.blobId,
type: it.type,
+5 -11
View File
@@ -16,8 +16,8 @@
import { type Asset, type IntlString } from '@hcengineering/platform'
import { type ComponentType } from 'svelte'
import { type TextEditorHandler } from '@hcengineering/text-editor'
import { type BlobID } from '@hcengineering/communication-types'
import type { BlobMetadata, Markup, Ref, Timestamp } from '@hcengineering/core'
import { type LinkPreviewData, type FileData } from '@hcengineering/communication-types'
import type { Markup, Ref, Timestamp } from '@hcengineering/core'
import type { Person } from '@hcengineering/contact'
export interface NavigationSection {
@@ -48,14 +48,6 @@ export interface TextInputAction {
disabled?: boolean
}
export interface UploadedFile {
blobId: BlobID
type: string
filename: string
size: number
metadata?: BlobMetadata
}
export interface Action {
id: string
label: IntlString
@@ -71,6 +63,8 @@ export interface PresenceTyping {
}
export interface MessageDraft {
_id: string
content: Markup
files: UploadedFile[]
files: FileData[]
links: LinkPreviewData[]
}
+35 -4
View File
@@ -21,11 +21,16 @@ import {
type Ref,
SortingOrder
} from '@hcengineering/core'
import { markupToJSON, jsonToMarkup, markupToText } from '@hcengineering/text'
import { jsonToMarkup, markupToJSON, markupToText } from '@hcengineering/text'
import { showPopup } from '@hcengineering/ui'
import { markupToMarkdown, markdownToMarkup } from '@hcengineering/text-markdown'
import { MessageType, type Message } from '@hcengineering/communication-types'
import { getClient, getCommunicationClient } from '@hcengineering/presentation'
import { markdownToMarkup, markupToMarkdown } from '@hcengineering/text-markdown'
import { type Message, MessageType, type LinkPreviewData } from '@hcengineering/communication-types'
import {
canDisplayLinkPreview,
fetchLinkPreviewDetails,
getClient,
getCommunicationClient
} from '@hcengineering/presentation'
import { employeeByPersonIdStore } from '@hcengineering/contact-resources'
import cardPlugin, { type Card } from '@hcengineering/card'
import { openDoc } from '@hcengineering/view-resources'
@@ -157,3 +162,29 @@ export function isMessageEmpty (message: Message): boolean {
message.type === MessageType.Message
)
}
export async function loadLinkPreviewData (url: string): Promise<LinkPreviewData | undefined> {
try {
const meta = await fetchLinkPreviewDetails(url)
if (canDisplayLinkPreview(meta) && meta.url !== undefined && meta.host !== undefined) {
return {
url: meta.url,
host: meta.host,
hostname: meta.hostname,
title: meta.title,
description: meta.description,
favicon: meta.icon,
image:
meta.image != null
? {
url: meta.image,
width: meta.imageWidth,
height: meta.imageHeight
}
: undefined
}
}
} catch (err: any) {
console.error(err)
}
}
+1 -1
View File
@@ -51,7 +51,7 @@
"@hcengineering/ui-next": "^0.6.0",
"@hcengineering/view": "^0.6.13",
"@hcengineering/view-resources": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/emoji": "^0.6.0",
"@hcengineering/emoji-resources": "^0.6.0",
"svelte": "^4.2.19"
@@ -0,0 +1,142 @@
<!--
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import TrashIcon from './icons/Trash.svelte'
import { getImageDimensions } from '../utils'
import LinkPreviewIcon from './LinkPreviewIcon.svelte'
import LinkPreviewImage from './LinkPreviewImage.svelte'
import { LinkPreviewData } from '../types'
export let linkPreview: LinkPreviewData
export let isOwn = false
const dispatch = createEventDispatcher()
$: description = linkPreview.description
$: title = linkPreview.title
$: icon = linkPreview.icon
$: image = linkPreview.image
$: host = linkPreview.host
$: hostname = linkPreview.hostname
$: url = linkPreview.url
$: imageDimensions =
linkPreview.imageWidth && linkPreview.imageHeight
? getImageDimensions(
{ width: linkPreview.imageWidth, height: linkPreview.imageHeight },
{
maxWidth: 23.5,
minWidth: 4,
maxHeight: 15,
minHeight: 4
}
)
: undefined
</script>
<div class="link-preview">
<div class="link-preview__header">
<LinkPreviewIcon src={icon} />
{#if host}
<b class="overflow-label"><a class="link" target="_blank" href={host}>{hostname}</a></b>
{/if}
{#if isOwn}
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div class="link-preview__delete-button" tabindex="0" role="button" on:click={() => dispatch('delete')}>
<TrashIcon size="small" />
</div>
{/if}
</div>
<div class="link-preview__body">
{#if title && title.toLowerCase() !== (hostname ?? '').toLowerCase()}
{#if url}
<b><a class="link" target="_blank" href={url}>{title}</a></b>
{:else}
<b>{title}</b>
{/if}
{/if}
{#if description && description !== ''}
<span class="link-preview__description lines-limit-4">
{description}
</span>
{/if}
</div>
{#if image}
<LinkPreviewImage
{url}
src={image}
width={imageDimensions?.width ?? 300}
height={imageDimensions?.height ?? 170}
fit={imageDimensions?.fit ?? 'contain'}
/>
{/if}
</div>
<style lang="scss">
.link-preview {
display: flex;
flex-direction: column;
gap: 0.25rem;
line-height: 150%;
padding: 0.75rem;
background-color: var(--theme-link-preview-bg-color);
border-radius: 0.75rem;
scroll-snap-align: start;
max-width: 26rem;
min-width: 16rem;
&:hover {
.link-preview__delete-button {
visibility: visible;
}
}
}
.link-preview__header {
display: flex;
flex-direction: row;
align-items: center;
gap: 0.375rem;
height: 1.375rem;
}
.link-preview__delete-button {
margin-left: auto;
cursor: pointer;
visibility: hidden;
&:not(:hover) {
color: var(--theme-link-preview-description-color);
}
}
.link-preview__body {
display: flex;
flex-direction: column;
gap: 0.25rem;
overflow: hidden;
}
.link-preview__description {
color: var(--theme-link-preview-description-color);
overflow: hidden;
}
.link {
color: var(--theme-link-preview-text-color);
}
</style>
@@ -0,0 +1,175 @@
<!--
// Copyright © 2025 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import presentation from '@hcengineering/presentation'
import { Label } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte'
import { LinkPreviewData } from '../types'
import WebIcon from './icons/Web.svelte'
export let value: LinkPreviewData
const dispatch = createEventDispatcher()
const maxLength: number = 30
const trimName = (name: string): string => {
if (name.length <= maxLength) return name
const ellipsis = '...'
const partLength = Math.floor((maxLength - ellipsis.length) / 2)
return name.slice(0, partLength) + ellipsis + name.slice(-partLength)
}
let useDefaultIcon = false
</script>
<div class="flex-row-center attachment-container">
<div class="flex-center icon image">
{#if value.icon !== undefined && !useDefaultIcon}
<img
src={value.icon}
class="link-preview-icon"
alt="link-preview"
on:error={() => {
useDefaultIcon = true
}}
/>
{:else}
<WebIcon size="medium" />
{/if}
</div>
<div class="flex-col info-container">
<div class="name">
<a target="_blank" class="no-line" style:flex-shrink={0} href={value.url}>
{trimName(value?.title ?? value.url)}
</a>
</div>
<div class="info-content flex-row-center">
<span class="actions inline-flex clear-mins gap-1">
{#if value.description}
{trimName(value.description)}
<span></span>
{/if}
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<span
class="remove-link"
on:click={(ev) => {
ev.stopPropagation()
ev.preventDefault()
dispatch('remove', value)
}}
>
<Label label={presentation.string.Delete} />
</span>
</span>
</div>
</div>
</div>
<style lang="scss">
.link-preview-icon {
max-width: 2rem;
max-height: 2rem;
}
.attachment-container {
flex-shrink: 0;
width: auto;
height: 3rem;
min-width: 17.25rem;
border-radius: 0.25rem;
.icon {
flex-shrink: 0;
width: 3rem;
height: 3rem;
object-fit: contain;
border: 1px solid var(--theme-button-border);
border-radius: 0.25rem 0 0 0.25rem;
cursor: pointer;
&:not(.image) {
color: var(--primary-button-color);
background-color: var(--primary-button-default);
}
&.image {
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
}
.info-container {
padding: 0.5rem 0.75rem;
width: 100%;
height: 100%;
background-color: var(--theme-button-default);
border: 1px solid var(--theme-button-border);
border-left: none;
border-radius: 0 0.25rem 0.25rem 0;
}
.no-line:hover ~ .info-container,
.info-container:hover {
background-color: var(--theme-button-hovered);
.actions {
opacity: 1;
}
}
.name {
white-space: nowrap;
font-size: 0.8125rem;
color: var(--theme-caption-color);
cursor: pointer;
&:hover ~ .info-content .actions {
opacity: 1;
}
}
.info-content {
white-space: nowrap;
font-size: 0.6875rem;
color: var(--theme-darker-color);
.actions {
opacity: 0;
transition: opacity 0.1s var(--timing-main);
}
&:hover .actions {
opacity: 1;
}
}
.remove-link {
color: var(--theme-error-color);
cursor: pointer;
&:hover {
text-decoration-line: underline;
}
}
.name:hover,
.no-line:hover + .info-container > .name a {
text-decoration: underline;
color: var(--theme-caption-color);
}
.name:active,
.no-line:active + .info-container > .name a {
text-decoration: underline;
color: var(--theme-caption-color);
}
}
</style>
+5 -1
View File
@@ -44,6 +44,8 @@ import IconUploadDuo from './components/icons/UploadDuo.svelte'
import PreviewWidget from './components/PreviewWidget.svelte'
import PreviewPopupActions from './components/PreviewPopupActions.svelte'
import DrawingPresenter from './components/DrawingPresenter.svelte'
import LinkPreview from './components/LinkPreview.svelte'
import LinkPreviewCard from './components/LinkPreviewCard.svelte'
export * from './types'
export * from './stores'
@@ -68,7 +70,9 @@ export {
FileBrowser,
FileDownload,
IconAttachment,
IconUploadDuo
IconUploadDuo,
LinkPreview,
LinkPreviewCard
}
export enum FileBrowserSortMode {
+12
View File
@@ -1 +1,13 @@
export type AttachmentImageSize = 'x-large' | 'auto'
export interface LinkPreviewData {
url: string
host: string
title?: string
description?: string
hostname?: string
image?: string
imageWidth?: number
imageHeight?: number
icon?: string
}
+1 -1
View File
@@ -41,7 +41,7 @@
"dependencies": {
"@hcengineering/presence": "^0.6.0",
"@hcengineering/presentation": "^0.6.3",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/core": "^0.6.32",
"@hcengineering/ui": "^0.6.15",
"@hcengineering/setting": "^0.6.17",
+1 -1
View File
@@ -42,7 +42,7 @@
"@hcengineering/card": "^0.6.0",
"@hcengineering/card-resources": "^0.6.0",
"@hcengineering/chat": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/contact-resources": "^0.6.0",
"@hcengineering/core": "^0.6.32",
+2 -2
View File
@@ -40,8 +40,8 @@
"dependencies": {
"@hcengineering/analytics": "^0.6.0",
"@hcengineering/client": "^0.6.18",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/core": "^0.6.32",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/rpc": "^0.6.5",
+1 -1
View File
@@ -44,7 +44,7 @@
"dependencies": {
"@hcengineering/card": "^0.6.0",
"@hcengineering/communication": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/contact-resources": "^0.6.0",
"@hcengineering/core": "^0.6.32",
@@ -157,6 +157,7 @@
replies: true,
files: true,
reactions: true,
links: true,
order: SortingOrder.Ascending,
limit
}
@@ -167,6 +168,7 @@
replies: true,
files: true,
reactions: true,
links: true,
order,
limit,
from: unread && initialLastView != null ? initialLastView : undefined
+1 -1
View File
@@ -40,7 +40,7 @@
"dependencies": {
"@hcengineering/analytics": "^0.6.0",
"@hcengineering/card": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/contact-resources": "^0.6.0",
"@hcengineering/core": "^0.6.32",
+1 -1
View File
@@ -61,7 +61,7 @@
"dependencies": {
"@hcengineering/analytics": "^0.6.0",
"@hcengineering/analytics-service": "^0.6.0",
"@hcengineering/communication-server": "0.1.191",
"@hcengineering/communication-server": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/core": "^0.6.32",
"@hcengineering/kafka": "^0.6.0",
@@ -48,7 +48,7 @@
"@hcengineering/server-core": "^0.6.1",
"@hcengineering/server-notification-resources": "^0.6.0",
"@hcengineering/text-core": "^0.6.0",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-types": "0.1.191"
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-types": "0.1.192"
}
}
@@ -443,7 +443,7 @@ export async function getNewActivityUpdates (
if (isUnset && hierarchy.isMixin(key as any)) {
const tag = key as Ref<Tag>
const clazz = hierarchy.getClass(tag)
console.log('d', hierarchy.isDerived(clazz._class, cardPlugin.class.Tag))
if (hierarchy.isDerived(clazz._class, cardPlugin.class.Tag)) {
result.push({
type: ActivityUpdateType.Tag,
+1 -1
View File
@@ -43,7 +43,7 @@
"@hcengineering/core": "^0.6.32",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/server-core": "^0.6.1",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/server-contact": "^0.6.1",
"@hcengineering/contact": "^0.6.24"
}
+2 -2
View File
@@ -36,8 +36,8 @@
},
"dependencies": {
"@hcengineering/analytics": "^0.6.0",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/core": "^0.6.32",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/query": "^0.6.12",
+2 -2
View File
@@ -41,8 +41,8 @@
"dependencies": {
"@hcengineering/account-client": "^0.6.0",
"@hcengineering/analytics": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/core": "^0.6.32",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/rpc": "^0.6.5",
+1 -1
View File
@@ -64,7 +64,7 @@
"@hcengineering/chat": "^0.6.0",
"@hcengineering/client": "^0.6.18",
"@hcengineering/client-resources": "^0.6.27",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/kvs-client": "^0.6.0",
"@hcengineering/mail-common": "^0.6.0",
+4 -4
View File
@@ -49,10 +49,10 @@
"@hcengineering/api-client": "^0.6.0",
"@hcengineering/card": "^0.6.0",
"@hcengineering/chat": "^0.6.0",
"@hcengineering/communication-rest-client": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-shared": "0.1.191",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-rest-client": "0.1.192",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-shared": "0.1.192",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/core": "^0.6.32",
"@hcengineering/kvs-client": "^0.6.0",
+3 -3
View File
@@ -61,9 +61,9 @@
"@hcengineering/analytics-service": "^0.6.0",
"@hcengineering/api-client": "^0.6.0",
"@hcengineering/card": "^0.6.0",
"@hcengineering/communication-rest-client": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-rest-client": "0.1.192",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/contact": "^0.6.24",
"@hcengineering/core": "^0.6.32",
"@hcengineering/kvs-client": "^0.6.0",
+5 -5
View File
@@ -57,11 +57,11 @@
"dependencies": {
"@hcengineering/api-client": "^0.6.0",
"@hcengineering/card": "^0.6.0",
"@hcengineering/communication-types": "0.1.191",
"@hcengineering/communication-shared": "0.1.191",
"@hcengineering/communication-yaml": "0.1.191",
"@hcengineering/communication-sdk-types": "0.1.191",
"@hcengineering/communication-rest-client": "0.1.191",
"@hcengineering/communication-types": "0.1.192",
"@hcengineering/communication-shared": "0.1.192",
"@hcengineering/communication-yaml": "0.1.192",
"@hcengineering/communication-sdk-types": "0.1.192",
"@hcengineering/communication-rest-client": "0.1.192",
"@hcengineering/core": "^0.6.32",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/server-client": "^0.6.0",