From 811b8e98da9b63e8114cf40dc1cf7d596e784918 Mon Sep 17 00:00:00 2001 From: Harsh | Push Date: Thu, 2 May 2024 15:09:33 +0400 Subject: [PATCH] Uiweb restapi fixes (#1249) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Chat Preview List workable PoC (#987) * fix: revert space changes * fix: merge main * fix: signer compatibility with viem and ethers (#567) * fix: signer compatibility with viem and ethers * fix: revert space changes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.26 * Update README.md * Update README.md * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.3 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.27 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.4 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.5 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.6 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.7 * fix: add: scw sig verification (#593) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.28 * fix: url correction * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.29 * ci(socket): šŸŽ‰ cut release to socket-v0.5.2 * fix: fixed subscribe and unsubscribe * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.5 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.8 * Feat/chat components (#621) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson * fix: add alpha support to UI web * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.0 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.6 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.9 * Feat/chat components (#625) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.1 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.7 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.8 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.10 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.9 * 632 group access control sdk changes (#640) * fix: group access control changes * fix: get group access SDK fix * fix: removed unnecessary param * Update README.md * Update README.md * Update README.md * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.30 * Reduce profile creation signature to 2 (#639) * fix: reduced signatures * fix: fixed examples * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.31 * fix: Read me fixes * fix: Space rules * Update README.md * Update README.md * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.32 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.10 * Feat/chat components (#658) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) --------- Co-authored-by: Monalisha Mishra Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.11 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.12 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.11 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.13 * fix: update read me file * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.14 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.15 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.12 * Feat/chat components (#679) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.2 * fix: dummy change * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.13 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.16 * Join group option (#681) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * feat: added verification option to show only on token gated groups * fix: fixing group access control * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build * feat: added send request to join group * fix: fixed verification on send * fix: fixed verify access btn not showing after joining group * fix: fixed join group showing for members too * fix: fixed join group showing to members * 667 chat.send enhancement (#673) * fix: changes messageObj for meta and reaction message type * fix: enhance send fn * fix: fixed intent issues * 680 group rules cosmetic changes (#682) * fix: fixed guild condition * fix: add did validation * fix: fixed * fix: fixed minor issues * fix: fixe dissue * fix: fixed minor issues * fix: check for scroll * fix: fixed scrolling * fix: fixed theme * fix: fixed * fix: fixed * fix: fixed * fix: fixed issues * fix: fixed * feat: added toast in join group btn for pvt groups * fix: fixed blurr --------- Co-authored-by: Monalisha Mishra Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Aman Gupta * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.3 * Join group option (#687) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * feat: added verification option to show only on token gated groups * fix: fixing group access control * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build * feat: added send request to join group * fix: fixed verification on send * fix: fixed verify access btn not showing after joining group * fix: fixed join group showing for members too * fix: fixed join group showing to members * 667 chat.send enhancement (#673) * fix: changes messageObj for meta and reaction message type * fix: enhance send fn * fix: fixed intent issues * 680 group rules cosmetic changes (#682) * fix: fixed guild condition * fix: add did validation * fix: fixed * fix: fixed minor issues * fix: fixe dissue * fix: fixed minor issues * fix: check for scroll * fix: fixed scrolling * fix: fixed theme * fix: fixed * fix: fixed * fix: fixed * fix: fixed issues * fix: fixed * feat: added toast in join group btn for pvt groups * fix: fixed blurr * fix: fixed minor issues rules * fix: fixed * fix: fixed --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Aman Gupta * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.4 * Join group option (#688) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * feat: added verification option to show only on token gated groups * fix: fixing group access control * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build * feat: added send request to join group * fix: fixed verification on send * fix: fixed verify access btn not showing after joining group * fix: fixed join group showing for members too * fix: fixed join group showing to members * 667 chat.send enhancement (#673) * fix: changes messageObj for meta and reaction message type * fix: enhance send fn * fix: fixed intent issues * 680 group rules cosmetic changes (#682) * fix: fixed guild condition * fix: add did validation * fix: fixed * fix: fixed minor issues * fix: fixe dissue * fix: fixed minor issues * fix: check for scroll * fix: fixed scrolling * fix: fixed theme * fix: fixed * fix: fixed * fix: fixed * fix: fixed issues * fix: fixed * feat: added toast in join group btn for pvt groups * fix: fixed blurr * fix: fixed minor issues rules * fix: fixed * fix: fixed * fix: fixed socket issue * fix: fixed --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Aman Gupta * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.5 * fix: fixed (#689) * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.6 * chat Load issue fixed (#690) * fix: fixed * fix: fixed minor issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.7 * fix: fixed msg bubble width (#691) * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.8 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.17 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.18 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.19 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.33 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.33 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.9 * Onboarding blocknative (#702) * fix: added reusable folder * fix: fixed theme for modal * fix: removed reusables from export * fix: fixed fallback for message input * feat: replaced rainbowkit with blocknative * fix: removed unused code --------- Co-authored-by: Monalisha Mishra * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.10 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.33 * Fix connect button issue (#710) * fix: fixed connect button blocknative * fix: fixed message fetching * fix: removed console * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.11 * fix: added condition while showing tokengatedIcon (#715) * fix: added disconnect for wallet (#721) * fix: added disconnect for wallet * fix: added autoConnect * Wallet disconnect (#722) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * Wallet disconnect (#723) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.12 * Changed messageInput params Case (#725) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.13 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.20 * Wallet disconnect (#728) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * fix: added coinbase wallet * fix: img added * fix: fixed metamask not showing if not present in it --------- Co-authored-by: KlausMikhaelson * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.14 * Wallet disconnect (#732) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * fix: added coinbase wallet * fix: img added * fix: fixed metamask not showing if not present in it * fix: fixed injected wallets --------- Co-authored-by: KlausMikhaelson * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.15 * fix: added class based implementation for notification (#699) * fix: added class based implementation for notification * fix: class based implementation for notification * fix: small fixes * fix: minor fixes and testcases * fix: fixes for testcases * fix: updated core abi and minor fixes * fix: removed comment * fix: minor fixes and additional checks * fix: minor fixes * fix: viem support for contract and new folder structure * fix: changed typescript 5.0.2 and configured eslint * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.34 * 720 pushstream class implementation (#729) * chore: added an example of automated chat using the new class based initialization * fix: fixed usecases * chore: added an example of automated chat using the new class based iā€¦ (#712) * chore: added an example of automated chat using the new class based initialization * fix: fixed usecases --------- Co-authored-by: aman035 * chore(automated chat example): tweaked automated chat example * fix: stream changes * fix: stream changes * fix: added chat.decrypt (#726) * fix: added chat.decrypt * fix: fix examples * fix: stream changes * fix: PUSH Stream Changes * fix: chat classes split * fix: Notification socket initialisations and rules backward compatibility * fix: added message decrypt * fix: review comments * fix: socket events * fix: test case fix and UserInfo to user * fix: rip PushNotification class * fix: additional check --------- Co-authored-by: harshrajat Co-authored-by: aman035 Co-authored-by: Harsh | Push Co-authored-by: akp111 * fix: remove only from test * fix: error fixed * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.35 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.35 * fix: stream cases * 720 pushstream class implementation (#737) * fix: stream changes * fix: stream changes * fix: stream changes * fix: PUSH Stream Changes * fix: chat classes split * fix: Notification socket initialisations and rules backward compatibility * fix: added message decrypt * fix: review comments * fix: socket events * fix: test case fix and UserInfo to user * fix: rip PushNotification class * fix: additional check * fix: minor fixes --------- Co-authored-by: Mohammed S * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.21 * fix: corrected example * fix: some changes on stream * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.36 * fix: minor fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.37 * fix: error handling in socket events * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.38 * fix: more fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.39 * fix: minor fixes * fix: socket enabled * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.40 * fix: minor fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.41 * Add counter for update channel (#740) * fix: added counter to update group * fix: added counter logic, moved delegate and alias function to channel class * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.42 * Add counter for update channel (#741) * fix: added counter to update group * fix: added counter logic, moved delegate and alias function to channel class * fix: added readme for notification * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.43 * fix: minor fix * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.14 * fix: log removed * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.44 * docs: fix tests * Feat/space backup (#746) * refactor: added code for joining livekit room for listeners (#731) * feat: drop in livekit inplace of livepeer (#736) * feat: drop in livekit inplace of livepeer * feat: added microphone * feat: added mic * feat: added access control --------- Co-authored-by: Nilesh Gupta * fix: Notification event mutation * Notification setting changes (#752) * Arbitrum changes (#735) * fix: inital implementation for arbitrum changes * fix: more changes * fix: added final changes * fix: minor fixes * fix: fixed typo * fix: notification settings related changes * fix: added index parameter for notification * fix: restored config * Arnab/livekit fixes (#754) * refactor: added code for joining livekit room for listeners (#731) * feat: drop in livekit inplace of livepeer * feat: added microphone * feat: added mic * feat: added access control * feat: fixes for livekit API call --------- Co-authored-by: Nilesh Gupta * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.22 * fix: added settings * fix: added settings (#762) * fix: build fix * fix: minor fix * fix: minor fix * Added initial chat sidebar * fix: pagination done * fix: added fuse network * Working stream with hacks, working badges, working loading, partial loading, not working accept stream * fix: focus back to message input after sending the message (#1014) * fix: added support for ens (#1008) * feat: add video SDK v2 and video stream (#1017) * add: ethers support (#952) * fix: fix viem support, add ethers support * fix: remove @pushprotocol/socket dependency from restapi * fix: changed ethers fn * fix: fix ether changes * fix: fix subscribev2 * chore: readme changes * fix: fix ethers provider issue * fix: fix channel.update * feat(video-v2): add video v2 class and stream (#930) * feat(video-v2): add highlevel video class * feat(video): add video stream * fix(sendnotification): modify rules.access.data to be an object & code cleanup * fix(video): remove signer from input, throw err if signer, decrypted pgp key not found * feat(video): add sendNotification calls in connect, disconnect methods * fix(videonotificationrules): typo in VideoNotificationRules interface * feat(video stream): handle connect, retry internally from the SDK * feat(video connect): remove the connect method from the videov2 SDK * fix(videov2): create push signer instance to get chain id in initialize() * fix(video stream): add backwards compatibilty to rules object for older SDK versions * fix(video stream): fix bug in rules object creation * feat(video): update param names for video.initialize() * feat(video): add internal event handlers for stream in video SDK --------- Co-authored-by: Mohammed S --------- Co-authored-by: Aman Gupta Co-authored-by: Mohammed S * fix: Added ethersV6SignerType in uiweb signer types (#1018) * fix: added pushUser and stream (#1023) * fix: case sensative file inclusion (#1024) * fix: added themisation and ens resolve * fix: fixed a bug * 963 improvement proposal support for fuse network (#1026) * fix: case sensative file inclusion * fix: changed icon dimesnion * streaming tweaks * streaming tweaks with connected in restapi * fix(video stream): add video event type enum in CONSTANTS (#1032) * fix: added search for chatPreviewList * fix: added error codes * frontend react demo adjustment and rebasing * duplicate import fix * fix: refatored code * fix: changed chatSender to chatParticipant * adding onChatSelected and onUnreadCountChange * fix: name change fix --------- Co-authored-by: aman035 Co-authored-by: Mohammed S Co-authored-by: Mohammed S Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta Co-authored-by: Monalisha Mishra Co-authored-by: Kolade Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Ashis Kumar Pradhan <38760485+akp111@users.noreply.github.com> Co-authored-by: akp111 Co-authored-by: Pritipriya Singh * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * fix: fixed issues on chatpreviewlist (#1044) * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * fix: added a dynamic component for no chatId (#1042) * fix: changed pushUser to user (#1058) * Chatpreview bug (#1063) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * fix: fixed pagination bug and added functions for preload * fix: added review comments --------- Co-authored-by: Mohammed S * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * fix: fixed minor limit bug (#1065) * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * Bug fix (#1068) * fix: fixed minor limit bug * fix: exposed chatParticipant * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.4 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.5 * Chatprofile (#1040) * Added initial chat sidebar * fix: pagination done * Working stream with hacks, working badges, working loading, partial loading, not working accept stream * fix: added themisation and ens resolve * fix: fixed a bug * streaming tweaks * streaming tweaks with connected in restapi * fix: added search for chatPreviewList * fix: added error codes * frontend react demo adjustment and rebasing * duplicate import fix * fix: refatored code * fix: addec chat profile and create group changes * fix: changed chatSender to chatParticipant * fix: fixed scroll when not needed * fix: changed group size * fix: stream not getting connected * fix: tested socket events * fix: fixed bugs --------- Co-authored-by: harshrajat Co-authored-by: Pritipriya Singh Co-authored-by: KlausMikhaelson * fix: fixed preview bugs (#1078) * Userprofile (#1084) * feat(video-v2): add highlevel video class * feat(video): add video stream * fix(sendnotification): modify rules.access.data to be an object & code cleanup * fix(video): remove signer from input, throw err if signer, decrypted pgp key not found * feat(video): add sendNotification calls in connect, disconnect methods * fix(videonotificationrules): typo in VideoNotificationRules interface * add: useStream.ts video-v2-example-app * add: videoV2.tsx in video-v2-example-app * feat(video stream): handle connect, retry internally from the SDK * feat(video connect): remove the connect method from the videov2 SDK * fix(videov2): create push signer instance to get chain id in initialize() * fix(videov2-example): refactor react example component & remove useStream hook * fix(video stream): add backwards compatibilty to rules object for older SDK versions * fix(video stream): fix bug in rules object creation * fix(video stream): call connect() for ApproveVideo event * feat(example-video-1.5): video v2 example app implementation * feat(sdk-frontend): few ui changes * fix(video-v2-example-app): initialisevdeo call after a call ends * feat(video stream): add request, deny evennt handlers * feat(sdk-frontend and sdk-frontend-react): added video-v2 example implementation * fix: few fixes * refactor: refator and remove console logs * fix: fix import error * feat(video): update param names for video.initialize() * fix: param name changes * chore: added few comments * chore: ui toast added * fix(video example): remove pushprotocol sdk direct dir reference for initVideoCallData * fix(video example): import React in examples & update SDK version in sdk-frontend * feat(video example): replace video events from CONSTANTS obj * Edited video example to make it more versatile * Update index.js * fix: added layout for userProfile * fix: added modal * fix: added modal * fix: added modal content * fix: added theme for userprofile * fix: fixed bugs in profile --------- Co-authored-by: Madhur Gupta Co-authored-by: Siddesh Sankhya <79219618+Siddesh7@users.noreply.github.com> Co-authored-by: Siddesh Co-authored-by: harshrajat Co-authored-by: Harsh | Push * fix: removed console * fix: fixed length issue in test * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * fix: fixed pagination bug * fix: the messages disappearing on scroll (#1077) Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: fixed chat preview stream issues (#1085) * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.5 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.6 * 897 improvement proposal spaces high level functions (#898) * fix: spaces high level * fix: spaces high level function * fix: spaces test cases * fix: spaces stream changes * fix: removed unnecessary logs * Add spaces high level audio methods (#993) * feat(spaces): add high level audio methods * fix: socket url fix (#995) * feat(spaces-highlevel-audio-methods): add media function in Spaces class --------- Co-authored-by: Mohammed S * feat(space stream): add 'start', 'stop' events (#1027) * fix(high level spaces sdk): fix list() method to uses spaces(), requests() methods (#1061) --------- Co-authored-by: Madhur Gupta * fix(restapi): build errors from spaces (#1098) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * feat(spaces v2): update space.initialize() param name, rename media() in SpacesV2 (#1101) * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.7 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * fix: media emoji added * fix: sending first message now shows in the inbox * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.8 * fix: for requests for receivers * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: added notification widget layout (#1076) * feat(video-v2): add highlevel video class * feat(video): add video stream * fix(sendnotification): modify rules.access.data to be an object & code cleanup * fix(video): remove signer from input, throw err if signer, decrypted pgp key not found * feat(video): add sendNotification calls in connect, disconnect methods * fix(videonotificationrules): typo in VideoNotificationRules interface * add: useStream.ts video-v2-example-app * add: videoV2.tsx in video-v2-example-app * feat(video stream): handle connect, retry internally from the SDK * feat(video connect): remove the connect method from the videov2 SDK * fix(videov2): create push signer instance to get chain id in initialize() * fix(videov2-example): refactor react example component & remove useStream hook * fix(video stream): add backwards compatibilty to rules object for older SDK versions * fix(video stream): fix bug in rules object creation * fix(video stream): call connect() for ApproveVideo event * feat(example-video-1.5): video v2 example app implementation * feat(sdk-frontend): few ui changes * fix(video-v2-example-app): initialisevdeo call after a call ends * feat(video stream): add request, deny evennt handlers * feat(sdk-frontend and sdk-frontend-react): added video-v2 example implementation * fix: few fixes * refactor: refator and remove console logs * fix: fix import error * feat(video): update param names for video.initialize() * fix: param name changes * chore: added few comments * chore: ui toast added * fix(video example): remove pushprotocol sdk direct dir reference for initVideoCallData * fix(video example): import React in examples & update SDK version in sdk-frontend * feat(video example): replace video events from CONSTANTS obj * Edited video example to make it more versatile * Update index.js * fix: fixed message parsing (#1051) * Minor fixes and improvements in video v2 (#1062) * feat(video v2): add VIDEO constants and types * feat(video v2): modify approve, deny to use internally stored peerInfo * fix(video constants): rename DEFAULT_DATA to INITIAL_DATA * 1050 update video example implementation in sdk-frontend (#1070) * fix: use latest imports in example app * feat: use latest rainbowkit library * chore: use latest restapi package * chore: remove unnecessary libs * fix: fixed signer bug (#1073) * fix: send intent in history and latest. (#1069) * fix: send intent in history and latest. * fix: get chat info API sdk changes * fix: stream helper functions * fix: caching implementation on user profile API (#1053) * fix: caching implementation on user profile API * fix: cache code review comments * fix: fix public key in read mode (#1074) * fix: added notification widget layout * fix: fixed naming convention * fix: added layout for hyperlink * Pub key cache to speed up chat messages verification (#1081) * fix: minor fixes * fix: cache implementation for public keys * fix: fix encV1 key decryption (#1088) * fix: add benchamark tests, fix reference msgs' (#1089) * fix: added resuables * bolierplate examples * bolierplate examples * bolierplate examples * fix: added connect button * fix: fixed lint * fix: v2 user creation / upgrades / downgrades (#1099) * fix: fix v2 user * test: remove only * Add filter for subscription (#1102) * fix: added parsing for settings * fix: minor fixes * fix: added manage notifiction * fix: added channel setting parse logic (#1107) * fix: fixed css * added user downgrade example * fix: fixed lint * fix: fixed connect modal * fix: added readmode * fix: fixed readMode --------- Co-authored-by: Madhur Gupta Co-authored-by: Siddesh Sankhya <79219618+Siddesh7@users.noreply.github.com> Co-authored-by: Siddesh Co-authored-by: harshrajat Co-authored-by: Harsh | Push Co-authored-by: Aman Gupta Co-authored-by: Mohammed S Co-authored-by: Ashis Kumar Pradhan <38760485+akp111@users.noreply.github.com> Co-authored-by: Mohammed S * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * Alpha deployment (#1112) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues --------- Co-authored-by: Mohammed S * fix: fixed minor bugs * Alpha deployment (#1114) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs --------- Co-authored-by: Mohammed S * fix: fixed chatpreview and widget issues * Alpha deployment (#1116) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues --------- Co-authored-by: Mohammed S * fix: fixed chat bugs * 1119 read only mode bug fix (#1120) * fix: optimize chat.list (#1115) * fix: read only guest mode * fix: review comments --------- Co-authored-by: Aman Gupta * fix: fixed readmode * Alpha deployment (#1121) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: fixed readmode --------- Co-authored-by: Mohammed S * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.70 * Mark ethers optional (#1124) * fix: optimize chat.list (#1115) * fix: allow groupImage and groupDesc to be updated to null (#1118) * fix: mark ethers as optional peer dependency * fix: change typeDataDomain * fix: update readme * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.71 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.9 * fix: added prefillChatList (#1122) * fix: troubleshoot * fix: fixed minor issue * Alpha deployment (#1132) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: fixed readmode * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.70 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.71 --------- Co-authored-by: Mohammed S * fix: fixed gues mode user profile * fix: fixed subscription error * Minor changes in spaces v2 SDK (#1136) * refactor(spaces v2): call createUserAudio internally before start, join as speaker * fix(spaces v2): add a check before creating stream in start, join as speaker * fix(spaces v2): make 'private' param in space.create() as optional * feat(spaces v2): export space types, constants from TYPES, CONSTANTS * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.72 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.10 * Alpha deployment (#1134) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: fixed readmode * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.70 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.71 * fix: troubleshoot * fix: fixed gues mode user profile * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.72 --------- Co-authored-by: Mohammed S * fix: stream connection support chat + pushUser to user fix (#1066) * fix: stream connection support chat + pushUser to user fix * fix: change console messages * fix: ens added * fix: z-index re added --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * Alpha deployment (#1146) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: fixed readmode * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.70 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.71 * fix: troubleshoot * fix: fixed gues mode user profile * fix: fixed subscription error * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.72 --------- Co-authored-by: Mohammed S * fix: z-index modal (#1152) * Revert "fix: z-index modal (#1152)" (#1153) This reverts commit 4e40221385750a240afde708c73d7b1221e5db0c. * Fix role change stream event (#1157) * fix: fix roleChange stream * fix: fix testcases * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.45 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.73 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.74 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.11 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.6 * Added channel.list API (#1160) * Added channel.list API * Added channel.list API * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.0 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.7 * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.1 * fix: some types are fixed * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.2 * fix: horizontal scroll (#1156) * fix: horizontal scroll * fix: z-index of prodile modal * fix: remove chat profile z-index * fix: remove chat profile z-index * fix: modal overlay z-index inc * fix: added word break to parent * fix: revert z-index profile * fix: fixed span * Alpha deployment (#1178) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: fixed readmode * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.70 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.71 * fix: troubleshoot * fix: fixed gues mode user profile * fix: fixed subscription error * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.72 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.45 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.73 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.74 * fix: fixed span --------- Co-authored-by: Mohammed S * fix: support chat scroll (#1184) * fix: support chat scroll * fix: when the scroll touches the last message it does fluctuate * Group fixes (#1182) * fix: fixed group minor issues * fix: fixed group fiex * fix: fixed user giving undefined for info (#1194) * Chatviewlist migration (#1164) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: added fetch chT * fix: fix * fix: added fetching chat * fix: fixed lint issues * fix: fixed * fix: converted send to class based * fix: fixed * fix: debugging stream issue * fix: debugging stream issue * fix: hack for stream fix * fix: removed event listeners * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.15 * fix: fixed chat bugs * fix: fixing stream issue * fix: fixed lint * fix: temp fix for stream * fix: fixed --------- Co-authored-by: Mohammed S * Alpha deployment (#1200) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: fixed readmode * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.68 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.70 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.71 * fix: troubleshoot * fix: fixed gues mode user profile * fix: fixed subscription error * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.72 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.45 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.73 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.74 * fix: fixed span --------- Co-authored-by: Mohammed S * Revert "Alpha deployment (#1200)" (#1201) This reverts commit 029e34d3a51a0ce4e0bc6adbad168e71b5c6129b. * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.75 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.75 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.77 * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.3 * Chatviewlist migration (#1202) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * fix: fix errors * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.64 * fix: changed stream type to any * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.16 * fix: minor change * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.17 * fix: minor fix * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.37 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.38 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.39 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.40 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.41 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.65 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.42 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.66 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.43 * fix: fixed build issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.36 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.44 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.67 * fix: fixed minor bugs * fix: fixed chatpreview and widget issues * fix: fixed chat bugs * fix: added fetch chT * fix: fix * fix: added fetching chat * fix: fixed lint issues * fix: fixed * fix: converted send to class based * fix: fixed * fix: debugging stream issue * fix: debugging stream issue * fix: hack for stream fix * fix: removed event listeners * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.15 * fix: fixed chat bugs * fix: fixing stream issue * fix: fixed lint * fix: temp fix for stream * fix: fixed * fix: fixed copy --------- Co-authored-by: Mohammed S * feat(uiweb): return response in createGroupModal (#1198) * feat(uiweb): return response in createGroupModal return group information when group is successfully created in uiweb createGroupModal * fix: fixed build issue --------- Co-authored-by: Monalisha Mishra Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * feat(uiweb): return response in createGroupModal (#1198) (#1215) * feat(uiweb): return response in createGroupModal return group information when group is successfully created in uiweb createGroupModal * fix: fixed build issue --------- Co-authored-by: Siddesh Sankhya <79219618+Siddesh7@users.noreply.github.com> * Add Polygon Amoy Support (#1221) * feat: add Polygon Amoy Support * test: added amoy test cases --------- Co-authored-by: Pratham Bhatnagar Co-authored-by: aman035 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.78 * 1220 add polygon amoy support (#1222) * feat: add Polygon Amoy Support * test: added amoy test cases * fix: fix minor changes --------- Co-authored-by: Pratham Bhatnagar Co-authored-by: aman035 * Tweaked UIWeb Chat * fix: added instanceids for push user and stream (#1224) * 1223 return id for push api and stream init (#1226) * fix: added instanceids for push user and stream * fix: review comments * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.79 * fixed conversation private or not * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.80 * fix: chat info changes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.81 * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.4 * Fixing chat components * fix: bug fixes * fix: renamed sender to account * fix: fix fn definitions (#1232) * fix: fix tmp error * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.82 * fix: update chat * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.83 * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.5 * fix: push api account public * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.6 * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.7 * fix: add public params * ci(restapi): šŸŽ‰ cut release to restapi-v1.7.8 * commit to pull changes from alpha * added .gitignore for .yarn * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.84 * fixed ChatProfile and PushUser * fix: error meta fix * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.85 * Rebased few icons to PushIcons.tsx, optimized resolveWeb3Name, added ChatProfile web3 name with divider * Added prettier in UIWeb and format rules, rebased icon and changed tooltip to flex * vscode settings and rebasing helpers * feat: Add Polygon zkEvm Cardona support (#1243) * Alpha (#1237) * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.1 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.0 * add: ethers support (#952) * fix: fix viem support, add ethers support * fix: remove @pushprotocol/socket dependency from restapi * fix: changed ethers fn * fix: fix ether changes * fix: fix subscribev2 * chore: readme changes * fix: fix ethers provider issue * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.61 * fix: fix channel.update * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.62 * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.2 * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.3 * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.4 * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.5 * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.6 * ci(restapi): šŸŽ‰ cut release to restapi-v1.5.7 * feat(video-v2): add video v2 class and stream (#930) * feat(video-v2): add highlevel video class * feat(video): add video stream * fix(sendnotification): modify rules.access.data to be an object & code cleanup * fix(video): remove signer from input, throw err if signer, decrypted pgp key not found * feat(video): add sendNotification calls in connect, disconnect methods * fix(videonotificationrules): typo in VideoNotificationRules interface * feat(video stream): handle connect, retry internally from the SDK * feat(video connect): remove the connect method from the videov2 SDK * fix(videov2): create push signer instance to get chain id in initialize() * fix(video stream): add backwards compatibilty to rules object for older SDK versions * fix(video stream): fix bug in rules object creation * feat(video): update param names for video.initialize() * feat(video): add internal event handlers for stream in video SDK --------- Co-authored-by: Mohammed S * ci(restapi): šŸŽ‰ cut release to restapi-v0.9.0 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.63 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.1 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.0 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.2 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.1 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.3 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.2.4 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.2 * ci(restapi): šŸŽ‰ cut release to restapi-v1.6.3 * Chat Preview List workable PoC (#987) * fix: revert space changes * fix: merge main * fix: signer compatibility with viem and ethers (#567) * fix: signer compatibility with viem and ethers * fix: revert space changes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.26 * Update README.md * Update README.md * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.3 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.27 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.4 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.5 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.6 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.7 * fix: add: scw sig verification (#593) * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.28 * fix: url correction * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.29 * ci(socket): šŸŽ‰ cut release to socket-v0.5.2 * fix: fixed subscribe and unsubscribe * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.5 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.8 * Feat/chat components (#621) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson * fix: add alpha support to UI web * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.0 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.6 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.9 * Feat/chat components (#625) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.1 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.7 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.8 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.10 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.9 * 632 group access control sdk changes (#640) * fix: group access control changes * fix: get group access SDK fix * fix: removed unnecessary param * Update README.md * Update README.md * Update README.md * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.30 * Reduce profile creation signature to 2 (#639) * fix: reduced signatures * fix: fixed examples * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.31 * fix: Read me fixes * fix: Space rules * Update README.md * Update README.md * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.32 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.10 * Feat/chat components (#658) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) --------- Co-authored-by: Monalisha Mishra Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.11 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.12 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.11 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.13 * fix: update read me file * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.14 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.15 * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.12 * Feat/chat components (#679) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.2 * fix: dummy change * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.13 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.16 * Join group option (#681) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * feat: added verification option to show only on token gated groups * fix: fixing group access control * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build * feat: added send request to join group * fix: fixed verification on send * fix: fixed verify access btn not showing after joining group * fix: fixed join group showing for members too * fix: fixed join group showing to members * 667 chat.send enhancement (#673) * fix: changes messageObj for meta and reaction message type * fix: enhance send fn * fix: fixed intent issues * 680 group rules cosmetic changes (#682) * fix: fixed guild condition * fix: add did validation * fix: fixed * fix: fixed minor issues * fix: fixe dissue * fix: fixed minor issues * fix: check for scroll * fix: fixed scrolling * fix: fixed theme * fix: fixed * fix: fixed * fix: fixed * fix: fixed issues * fix: fixed * feat: added toast in join group btn for pvt groups * fix: fixed blurr --------- Co-authored-by: Monalisha Mishra Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Aman Gupta * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.3 * Join group option (#687) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * feat: added verification option to show only on token gated groups * fix: fixing group access control * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build * feat: added send request to join group * fix: fixed verification on send * fix: fixed verify access btn not showing after joining group * fix: fixed join group showing for members too * fix: fixed join group showing to members * 667 chat.send enhancement (#673) * fix: changes messageObj for meta and reaction message type * fix: enhance send fn * fix: fixed intent issues * 680 group rules cosmetic changes (#682) * fix: fixed guild condition * fix: add did validation * fix: fixed * fix: fixed minor issues * fix: fixe dissue * fix: fixed minor issues * fix: check for scroll * fix: fixed scrolling * fix: fixed theme * fix: fixed * fix: fixed * fix: fixed * fix: fixed issues * fix: fixed * feat: added toast in join group btn for pvt groups * fix: fixed blurr * fix: fixed minor issues rules * fix: fixed * fix: fixed --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Aman Gupta * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.4 * Join group option (#688) * feat: created architechture * fix: added context values (#594) * Chat dataprovider (#596) * feat: data provider for chat component * fix: replaced react.usestate to usestate * fix: added props as the initial state and changed state name * fix: reverted chat context changes and renamed values * fix: added test page for chat ui components (#597) * added chatbubble component (#602) * feat: added chatbubble component * fix: made the messageBubble's width to fit-content --------- Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> * fix: added theme * Group chat bubble (#604) * feat: moved test component to testui folder & replaced dummy data with sdk response * feat: added twitter card and address for group chat received msg * feat: made the messageaddress reusable, added account from context * fix: removed unnecessary div and unused props and console logs * feat: adding pfp in text bubbles * fix: replaced hook with function and added pfp to messagebubble * fix: fixed image alignment * fix: changed border-radius of msg bubble and changed function name * fix: fixed theme and decryptedPrivateKey name (#616) * fix: fixed theme and decryptedPrivateKey name * fix: fixed bug * fix: fixed theme reviews * Message list (#615) * fix: message list comp * fix: message list comp * fix: added pagination * fix: added pagination * fix: pagination * fix: create useChatData hook * fix: fixed minor bug * fix: socket issues fixed * fix: added theme in msgbubble (#620) * fix: added theme in msgbubble * fix: fixed import --------- Co-authored-by: Monalisha Mishra * fix: exported the theme (#623) * fix: exported the theme * fix: fixed issues --------- Co-authored-by: Monalisha Mishra * Typebar component (#631) * feat: added typebar UI * feat: added functions to typebar * fix: added icon * fix: fixed theme issues --------- Co-authored-by: Monalisha Mishra * feat: added connectbutton * fix: fixed connectbtn ui and remove disconnect and fixed error on disconnect * fix: fixed create account getting called twice * Profile Header Component (#636) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * Message container (#635) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * fix: updated svg to react component * fix: changed svg to tsx component * fix: fixed review changes (#646) * fix: fixed review changes * fix: resolved issues --------- Co-authored-by: Nilesh Gupta * Profile Header -> Chat Profile fixes (#647) * feat: profile header * feat: update profile header * fix: update hooks * fix: video icon ui * feat: add group modal * fix: add modal info * fix: edit components * fix: commit modal theme * fix: updating UI * fix: ensname * fix: add notifs * fix: remove alerts * fix: remove alert logs * fix: push fixes * fix: conflicts * fix: notifs * fix: correct theme colors * fix: renaming profileHeader * fix: qa fixes * fix: loader * refactor: resolved issues * fix: edit types --------- Co-authored-by: Nilesh Gupta * fix: resolved package not added issue * Fix: modal issue in group info && alert remove members (#653) * fix: modal * fix: update changes * refactor: resolved issue --------- Co-authored-by: Nilesh Gupta * fix: QA fixes (#654) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * Connect btn revamp (#668) * fix: added theme in msgbubble * fix: fixed import * fix: fixed message-list * fix: added approve intent * fix: added fixes * fix: fixed socket bug * fix: fixed message from socket * fix: fixed minor issues * fix: fixed typebar theming * fix: fixed env issue * fix: fixed message not updating issue * refactor: added isConnected prop in msgContainer * refactor: resolve merge conflicts * fix: fixed request sending * fix: fixed decryption * fix: fixed env issue * feat: added profile header in message container * feat: adding rainbowkit for btn * fix: fix issues * fix: addec onnect functionality * fix: connect button * fix: added hack for rainbowkit css --------- Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta * Typebar UI issue (#666) * fix: fixed typebar space not working and theme * fix: fixed gif and emoji --------- Co-authored-by: KlausMikhaelson * fix: fixed theme colours * fix: added theme for brb * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added filter hat * fix: merged with main * fix: fixed msg border * fix: fixed theme * fix: fixed fonts * fix: fixed bug * Access control (#672) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * fix: added minor fix --------- Co-authored-by: Monalisha Mishra * fix: fixed padding issues * fix(f): fixed build issues * fix: fix for chat status test * feat: added verification option to show only on token gated groups * fix: fixing group access control * Check rules access control (#678) * fix: fixed typebar space not working and theme * feat: created access control UI * feat: created verify access control hook * fix: fixed access control hook issue * feat: added access control verification * feat: added onclick props for integration team to pass function and fixed btn ui * fix: added link for learn more * fix: fixed msg not updating in socket issue * 662 group access control v2 changes (#663) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix: origin in user creation (#665) * fix: origin in user creation * Update README.md * fix: review comments * 662 group access control v2 changes (#677) * fix: spaces access API * fix: custom endpoint doc impl * Update README.md * Update README.md * fix: review comments change * fix: read me update * Update README.md * Update README.md * fix(spaces): broadcast changes and UX fixes (#674) * fix: fix UI grid view (#642) * fix: fix UI grid view * refactor: conditional added * fix: resolved muting/unmuting try catch error (#657) * fix(spaces): fix livepeer broadcast (#656) * fix(spaces): fix livepeer broadcast * fix(spaces): fix data shown for unjoined space & promote listener logic --------- Co-authored-by: Madhur Gupta * refactor(spaces): use local state instead of get from server while meta message fire (#676) --------- Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * feat: added verification option to show only on token gated groups * fix: fixing group access control --------- Co-authored-by: Monalisha Mishra Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Nilesh Gupta * fix: fixed build * feat: added send request to join group * fix: fixed verification on send * fix: fixed verify access btn not showing after joining group * fix: fixed join group showing for members too * fix: fixed join group showing to members * 667 chat.send enhancement (#673) * fix: changes messageObj for meta and reaction message type * fix: enhance send fn * fix: fixed intent issues * 680 group rules cosmetic changes (#682) * fix: fixed guild condition * fix: add did validation * fix: fixed * fix: fixed minor issues * fix: fixe dissue * fix: fixed minor issues * fix: check for scroll * fix: fixed scrolling * fix: fixed theme * fix: fixed * fix: fixed * fix: fixed * fix: fixed issues * fix: fixed * feat: added toast in join group btn for pvt groups * fix: fixed blurr * fix: fixed minor issues rules * fix: fixed * fix: fixed * fix: fixed socket issue * fix: fixed --------- Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Kolade Co-authored-by: Nilesh Gupta Co-authored-by: Mohammed S Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Aman Gupta * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.5 * fix: fixed (#689) * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.6 * chat Load issue fixed (#690) * fix: fixed * fix: fixed minor issues * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.7 * fix: fixed msg bubble width (#691) * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.8 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.17 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.18 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.19 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.33 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.33 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.9 * Onboarding blocknative (#702) * fix: added reusable folder * fix: fixed theme for modal * fix: removed reusables from export * fix: fixed fallback for message input * feat: replaced rainbowkit with blocknative * fix: removed unused code --------- Co-authored-by: Monalisha Mishra * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.10 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.33 * Fix connect button issue (#710) * fix: fixed connect button blocknative * fix: fixed message fetching * fix: removed console * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.11 * fix: added condition while showing tokengatedIcon (#715) * fix: added disconnect for wallet (#721) * fix: added disconnect for wallet * fix: added autoConnect * Wallet disconnect (#722) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * Wallet disconnect (#723) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.12 * Changed messageInput params Case (#725) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.13 * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.20 * Wallet disconnect (#728) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * fix: added coinbase wallet * fix: img added * fix: fixed metamask not showing if not present in it --------- Co-authored-by: KlausMikhaelson * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.14 * Wallet disconnect (#732) * fix: added disconnect for wallet * fix: added autoConnect * fix: changed onClick to onGetTokenClick * fix: fixed errors * fix: added coinbase wallet * fix: img added * fix: fixed metamask not showing if not present in it * fix: fixed injected wallets --------- Co-authored-by: KlausMikhaelson * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.15 * fix: added class based implementation for notification (#699) * fix: added class based implementation for notification * fix: class based implementation for notification * fix: small fixes * fix: minor fixes and testcases * fix: fixes for testcases * fix: updated core abi and minor fixes * fix: removed comment * fix: minor fixes and additional checks * fix: minor fixes * fix: viem support for contract and new folder structure * fix: changed typescript 5.0.2 and configured eslint * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.34 * 720 pushstream class implementation (#729) * chore: added an example of automated chat using the new class based initialization * fix: fixed usecases * chore: added an example of automated chat using the new class based iā€¦ (#712) * chore: added an example of automated chat using the new class based initialization * fix: fixed usecases --------- Co-authored-by: aman035 * chore(automated chat example): tweaked automated chat example * fix: stream changes * fix: stream changes * fix: added chat.decrypt (#726) * fix: added chat.decrypt * fix: fix examples * fix: stream changes * fix: PUSH Stream Changes * fix: chat classes split * fix: Notification socket initialisations and rules backward compatibility * fix: added message decrypt * fix: review comments * fix: socket events * fix: test case fix and UserInfo to user * fix: rip PushNotification class * fix: additional check --------- Co-authored-by: harshrajat Co-authored-by: aman035 Co-authored-by: Harsh | Push Co-authored-by: akp111 * fix: remove only from test * fix: error fixed * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.35 * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.35 * fix: stream cases * 720 pushstream class implementation (#737) * fix: stream changes * fix: stream changes * fix: stream changes * fix: PUSH Stream Changes * fix: chat classes split * fix: Notification socket initialisations and rules backward compatibility * fix: added message decrypt * fix: review comments * fix: socket events * fix: test case fix and UserInfo to user * fix: rip PushNotification class * fix: additional check * fix: minor fixes --------- Co-authored-by: Mohammed S * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.21 * fix: corrected example * fix: some changes on stream * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.36 * fix: minor fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.37 * fix: error handling in socket events * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.38 * fix: more fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.39 * fix: minor fixes * fix: socket enabled * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.40 * fix: minor fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.41 * Add counter for update channel (#740) * fix: added counter to update group * fix: added counter logic, moved delegate and alias function to channel class * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.42 * Add counter for update channel (#741) * fix: added counter to update group * fix: added counter logic, moved delegate and alias function to channel class * fix: added readme for notification * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.43 * fix: minor fix * ci(uiweb): šŸŽ‰ cut release to uiweb-v1.1.14 * fix: log removed * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.44 * docs: fix tests * Feat/space backup (#746) * refactor: added code for joining livekit room for listeners (#731) * feat: drop in livekit inplace of livepeer (#736) * feat: drop in livekit inplace of livepeer * feat: added microphone * feat: added mic * feat: added access control --------- Co-authored-by: Nilesh Gupta * fix: Notification event mutation * Notification setting changes (#752) * Arbitrum changes (#735) * fix: inital implementation for arbitrum changes * fix: more changes * fix: added final changes * fix: minor fixes * fix: fixed typo * fix: notification settings related changes * fix: added index parameter for notification * fix: restored config * Arnab/livekit fixes (#754) * refactor: added code for joining livekit room for listeners (#731) * feat: drop in livekit inplace of livepeer * feat: added microphone * feat: added mic * feat: added access control * feat: fixes for livekit API call --------- Co-authored-by: Nilesh Gupta * ci(restapi): šŸŽ‰ cut release to restapi-v1.4.22 * fix: added settings * fix: added settings (#762) * fix: build fix * fix: minor fix * fix: minor fix * Added initial chat sidebar * fix: pagination done * fix: added fuse network * Working stream with hacks, working badges, working loading, partial loading, not working accept stream * fix: focus back to message input after sending the message (#1014) * fix: added support for ens (#1008) * feat: add video SDK v2 and video stream (#1017) * add: ethers support (#952) * fix: fix viem support, add ethers support * fix: remove @pushprotocol/socket dependency from restapi * fix: changed ethers fn * fix: fix ether changes * fix: fix subscribev2 * chore: readme changes * fix: fix ethers provider issue * fix: fix channel.update * feat(video-v2): add video v2 class and stream (#930) * feat(video-v2): add highlevel video class * feat(video): add video stream * fix(sendnotification): modify rules.access.data to be an object & code cleanup * fix(video): remove signer from input, throw err if signer, decrypted pgp key not found * feat(video): add sendNotification calls in connect, disconnect methods * fix(videonotificationrules): typo in VideoNotificationRules interface * feat(video stream): handle connect, retry internally from the SDK * feat(video connect): remove the connect method from the videov2 SDK * fix(videov2): create push signer instance to get chain id in initialize() * fix(video stream): add backwards compatibilty to rules object for older SDK versions * fix(video stream): fix bug in rules object creation * feat(video): update param names for video.initialize() * feat(video): add internal event handlers for stream in video SDK --------- Co-authored-by: Mohammed S --------- Co-authored-by: Aman Gupta Co-authored-by: Mohammed S * fix: Added ethersV6SignerType in uiweb signer types (#1018) * fix: aā€¦ * test: fix test case * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.86 * ci(uiweb): šŸŽ‰ cut beta release to uiweb-v0.0.1-alpha.46 * fixed localstorage and displaying chat profile * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.87 * Changing stream operations * feat: support chat v2 added (#1236) * feat: support chat v2 added * fix: changed supportchatv2 to chatwidget * fix: changed support chat to chatwidget * feat: support chat v2 added (#1236) (#1248) * feat: support chat v2 added * fix: changed supportchatv2 to chatwidget * fix: changed support chat to chatwidget * fix: logs * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.88 * partial commit before alpha merge * fix: stream fixes * ci(restapi): šŸŽ‰ cut beta release to restapi-v0.0.1-alpha.89 * Enabled debug mode * fix: chat stream fixes * chat stream fixes * Before toast rebase * Fixed most issues including toast, zIndex * Added comment for clarity on ChatPreviewList * fix: fixed chat qa issues * fix: fixed issue --------- Co-authored-by: aman035 Co-authored-by: Mohammed S Co-authored-by: Mohammed S Co-authored-by: Monalisha Mishra <42746736+mishramonalisha76@users.noreply.github.com> Co-authored-by: Satyam <100528412+KlausMikhaelson@users.noreply.github.com> Co-authored-by: KlausMikhaelson Co-authored-by: Nilesh Gupta Co-authored-by: Monalisha Mishra Co-authored-by: Kolade Co-authored-by: Madhur Gupta Co-authored-by: Arnab Chatterjee <60937304+arn4b@users.noreply.github.com> Co-authored-by: Ashis Kumar Pradhan <38760485+akp111@users.noreply.github.com> Co-authored-by: akp111 Co-authored-by: Pritipriya Singh Co-authored-by: Siddesh Sankhya <79219618+Siddesh7@users.noreply.github.com> Co-authored-by: Siddesh Co-authored-by: Pratham Bhatnagar <84272138+pratham-bhatnagar@users.noreply.github.com> Co-authored-by: Pratham Bhatnagar --- .vscode/settings.json | 3 +- .yarnrc.yml | 1 + package.json | 10 +- packages/examples/boilerplate/index.js | 19 +- packages/examples/boilerplate/package.json | 2 +- .../src/app/ChatSupportTest.tsx | 38 +- .../src/app/ChatUITest/ChatPreviewList.tsx | 151 +- .../src/app/ChatUITest/ChatViewComponent.tsx | 44 +- .../sdk-frontend-react/src/app/app.tsx | 15 +- .../example-chat-group-profile-update.js | 38 + .../example-chat-guest-mode-functions.js | 18 + .../example-chat-profile-update.js | 39 + .../restapi/src/lib/pushstream/PushStream.ts | 693 +- packages/restapi/yarn.lock | 5 + packages/uiweb/.editorconfig | 17 + packages/uiweb/.prettierrc | 11 + packages/uiweb/package.json | 7 +- packages/uiweb/src/declerations.d.ts | 3 + .../chat/ChatPreview/ChatPreview.tsx | 83 +- .../chat/ChatPreviewList/ChatPreviewList.tsx | 478 +- .../chat/ChatProfile/AddWalletContent.tsx | 24 +- .../chat/ChatProfile/ChatProfile.tsx | 392 +- ...InfoModal.tsx => ChatProfileInfoModal.tsx} | 638 +- .../chat/ChatProfile/MemberListContainer.tsx | 19 +- .../chat/ChatProfile/MemberProfileCard.tsx | 26 +- .../chat/ChatProfile/PendingMembers.tsx | 159 +- .../chat/ChatView/ChatViewComponent.tsx | 139 +- .../chat/ChatViewBubble/ChatViewBubble.tsx | 277 +- .../chat/ChatViewList/ActionRequestBubble.tsx | 236 + .../ChatViewList/ApproveRequestBubble.tsx | 121 - .../chat/ChatViewList/ChatViewList.tsx | 541 +- .../chat/ChatViewList/MessageEncryption.tsx | 105 +- .../chat/ConnectButton/ConnectButton.tsx | 57 +- .../chat/CreateGroup/AddCriteria.tsx | 203 +- .../chat/CreateGroup/AddGroupMembers.tsx | 49 +- .../chat/CreateGroup/CreateGroupModal.tsx | 167 +- .../chat/MessageInput/MessageInput.tsx | 471 +- .../UserProfile/UpdateUserProfileModal.tsx | 135 +- .../chat/UserProfile/UserProfile.tsx | 92 +- .../src/lib/components/chat/exportedTypes.ts | 21 +- .../src/lib/components/chat/helpers/helper.ts | 183 +- .../src/lib/components/chat/helpers/index.ts | 7 +- .../lib/components/chat/helpers/twitter.ts | 16 +- .../components/chat/reusables/AddWallets.tsx | 99 +- .../chat/reusables/MemberListContainer.tsx | 54 +- .../lib/components/chat/reusables/Modal.tsx | 84 +- .../components/chat/reusables/NewToast.tsx | 114 +- .../chat/reusables/ProfileContainer.tsx | 207 +- .../src/lib/components/chat/theme/index.ts | 330 +- .../src/lib/components/chat/types/index.ts | 75 +- .../src/lib/components/chatWidget/Modal.tsx | 64 +- .../components/notification/chainDetails.tsx | 18 +- .../src/lib/components/notification/index.tsx | 26 +- .../reusables/ParticleEffectButton/index.tsx | 398 + .../reusables/ParticleEffectButton/styles.css | 23 + .../src/lib/components/reusables/Spinner.tsx | 4 +- .../src/lib/components/reusables/Tooltip.tsx | 2 +- .../components/reusables/sharedStyling.tsx | 305 +- .../components/supportChat/AddressInfo.tsx | 8 +- packages/uiweb/src/lib/context/chatContext.ts | 167 +- .../lib/dataProviders/ChatDataProvider.tsx | 487 +- .../src/lib/dataProviders/WidgetProvider.tsx | 18 +- packages/uiweb/src/lib/helpers/address.ts | 73 +- packages/uiweb/src/lib/helpers/blockies.ts | 129 + packages/uiweb/src/lib/helpers/chat/chat.ts | 118 +- .../src/lib/helpers/chat/localStorage.ts | 69 +- packages/uiweb/src/lib/helpers/chat/search.ts | 54 +- packages/uiweb/src/lib/helpers/debug.ts | 19 + packages/uiweb/src/lib/helpers/index.ts | 6 +- packages/uiweb/src/lib/helpers/udResolver.ts | 2 +- packages/uiweb/src/lib/helpers/utils.ts | 35 + packages/uiweb/src/lib/hooks/chat/index.ts | 7 +- .../lib/hooks/chat/useApproveChatRequest.ts | 21 +- .../src/lib/hooks/chat/useCreateGatedGroup.ts | 11 +- .../uiweb/src/lib/hooks/chat/useFetchChat.ts | 12 +- .../hooks/chat/useFetchMessageUtilities.ts | 148 +- .../lib/hooks/chat/useGroupMemberUtilities.ts | 95 +- ...ket.ts => usePushChatSocket.ts.deprecated} | 0 .../src/lib/hooks/chat/usePushChatStream.ts | 347 +- .../src/lib/hooks/chat/usePushSendMessage.ts | 9 +- .../lib/hooks/chat/useRejectChatRequest.ts | 45 + .../src/lib/hooks/chat/useUpdateGroup.ts | 42 +- .../lib/hooks/chat/useUserInfoUtilities.ts | 29 +- .../lib/hooks/chat/useVerifyAccessControl.ts | 9 +- packages/uiweb/src/lib/hooks/exportedHooks.ts | 2 - .../src/lib/hooks/exportedHooks.ts.deprecated | 0 packages/uiweb/src/lib/hooks/index.ts | 19 +- .../uiweb/src/lib/hooks/useInitializeUser.ts | 31 - packages/uiweb/src/lib/hooks/usePushUser.ts | 73 + ...rofile.ts => useUserProfile.deprecated.ts} | 7 +- packages/uiweb/src/lib/icons/CopySvg2.tsx | 14 - packages/uiweb/src/lib/icons/PushIcons.tsx | 184 + packages/uiweb/src/lib/icons/copyVector.svg | 5 +- .../src/lib/icons/raw/AcceptCircleIcon.svg | 3 + .../src/lib/icons/raw/CancelCircleIcon.svg | 12 + .../PublicChatIcon.svg} | 0 .../lib/icons/{ => raw}/TokenGatedIcon.svg | 0 packages/uiweb/src/lib/index.ts | 4 +- packages/uiweb/tsconfig.lib.json | 12 +- packages/uiweb/yarn.lock | 3040 +++--- yarn.lock | 9700 +++++++++-------- 101 files changed, 12495 insertions(+), 10127 deletions(-) create mode 100644 .yarnrc.yml create mode 100644 packages/examples/several-examples/example-chat-group-profile-update.js create mode 100644 packages/examples/several-examples/example-chat-guest-mode-functions.js create mode 100644 packages/examples/several-examples/example-chat-profile-update.js create mode 100644 packages/uiweb/.editorconfig create mode 100644 packages/uiweb/.prettierrc create mode 100644 packages/uiweb/src/declerations.d.ts rename packages/uiweb/src/lib/components/chat/ChatProfile/{GroupInfoModal.tsx => ChatProfileInfoModal.tsx} (66%) create mode 100644 packages/uiweb/src/lib/components/chat/ChatViewList/ActionRequestBubble.tsx delete mode 100644 packages/uiweb/src/lib/components/chat/ChatViewList/ApproveRequestBubble.tsx create mode 100644 packages/uiweb/src/lib/components/reusables/ParticleEffectButton/index.tsx create mode 100644 packages/uiweb/src/lib/components/reusables/ParticleEffectButton/styles.css create mode 100644 packages/uiweb/src/lib/helpers/blockies.ts create mode 100644 packages/uiweb/src/lib/helpers/debug.ts create mode 100644 packages/uiweb/src/lib/helpers/utils.ts rename packages/uiweb/src/lib/hooks/chat/{usePushChatSocket.ts => usePushChatSocket.ts.deprecated} (100%) create mode 100644 packages/uiweb/src/lib/hooks/chat/useRejectChatRequest.ts delete mode 100644 packages/uiweb/src/lib/hooks/exportedHooks.ts create mode 100644 packages/uiweb/src/lib/hooks/exportedHooks.ts.deprecated delete mode 100644 packages/uiweb/src/lib/hooks/useInitializeUser.ts create mode 100644 packages/uiweb/src/lib/hooks/usePushUser.ts rename packages/uiweb/src/lib/hooks/{useUserProfile.ts => useUserProfile.deprecated.ts} (80%) delete mode 100644 packages/uiweb/src/lib/icons/CopySvg2.tsx create mode 100644 packages/uiweb/src/lib/icons/PushIcons.tsx create mode 100644 packages/uiweb/src/lib/icons/raw/AcceptCircleIcon.svg create mode 100644 packages/uiweb/src/lib/icons/raw/CancelCircleIcon.svg rename packages/uiweb/src/lib/icons/{Public-Chat.svg => raw/PublicChatIcon.svg} (100%) rename packages/uiweb/src/lib/icons/{ => raw}/TokenGatedIcon.svg (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index e1786ec1c..8f5881e8b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "workbench.activityBar.orientation": "vertical" + "workbench.activityBar.orientation": "vertical", + "editor.formatOnSave": true } \ No newline at end of file diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 000000000..3186f3f07 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/package.json b/package.json index 2d6720e6e..91a810c5a 100644 --- a/package.json +++ b/package.json @@ -56,11 +56,6 @@ "viem": "^1.3.0" }, "devDependencies": { - "browserify-zlib": "^0.2.0", - "https-browserify": "^1.0.0", - "node-polyfill-webpack-plugin": "^3.0.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", "@commitlint/cli": "^17.0.0", "@commitlint/config-angular": "^17.0.0", "@jscutlery/semver": "^2.27.1", @@ -101,6 +96,7 @@ "@web3-react/types": "^6.0.7", "babel-jest": "27.5.1", "babel-plugin-styled-components": "^1.10.7", + "browserify-zlib": "^0.2.0", "chai-as-promised": "^7.1.1", "commitizen": "^4.2.5", "cz-conventional-changelog": "^3.3.0", @@ -110,6 +106,7 @@ "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.5.0", + "https-browserify": "^1.0.0", "husky": "^8.0.0", "jest": "27.5.1", "jest-react-native": "18.0.0", @@ -117,6 +114,7 @@ "metro-babel-register": "0.70.2", "metro-react-native-babel-preset": "0.70.2", "metro-resolver": "0.70.2", + "node-polyfill-webpack-plugin": "^3.0.0", "nx": "14.1.7", "patch-package": "^6.4.7", "prettier": "^2.5.1", @@ -124,6 +122,8 @@ "react-native-svg": "12.3.0", "react-native-svg-transformer": "1.0.0", "react-test-renderer": "17.0.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", "ts-jest": "27.1.4", "ts-node": "9.1.1", "typescript": "5.0.2" diff --git a/packages/examples/boilerplate/index.js b/packages/examples/boilerplate/index.js index bc28a594a..4fa9735bd 100644 --- a/packages/examples/boilerplate/index.js +++ b/packages/examples/boilerplate/index.js @@ -1,6 +1,19 @@ import { CONSTANTS, PushAPI } from '@pushprotocol/restapi'; import { ethers } from 'ethers'; -import input from 'input'; -console.log("Hello... what's my purpose?") -console.log("To train all the hackers..") +// Creating a random signer from a wallet, ideally this is the wallet you will connect +const signerAlice = ethers.Wallet.createRandom(); + +// Initialize wallet user, pass 'prod' instead of 'staging' for mainnet apps +const userAlice = await PushAPI.initialize(signerAlice, { env: CONSTANTS.ENV.PROD }); +const userBobAddress = '0x8D4625b4e04d7dE7F158df470a71C5FC4D4d5F4B'; + +const generateRandomWordsWithTimestamp = () => { + return `${Math.random().toString(36).substring(2)} - ${new Date().toISOString()}`; +} + +userAlice.chat.send(userBobAddress, { + content: "Gm gm! It's a me... Alice! - " + generateRandomWordsWithTimestamp(), +}); + +console.log('Message sent from Alice to ', userBobAddress); \ No newline at end of file diff --git a/packages/examples/boilerplate/package.json b/packages/examples/boilerplate/package.json index ad9aae1c9..69caee583 100644 --- a/packages/examples/boilerplate/package.json +++ b/packages/examples/boilerplate/package.json @@ -14,7 +14,7 @@ "author": "", "license": "ISC", "dependencies": { - "@pushprotocol/restapi": "latest", + "@pushprotocol/restapi": "1.7.11", "ethers": "5.7.2", "input": "1.0.1" }, diff --git a/packages/examples/sdk-frontend-react/src/app/ChatSupportTest.tsx b/packages/examples/sdk-frontend-react/src/app/ChatSupportTest.tsx index 336586c14..6f7d9a89c 100644 --- a/packages/examples/sdk-frontend-react/src/app/ChatSupportTest.tsx +++ b/packages/examples/sdk-frontend-react/src/app/ChatSupportTest.tsx @@ -33,23 +33,31 @@ export const ChatSupportTest = () => { return ( //works as Chat as well as Support Chat -

Welcome

-

new chat

-

Welcome

-

new chat

-

Welcome

-

new chat

-

Welcome

- - - } - + key={'460336a9fa83112c95894af5471cd2b1091290a11298d87ec824ed74b7c14974'} + chatId="4ac5ab85c9c3d57adbdf2dba79357e56b2f9ef0256befe750d9f93af78d2ca68" + welcomeComponent={ +
+

Welcome

+

new chat

+

Welcome

+

new chat

+

Welcome

+

new chat

+

Welcome

+
+ } /> // { // define controls @@ -17,52 +17,69 @@ const ChatPreviewListTest = () => { setAddress((e.target as HTMLInputElement).value); }; - - const prefill:Array = [{ chatPreviewPayload: + const prefill: Array = [ + { + chatPreviewPayload: { + chatId: + '460336a9fa83112c95894af5471cd2b1091290a11298d87ec824ed74b7c14974', + chatPic: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAwElEQVR4AcXBsXECQRBE0U9zLgYxTCy4U6U4MDaWMZQAAWCsqygUwEahAE7ulIyrwkD93un747HTrDnoIotuzcGRyKJbc9BFFp0wE2bC7PQ8X3eMhJkwE2bb/XKj+/z5oossujUHRyKLbs1Bd7/c6ISZMBNmp+f5uvOCyOLImoNXCDNhJsy2yKJbc/BOkUUnzISZMNvWHPynNQedMBNmwmyLLLo1B+8UWXTCTJgJs40/Iosjaw6ORBavEGbCTJj9AvyZLEx5gBqzAAAAAElFTkSuQmCC', + chatParticipant: 'eip155:0x99A08ac6254dcf7ccc37CeC662aeba8eFA666666', + chatGroup: false, + chatTimestamp: 1708516854492, + chatMsg: { + messageType: 'Text', + messageContent: + '"Hgkb" - a succinct and eloquent expression that encapsulates the essence of brevity in a world of verbosity. Your choice of letters is like a haiku in the vast expanse of literature, a tiny gem that shines bright amidst the sea of words. "Hgkb" - a phrase that dares to challenge the norms of communication, elevating simplicity to an art form worth celebrating. Bravo, my dear linguist, for bestowing upon us such a profound revelation in just four letters.', + }, + }, + }, + { + chatPreviewPayload: { + chatId: + '4ac5ab85c9c3d57adbdf2dba79357e56b2f9ef0256befe750d9f93af78d2ca68', + chatPic: + 'data:image/png;base64,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', + chatParticipant: 'BRB Chat', + chatGroup: true, + chatTimestamp: 1705100044656, + chatMsg: { + messageType: 'Text', + messageContent: + 'Hi! Stay tuned, while BRB IRL dev tour has wrapped up, We still have BRB Online with challenges from global projects that still needs to be solved: https://push.org/brb', + }, + }, + }, + { + chatPreviewPayload: { + chatId: + '257221c02396ea210ab82c80d6e1d34abc36ea76dbeb3cb19d5e2e8313ff676f', + chatPic: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA00lEQVR4AcXBIW4DUQxF0Vvrr+ezbMEsoGBY5J2VmAaWeQtRiTfU0qeAkQZUPufj8fP5i8jt/KfoQhnDjGHGsJXbUdGFyu2o5y04c7wSFV2o3I4yhhnDjGGLi76/Hpw5cK4whhnDjGErulC5HRVdqNzOmehC5XZUdKGMYcYwY9jiTXShcjsqujiT21HRxRljmDHMGLZyO1fkdq7I7ZwxhhnDjGGLN89boI5XoqKLM7kd9bwF6nglyhhmDDOGrehC3QlUdHFFdKHuBCq6UMYwY5gx7A+zLjo4V72nLgAAAABJRU5ErkJggg==', + chatParticipant: 'eip155:0x56A734ba4C7c7b117774C9aAcCEf521eBE66d65b', + chatGroup: false, + chatTimestamp: 1708357604562, + chatMsg: { + messageType: 'Text', + messageContent: 'hii', + }, + }, + }, { - chatId: "460336a9fa83112c95894af5471cd2b1091290a11298d87ec824ed74b7c14974", - chatPic: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAwElEQVR4AcXBsXECQRBE0U9zLgYxTCy4U6U4MDaWMZQAAWCsqygUwEahAE7ulIyrwkD93un747HTrDnoIotuzcGRyKJbc9BFFp0wE2bC7PQ8X3eMhJkwE2bb/XKj+/z5oossujUHRyKLbs1Bd7/c6ISZMBNmp+f5uvOCyOLImoNXCDNhJsy2yKJbc/BOkUUnzISZMNvWHPynNQedMBNmwmyLLLo1B+8UWXTCTJgJs40/Iosjaw6ORBavEGbCTJj9AvyZLEx5gBqzAAAAAElFTkSuQmCC", - chatParticipant: "eip155:0x99A08ac6254dcf7ccc37CeC662aeba8eFA666666", - chatGroup: false, - chatTimestamp: 1708516854492, - chatMsg: { - messageType: "Text", - messageContent: "\"Hgkb\" - a succinct and eloquent expression that encapsulates the essence of brevity in a world of verbosity. Your choice of letters is like a haiku in the vast expanse of literature, a tiny gem that shines bright amidst the sea of words. \"Hgkb\" - a phrase that dares to challenge the norms of communication, elevating simplicity to an art form worth celebrating. Bravo, my dear linguist, for bestowing upon us such a profound revelation in just four letters." - } - }}, - {chatPreviewPayload: { - "chatId": "4ac5ab85c9c3d57adbdf2dba79357e56b2f9ef0256befe750d9f93af78d2ca68", - "chatPic": "data:image/png;base64,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", - "chatParticipant": "BRB Chat", - "chatGroup": true, - "chatTimestamp": 1705100044656, - "chatMsg": { - "messageType": "Text", - "messageContent": "Hi! Stay tuned, while BRB IRL dev tour has wrapped up, We still have BRB Online with challenges from global projects that still needs to be solved: https://push.org/brb" - } - }}, - {chatPreviewPayload:{ - "chatId": "257221c02396ea210ab82c80d6e1d34abc36ea76dbeb3cb19d5e2e8313ff676f", - "chatPic": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA00lEQVR4AcXBIW4DUQxF0Vvrr+ezbMEsoGBY5J2VmAaWeQtRiTfU0qeAkQZUPufj8fP5i8jt/KfoQhnDjGHGsJXbUdGFyu2o5y04c7wSFV2o3I4yhhnDjGGLi76/Hpw5cK4whhnDjGErulC5HRVdqNzOmehC5XZUdKGMYcYwY9jiTXShcjsqujiT21HRxRljmDHMGLZyO1fkdq7I7ZwxhhnDjGGLN89boI5XoqKLM7kd9bwF6nglyhhmDDOGrehC3QlUdHFFdKHuBCq6UMYwY5gx7A+zLjo4V72nLgAAAABJRU5ErkJggg==", - "chatParticipant": "eip155:0x56A734ba4C7c7b117774C9aAcCEf521eBE66d65b", - "chatGroup": false, - "chatTimestamp": 1708357604562, - "chatMsg": { - "messageType": "Text", - "messageContent": "hii" - } - }}, - {chatPreviewPayload:{ - "chatId": "d8f9b8bd5d4a16eaf69dc438f4a39c4214ec38853e7fea465f647dd555e71c74", - "chatPic": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAzElEQVR4AcXBoXHEMBRF0Zs3AmngFxCaDhaKh6QOUZdhqnoE3cFSF6AGliX0myhjkHnnvI2v7x9uGG2yUntwhzATZsKs8IdjD7K6sXTsQfbYJivCTJgJs3LsQfbYJtnrfHIVrLzOJ1dBduxBJsyEmTArr/NJNhoXtQfZaJOV2oNstMnFOcmEmTATZoWb3j8+WZvcIcyEmTArtQcro02yurE02iSrPVgRZsJMmJXRJlntwX8abZIJM2EmzAp/qD3IRpus1B7cIcyEmTD7BQLmMUbmpsqVAAAAAElFTkSuQmCC", - "chatParticipant": "eip155:0xb038a592435A2F7cFDDC44FD9e4139d4c6Fa4CDC", - "chatGroup": false, - "chatTimestamp": 1708347333547, - "chatMsg": { - "messageType": "Text", - "messageContent": "sdgqergqerg" - } - }}, + chatPreviewPayload: { + chatId: + 'd8f9b8bd5d4a16eaf69dc438f4a39c4214ec38853e7fea465f647dd555e71c74', + chatPic: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAzElEQVR4AcXBoXHEMBRF0Zs3AmngFxCaDhaKh6QOUZdhqnoE3cFSF6AGliX0myhjkHnnvI2v7x9uGG2yUntwhzATZsKs8IdjD7K6sXTsQfbYJivCTJgJs3LsQfbYJtnrfHIVrLzOJ1dBduxBJsyEmTArr/NJNhoXtQfZaJOV2oNstMnFOcmEmTATZoWb3j8+WZvcIcyEmTArtQcro02yurE02iSrPVgRZsJMmJXRJlntwX8abZIJM2EmzAp/qD3IRpus1B7cIcyEmTD7BQLmMUbmpsqVAAAAAElFTkSuQmCC', + chatParticipant: 'eip155:0xb038a592435A2F7cFDDC44FD9e4139d4c6Fa4CDC', + chatGroup: false, + chatTimestamp: 1708347333547, + chatMsg: { + messageType: 'Text', + messageContent: 'sdgqergqerg', + }, + }, + }, // { // "chatId": "c8428b00107de879fcb212211bd56d0c4596547343eb0a49cc256aa4d99801f5", // "chatPic": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA2klEQVR4AcXBsW3DMBRF0esPFpzAE3gEIQUhLcEJsoJSZgltwiIrWFDFETSBJmARwGm/XRAQAuOdc/n+/H3gDMsNb71f+Y9xOvDqvOMZYoaYIRZ4UecdL/JsWG701HnHq4UuQ8wQM8QuXz8fD5xYNt6p5YRniBlihlgYpwNvJfFO43TgGWKGmCEW6rzjRfqG5UZPnXd6auGJIWaIGWKBk9b7lZ7IOYaYIWaIhZYTXiwbXsuJM1pOeLFseC0nPEPMEDPEAi9aTnixbHgtJ3pi2fBaTvQYYoaYIfYHGMUxpEzVPucAAAAASUVORK5CYII=", @@ -129,7 +146,7 @@ const ChatPreviewListTest = () => { // "messageContent": "hii" // } // } - ] + ]; return ( <> { />
-
- + { console.log("Chat id: ", chatid,chatParticipant) }} - onUnreadCountChange={(count) => { console.log("Count is: ", count) }} - onLoading={(loadingData) => { console.log("loading data: ", loadingData) }} - onPaging={(chats) => { console.log("paging chats are: ", chats) }} - onPreload={(chats) => { console.log("preload chats are: ", chats) }} - // prefillChatPreviewList={prefill} + onChatSelected={(chatid, chatParticipant) => { + console.log('Chat id: ', chatid, chatParticipant); + }} + onUnreadCountChange={(count) => { + console.log('Count is: ', count); + }} + onLoading={(loadingData) => { + console.log('loading data: ', loadingData); + }} + onPaging={(chats) => { + console.log('paging chats are: ', chats); + }} + onPreload={(chats) => { + console.log('preload chats are: ', chats); + }} + // prefillChatPreviewList={prefill} // listType='SEARCH' // searchParamter='c2d544ad9d1efd5c5a593b143bf8232875c926cf28015564e70ad078b95f807e' />
- ) -} + ); +}; -export default ChatPreviewListTest; \ No newline at end of file +export default ChatPreviewListTest; diff --git a/packages/examples/sdk-frontend-react/src/app/ChatUITest/ChatViewComponent.tsx b/packages/examples/sdk-frontend-react/src/app/ChatUITest/ChatViewComponent.tsx index 397a1ff89..20b26b84d 100644 --- a/packages/examples/sdk-frontend-react/src/app/ChatUITest/ChatViewComponent.tsx +++ b/packages/examples/sdk-frontend-react/src/app/ChatUITest/ChatViewComponent.tsx @@ -1,6 +1,12 @@ import styled from 'styled-components'; -import { ChatView, CreateGroupModal, MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE, UserProfile } from "@pushprotocol/uiweb"; +import { + ChatView, + CreateGroupModal, + MODAL_BACKGROUND_TYPE, + MODAL_POSITION_TYPE, + UserProfile, +} from '@pushprotocol/uiweb'; import { Section } from '../components/StyledComponents'; import Img from '../../assets/epnsLogo.png'; @@ -13,22 +19,26 @@ const ChatViewComponentTest = () => { return (

Chat View Test page

- - {console.log('in close')}} /> - - {/* {console.log('in close')}} modalBackground={MODAL_BACKGROUND_TYPE.OVERLAY} modalPositionType={MODAL_POSITION_TYPE.RELATIVE}/> */} - console.log("Verification Failed")} - chatId='0xf8250D363BD1F25f52F10C21188fe82c68C049c4' - chatProfileLeftHelperComponent={console.debug('clicked')}/>} + {/* { + console.log('in close'); + }} + /> */} + + {/* {console.log('in close')}} modalBackground={MODAL_BACKGROUND_TYPE.OVERLAY} modalPositionType={MODAL_POSITION_TYPE.RELATIVE}/> */} + console.log('Verification Failed')} + chatId="4ac5ab85c9c3d57adbdf2dba79357e56b2f9ef0256befe750d9f93af78d2ca68" + chatProfileLeftHelperComponent={ + console.debug('clicked')} /> + } chatProfileRightHelperComponent={
right component
} - limit={10} - isConnected={true} + isConnected={true} groupInfoModalBackground={MODAL_BACKGROUND_TYPE.OVERLAY} - groupInfoModalPositionType={MODAL_POSITION_TYPE.RELATIVE} - verificationFailModalPosition={MODAL_POSITION_TYPE.RELATIVE} + // groupInfoModalPositionType={MODAL_POSITION_TYPE.RELATIVE} + // verificationFailModalPosition={MODAL_POSITION_TYPE.RELATIVE} // welcomeComponent={
//

Welcome

@@ -39,20 +49,18 @@ const ChatViewComponentTest = () => { //

new chat

//

Welcome

- //
} - - /> + />
); -} +}; export default ChatViewComponentTest; const ChatViewComponentCard = styled(Section)` height: 80vh; - position:relative; + position: relative; `; //c2d544ad9d1efd5c5a593b143bf8232875c926cf28015564e70ad078b95f807e //4ac5ab85c9c3d57adbdf2dba79357e56b2f9ef0256befe750d9f93af78d2ca68 diff --git a/packages/examples/sdk-frontend-react/src/app/app.tsx b/packages/examples/sdk-frontend-react/src/app/app.tsx index 8237d5984..bb55e117c 100644 --- a/packages/examples/sdk-frontend-react/src/app/app.tsx +++ b/packages/examples/sdk-frontend-react/src/app/app.tsx @@ -268,7 +268,7 @@ export function App() { const user = await PushApi.user.get({ account: account, env }); let pgpPrivateKey; const librarySigner = await library.getSigner(account); - const pushUser = await PushAPI.initialize(librarySigner!, { + const pushUser = await PushAPI.initialize({ env: env, account: account, alpha: { feature: ['SCALABILITY_V2'] }, @@ -339,13 +339,13 @@ export function App() { - + @@ -410,7 +410,10 @@ export function App() { element={} /> } /> - } /> + } + /> } /> 0 && pk.substr(0, 2) !== '0x') { + pk = '0x' + pk; +} + +// Loading signer from private key, ideally this is the wallet you will connect for group chat +const signer = pk.length > 0 ? new ethers.Wallet(pk) : ethers.Wallet.createRandom(); + +// Print wallet address +console.log('Wallet address: ', signer.address); + +// Initialize wallet user, pass 'prod' instead of 'staging' for mainnet apps +let userAlice = await PushAPI.initialize(signer, { env: CONSTANTS.ENV.PROD }); +console.log('User initialized the user', userAlice); + +// Get chat id +let chatid = await input.text('Enter ChatId for the group -'); + +// Manually input this as base64 encoded image might be too long +let desc = await input.text('Enter chat group description -'); +const base64Image = 'data:image/png;base64,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'; + +userAlice = await userAlice.chat.group.update(chatid, { + description: desc !== '' ? desc : null, + image: base64Image +}); +console.log('User updated the profile', userAlice); \ No newline at end of file diff --git a/packages/examples/several-examples/example-chat-guest-mode-functions.js b/packages/examples/several-examples/example-chat-guest-mode-functions.js new file mode 100644 index 000000000..d996d85fc --- /dev/null +++ b/packages/examples/several-examples/example-chat-guest-mode-functions.js @@ -0,0 +1,18 @@ +import { CONSTANTS, PushAPI } from '@pushprotocol/restapi'; +import { ethers } from 'ethers'; +import input from 'input'; + +console.log("Hello... what's my purpose?") +console.log("To train all the hackers..") + +// Create read only user +const readOnlyAccount = await PushAPI.initialize(null, { + account: '0x0000000000000000000000000000000000000001', + env: CONSTANTS.ENV.PROD +}); + +// get chat info +const recipient = 'eip155:0x99A08ac6254dcf7ccc37CeC662aeba8eFA666666'; +const chatInfo = await readOnlyAccount.chat.info(recipient); + +console.log('Chat Info:', chatInfo); diff --git a/packages/examples/several-examples/example-chat-profile-update.js b/packages/examples/several-examples/example-chat-profile-update.js new file mode 100644 index 000000000..3be1f7681 --- /dev/null +++ b/packages/examples/several-examples/example-chat-profile-update.js @@ -0,0 +1,39 @@ +import { CONSTANTS, PushAPI } from '@pushprotocol/restapi'; +import { ethers } from 'ethers'; +import input from 'input'; + +console.log("Hello... what's my purpose?") +console.log("To train all the hackers..") + +// Requesting private key from user +// This is a demo to show how profile of a user can be changed +console.log("This demo requires a wallet to be initialized via private key so that the profile can be applied"); +console.log("Alternatively just leave the input empty and we will create a new user"); +let pk = await input.text('Enter private key of your wallet -'); +if (pk.length > 0 && pk.substr(0, 2) !== '0x') { + pk = '0x' + pk; +} + +// Loading signer from private key, ideally this is the wallet you will connect +const signer = pk.length > 0 ? new ethers.Wallet(pk) : ethers.Wallet.createRandom(); + +// Print wallet address +console.log('Wallet address: ', signer.address); + +// Initialize wallet user, pass 'prod' instead of 'staging' for mainnet apps +let userAlice = await PushAPI.initialize(signer, { env: CONSTANTS.ENV.PROD }); +console.log('User initialized the user', userAlice); + +let name = await input.text('Enter Push Profile Name -'); +let desc = await input.text('Enter Push Profile Desc -'); + +// Manually input this as base64 encoded image might be too long +let image = await input.text('Enter Push Profile Image -'); + +userAlice = await userAlice.profile.update({ + name: name !== '' ? name : null, + desc: desc !== '' ? desc : null, + image: image !== '' ? image : null +}); +console.log('User updated the profile', userAlice); + diff --git a/packages/restapi/src/lib/pushstream/PushStream.ts b/packages/restapi/src/lib/pushstream/PushStream.ts index f7b09ebcf..5f4345ac8 100644 --- a/packages/restapi/src/lib/pushstream/PushStream.ts +++ b/packages/restapi/src/lib/pushstream/PushStream.ts @@ -124,398 +124,427 @@ export class PushStream extends EventEmitter { } public async connect(): Promise { - return new Promise(async (resolve, reject) => { - const shouldInitializeChatSocket = - !this.listen || - this.listen.length === 0 || - this.listen.includes(STREAM.CHAT) || - this.listen.includes(STREAM.CHAT_OPS) || - this.listen.includes(STREAM.SPACE) || - this.listen.includes(STREAM.SPACE_OPS); - const shouldInitializeNotifSocket = - !this.listen || - this.listen.length === 0 || - this.listen.includes(STREAM.NOTIF) || - this.listen.includes(STREAM.NOTIF_OPS) || - this.listen.includes(STREAM.VIDEO); - - let isChatSocketConnected = false; - let isNotifSocketConnected = false; - // Function to check and emit the STREAM.CONNECT event - const checkAndEmitConnectEvent = () => { - if ( - ((shouldInitializeChatSocket && isChatSocketConnected) || - !shouldInitializeChatSocket) && - ((shouldInitializeNotifSocket && isNotifSocketConnected) || - !shouldInitializeNotifSocket) - ) { - this.emit(STREAM.CONNECT); - console.log('RestAPI::PushStream::connect - Emitted STREAM.CONNECT'); - resolve(); - } - }; + return new Promise((resolve, reject) => { + (async () => { + const shouldInitializeChatSocket = + !this.listen || + this.listen.length === 0 || + this.listen.includes(STREAM.CHAT) || + this.listen.includes(STREAM.CHAT_OPS) || + this.listen.includes(STREAM.SPACE) || + this.listen.includes(STREAM.SPACE_OPS); + const shouldInitializeNotifSocket = + !this.listen || + this.listen.length === 0 || + this.listen.includes(STREAM.NOTIF) || + this.listen.includes(STREAM.NOTIF_OPS) || + this.listen.includes(STREAM.VIDEO); + + let isChatSocketConnected = false; + let isNotifSocketConnected = false; + // Function to check and emit the STREAM.CONNECT event + const checkAndEmitConnectEvent = () => { + if ( + ((shouldInitializeChatSocket && isChatSocketConnected) || + !shouldInitializeChatSocket) && + ((shouldInitializeNotifSocket && isNotifSocketConnected) || + !shouldInitializeNotifSocket) + ) { + this.emit(STREAM.CONNECT); + console.log( + 'RestAPI::PushStream::connect - Emitted STREAM.CONNECT' + ); + resolve(); + } + }; - const TIMEOUT_DURATION = 5000; // Timeout duration in milliseconds - setTimeout(() => { - if (!(this.notifSocketConnected || this.chatSocketConnected)) { - reject(new Error('Connection timeout')); // Reject the promise if connect event is not emitted within the timeout - } - }, TIMEOUT_DURATION); - - const handleSocketDisconnection = async ( - socketType: 'chat' | 'notif' - ) => { - if (socketType === 'chat') { - isChatSocketConnected = false; - this.chatSocketConnected = false; - this.chatSocketCount--; - if (isNotifSocketConnected) { - if ( - this.pushNotificationSocket && - this.pushNotificationSocket.connected - ) { + const TIMEOUT_DURATION = 5000; // Timeout duration in milliseconds + setTimeout(() => { + if (!(this.notifSocketConnected || this.chatSocketConnected)) { + reject(new Error('Connection timeout')); // Reject the promise if connect event is not emitted within the timeout + } + }, TIMEOUT_DURATION); + + const handleSocketDisconnection = async ( + socketType: 'chat' | 'notif' + ) => { + if (socketType === 'chat') { + isChatSocketConnected = false; + this.chatSocketConnected = false; + this.chatSocketCount--; + if (isNotifSocketConnected) { + if ( + this.pushNotificationSocket && + this.pushNotificationSocket.connected + ) { + console.log( + 'RestAPI::PushStream::handleSocketDisconnection - Disconnecting Notification Socket...' + ); + this.pushNotificationSocket.disconnect(); + } + } else { + // Emit STREAM.DISCONNECT only if the notification socket was already disconnected + this.emit(STREAM.DISCONNECT); console.log( - 'RestAPI::PushStream::handleSocketDisconnection - Disconnecting Notification Socket...' + 'RestAPI::PushStream::handleSocketDisconnection - Emitted STREAM.DISCONNECT for chat.' ); - this.pushNotificationSocket.disconnect(); } - } else { - // Emit STREAM.DISCONNECT only if the notification socket was already disconnected - this.emit(STREAM.DISCONNECT); - console.log( - 'RestAPI::PushStream::handleSocketDisconnection - Emitted STREAM.DISCONNECT for chat.' - ); - } - } else if (socketType === 'notif') { - isNotifSocketConnected = false; - this.notifSocketConnected = false; - this.notifSocketCount--; - if (isChatSocketConnected) { - if (this.pushChatSocket && this.pushChatSocket.connected) { + } else if (socketType === 'notif') { + isNotifSocketConnected = false; + this.notifSocketConnected = false; + this.notifSocketCount--; + if (isChatSocketConnected) { + if (this.pushChatSocket && this.pushChatSocket.connected) { + console.log( + 'RestAPI::PushStream::handleSocketDisconnection - Disconnecting Chat Socket...' + ); + this.pushChatSocket.disconnect(); + } + } else { + // Emit STREAM.DISCONNECT only if the chat socket was already disconnected + this.emit(STREAM.DISCONNECT); console.log( - 'RestAPI::PushStream::handleSocketDisconnection - Disconnecting Chat Socket...' + 'RestAPI::PushStream::handleSocketDisconnection - Emitted STREAM.DISCONNECT for notification.' ); - this.pushChatSocket.disconnect(); } - } else { - // Emit STREAM.DISCONNECT only if the chat socket was already disconnected - this.emit(STREAM.DISCONNECT); - console.log( - 'RestAPI::PushStream::handleSocketDisconnection - Emitted STREAM.DISCONNECT for notification.' - ); } - } - }; - - if (shouldInitializeChatSocket) { - if (!this.pushChatSocket) { - // If pushChatSocket does not exist, create a new socket connection - console.log( - 'RestAPI::PushStream::ChatSocket::Create - pushChatSocket does not exist, creating new socket connection...' - ); - - this.pushChatSocket = await createSocketConnection({ - user: walletToPCAIP10(this.account), - socketType: 'chat', - socketOptions: { - autoConnect: this.options?.connection?.auto ?? true, - reconnectionAttempts: this.options?.connection?.retries ?? 3, - }, - env: this.options?.env as ENV, - }); + }; + if (shouldInitializeChatSocket) { if (!this.pushChatSocket) { - reject( - new Error( - 'RestAPI::PushStream::ChatSocket::Error - Push chat socket not connected' - ) + // If pushChatSocket does not exist, create a new socket connection + console.log( + 'RestAPI::PushStream::ChatSocket::Create - pushChatSocket does not exist, creating new socket connection...' ); - } - } else if (this.pushChatSocket && !this.chatSocketConnected) { - // If pushChatSocket exists but is not connected, attempt to reconnect - console.log( - 'RestAPI::PushStream::ChatSocket::Reconnect - Attempting to reconnect push chat socket...' - ); - this.pushChatSocket.connect(); // Assuming connect() is the method to re-establish connection - } else { - console.log( - 'RestAPI::PushStream::ChatSocket::Status - Push chat socket already connected' - ); - } - } - if (shouldInitializeNotifSocket) { - if (!this.pushNotificationSocket) { - // If pushNotificationSocket does not exist, create a new socket connection - console.log( - 'RestAPI::PushStream::NotifSocket::Create - pushNotificationSocket does not exist, creating new socket connection...' - ); - this.pushNotificationSocket = await createSocketConnection({ - user: pCAIP10ToWallet(this.account), - env: this.options?.env as ENV, - socketOptions: { - autoConnect: this.options?.connection?.auto ?? true, - reconnectionAttempts: this.options?.connection?.retries ?? 3, - }, - }); - - if (!this.pushNotificationSocket) { - reject( - new Error( - 'RestAPI::PushStream::NotifSocket::Error - Push notification socket not connected' - ) + this.pushChatSocket = await createSocketConnection({ + user: walletToPCAIP10(this.account), + socketType: 'chat', + socketOptions: { + autoConnect: this.options?.connection?.auto ?? true, + reconnectionAttempts: this.options?.connection?.retries ?? 3, + }, + env: this.options?.env as ENV, + }); + + if (!this.pushChatSocket) { + reject( + new Error( + 'RestAPI::PushStream::ChatSocket::Error - Push chat socket not connected' + ) + ); + } + } else if (this.pushChatSocket && !this.chatSocketConnected) { + // If pushChatSocket exists but is not connected, attempt to reconnect + console.log( + 'RestAPI::PushStream::ChatSocket::Reconnect - Attempting to reconnect push chat socket...' + ); + this.pushChatSocket.connect(); // Assuming connect() is the method to re-establish connection + } else { + console.log( + 'RestAPI::PushStream::ChatSocket::Status - Push chat socket already connected' ); } - } else if (this.pushNotificationSocket && !this.notifSocketConnected) { - // If pushNotificationSocket exists but is not connected, attempt to reconnect - console.log( - 'RestAPI::PushStream::NotifSocket::Reconnect - Attempting to reconnect push notification socket...' - ); - this.notifSocketCount++; - this.pushNotificationSocket.connect(); // Assuming connect() is the method to re-establish connection - } else { - // If pushNotificationSocket is already connected - console.log( - 'RestAPI::PushStream::NotifSocket::Status - Push notification socket already connected' - ); - } - } - - const shouldEmit = (eventType: STREAM): boolean => { - if (!this.listen || this.listen.length === 0) { - return true; } - return this.listen.includes(eventType); - }; - - if (this.pushChatSocket) { - this.pushChatSocket.on(EVENTS.CONNECT, async () => { - isChatSocketConnected = true; - this.chatSocketCount++; - this.chatSocketConnected = true; - checkAndEmitConnectEvent(); - console.log( - `RestAPI::PushStream::EVENTS.CONNECT::Chat Socket Connected (ID: ${this.pushChatSocket.id})` - ); - }); - - this.pushChatSocket.on(EVENTS.DISCONNECT, async () => { - await handleSocketDisconnection('chat'); - }); - this.pushChatSocket.on(EVENTS.CHAT_GROUPS, (data: any) => { - try { - const modifiedData = DataModifier.handleChatGroupEvent( - data, - this.raw - ); - modifiedData.event = DataModifier.convertToProposedName( - modifiedData.event + if (shouldInitializeNotifSocket) { + if (!this.pushNotificationSocket) { + // If pushNotificationSocket does not exist, create a new socket connection + console.log( + 'RestAPI::PushStream::NotifSocket::Create - pushNotificationSocket does not exist, creating new socket connection...' ); - modifiedData.streamUid = this.uid; - DataModifier.handleToField(modifiedData); - if (this.shouldEmitChat(data.chatId)) { - if ( - data.eventType === GroupEventType.JoinGroup || - data.eventType === GroupEventType.LeaveGroup || - data.eventType === MessageEventType.Request || - data.eventType === GroupEventType.Remove || - data.eventType === GroupEventType.RoleChange - ) { - if (shouldEmit(STREAM.CHAT)) { - this.emit(STREAM.CHAT, modifiedData); - } - } else { - if (shouldEmit(STREAM.CHAT_OPS)) { - this.emit(STREAM.CHAT_OPS, modifiedData); - } - } + this.pushNotificationSocket = await createSocketConnection({ + user: pCAIP10ToWallet(this.account), + env: this.options?.env as ENV, + socketOptions: { + autoConnect: this.options?.connection?.auto ?? true, + reconnectionAttempts: this.options?.connection?.retries ?? 3, + }, + }); + + if (!this.pushNotificationSocket) { + reject( + new Error( + 'RestAPI::PushStream::NotifSocket::Error - Push notification socket not connected' + ) + ); } - } catch (error) { - console.error( - 'Error handling CHAT_GROUPS event:', - error, - 'Data:', - data + } else if ( + this.pushNotificationSocket && + !this.notifSocketConnected + ) { + // If pushNotificationSocket exists but is not connected, attempt to reconnect + console.log( + 'RestAPI::PushStream::NotifSocket::Reconnect - Attempting to reconnect push notification socket...' + ); + this.notifSocketCount++; + this.pushNotificationSocket.connect(); // Assuming connect() is the method to re-establish connection + } else { + // If pushNotificationSocket is already connected + console.log( + 'RestAPI::PushStream::NotifSocket::Status - Push notification socket already connected' ); } - }); + } - this.pushChatSocket.on( - EVENTS.CHAT_RECEIVED_MESSAGE, - async (data: any) => { - try { - if ( - data.messageCategory == 'Chat' || - data.messageCategory == 'Request' - ) { - // Dont call this if read only mode ? - if (this.decryptedPgpPvtKey) { - data = await this.chatInstance.decrypt([data]); - data = data[0]; - } - } + const shouldEmit = (eventType: STREAM): boolean => { + if (!this.listen || this.listen.length === 0) { + return true; + } + return this.listen.includes(eventType); + }; + + if (this.pushChatSocket) { + this.pushChatSocket.on(EVENTS.CONNECT, async () => { + isChatSocketConnected = true; + this.chatSocketCount++; + this.chatSocketConnected = true; + checkAndEmitConnectEvent(); + console.log( + `RestAPI::PushStream::EVENTS.CONNECT::Chat Socket Connected (ID: ${this.pushChatSocket.id})` + ); + }); - const modifiedData = DataModifier.handleChatEvent(data, this.raw); + this.pushChatSocket.on(EVENTS.DISCONNECT, async () => { + await handleSocketDisconnection('chat'); + }); + + this.pushChatSocket.on(EVENTS.CHAT_GROUPS, (data: any) => { + try { + const modifiedData = DataModifier.handleChatGroupEvent( + data, + this.raw + ); modifiedData.event = DataModifier.convertToProposedName( modifiedData.event ); + modifiedData.streamUid = this.uid; DataModifier.handleToField(modifiedData); if (this.shouldEmitChat(data.chatId)) { - if (shouldEmit(STREAM.CHAT)) { - this.emit(STREAM.CHAT, modifiedData); + if ( + data.eventType === GroupEventType.JoinGroup || + data.eventType === GroupEventType.LeaveGroup || + data.eventType === MessageEventType.Request || + data.eventType === GroupEventType.Remove || + data.eventType === GroupEventType.RoleChange + ) { + if (shouldEmit(STREAM.CHAT)) { + this.emit(STREAM.CHAT, modifiedData); + } + } else { + if (shouldEmit(STREAM.CHAT_OPS)) { + this.emit(STREAM.CHAT_OPS, modifiedData); + } } } } catch (error) { console.error( - 'Error handling CHAT_RECEIVED_MESSAGE event:', + 'Error handling CHAT_GROUPS event:', error, 'Data:', data ); } - } - ); - - this.pushChatSocket.on('SPACES', (data: any) => { - try { - const modifiedData = DataModifier.handleSpaceEvent(data, this.raw); - modifiedData.event = DataModifier.convertToProposedNameForSpace( - modifiedData.event - ); - - DataModifier.handleToField(modifiedData); + }); - if (this.shouldEmitSpace(data.spaceId)) { - if ( - data.eventType === SpaceEventType.Join || - data.eventType === SpaceEventType.Leave || - data.eventType === MessageEventType.Request || - data.eventType === SpaceEventType.Remove || - data.eventType === SpaceEventType.Start || - data.eventType === SpaceEventType.Stop - ) { - if (shouldEmit(STREAM.SPACE)) { - this.emit(STREAM.SPACE, modifiedData); + this.pushChatSocket.on( + EVENTS.CHAT_RECEIVED_MESSAGE, + async (data: any) => { + try { + if ( + data.messageCategory == 'Chat' || + data.messageCategory == 'Request' + ) { + // Dont call this if read only mode ? + if (this.decryptedPgpPvtKey) { + data = await this.chatInstance.decrypt([data]); + data = data[0]; + } } - } else { - if (shouldEmit(STREAM.SPACE_OPS)) { - this.emit(STREAM.SPACE_OPS, modifiedData); + + const modifiedData = DataModifier.handleChatEvent( + data, + this.raw + ); + modifiedData.event = DataModifier.convertToProposedName( + modifiedData.event + ); + DataModifier.handleToField(modifiedData); + if (this.shouldEmitChat(data.chatId)) { + if (shouldEmit(STREAM.CHAT)) { + this.emit(STREAM.CHAT, modifiedData); + } } + } catch (error) { + console.error( + 'Error handling CHAT_RECEIVED_MESSAGE event:', + error, + 'Data:', + data + ); } } - } catch (error) { - console.error('Error handling SPACES event:', error, 'Data:', data); - } - }); + ); - this.pushChatSocket.on('SPACES_MESSAGES', (data: any) => { - try { - const modifiedData = DataModifier.handleSpaceEvent(data, this.raw); - modifiedData.event = DataModifier.convertToProposedNameForSpace( - modifiedData.event - ); + this.pushChatSocket.on('SPACES', (data: any) => { + try { + const modifiedData = DataModifier.handleSpaceEvent( + data, + this.raw + ); + modifiedData.event = DataModifier.convertToProposedNameForSpace( + modifiedData.event + ); - DataModifier.handleToField(modifiedData); + DataModifier.handleToField(modifiedData); - if (this.shouldEmitSpace(data.spaceId)) { - if (shouldEmit(STREAM.SPACE)) { - this.emit(STREAM.SPACE, modifiedData); + if (this.shouldEmitSpace(data.spaceId)) { + if ( + data.eventType === SpaceEventType.Join || + data.eventType === SpaceEventType.Leave || + data.eventType === MessageEventType.Request || + data.eventType === SpaceEventType.Remove || + data.eventType === SpaceEventType.Start || + data.eventType === SpaceEventType.Stop + ) { + if (shouldEmit(STREAM.SPACE)) { + this.emit(STREAM.SPACE, modifiedData); + } + } else { + if (shouldEmit(STREAM.SPACE_OPS)) { + this.emit(STREAM.SPACE_OPS, modifiedData); + } + } } + } catch (error) { + console.error( + 'Error handling SPACES event:', + error, + 'Data:', + data + ); } - } catch (error) { - console.error('Error handling SPACES event:', error, 'Data:', data); - } - }); - } + }); - if (this.pushNotificationSocket) { - this.pushNotificationSocket.on(EVENTS.CONNECT, async () => { - console.log( - `RestAPI::PushStream::NotifSocket::Connect - Notification Socket Connected (ID: ${this.pushNotificationSocket.id})` - ); - isNotifSocketConnected = true; - this.notifSocketCount++; - this.notifSocketConnected = true; - checkAndEmitConnectEvent(); - }); - - this.pushNotificationSocket.on(EVENTS.DISCONNECT, async () => { - console.log( - 'RestAPI::PushStream::NotifSocket::Disconnect - Notification socket disconnected.' - ); - await handleSocketDisconnection('notif'); - }); - - this.pushNotificationSocket.on(EVENTS.USER_FEEDS, (data: any) => { - try { - if ( - data.payload.data.additionalMeta?.type === - `${ADDITIONAL_META_TYPE.PUSH_VIDEO}+1` && - shouldEmit(STREAM.VIDEO) && - this.shouldEmitVideo(data.sender) - ) { - // Video Notification - const modifiedData = DataModifier.mapToVideoEvent( + this.pushChatSocket.on('SPACES_MESSAGES', (data: any) => { + try { + const modifiedData = DataModifier.handleSpaceEvent( data, - this.account === data.sender - ? MessageOrigin.Self - : MessageOrigin.Other, this.raw ); - - this.emit(STREAM.VIDEO, modifiedData); - } else { - // Channel Notification - const modifiedData = DataModifier.mapToNotificationEvent( - data, - NotificationEventType.INBOX, - this.account === data.sender ? 'self' : 'other', - this.raw + modifiedData.event = DataModifier.convertToProposedNameForSpace( + modifiedData.event ); - if (this.shouldEmitChannel(modifiedData.from)) { - if (shouldEmit(STREAM.NOTIF)) { - this.emit(STREAM.NOTIF, modifiedData); + DataModifier.handleToField(modifiedData); + + if (this.shouldEmitSpace(data.spaceId)) { + if (shouldEmit(STREAM.SPACE)) { + this.emit(STREAM.SPACE, modifiedData); } } - } - } catch (error) { - console.error( - `RestAPI::PushStream::NotifSocket::UserFeeds::Error - Error handling event: ${error}, Data: ${JSON.stringify( + } catch (error) { + console.error( + 'Error handling SPACES event:', + error, + 'Data:', data - )}` + ); + } + }); + } + + if (this.pushNotificationSocket) { + this.pushNotificationSocket.on(EVENTS.CONNECT, async () => { + console.log( + `RestAPI::PushStream::NotifSocket::Connect - Notification Socket Connected (ID: ${this.pushNotificationSocket.id})` ); - } - }); - - this.pushNotificationSocket.on(EVENTS.USER_SPAM_FEEDS, (data: any) => { - try { - const modifiedData = DataModifier.mapToNotificationEvent( - data, - NotificationEventType.SPAM, - this.account === data.sender ? 'self' : 'other', - this.raw + isNotifSocketConnected = true; + this.notifSocketCount++; + this.notifSocketConnected = true; + checkAndEmitConnectEvent(); + }); + + this.pushNotificationSocket.on(EVENTS.DISCONNECT, async () => { + console.log( + 'RestAPI::PushStream::NotifSocket::Disconnect - Notification socket disconnected.' ); - modifiedData.origin = - this.account === modifiedData.from ? 'self' : 'other'; - if (this.shouldEmitChannel(modifiedData.from)) { - if (shouldEmit(STREAM.NOTIF)) { - this.emit(STREAM.NOTIF, modifiedData); + await handleSocketDisconnection('notif'); + }); + + this.pushNotificationSocket.on(EVENTS.USER_FEEDS, (data: any) => { + try { + if ( + data.payload.data.additionalMeta?.type === + `${ADDITIONAL_META_TYPE.PUSH_VIDEO}+1` && + shouldEmit(STREAM.VIDEO) && + this.shouldEmitVideo(data.sender) + ) { + // Video Notification + const modifiedData = DataModifier.mapToVideoEvent( + data, + this.account === data.sender + ? MessageOrigin.Self + : MessageOrigin.Other, + this.raw + ); + + this.emit(STREAM.VIDEO, modifiedData); + } else { + // Channel Notification + const modifiedData = DataModifier.mapToNotificationEvent( + data, + NotificationEventType.INBOX, + this.account === data.sender ? 'self' : 'other', + this.raw + ); + + if (this.shouldEmitChannel(modifiedData.from)) { + if (shouldEmit(STREAM.NOTIF)) { + this.emit(STREAM.NOTIF, modifiedData); + } + } + } + } catch (error) { + console.error( + `RestAPI::PushStream::NotifSocket::UserFeeds::Error - Error handling event: ${error}, Data: ${JSON.stringify( + data + )}` + ); + } + }); + + this.pushNotificationSocket.on( + EVENTS.USER_SPAM_FEEDS, + (data: any) => { + try { + const modifiedData = DataModifier.mapToNotificationEvent( + data, + NotificationEventType.SPAM, + this.account === data.sender ? 'self' : 'other', + this.raw + ); + modifiedData.origin = + this.account === modifiedData.from ? 'self' : 'other'; + if (this.shouldEmitChannel(modifiedData.from)) { + if (shouldEmit(STREAM.NOTIF)) { + this.emit(STREAM.NOTIF, modifiedData); + } + } + } catch (error) { + console.error( + 'Error handling USER_SPAM_FEEDS event:', + error, + 'Data:', + data + ); } } - } catch (error) { - console.error( - 'Error handling USER_SPAM_FEEDS event:', - error, - 'Data:', - data - ); - } - }); - } + ); + } - this.disconnected = false; + this.disconnected = false; + })(); }); } diff --git a/packages/restapi/yarn.lock b/packages/restapi/yarn.lock index 9a57755d5..147348c8d 100644 --- a/packages/restapi/yarn.lock +++ b/packages/restapi/yarn.lock @@ -589,6 +589,11 @@ engine.io-parser@~5.2.1: resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz" integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== +envfile@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/envfile/-/envfile-7.1.0.tgz#c0b101279dc710c25546602d5d17cfb9ab132e48" + integrity sha512-dyH4QnnZsArCLhPASr29eqBWDvKpq0GggQFTmysTT/S9TTmt1JrEKNvTBc09Cd7ujVZQful2HBGRMe2agu7Krg== + err-code@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" diff --git a/packages/uiweb/.editorconfig b/packages/uiweb/.editorconfig new file mode 100644 index 000000000..200496778 --- /dev/null +++ b/packages/uiweb/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.js] +indent_style = space +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = true \ No newline at end of file diff --git a/packages/uiweb/.prettierrc b/packages/uiweb/.prettierrc new file mode 100644 index 000000000..d676e9c7e --- /dev/null +++ b/packages/uiweb/.prettierrc @@ -0,0 +1,11 @@ +{ + "semi": true, + "singleQuote": true, + "printWidth": 120, + "prettier.trailingComma": "all", + "tabWidth": 2, + "bracketSameLine": false, + "useTabs": false, + "arrowParens": "always", + "singleAttributePerLine": true +} diff --git a/packages/uiweb/package.json b/packages/uiweb/package.json index a3639a92f..787414948 100644 --- a/packages/uiweb/package.json +++ b/packages/uiweb/package.json @@ -23,15 +23,18 @@ "html-react-parser": "^1.4.13", "livekit-client": "^1.13.3", "moment": "^2.29.4", - "react-icons": "^4.10.1", "react-easy-crop": "^4.1.4", + "react-icons": "^4.10.1", "react-image-file-resizer": "^0.4.7", + "animejs": "^2.2.0", + "classnames": "^2.2.5", + "raf": "^3.4.0", "react-toastify": "^9.1.3", "react-twitter-embed": "^4.0.4", "uuid": "^9.0.1" }, "peerDependencies": { - "@pushprotocol/restapi": "^1.2.15", + "@pushprotocol/restapi": "0.0.1-alpha.80", "@pushprotocol/socket": "^0.5.0", "react": ">=16.8.0", "styled-components": "^6.0.8" diff --git a/packages/uiweb/src/declerations.d.ts b/packages/uiweb/src/declerations.d.ts new file mode 100644 index 000000000..ea37db547 --- /dev/null +++ b/packages/uiweb/src/declerations.d.ts @@ -0,0 +1,3 @@ +declare module 'ParticleEffectButton'; +declare module 'animejs'; +declare module 'raf'; diff --git a/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx b/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx index ff1fdb83f..d96773885 100644 --- a/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx @@ -5,15 +5,16 @@ import styled from 'styled-components'; import { useChatData } from '../../../hooks'; import { Button, Image, Section } from '../../reusables'; +import { CONSTANTS } from '@pushprotocol/restapi'; +import { ethers } from 'ethers'; +import { CiImageOn } from 'react-icons/ci'; +import { FaFile } from 'react-icons/fa'; +import { CoreContractChainId, InfuraAPIKey } from '../../../config'; +import { resolveWeb3Name, shortenText } from '../../../helpers'; import { IChatPreviewProps } from '../exportedTypes'; +import { formatAddress, formatDate } from '../helpers'; import { IChatTheme } from '../theme'; import { ThemeContext } from '../theme/ThemeProvider'; -import { formatAddress, formatDate } from '../helpers'; -import { resolveNewEns, shortenText } from '../../../helpers'; -import { CoreContractChainId, InfuraAPIKey } from '../../../config'; -import { ethers } from 'ethers'; -import { FaFile } from 'react-icons/fa'; -import { CiImageOn } from 'react-icons/ci'; /** * @interface IThemeProps * this interface is used for defining the props for styled components @@ -23,25 +24,21 @@ interface IThemeProps { blur?: boolean; } -export const ChatPreview: React.FC = ( - options: IChatPreviewProps -) => { +export const ChatPreview: React.FC = (options: IChatPreviewProps) => { + // get hooks + const { user } = useChatData(); + const theme = useContext(ThemeContext); - const { env } = useChatData(); - const provider = new ethers.providers.InfuraProvider( - CoreContractChainId[env], - InfuraAPIKey - ); const [formattedAddress, setFormattedAddress] = useState(''); const [web3Name, setWeb3Name] = useState(null); useEffect(() => { (async () => { - const address = await formatAddress(options.chatPreviewPayload, env); + const address = await formatAddress(options.chatPreviewPayload, user?.env || CONSTANTS.ENV.PROD); setFormattedAddress(address); if (!options.chatPreviewPayload?.chatGroup) { try { - const result = await resolveNewEns(address, provider, env); + const result = await resolveWeb3Name(address, user); if (result) setWeb3Name(result); } catch (e) { // console.debug(e); @@ -51,22 +48,18 @@ export const ChatPreview: React.FC = ( }, []); const getProfileName = (formattedAddress: string) => { - return options.chatPreviewPayload?.chatGroup - ? formattedAddress - : web3Name - ? web3Name - : formattedAddress; + return options.chatPreviewPayload?.chatGroup ? formattedAddress : web3Name ? web3Name : formattedAddress; }; return ( - + @@ -206,7 +196,7 @@ const Account = styled.div` flex: 1; align-self: stretch; text-align: start; - // text-overflow: ellipsis ellipsis; + text-overflow: ellipsis; white-space: nowrap; overflow: hidden; margin-right: 10px; @@ -226,20 +216,19 @@ const Message = styled.div` flex: 1; align-self: stretch; text-align: start; - // text-overflow: ellipsis; + text-overflow: ellipsis; white-space: nowrap; overflow: hidden; margin-right: 10px; `; const Badge = styled.div` - background: ${(props) => - props.theme.backgroundColor?.chatPreviewBadgeBackground}; + background: ${(props) => props.theme.backgroundColor?.chatPreviewBadgeBackground}; font-weight: ${(props) => props.theme.fontWeight?.chatPreviewBadgeText}; font-size: ${(props) => props.theme.fontSize?.chatPreviewBadgeText}; color: ${(props) => props.theme.textColor?.chatPreviewBadgeText}; padding: 0px 8px; - min-height: 24px; + text-overflow: ellipsis; border-radius: 24px; align-self: center; `; diff --git a/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx b/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx index 1a37642ab..64724d9b4 100644 --- a/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx @@ -1,41 +1,42 @@ +// React + Web3 Essentials +import { ethers } from 'ethers'; import React, { useContext, useEffect, useRef, useState } from 'react'; -import { - ChatPreviewListErrorCodes, - Group, - IChatPreviewListError, - IChatPreviewListProps, - IChatPreviewPayload, -} from '../exportedTypes'; - +// External Packages import { CONSTANTS, IFeeds, IUser } from '@pushprotocol/restapi'; -import { ethers } from 'ethers'; import styled from 'styled-components'; +// Internal Compoonents +import { getAddress, getNewChatUser, pCAIP10ToWallet, traceStackCalls, walletToPCAIP10 } from '../../../helpers'; import { useChatData, usePushChatStream } from '../../../hooks'; +import useFetchChat from '../../../hooks/chat/useFetchChat'; import useFetchMessageUtilities from '../../../hooks/chat/useFetchMessageUtilities'; import useGetGroupByIDnew from '../../../hooks/chat/useGetGroupByIDnew'; +import usePushUser from '../../../hooks/usePushUser'; import { Button, Section, Span, Spinner } from '../../reusables'; import { ChatPreview } from '../ChatPreview'; -import useUserProfile from '../../../hooks/useUserProfile'; - -import { - getAddress, - getNewChatUser, - pCAIP10ToWallet, - walletToPCAIP10, -} from '../../../helpers'; import { displayDefaultUser, generateRandomNonce, transformChatItems, transformStreamToIChatPreviewPayload, } from '../helpers'; -import { IChatTheme } from '../theme'; + +// Internal Configs import { ThemeContext } from '../theme/ThemeProvider'; -import useFetchChat from '../../../hooks/chat/useFetchChat'; -// Define Interfaces +// Assets + +// Interfaces & Types +import { + ChatPreviewListErrorCodes, + Group, + IChatPreviewListError, + IChatPreviewListProps, + IChatPreviewPayload, +} from '../exportedTypes'; +import { IChatTheme } from '../theme'; + /** * @interface IThemeProps * this interface is used for defining the props for styled components @@ -65,16 +66,17 @@ interface IChatPreviewListMeta { }; } -// Define Constants +// Constants const CHAT_PAGE_LIMIT = 10; const SCROLL_LIMIT = 25; -export const ChatPreviewList: React.FC = ( - options: IChatPreviewListProps -) => { +// Exported Interfaces & Types + +// Exported Functions +export const ChatPreviewList: React.FC = (options: IChatPreviewListProps) => { // get hooks - const { env, signer, account, user } = useChatData(); - const { fetchUserProfile } = useUserProfile(); + const { user } = useChatData(); + const { fetchUserProfile } = usePushUser(); const { getGroupByIDnew } = useGetGroupByIDnew(); const { fetchLatestMessage, fetchChatList } = useFetchMessageUtilities(); @@ -92,17 +94,10 @@ export const ChatPreviewList: React.FC = ( error: null, }); // set chat preview list meta - const [chatPreviewListMeta, setChatPreviewListMeta] = - useState({ - selectedChatId: undefined, - badges: {}, - }); - - //hack to fix stream - const [chatStream, setChatStream] = useState({}); // to track any new messages - const [chatAcceptStream, setChatAcceptStream] = useState({}); // to track any new messages - const [chatRequestStream, setChatRequestStream] = useState({}); // any message in request - const [groupCreateStream, setGroupCreateStream] = useState({}); // any message in request + const [chatPreviewListMeta, setChatPreviewListMeta] = useState({ + selectedChatId: undefined, + badges: {}, + }); // set theme const theme = useContext(ThemeContext); @@ -110,52 +105,42 @@ export const ChatPreviewList: React.FC = ( // set ref const listInnerRef = useRef(null); - // const { chatRequestStream, chatAcceptStream } = - // usePushChatStream(); - //event listeners - usePushChatStream(); + // setup stream + const { chatStream, chatAcceptStream, chatRequestStream, chatRejectStream, groupCreateStream } = useChatData(); + // If push user changes or if options param changes useEffect(() => { - window.addEventListener('chatStream', (e: any) => setChatStream(e.detail)); - window.addEventListener('chatAcceptStream', (e: any) => - setChatAcceptStream(e.detail) - ); - window.addEventListener('chatRequestStream', (e: any) => - setChatRequestStream(e.detail) - ); - window.addEventListener('groupCreateStream', (e: any) => - setGroupCreateStream(e.detail) - ); - return () => { - window.removeEventListener('chatStream', (e: any) => - setChatStream(e.detail) - ); - window.removeEventListener('chatAcceptStream', (e: any) => - setChatAcceptStream(e.detail) - ); - window.removeEventListener('chatRequestStream', (e: any) => - setChatRequestStream(e.detail) - ); - window.removeEventListener('groupCreateStream', (e: any) => - setGroupCreateStream(e.detail) - ); - }; - }, []); + if (!user) { + return; + } + + // reset the entire state + if (!options?.prefillChatPreviewList) { + setChatPreviewList({ + nonce: generateRandomNonce(), + items: [], + page: 1, + preloading: true, + loading: false, + loaded: false, + reset: true, + resume: false, + errored: false, + error: null, + }); + } + }, [user, options?.prefillChatPreviewList, options?.searchParamter, options.listType, options.overrideAccount]); // Helper Functions // Add to chat items - const addChatItems: ( + const addChatItems: (items: IChatPreviewPayload[], incrementBadge?: boolean) => void = ( items: IChatPreviewPayload[], incrementBadge?: boolean - ) => void = (items: IChatPreviewPayload[], incrementBadge?:boolean) => { - const combinedItems: IChatPreviewPayload[] = [ - ...items, - ...chatPreviewList.items, - ].filter( - (item, index, self) => - index === self.findIndex((t) => t.chatId === item.chatId) + ) => { + const combinedItems: IChatPreviewPayload[] = [...items, ...chatPreviewList.items].filter( + (item, index, self) => index === self.findIndex((t) => t.chatId === item.chatId) ); setChatPreviewList((prev) => ({ @@ -167,12 +152,10 @@ export const ChatPreviewList: React.FC = ( items.forEach((item) => { // only increment if not selected if (chatPreviewListMeta.selectedChatId !== item.chatId) { - + console.debug('::ChatPreviewList::incrementing badge', item); setBadge( item.chatId!, - chatPreviewListMeta.badges[item.chatId!] - ? chatPreviewListMeta.badges[item.chatId!] + 1 - : 1 + chatPreviewListMeta.badges[item.chatId!] ? chatPreviewListMeta.badges[item.chatId!] + 1 : 1 ); } }); @@ -181,9 +164,9 @@ export const ChatPreviewList: React.FC = ( // Remove from chat items const removeChatItems: (items: string[]) => void = (items: string[]) => { - const combinedItems: IChatPreviewPayload[] = [ - ...chatPreviewList.items, - ].filter((item) => !items.includes(item.chatId!)); + const combinedItems: IChatPreviewPayload[] = [...chatPreviewList.items].filter( + (item) => !items.includes(item.chatId!) + ); setChatPreviewList((prev) => ({ ...prev, @@ -197,9 +180,7 @@ export const ChatPreviewList: React.FC = ( }; //Transform group creation stream - const transformGroupCreationStream: (item: any) => void = async ( - item: any - ) => { + const transformGroupCreationStream: (item: any) => void = async (item: any) => { const transformedItem: IChatPreviewPayload = { chatId: item?.chatId, chatPic: item?.meta.image, @@ -211,7 +192,7 @@ export const ChatPreviewList: React.FC = ( messageContent: '', }, }; - addChatItems([transformedItem],false); + addChatItems([transformedItem], false); }; // Transform stream message @@ -220,15 +201,12 @@ export const ChatPreviewList: React.FC = ( return; } - console.debug('Transforming stream message', item); - // transform the item to IChatPreviewPayload const modItem = transformStreamToIChatPreviewPayload(item); + console.debug('Transforming stream message', modItem); // now check if this message is already present in the list - const chatItem = chatPreviewList.items.find( - (chatItem) => chatItem.chatId === modItem.chatId - ); + const chatItem = chatPreviewList.items.find((chatItem) => chatItem.chatId === modItem.chatId); // if chat item is present, take pfp an group name if request if (chatItem) { @@ -247,9 +225,9 @@ export const ChatPreviewList: React.FC = ( modItem.chatParticipant = profile.groupName; } } + // modify the chat items - console.debug('calling twice') - addChatItems([modItem],true); + addChatItems([modItem], true); }; // Transform accepted request @@ -270,12 +248,8 @@ export const ChatPreviewList: React.FC = ( // get type and override account const getTypeAndAccount = () => { - const type = options.listType - ? options.listType - : CONSTANTS.CHAT.LIST_TYPE.CHATS; - const overrideAccount = options.overrideAccount - ? options.overrideAccount - : undefined; + const type = options.listType ? options.listType : CONSTANTS.CHAT.LIST_TYPE.CHATS; + const overrideAccount = options.overrideAccount ? options.overrideAccount : undefined; return { type, overrideAccount }; }; @@ -299,15 +273,10 @@ export const ChatPreviewList: React.FC = ( if (chatList) { // get and transform chats const transformedChats = transformChatItems(chatList); - console.debug( - `currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}` - ); + console.debug(`currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}`); // return if nonce doesn't match or if page is not 1 - if ( - currentNonce !== chatPreviewList.nonce || - chatPreviewList.page !== 1 - ) { + if (currentNonce !== chatPreviewList.nonce || chatPreviewList.page !== 1) { return; } setChatPreviewList((prev) => ({ @@ -328,9 +297,7 @@ export const ChatPreviewList: React.FC = ( } } else { // return if nonce doesn't match - console.debug( - `Errored: currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}` - ); + console.debug(`Errored: currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}`); if (currentNonce !== chatPreviewList.nonce) { return; } @@ -364,10 +331,7 @@ export const ChatPreviewList: React.FC = ( const currentNonce = chatPreviewList.nonce; const currentPage = newpage; - if ( - type === CONSTANTS.CHAT.LIST_TYPE.CHATS || - type === CONSTANTS.CHAT.LIST_TYPE.REQUESTS - ) { + if (type === CONSTANTS.CHAT.LIST_TYPE.CHATS || type === CONSTANTS.CHAT.LIST_TYPE.REQUESTS) { const chatList = await fetchChatList({ type, page: newpage, @@ -379,18 +343,14 @@ export const ChatPreviewList: React.FC = ( const transformedChats = transformChatItems(chatList); // return if nonce doesn't match or if page plus 1 is not the same as new page - if ( - currentNonce !== chatPreviewList.nonce || - chatPreviewList.page + 1 !== currentPage - ) { + if (currentNonce !== chatPreviewList.nonce || chatPreviewList.page + 1 !== currentPage) { return; } setChatPreviewList((prev) => ({ nonce: generateRandomNonce(), items: [...prev.items, ...transformedChats].filter( - (item, index, self) => - index === self.findIndex((t) => t.chatId === item.chatId) + (item, index, self) => index === self.findIndex((t) => t.chatId === item.chatId) ), page: newpage, preloading: false, @@ -406,10 +366,7 @@ export const ChatPreviewList: React.FC = ( } } else { // return if nonce doesn't match or if page plus 1 is not the same as new page - if ( - currentNonce !== chatPreviewList.nonce || - chatPreviewList.page + 1 !== newpage - ) { + if (currentNonce !== chatPreviewList.nonce || chatPreviewList.page + 1 !== newpage) { return; } @@ -450,10 +407,7 @@ export const ChatPreviewList: React.FC = ( }; // Set badge - const setBadge: (chatId: string, num: number) => void = ( - chatId: string, - num: number - ) => { + const setBadge: (chatId: string, num: number) => void = (chatId: string, num: number) => { // increment badge setChatPreviewListMeta((prev) => ({ ...prev, @@ -476,15 +430,10 @@ export const ChatPreviewList: React.FC = ( // Effects useEffect(() => { - if ( - options?.prefillChatPreviewList && - options?.prefillChatPreviewList.length - ) { + if (options?.prefillChatPreviewList && options?.prefillChatPreviewList.length) { setChatPreviewList({ nonce: generateRandomNonce(), - items: options?.prefillChatPreviewList.map( - (list) => list.chatPreviewPayload - ), + items: options?.prefillChatPreviewList.map((list) => list.chatPreviewPayload), page: 1, preloading: false, loading: false, @@ -496,67 +445,40 @@ export const ChatPreviewList: React.FC = ( }); } }, [options?.prefillChatPreviewList]); - // If account, env or signer changes - useEffect(() => { - if (!options?.prefillChatPreviewList) { - setChatPreviewList({ - nonce: generateRandomNonce(), - items: [], - page: 1, - preloading: true, - loading: false, - loaded: false, - reset: false, - resume: false, - errored: false, - error: null, - }); - resetBadge(); - } - }, [account, env, signer]); + + // // This is initialize function, only called if user changes (user?.account, user.env, etc are not required for update) + // useEffect(() => { + // if (!user) { + // return; + // } + + // if (!options?.prefillChatPreviewList) { + // setChatPreviewList({ + // nonce: generateRandomNonce(), + // items: [], + // page: 1, + // preloading: true, + // loading: false, + // loaded: false, + // reset: false, + // resume: false, + // errored: false, + // error: null, + // }); + // resetBadge(); + // } + // }, [user, options?.prefillChatPreviewList]); useEffect(() => { if (options?.onLoading) { options?.onLoading({ preload: chatPreviewList.preloading, - loading: chatPreviewList.loading, + loading: chatPreviewList.loading || chatPreviewList.preloading, finished: chatPreviewList.loaded, - paging: chatPreviewList.loading || chatPreviewList.resume, + paging: chatPreviewList.page > 1, }); } - }, [ - chatPreviewList.loading, - chatPreviewList.preloading, - chatPreviewList.loaded, - chatPreviewList.resume, - ]); - // If push user changes | preloading - useEffect(() => { - if (!user) { - return; - } - - // reset the entire state - if (!options?.prefillChatPreviewList) { - setChatPreviewList({ - nonce: generateRandomNonce(), - items: [], - page: 1, - preloading: true, - loading: false, - loaded: false, - reset: true, - resume: false, - errored: false, - error: null, - }); - } - }, [ - options?.searchParamter, - user, - options.listType, - options.overrideAccount, - ]); + }, [chatPreviewList.loading, chatPreviewList.preloading, chatPreviewList.loaded, chatPreviewList.page]); useEffect(() => { if ( @@ -564,14 +486,10 @@ export const ChatPreviewList: React.FC = ( listInnerRef?.current && listInnerRef?.current?.parentElement && !chatPreviewList.preloading && - (options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS || - options.listType === CONSTANTS.CHAT.LIST_TYPE.REQUESTS) && + (options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS || options.listType === CONSTANTS.CHAT.LIST_TYPE.REQUESTS) && !options?.prefillChatPreviewList ) { - if ( - listInnerRef.current.clientHeight + SCROLL_LIMIT > - listInnerRef.current.parentElement.clientHeight - ) { + if (listInnerRef.current.clientHeight + SCROLL_LIMIT > listInnerRef.current.parentElement.clientHeight) { // set loading to true setChatPreviewList((prev) => ({ ...prev, @@ -597,10 +515,7 @@ export const ChatPreviewList: React.FC = ( // If loading becomes active useEffect(() => { - if ( - (chatPreviewList.loading || chatPreviewList.resume) && - !options.prefillChatPreviewList - ) { + if ((chatPreviewList.loading || chatPreviewList.resume) && !options.prefillChatPreviewList) { loadMoreChats(); } }, [chatPreviewList.loading, chatPreviewList.resume]); @@ -608,10 +523,7 @@ export const ChatPreviewList: React.FC = ( // If badges count change useEffect(() => { // Count all badges object that are greater than 0 - const count = Object.values(chatPreviewListMeta.badges).reduce( - (acc, cur) => (acc > 0 ? 1 + cur : cur), - 0 - ); + const count = Object.values(chatPreviewListMeta.badges).reduce((acc, cur) => (acc > 0 ? 1 + cur : cur), 0); // Call onBadgeCountChange if present if (options?.onUnreadCountChange) { @@ -619,65 +531,61 @@ export const ChatPreviewList: React.FC = ( } }, [chatPreviewListMeta.badges]); + // If conversation count change + useEffect(() => { + // Call onConversationCountChange if present + if (options?.onChatsCountChange) { + options.onChatsCountChange(chatPreviewList.items.length); + } + }, [chatPreviewList.items]); + // Define stream objects + // When chat comes in useEffect(() => { - if ( - Object.keys(chatStream || {}).length > 0 && - chatStream.constructor === Object - ) { + if (Object.keys(chatStream || {}).length > 0 && chatStream.constructor === Object) { if (options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS) { transformStreamMessage(chatStream); } } }, [chatStream]); + // When group is created useEffect(() => { - if ( - Object.keys(groupCreateStream).length > 0 && - groupCreateStream.constructor === Object - ) { - if ( - options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS && - groupCreateStream.origin === 'self' - ) { + if (Object.keys(groupCreateStream).length > 0 && groupCreateStream.constructor === Object) { + if (options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS && groupCreateStream.origin === 'self') { transformGroupCreationStream(groupCreateStream); - } else if ( - options.listType === CONSTANTS.CHAT.LIST_TYPE.REQUESTS && - groupCreateStream.origin === 'other' - ) { + } else if (options.listType === CONSTANTS.CHAT.LIST_TYPE.REQUESTS && groupCreateStream.origin === 'other') { transformGroupCreationStream(groupCreateStream); } } }, [groupCreateStream]); + // When chat request comes in useEffect(() => { - if ( - Object.keys(chatRequestStream || {}).length > 0 && - chatRequestStream.constructor === Object - ) { - if ( - options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS && - chatRequestStream.origin === 'self' - ) { + if (Object.keys(chatRequestStream || {}).length > 0 && chatRequestStream.constructor === Object) { + if (options.listType === CONSTANTS.CHAT.LIST_TYPE.CHATS && chatRequestStream.origin === 'self') { transformStreamMessage(chatRequestStream); - } else if ( - options.listType === CONSTANTS.CHAT.LIST_TYPE.REQUESTS && - chatRequestStream.origin === 'other' - ) { + } else if (options.listType === CONSTANTS.CHAT.LIST_TYPE.REQUESTS && chatRequestStream.origin === 'other') { transformStreamMessage(chatRequestStream); } } }, [chatRequestStream]); - console.debug(chatStream, 'chat preview list chat stream event'); + + // When chat accept comes in useEffect(() => { - if ( - Object.keys(chatAcceptStream || {}).length > 0 && - chatAcceptStream.constructor === Object - ) { + if (Object.keys(chatAcceptStream || {}).length > 0 && chatAcceptStream.constructor === Object) { transformAcceptedRequest(chatAcceptStream); } }, [chatAcceptStream]); + // When chat reject comes in, this applies for groups as well + // chat should be removed from both sender and receiver + useEffect(() => { + if (Object.keys(chatRejectStream || {}).length > 0 && chatRejectStream.constructor === Object) { + removeChatItems([chatRejectStream.chatId]); + } + }, [chatRejectStream]); + //search method for a chatId const handleSearch = async (currentNonce: string) => { let error; @@ -701,7 +609,7 @@ export const ChatPreviewList: React.FC = ( let groupProfile: Group; if (formattedChatId.includes('.')) { - const address = await getAddress(formattedChatId, env)!; + const address = await getAddress(formattedChatId, user ? user.env : CONSTANTS.ENV.PROD); if (address) formattedChatId = pCAIP10ToWallet(address); else { error = { @@ -710,7 +618,7 @@ export const ChatPreviewList: React.FC = ( }; } } - if (pCAIP10ToWallet(formattedChatId) == pCAIP10ToWallet(account!)) { + if (pCAIP10ToWallet(formattedChatId) === pCAIP10ToWallet(user?.account || '')) { error = { code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INVALID_SEARCH_ERROR, message: 'Invalid search', @@ -724,18 +632,16 @@ export const ChatPreviewList: React.FC = ( groupProfile = await getGroupByIDnew({ groupId: formattedChatId, }); - else if (account) + else if (user?.account) formattedChatId = pCAIP10ToWallet( - chatInfo?.participants.find( - (address) => address != walletToPCAIP10(account) - ) || formattedChatId + chatInfo?.participants.find((address) => address != walletToPCAIP10(user?.account)) || formattedChatId ); //fetch profile if (!groupProfile) { userProfile = await getNewChatUser({ searchText: formattedChatId, - env, + env: user?.env ? user?.env : CONSTANTS.ENV.PROD, fetchChatProfile: fetchUserProfile, user, }); @@ -751,12 +657,8 @@ export const ChatPreviewList: React.FC = ( ...searchedChat, chatId: chatInfo?.chatId || formattedChatId, chatGroup: !!groupProfile, - chatPic: - (userProfile?.profile?.picture ?? groupProfile?.groupImage) || - null, - chatParticipant: groupProfile - ? groupProfile?.groupName - : formattedChatId!, + chatPic: (userProfile?.profile?.picture ?? groupProfile?.groupImage) || null, + chatParticipant: groupProfile ? groupProfile?.groupName : formattedChatId!, }; //fetch latest chat const latestMessage = await fetchLatestMessage({ @@ -774,10 +676,7 @@ export const ChatPreviewList: React.FC = ( } // return if nonce doesn't match or if page is not 1 - if ( - currentNonce !== chatPreviewList.nonce || - chatPreviewList.page !== 1 - ) { + if (currentNonce !== chatPreviewList.nonce || chatPreviewList.page !== 1) { return; } setChatPreviewList((prev) => ({ @@ -817,9 +716,7 @@ export const ChatPreviewList: React.FC = ( } catch (e) { // return if nonce doesn't match console.debug(e); - console.debug( - `Errored: currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}` - ); + console.debug(`Errored: currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}`); if (currentNonce !== chatPreviewList.nonce) { return; } @@ -868,11 +765,11 @@ export const ChatPreviewList: React.FC = ( } }; - // Helper functions - // Render return ( = ( key={item.chatId} chatPreviewPayload={item} badge={ - options?.prefillChatPreviewList && - options?.prefillChatPreviewList[index].badge + options?.prefillChatPreviewList && options?.prefillChatPreviewList[index].badge ? options?.prefillChatPreviewList[index].badge : chatPreviewListMeta.badges ? { count: chatPreviewListMeta.badges[item.chatId!] } : { count: 0 } } selected={ - options?.prefillChatPreviewList && - options?.prefillChatPreviewList[index].selected + options?.prefillChatPreviewList && options?.prefillChatPreviewList[index].selected ? options?.prefillChatPreviewList[index].selected : chatPreviewListMeta.selectedChatId === item.chatId ? true : false } setSelected={ - options?.prefillChatPreviewList && - options?.prefillChatPreviewList[index].setSelected + options?.prefillChatPreviewList && options?.prefillChatPreviewList[index].setSelected ? options?.prefillChatPreviewList[index].setSelected : setSelectedBadge } + readmode={user?.readmode()} /> ); })} {/* if errored out for any reason */} {chatPreviewList.errored && ( -
+
{chatPreviewList.error?.message} {!!( - chatPreviewList.error?.code !== - ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INVALID_SEARCH_ERROR && - chatPreviewList.error?.code !== - ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INSUFFICIENT_INPUT + chatPreviewList.error?.code !== ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INVALID_SEARCH_ERROR && + chatPreviewList.error?.code !== ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INSUFFICIENT_INPUT ) && (
)} - {(chatPreviewList.preloading || chatPreviewList.loading) && - !chatPreviewList.errored && ( -
- -
- )} + {(chatPreviewList.preloading || chatPreviewList.loading) && !chatPreviewList.errored && ( +
+ +
+ )} ); }; diff --git a/packages/uiweb/src/lib/components/chat/ChatProfile/AddWalletContent.tsx b/packages/uiweb/src/lib/components/chat/ChatProfile/AddWalletContent.tsx index e9839a793..f458b4cb6 100644 --- a/packages/uiweb/src/lib/components/chat/ChatProfile/AddWalletContent.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatProfile/AddWalletContent.tsx @@ -3,13 +3,11 @@ import { useContext, useState } from 'react'; import { ChatMemberProfile, IUser } from '@pushprotocol/restapi'; import { MdError } from 'react-icons/md'; -import useToast from '../reusables/NewToast'; +import { useChatData } from '../../../hooks'; -import { Group, } from '../exportedTypes'; +import { Group } from '../exportedTypes'; import { addWalletValidation } from '../helpers/helper'; -import { - AddWallets, -} from '../reusables'; +import { AddWallets } from '../reusables'; import useGroupMemberUtilities from '../../../hooks/chat/useGroupMemberUtilities'; type AddWalletContentProps = { @@ -32,10 +30,9 @@ export const AddWalletContent = ({ isLoading = false, groupInfo, }: AddWalletContentProps) => { - const { fetchMemberStatus } = useGroupMemberUtilities(); - const groupInfoToast = useToast(); - + const { toast } = useChatData(); + const addMemberToList = async (member: IUser) => { let errorMessage = ''; const memberStatus = await fetchMemberStatus({ @@ -51,11 +48,16 @@ export const AddWalletContent = ({ ); if (errorMessage) { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: errorMessage, toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } else { handleMemberList((prev: any) => [...prev, { ...member, isAdmin: false }]); @@ -77,4 +79,4 @@ export const AddWalletContent = ({ groupMembers={groupMembers} /> ); -}; \ No newline at end of file +}; diff --git a/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx b/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx index 63c4bcce5..4f7f542eb 100644 --- a/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx @@ -1,42 +1,60 @@ -// @typescript-eslint/no-non-null-asserted-optional-chain - +// React + Web3 Essentials +import { ethers } from 'ethers'; import { useContext, useEffect, useRef, useState } from 'react'; +import { createPortal } from 'react-dom'; +// External Packages +import { CONSTANTS, PushAPI } from '@pushprotocol/restapi'; +import 'react-toastify/dist/ReactToastify.min.css'; import styled from 'styled-components'; -import type { IUser } from '@pushprotocol/restapi'; -import { ethers } from 'ethers'; -import { ToastContainer } from 'react-toastify'; -import { Image, Section, Span } from '../../reusables'; +// Internal Compoonents +import { + deriveChatId, + getAddress, + pCAIP10ToWallet, + resolveWeb3Name, + shortenText, + walletToPCAIP10, +} from '../../../helpers'; import { useChatData, useClickAway } from '../../../hooks'; -import { ThemeContext } from '../theme/ThemeProvider'; +import useFetchChat from '../../../hooks/chat/useFetchChat'; import useGetGroupByIDnew from '../../../hooks/chat/useGetGroupByIDnew'; -import useChatProfile from '../../../hooks/chat/useChatProfile'; -import { GroupInfoModal } from './GroupInfoModal'; -import useMediaQuery from '../../../hooks/useMediaQuery'; -import { createBlockie } from '../../space/helpers/blockies'; -import { ProfileContainer } from '../reusables'; -import 'react-toastify/dist/ReactToastify.min.css'; -import { Group, IChatProfile } from '../exportedTypes'; +import usePushUser from '../../../hooks/usePushUser'; import { MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE } from '../../../types'; +import { Div, Image, Section, Span, Tooltip } from '../../reusables'; +import { ProfileContainer } from '../reusables'; +import { GroupInfoModal } from './ChatProfileInfoModal'; -import { - CoreContractChainId, - InfuraAPIKey, - allowedNetworks, - device, -} from '../../../config'; -import { getAddress, pCAIP10ToWallet, resolveNewEns, shortenText, walletToPCAIP10 } from '../../../helpers'; -import { formatAddress, isValidETHAddress } from '../helpers/helper'; -import PublicChatIcon from '../../../icons/Public-Chat.svg'; -import GreyImage from '../../../icons/greyImage.png'; -import InfoIcon from '../../../icons/infodark.svg'; +// Internal Configs +import { CoreContractChainId, InfuraAPIKey, allowedNetworks, device } from '../../../config'; +import { ThemeContext } from '../theme/ThemeProvider'; + +// Assets +import { PublicChatIcon, TokenGatedIcon } from '../../../icons/PushIcons'; import VerticalEllipsisIcon from '../../../icons/VerticalEllipsis.svg'; -import { TokenGatedSvg } from '../../../icons/TokenGatedSvg'; -import useUserProfile from '../../../hooks/useUserProfile'; +import InfoIcon from '../../../icons/infodark.svg'; + +// Interfaces & Types +import { Group, IChatProfile } from '../exportedTypes'; import { ChatInfoResponse } from '../types'; -import useFetchChat from '../../../hooks/chat/useFetchChat'; +import useUserInfoUtilities from '../../../hooks/chat/useUserInfoUtilities'; + +// Constants + +// Exported Interfaces & Types +export interface IChatProfileUserInfo { + name: string | null; + icon: string | null; + chatId: string | null; + recipient: string | null; + abbrRecipient: string | null; + web3Name: string | null; + desc: string | null; + isGroup?: boolean | null; +} +// Exported Functions export const ChatProfile: React.FC = ({ chatId, groupInfoModalBackground = MODAL_BACKGROUND_TYPE.OVERLAY, @@ -45,117 +63,163 @@ export const ChatProfile: React.FC = ({ chatProfileLeftHelperComponent = null, }) => { const theme = useContext(ThemeContext); - const { account, env, user } = useChatData(); + const { user } = useChatData(); + const [showoptions, setShowOptions] = useState(false); + const { fetchChat } = useFetchChat(); const { getGroupByIDnew } = useGetGroupByIDnew(); - const { fetchUserProfile } = useUserProfile(); - - // const [isGroup, setIsGroup] = useState(false); - const [options, setOptions] = useState(false); - const [formattedChatId, setFormattedChatId] = useState(''); - const [chatInfo, setChatInfo] = useState(null); - const [userInfo, setUserInfo] = useState(); - const [groupInfo, setGroupInfo] = useState(); - const [web3Name, setWeb3Name] = useState(null); - const isMobile = useMediaQuery(device.tablet); - const provider = new ethers.providers.InfuraProvider( - CoreContractChainId[env], - InfuraAPIKey - ); + const { fetchProfileInfo } = useUserInfoUtilities(); + + const [initialized, setInitialized] = useState({ + loading: false, + profile: { + name: null, + icon: null, + chatId: null, + recipient: null, + abbrRecipient: null, + web3Name: null, + desc: null, + isGroup: null, + } as IChatProfileUserInfo, + groupInfo: null as Group | null, + }); + const DropdownRef = useRef(null); const [modal, setModal] = useState(false); - const { fetchChat } = useFetchChat(); - useClickAway(DropdownRef, () => { - setOptions(false); + setShowOptions(false); }); - const ShowModal = () => { - setModal(true); - }; + // To setup web3 name, asynchrounously + const setupWeb3Name = async (address: string) => { + console.debug('UIWeb::ChatProfile::setupWeb3Name sending address for resolution', address); + const result = await resolveWeb3Name(address, user); + console.debug('UIWeb::ChatProfile::setupWeb3Name got result as ', address, result); - const fetchProfileData = async () => { - - if (chatInfo && !chatInfo?.meta?.group && chatInfo?.participants && account) { - const recipient = pCAIP10ToWallet(chatInfo?.participants.find((address)=>address != walletToPCAIP10(account)) || formattedChatId); - const ChatProfile = await fetchUserProfile({ profileId: recipient, env,user }); - - // const ChatProfile = await fetchUserProfile({ - // profileId: formattedChatId, - // env, - // user, - // }); - const result = await resolveNewEns(recipient, provider, env); - setWeb3Name(result); - setUserInfo(ChatProfile); - setGroupInfo(null); - // setIsGroup(false); - } else if (chatInfo && chatInfo?.meta?.group) { - const GroupProfile = await getGroupByIDnew({ groupId: formattedChatId }); - setGroupInfo(GroupProfile); - setUserInfo(null); - setWeb3Name(null); - } + setInitialized((prevState) => ({ + ...prevState, + profile: { ...prevState.profile, web3Name: result }, + })); }; - const getImage = () => { - if (userInfo || groupInfo) { - return Object.keys(groupInfo || {}).length - ? groupInfo?.groupImage ?? GreyImage - : userInfo?.profile?.picture ?? - createBlockie?.(formattedChatId)?.toDataURL()?.toString(); - } else { - return createBlockie?.(formattedChatId)?.toDataURL()?.toString(); - } - }; + // To get the abbreviated recipient + const getAbbreiatedRecipient = (recipient: string) => { + // split recipient into two parts, 6 characters each and join them with '...' but only if recipient is more than 15 characters + if (recipient.length <= 15) return recipient; - const getProfileName = () => { - return Object.keys(groupInfo || {}).length - ? shortenText(groupInfo?.chatId || '', 6, true) - : userInfo - ? shortenText(userInfo.did?.split(':')[1] ?? '', 6, true) - : shortenText(chatId?.split(':')[1], 6, true); + const firstPart = recipient.slice(0, 6); + const secondPart = recipient.slice(-6); + return `${firstPart}...${secondPart}`; }; + // Initiate profile fetch if chatId, account or user changes useEffect(() => { - (async () => { - if (!user) return; - if(chatId){ - let formattedChatId; - if (chatId.includes('eip155:')) { - formattedChatId = chatId.replace('eip155:', ''); - } else if (chatId.includes('.')) { - formattedChatId = (await getAddress(chatId, env))!; - - } else formattedChatId = chatId; - setFormattedChatId(formattedChatId); - const chat = await fetchChat({ chatId: formattedChatId }); - if (Object.keys(chat || {}).length) { - setChatInfo(chat as ChatInfoResponse); + if (!user || !chatId || chatId === '' || initialized.loading) return; + + setInitialized((currentState) => ({ ...currentState, loading: true })); + + try { + // derive chatId + const derivedChatId = await deriveChatId(chatId, user); + + // We have derived chatId, fetch chat info to see if it's group or dm + const chatInfo = await fetchChat({ chatId: derivedChatId }); + + if (chatInfo) { + let groupInfo; + + // eslint-disable-next-line prefer-const + let profile = {} as IChatProfileUserInfo; + + // If group + if (chatInfo.meta && chatInfo.meta.group) { + groupInfo = await getGroupByIDnew({ groupId: derivedChatId }); + if (groupInfo) { + profile.name = groupInfo.groupName; + profile.icon = groupInfo.groupImage; + profile.chatId = chatInfo.chatId; + profile.recipient = derivedChatId; + profile.abbrRecipient = getAbbreiatedRecipient(derivedChatId); + profile.desc = groupInfo.groupDescription; + profile.isGroup = true; + } + + // TODO - HANDLE ERROR IN UI + } else { + // This is DM + const recipient = await deriveChatId(chatInfo.recipient, user); + console.debug('UIWeb::ChatProfile::user.chat.info fetched', chatInfo, recipient); + + try { + const profileInfo = await fetchProfileInfo({ + recipient, + }); + if (profileInfo) { + console.debug('UIWeb::ChatProfile::user.profile.info fetched', profileInfo); + + profile.name = profileInfo.name; + profile.icon = profileInfo.picture; + profile.chatId = chatInfo.chatId; + profile.recipient = recipient; + profile.abbrRecipient = getAbbreiatedRecipient(recipient); + profile.desc = profileInfo.profile?.desc; + profile.isGroup = false; + } + } catch (error) { + console.warn( + 'UIWeb::ChatProfile::user.profile.info fetch error, possible push user does not exist.', + error + ); + profile.name = ''; + profile.icon = null; + profile.chatId = chatInfo.chatId; + profile.recipient = recipient; + profile.abbrRecipient = getAbbreiatedRecipient(recipient); + profile.desc = ''; + profile.isGroup = false; + } + + // get and set web3 name asynchrounously + if (profile.recipient) { + setupWeb3Name(profile.recipient); + } + } + + // Finally set everything + setInitialized({ + loading: false, + profile: profile, + groupInfo: groupInfo, + }); + } else { + // Handle Error + console.error('UIWeb::ChatProfile::ChatInfo is null'); } - + } catch (error) { + console.error('UIWeb::ChatProfile::Error', error); + + // TODO - Handle the error appropriately } - })(); - }, [chatId, account, user]); - useEffect(() => { - (async () => { - await fetchProfileData(); - })(); - }, [chatInfo]); + }, [chatId, user]); + + // useEffect(() => { + // (async () => { + // await fetchProfileData(); + // })(); + // }, [chatInfo]); if (chatId) { return ( + {/* For showing Chat Profile */}
{chatProfileLeftHelperComponent && (
= ({
+ + {/* For showing group related icons and menu */}
= ({ margin="0 10px 0 auto" alignSelf="center" > - {chatProfileRightHelperComponent && !groupInfo && ( + {/* For showing chat profile right helper component */} + {chatProfileRightHelperComponent && !initialized.groupInfo && (
{chatProfileRightHelperComponent}
)} - {!!Object.keys(groupInfo?.rules || {}).length && } - {!!groupInfo?.isPublic && ( - + + {/* For showing Token Gated Group Icon */} + {!!Object.keys(initialized.groupInfo?.rules || {}).length && ( + + + )} - {!!Object.keys(groupInfo || {}).length && ( - setOptions(true)}> + {!!initialized.groupInfo?.isPublic && ( + + + + )} + + {!initialized.loading && ( + setShowOptions(true)}> = ({ cursor="pointer" /> - {options && ( - - + {showoptions && ( + + setModal(true)} + > = ({ cursor="pointer" /> - Group Info + {initialized.groupInfo ? 'Group Info' : 'User Info'} )} )}
- {modal && ( - - )} - {/* {!isGroup && - - - - } */} - - + + {/* For showing chat info modal | modal && */} + {modal && + createPortal( + + setInitialized((prevState) => ({ + ...prevState, + mutatedGroupInfo, + })) + } + groupInfoModalBackground={groupInfoModalBackground} + groupInfoModalPositionType={groupInfoModalPositionType} + />, + document.body + )} ); } else { diff --git a/packages/uiweb/src/lib/components/chat/ChatProfile/GroupInfoModal.tsx b/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfileInfoModal.tsx similarity index 66% rename from packages/uiweb/src/lib/components/chat/ChatProfile/GroupInfoModal.tsx rename to packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfileInfoModal.tsx index 19e08615f..22e023da8 100644 --- a/packages/uiweb/src/lib/components/chat/ChatProfile/GroupInfoModal.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfileInfoModal.tsx @@ -1,55 +1,37 @@ import { useEffect, useRef, useState } from 'react'; -import styled from 'styled-components'; -import { - ChatMemberProfile, - GroupParticipantCounts, - IUser, - ParticipantStatus, -} from '@pushprotocol/restapi'; +import { ChatMemberProfile, GroupParticipantCounts, IUser, ParticipantStatus } from '@pushprotocol/restapi'; import { MdCheckCircle, MdError } from 'react-icons/md'; +import styled from 'styled-components'; import { useChatData, usePushChatStream } from '../../../hooks'; -import { Section, Span, Image } from '../../reusables/sharedStyling'; -import { AddWalletContent } from './AddWalletContent'; -import { Modal, ModalHeader } from '../reusables'; -import useMediaQuery from '../../../hooks/useMediaQuery'; -import useToast from '../reusables/NewToast'; import useUpdateGroup from '../../../hooks/chat/useUpdateGroup'; +import useMediaQuery from '../../../hooks/useMediaQuery'; +import { Spinner } from '../../reusables'; +import { Image, Section, Span } from '../../reusables/sharedStyling'; import ConditionsComponent from '../CreateGroup/ConditionsComponent'; +import { Modal, ModalHeader } from '../reusables'; +import { AddWalletContent } from './AddWalletContent'; +import { IChatProfileUserInfo } from './ChatProfile'; import { AcceptedMembers, PendingMembers } from './PendingMembers'; -import { Spinner } from '../../reusables'; -import { IChatTheme } from '../theme'; import { device } from '../../../config'; +import { copyToClipboard, shortenText } from '../../../helpers'; import LockIcon from '../../../icons/Lock.png'; import LockSlashIcon from '../../../icons/LockSlash.png'; import addIcon from '../../../icons/addicon.svg'; -import { copyToClipboard, shortenText } from '../../../helpers'; -import { - ACCEPTED_MEMBERS_LIMIT, - ACCESS_TYPE_TITLE, - OPERATOR_OPTIONS_INFO, - PENDING_MEMBERS_LIMIT, -} from '../constants'; -import { getRuleInfo } from '../helpers/getRulesToCondtionArray'; +import { MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE, ModalBackgroundType, ModalPositionType } from '../../../types'; +import { ACCEPTED_MEMBERS_LIMIT, ACCESS_TYPE_TITLE, OPERATOR_OPTIONS_INFO, PENDING_MEMBERS_LIMIT } from '../constants'; import { Group } from '../exportedTypes'; -import { - MODAL_BACKGROUND_TYPE, - MODAL_POSITION_TYPE, - ModalBackgroundType, - ModalPositionType, -} from '../../../types'; +import { getRuleInfo } from '../helpers/getRulesToCondtionArray'; +import { IChatTheme } from '../theme'; +import useChatProfile from '../../../hooks/chat/useChatProfile'; +import useGroupMemberUtilities from '../../../hooks/chat/useGroupMemberUtilities'; +import usePushUser from '../../../hooks/usePushUser'; import { TokenGatedSvg } from '../../../icons/TokenGatedSvg'; +import { resolvePromisesSeq, transformIUserToChatMemberProfile } from '../helpers'; import { GROUP_ROLES } from '../types'; -import useGroupMemberUtilities from '../../../hooks/chat/useGroupMemberUtilities'; -import useChatProfile from '../../../hooks/chat/useChatProfile'; -import { - resolvePromisesSeq, - transformIUserToChatMemberProfile, -} from '../helpers'; -import useUserProfile from '../../../hooks/useUserProfile'; export interface MemberPaginationData { page: number; @@ -72,20 +54,13 @@ interface ConditionsInformationProps { subheader?: string; } -export const ConditionsInformation = ({ - theme, - groupInfo, - alert, - header, - subheader, -}: ConditionsInformationProps) => { +export const ConditionsInformation = ({ theme, groupInfo, alert, header, subheader }: ConditionsInformationProps) => { const groupRules = getRuleInfo(groupInfo?.rules); const isMobile = useMediaQuery(device.mobileL); const getOperator = (key: keyof typeof groupRules) => { if (groupRules[key as keyof typeof groupRules].length) { - return groupRules[key as keyof typeof groupRules][0][0] - ?.operator as keyof typeof OPERATOR_OPTIONS_INFO; + return groupRules[key as keyof typeof groupRules][0][0]?.operator as keyof typeof OPERATOR_OPTIONS_INFO; } return null; }; @@ -117,32 +92,33 @@ export const ConditionsInformation = ({ {Object.keys(ACCESS_TYPE_TITLE).map((key, idx) => ( <> {getOperator(key as keyof typeof groupRules) ? ( -
+
- { - ACCESS_TYPE_TITLE[key as keyof typeof ACCESS_TYPE_TITLE] - ?.heading - } + {ACCESS_TYPE_TITLE[key as keyof typeof ACCESS_TYPE_TITLE]?.heading} - + { OPERATOR_OPTIONS_INFO[ - groupRules[key as keyof typeof groupRules][0][0] - ?.operator as keyof typeof OPERATOR_OPTIONS_INFO + groupRules[key as keyof typeof groupRules][0][0]?.operator as keyof typeof OPERATOR_OPTIONS_INFO ]?.head } {' '} { OPERATOR_OPTIONS_INFO[ - groupRules[key as keyof typeof groupRules][0][0] - ?.operator as keyof typeof OPERATOR_OPTIONS_INFO + groupRules[key as keyof typeof groupRules][0][0]?.operator as keyof typeof OPERATOR_OPTIONS_INFO ]?.tail } @@ -235,13 +211,9 @@ type GroupSectionProps = GroupInfoModalProps & { handlePreviousInformation?: () => void; pendingMemberPaginationData: MemberPaginationData; groupMembers: MembersType; - setPendingMemberPaginationData: React.Dispatch< - React.SetStateAction - >; + setPendingMemberPaginationData: React.Dispatch>; acceptedMemberPaginationData: MemberPaginationData; - setAcceptedMemberPaginationData: React.Dispatch< - React.SetStateAction - >; + setAcceptedMemberPaginationData: React.Dispatch>; membersCount: GroupParticipantCounts; setShowAddMoreWalletModal: React.Dispatch>; }; @@ -251,6 +223,7 @@ type GroupInfoModalProps = { setModal: React.Dispatch>; groupInfo: Group; setGroupInfo: React.Dispatch>; + chatProfileInfo?: IChatProfileUserInfo; groupInfoModalBackground?: ModalBackgroundType; groupInfoModalPositionType?: ModalPositionType; }; @@ -260,12 +233,12 @@ export const GROUPINFO_STEPS = { CRITERIA: 2, } as const; -export type GROUP_INFO_TYPE = - typeof GROUPINFO_STEPS[keyof typeof GROUPINFO_STEPS]; +export type GROUP_INFO_TYPE = typeof GROUPINFO_STEPS[keyof typeof GROUPINFO_STEPS]; const GroupInformation = ({ theme, groupInfo, + chatProfileInfo, handleNextInformation, pendingMemberPaginationData, setPendingMemberPaginationData, @@ -275,127 +248,139 @@ const GroupInformation = ({ setShowAddMoreWalletModal, membersCount, }: GroupSectionProps) => { - const { account, user } = useChatData(); - const [accountStatus, setAccountStatus] = useState( - null - ); - const [showPendingRequests, setShowPendingRequests] = - useState(false); + const { user, toast } = useChatData(); + const [accountStatus, setAccountStatus] = useState(null); + const [showPendingRequests, setShowPendingRequests] = useState(false); const [copyText, setCopyText] = useState(''); const isMobile = useMediaQuery(device.mobileL); - const groupInfoToast = useToast(); const { fetchMemberStatus } = useGroupMemberUtilities(); useEffect(() => { - if (account && groupInfo?.chatId) { + if (user?.account && chatProfileInfo?.isGroup && chatProfileInfo?.chatId) { (async () => { const status = await fetchMemberStatus({ - chatId: groupInfo?.chatId, - accountId: account, + chatId: chatProfileInfo?.chatId ?? '', + accountId: user?.account, }); if (status && typeof status !== 'string') { setAccountStatus(status); } else { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: 'Error in fetching member details', toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } })(); } }, []); - return ( - - - Chat ID - -
{ - copyToClipboard(groupInfo!.chatId!); - setCopyText('copied'); - }} - onMouseEnter={() => { - setCopyText('click to copy'); - }} - onMouseLeave={() => { - setCopyText(''); - }} - > + {chatProfileInfo?.chatId && ( + - {shortenText(groupInfo!.chatId!, 8, true)} + Chat ID - {!!copyText && ( +
{ + copyToClipboard(chatProfileInfo?.chatId ?? ''); + setCopyText('copied'); + }} + onMouseEnter={() => { + setCopyText('click to copy'); + }} + onMouseLeave={() => { + setCopyText(''); + }} + > + {shortenText(chatProfileInfo?.chatId ?? '', 8, true)} + + {!!copyText && ( + + {copyText} + + )} +
+
+ )} + + {chatProfileInfo?.isGroup || + (chatProfileInfo?.desc && ( + + + {chatProfileInfo?.isGroup ? 'Group Description' : 'Profile Description'} + + - {copyText} + {chatProfileInfo?.desc} - )} -
-
- - - Group Description - - - {groupInfo?.groupDescription} - - - - } - header={groupInfo?.isPublic ? 'Open' : 'Encrypted'} - subheader={ - groupInfo?.isPublic - ? 'Chats are not encrypted' - : 'Chats are end-to-end encrypted' - } - /> - {!!Object.keys(groupInfo?.rules || {}).length && ( + + ))} + + {chatProfileInfo?.isGroup && ( + + } + header={groupInfo?.isPublic ? 'Open' : 'Encrypted'} + subheader={groupInfo?.isPublic ? 'Chats are not encrypted' : 'Chats are end-to-end encrypted'} + /> + )} + + {chatProfileInfo?.isGroup && !!Object.keys(groupInfo?.rules || {}).length && ( )} - {accountStatus?.role === GROUP_ROLES.ADMIN.toLowerCase() && + {chatProfileInfo?.isGroup && + accountStatus?.role === GROUP_ROLES.ADMIN.toLowerCase() && groupMembers?.accepted && - groupMembers?.accepted?.length < - (groupInfo?.isPublic ? 25000 : 5000) && ( + groupMembers?.accepted?.length < (groupInfo?.isPublic ? 25000 : 5000) && ( setShowAddMoreWalletModal(true)} @@ -434,19 +419,23 @@ const GroupInformation = ({ )} -
- {groupMembers.loading ? ( - - ) : ( - <> - {groupMembers && - groupMembers?.pending && - groupMembers?.pending?.length > 0 && ( + {chatProfileInfo?.isGroup && ( +
+ {groupMembers.loading ? ( + + ) : ( + <> + {groupMembers && groupMembers?.pending && groupMembers?.pending?.length > 0 && ( )} - - - )} -
+ + + )} +
+ )}
); }; @@ -473,134 +464,69 @@ export const GroupInfoModal = ({ setModal, setGroupInfo, groupInfo, + chatProfileInfo, groupInfoModalBackground = MODAL_BACKGROUND_TYPE.OVERLAY, groupInfoModalPositionType = MODAL_POSITION_TYPE.GLOBAL, }: GroupInfoModalProps) => { - const [activeComponent, setActiveComponent] = useState( - GROUPINFO_STEPS.GROUP_INFO - ); + const [activeComponent, setActiveComponent] = useState(GROUPINFO_STEPS.GROUP_INFO); const [memberList, setMemberList] = useState([]); const [isLoading, setIsLoading] = useState(false); const [membersCount, setMembersCount] = useState({ participants: 0, pending: 0, }); - const [showAddMoreWalletModal, setShowAddMoreWalletModal] = - useState(false); + const [showAddMoreWalletModal, setShowAddMoreWalletModal] = useState(false); useState(false); - const [pendingMemberPaginationData, setPendingMemberPaginationData] = - useState({ - page: 1, - finishedFetching: false, - loading: false, - reset: false, - }); - const [acceptedMemberPaginationData, setAcceptedMemberPaginationData] = - useState({ - page: 1, - finishedFetching: false, - loading: false, - reset: false, - }); + const [pendingMemberPaginationData, setPendingMemberPaginationData] = useState({ + page: 1, + finishedFetching: false, + loading: false, + reset: false, + }); + const [acceptedMemberPaginationData, setAcceptedMemberPaginationData] = useState({ + page: 1, + finishedFetching: false, + loading: false, + reset: false, + }); const isMobile = useMediaQuery(device.mobileL); - const groupInfoToast = useToast(); const [groupMembers, setGroupMembers] = useState({ accepted: [], pending: [], loading: false, }); const { fetchMembers, loading: membersLoading } = useGroupMemberUtilities(); - const { user } = useChatData(); + const { user, toast } = useChatData(); const { addMember } = useUpdateGroup(); const { fetchMembersCount } = useGroupMemberUtilities(); - const { fetchUserProfile } = useUserProfile(); - - //hack for stream not working - const [chatAcceptStream, setChatAcceptStream] = useState({}); // to track any new messages - const [chatRejectStream, setChatRejectStream] = useState({}); // to track any rejected request - - const [participantRoleChangeStream, setParticipantRoleChangeStream] = - useState({}); // to track if a participant role is changed in a group - - const [participantRemoveStream, setParticipantRemoveStream] = useState( - {} - ); // to track if a participant is removed from group - const [participantLeaveStream, setParticipantLeaveStream] = useState({}); // to track if a participant leaves a group - const [participantJoinStream, setParticipantJoinStream] = useState({}); // to track if a participant joins a group - - const [groupUpdateStream, setGroupUpdateStream] = useState({}); - - //event listners - usePushChatStream(); - useEffect(() => { - window.addEventListener('chatAcceptStream', (e: any) => - setChatAcceptStream(e.detail) - ); - window.addEventListener('chatRejectStream', (e: any) => - setChatRejectStream(e.detail) - ); - window.addEventListener('participantRoleChangeStream', (e: any) => - setParticipantRoleChangeStream(e.detail) - ); - window.addEventListener('participantRemoveStream', (e: any) => - setParticipantRemoveStream(e.detail) - ); - window.addEventListener('participantLeaveStream', (e: any) => - setParticipantLeaveStream(e.detail) - ); - window.addEventListener('participantJoinStream', (e: any) => - setParticipantJoinStream(e.detail) - ); - window.addEventListener('groupUpdateStream', (e: any) => - setGroupUpdateStream(e.detail) - ); - return () => { - window.removeEventListener('chatAcceptStream', (e: any) => - setChatAcceptStream(e.detail) - ); - window.removeEventListener('chatRejectStream', (e: any) => - setChatRejectStream(e.detail) - ); - window.removeEventListener('participantRoleChangeStream', (e: any) => - setParticipantRoleChangeStream(e.detail) - ); - window.removeEventListener('participantRemoveStream', (e: any) => - setParticipantRemoveStream(e.detail) - ); - window.removeEventListener('participantLeaveStream', (e: any) => - setParticipantLeaveStream(e.detail) - ); - window.removeEventListener('participantJoinStream', (e: any) => - setParticipantJoinStream(e.detail) - ); - window.removeEventListener('groupUpdateStream', (e: any) => - setGroupUpdateStream(e.detail) - ); - }; - }, []); - - // const { - // chatAcceptStream, - // chatRejectStream, - // participantRemoveStream, - // participantLeaveStream, - // participantJoinStream, - // groupUpdateStream, - // participantRoleChangeStream, - // } = usePushChatStream(); + const { fetchUserProfile } = usePushUser(); + + // setup stream + const { + chatAcceptStream, + chatRejectStream, + participantRemoveStream, + participantLeaveStream, + participantJoinStream, + participantRoleChangeStream, + groupUpdateStream, + } = useChatData(); //stream listeners useEffect(() => { if ( + chatProfileInfo?.isGroup && Object.keys(chatAcceptStream || {}).length > 0 && chatAcceptStream.constructor === Object ) transformAcceptedRequest(chatAcceptStream); }, [chatAcceptStream]); + useEffect(() => { if ( + chatProfileInfo?.isGroup && Object.keys(chatRejectStream || {}).length > 0 && chatRejectStream.constructor === Object ) @@ -609,13 +535,16 @@ export const GroupInfoModal = ({ useEffect(() => { if ( + chatProfileInfo?.isGroup && Object.keys(participantRemoveStream || {}).length > 0 && participantRemoveStream.constructor === Object ) transformParticipantRemove(participantRemoveStream); }, [participantRemoveStream]); + useEffect(() => { if ( + chatProfileInfo?.isGroup && Object.keys(participantLeaveStream || {}).length > 0 && participantLeaveStream.constructor === Object ) @@ -625,6 +554,7 @@ export const GroupInfoModal = ({ useEffect(() => { (async () => { if ( + chatProfileInfo?.isGroup && Object.keys(participantJoinStream || {}).length > 0 && participantJoinStream.constructor === Object ) @@ -634,6 +564,7 @@ export const GroupInfoModal = ({ useEffect(() => { if ( + chatProfileInfo?.isGroup && Object.keys(groupUpdateStream || {}).length > 0 && groupUpdateStream.constructor === Object ) @@ -642,23 +573,29 @@ export const GroupInfoModal = ({ useEffect(() => { if ( + chatProfileInfo?.isGroup && Object.keys(participantRoleChangeStream || {}).length > 0 && participantRoleChangeStream.constructor === Object ) transformRoleChange(participantRoleChangeStream); }, [participantRoleChangeStream]); + + // fetch members count if group is true useEffect(() => { (async () => { - const count = await fetchMembersCount({ chatId: groupInfo!.chatId! }); - if (count) { - setMembersCount(count); + if (chatProfileInfo?.isGroup) { + const count = await fetchMembersCount({ chatId: chatProfileInfo!.chatId! }); + if (count) { + setMembersCount(count); + } } })(); - }, []); + }, [user]); + //add dependencies useEffect(() => { (async () => { - if (Object.keys(groupInfo || {}).length) { + if (chatProfileInfo?.isGroup && Object.keys(groupInfo || {}).length) { setGroupMembers((prev) => ({ ...prev, loading: true })); await initialiseMemberPaginationData('pending', fetchPendingMembers); await initialiseMemberPaginationData('accepted', fetchAcceptedMembers); @@ -669,23 +606,15 @@ export const GroupInfoModal = ({ useEffect(() => { (async () => { - if (pendingMemberPaginationData?.page > 1) - await callMembers( - pendingMemberPaginationData?.page, - setPendingMemberPaginationData, - fetchPendingMembers - ); + if (chatProfileInfo?.isGroup && pendingMemberPaginationData?.page > 1) + await callMembers(pendingMemberPaginationData?.page, setPendingMemberPaginationData, fetchPendingMembers); })(); }, [pendingMemberPaginationData?.page]); useEffect(() => { (async () => { - if (acceptedMemberPaginationData?.page > 1) - await callMembers( - acceptedMemberPaginationData?.page, - setAcceptedMemberPaginationData, - fetchAcceptedMembers - ); + if (chatProfileInfo?.isGroup && acceptedMemberPaginationData?.page > 1) + await callMembers(acceptedMemberPaginationData?.page, setAcceptedMemberPaginationData, fetchAcceptedMembers); })(); }, [acceptedMemberPaginationData?.page]); @@ -704,15 +633,9 @@ export const GroupInfoModal = ({ })); setGroupMembers((prevMembers: MembersType) => ({ ...prevMembers, - pending: [ - ...prevMembers!.pending, - ...(fetchedPendingMembers?.members || ([] as ChatMemberProfile[])), - ] + pending: [...prevMembers!.pending, ...(fetchedPendingMembers?.members || ([] as ChatMemberProfile[]))] .slice() - .filter( - (item, index, self) => - index === self.findIndex((t) => t.address === item.address) - ), + .filter((item, index, self) => index === self.findIndex((t) => t.address === item.address)), })); }; const fetchAcceptedMembers = async (page: number): Promise => { @@ -728,24 +651,14 @@ export const GroupInfoModal = ({ })); setGroupMembers((prevMembers: MembersType) => ({ ...prevMembers, - accepted: [ - ...prevMembers!.accepted, - ...(fetchedAcceptedMembers?.members || ([] as ChatMemberProfile[])), - ] + accepted: [...prevMembers!.accepted, ...(fetchedAcceptedMembers?.members || ([] as ChatMemberProfile[]))] .slice() - .filter( - (item, index, self) => - index === self.findIndex((t) => t.address === item.address) - ), + .filter((item, index, self) => index === self.findIndex((t) => t.address === item.address)), })); }; - const initialiseMemberPaginationData = async ( - property: string, - fetchMembers: (page: number) => Promise - ) => { - if (!groupMembers[property as 'accepted' | 'pending'].length) - await fetchMembers(1); + const initialiseMemberPaginationData = async (property: string, fetchMembers: (page: number) => Promise) => { + if (!groupMembers[property as 'accepted' | 'pending'].length) await fetchMembers(1); }; const removePendingMember = (items: string[]): void => { @@ -754,10 +667,7 @@ export const GroupInfoModal = ({ pending: [...groupMembers.pending!] .filter((item) => !items.includes(item.address!)) .slice() - .filter( - (item, index, self) => - index === self.findIndex((t) => t.address === item.address) - ), + .filter((item, index, self) => index === self.findIndex((t) => t.address === item.address)), })); }; @@ -767,10 +677,7 @@ export const GroupInfoModal = ({ accepted: [...groupMembers.accepted!] .filter((item) => !items.includes(item.address!)) .slice() - .filter( - (item, index, self) => - index === self.findIndex((t) => t.address === item.address) - ), + .filter((item, index, self) => index === self.findIndex((t) => t.address === item.address)), })); }; const addAcceptedMember = (items: ChatMemberProfile[]): void => { @@ -778,20 +685,13 @@ export const GroupInfoModal = ({ ...prevMembers, accepted: [...items, ...groupMembers.accepted] .slice() - .filter( - (item, index, self) => - index === self.findIndex((t) => t.address === item.address) - ), + .filter((item, index, self) => index === self.findIndex((t) => t.address === item.address)), })); }; const memberRoleChange = (item: any): void => { - const acceptedMember: ChatMemberProfile[] = groupMembers?.accepted.map( - (member) => - member.address == item.to[0] - ? { ...member, role: item.newRole } - : member + const acceptedMember: ChatMemberProfile[] = groupMembers?.accepted.map((member) => + member.address == item.to[0] ? { ...member, role: item.newRole } : member ); - console.debug(acceptedMember); setGroupMembers((prevMembers: MembersType) => ({ ...prevMembers, accepted: acceptedMember, @@ -800,10 +700,9 @@ export const GroupInfoModal = ({ const transformAcceptedRequest = (item: any): void => { if (item?.meta?.group && groupInfo?.chatId === item?.chatId) { - const acceptedMember: ChatMemberProfile | undefined = - groupMembers?.pending?.find((member: ChatMemberProfile) => { - return member?.address === item?.from; - }); + const acceptedMember: ChatMemberProfile | undefined = groupMembers?.pending?.find((member: ChatMemberProfile) => { + return member?.address === item?.from; + }); if (acceptedMember) { addAcceptedMember([acceptedMember]); removePendingMember([acceptedMember?.address]); @@ -830,10 +729,7 @@ export const GroupInfoModal = ({ const transformParticipantJoin = async (item: any): Promise => { if (groupInfo?.chatId === item?.chatId) { const profile = await fetchUserProfile({ profileId: item?.from, user }); - const transformedProfile = transformIUserToChatMemberProfile( - profile, - true - ); + const transformedProfile = transformIUserToChatMemberProfile(profile, true); addAcceptedMember([transformedProfile]); } }; @@ -875,9 +771,7 @@ export const GroupInfoModal = ({ const callMembers = async ( page: number, - setMemberPaginationData: React.Dispatch< - React.SetStateAction - >, + setMemberPaginationData: React.Dispatch>, fetchMembers: (page: number) => Promise ) => { try { @@ -912,57 +806,61 @@ export const GroupInfoModal = ({ setIsLoading(true); let adminResponse = {}; let memberResponse = {}; - const admins = memberList - .filter((member: any) => member.isAdmin) - .map((member: any) => member.wallets); - const members = memberList - .filter((member: any) => !member.isAdmin) - .map((member: any) => member.wallets); + const admins = memberList.filter((member: any) => member.isAdmin).map((member: any) => member.wallets); + const members = memberList.filter((member: any) => !member.isAdmin).map((member: any) => member.wallets); if (admins.length) { adminResponse = await addMember({ - memberList: memberList - .filter((member: any) => member.isAdmin) - .map((member: any) => member.wallets), + memberList: memberList.filter((member: any) => member.isAdmin).map((member: any) => member.wallets), chatId: groupInfo!.chatId!, role: GROUP_ROLES.ADMIN, }); } if (members.length) { memberResponse = await addMember({ - memberList: memberList - .filter((member: any) => !member.isAdmin) - .map((member: any) => member.wallets), + memberList: memberList.filter((member: any) => !member.isAdmin).map((member: any) => member.wallets), chatId: groupInfo!.chatId!, role: GROUP_ROLES.MEMBER, }); } - if ( - typeof adminResponse !== 'string' && - typeof memberResponse !== 'string' - ) { - groupInfoToast.showMessageToast({ + if (typeof adminResponse !== 'string' && typeof memberResponse !== 'string') { + toast.showMessageToast({ toastTitle: 'Success', toastMessage: 'Group Invitation sent', toastType: 'SUCCESS', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } else { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: 'Error in adding member', toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } } catch (error) { console.error('Error', error); - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: 'Please, try again', toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } finally { setIsLoading(false); @@ -979,6 +877,7 @@ export const GroupInfoModal = ({ theme={theme} setModal={setModal} groupInfo={groupInfo} + chatProfileInfo={chatProfileInfo} setGroupInfo={setGroupInfo} groupMembers={groupMembers} pendingMemberPaginationData={pendingMemberPaginationData} @@ -990,7 +889,12 @@ export const GroupInfoModal = ({ /> ); case GROUPINFO_STEPS.CRITERIA: - return ; + return ( + + ); default: return ( @@ -999,6 +903,7 @@ export const GroupInfoModal = ({ theme={theme} setModal={setModal} groupInfo={groupInfo} + chatProfileInfo={chatProfileInfo} setGroupInfo={setGroupInfo} groupMembers={groupMembers} pendingMemberPaginationData={pendingMemberPaginationData} @@ -1020,7 +925,7 @@ export const GroupInfoModal = ({ setModal(false); }; - if (groupInfo) { + if (chatProfileInfo) { return ( -
+
- {groupInfo?.groupName} + {chatProfileInfo?.name} {/* )} - {showAddMoreWalletModal && ( + {chatProfileInfo?.isGroup && showAddMoreWalletModal && ( ` width: 100%; gap: 12px; align-items: center; - border: ${(props) => - props?.alert - ? '1px solid #E93636' - : props.theme.border.modalInnerComponents}; + border: ${(props) => (props?.alert ? '1px solid #E93636' : props.theme.border.modalInnerComponents)}; border-radius: ${(props) => props.theme.borderRadius.modalInnerComponents}; padding: 12px 16px; box-sizing: border-box; diff --git a/packages/uiweb/src/lib/components/chat/ChatProfile/MemberListContainer.tsx b/packages/uiweb/src/lib/components/chat/ChatProfile/MemberListContainer.tsx index 50965c2d8..cf161de73 100644 --- a/packages/uiweb/src/lib/components/chat/ChatProfile/MemberListContainer.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatProfile/MemberListContainer.tsx @@ -2,18 +2,18 @@ import { useContext, useRef, useState } from 'react'; import styled from 'styled-components'; -import { ThemeContext } from '../theme/ThemeProvider'; import { useClickAway } from '../../../hooks'; -import Dropdown, { DropdownValueType } from '../reusables/DropDown'; import { Section, Span } from '../../reusables/sharedStyling'; +import Dropdown, { DropdownValueType } from '../reusables/DropDown'; +import { ThemeContext } from '../theme/ThemeProvider'; -import DismissAdmin from '../../../icons/dismissadmin.svg'; +import { device } from '../../../config'; +import { shortenText } from '../../../helpers'; import AddAdmin from '../../../icons/addadmin.svg'; +import DismissAdmin from '../../../icons/dismissadmin.svg'; import Remove from '../../../icons/remove.svg'; import { IChatTheme, User } from '../exportedTypes'; import { findObject } from '../helpers/helper'; -import { device } from '../../../config'; -import { shortenText } from '../../../helpers'; import { ProfileContainer } from '../reusables'; @@ -113,8 +113,13 @@ export const MemberListContainer = ({ diff --git a/packages/uiweb/src/lib/components/chat/ChatProfile/MemberProfileCard.tsx b/packages/uiweb/src/lib/components/chat/ChatProfile/MemberProfileCard.tsx index 01787a63e..42c7f261c 100644 --- a/packages/uiweb/src/lib/components/chat/ChatProfile/MemberProfileCard.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatProfile/MemberProfileCard.tsx @@ -5,16 +5,15 @@ import React, { useContext, useState } from 'react'; import styled from 'styled-components'; // Internal Components -import { MoreLightIcon } from '../../../icons/MoreLight'; -import { shortenText } from '../../../helpers'; -import { ThemeContext } from '../theme/ThemeProvider'; +import { device } from '../../../config'; +import { pCAIP10ToWallet, shortenText } from '../../../helpers'; import { useChatData } from '../../../hooks'; +import { MoreLightIcon } from '../../../icons/MoreLight'; import { Section, Span } from '../../reusables'; -import Dropdown from '../reusables/DropDown'; -import { pCAIP10ToWallet } from '../../../helpers'; -import { device } from '../../../config'; -import { ProfileContainer } from '../reusables'; import { isAdmin } from '../helpers'; +import { ProfileContainer } from '../reusables'; +import Dropdown from '../reusables/DropDown'; +import { ThemeContext } from '../theme/ThemeProvider'; type MemberProfileCardProps = { key?: number | string; @@ -35,7 +34,7 @@ export const MemberProfileCard = ({ dropdownRef, }: MemberProfileCardProps) => { const theme = useContext(ThemeContext); - const { account } = useChatData(); + const { user } = useChatData(); const [dropdownHeight, setDropdownHeight] = useState(0); @@ -60,8 +59,13 @@ export const MemberProfileCard = ({
@@ -78,7 +82,7 @@ export const MemberProfileCard = ({ )} {pCAIP10ToWallet(member?.address)!.toLowerCase() !== - pCAIP10ToWallet(account!.toLowerCase()!) && + pCAIP10ToWallet(user!.account!.toLowerCase()!) && dropdownValues.length > 0 && (
- >; + setPendingMemberPaginationData: React.Dispatch>; pendingMembers: ChatMemberProfile[]; setShowPendingRequests: React.Dispatch>; showPendingRequests: boolean; @@ -39,10 +36,9 @@ type PendingMembersProps = { }; type AcceptedMembersProps = { acceptedMemberPaginationData: MemberPaginationData; - setAcceptedMemberPaginationData: React.Dispatch< - React.SetStateAction - >; + setAcceptedMemberPaginationData: React.Dispatch>; acceptedMembers: ChatMemberProfile[]; + accountStatus: ParticipantStatus | null; chatId: string; theme: IChatTheme; }; @@ -75,11 +71,7 @@ export const PendingMembers = ({ const isInViewportPending = useIsInViewport(pendingMemberPageRef, '1px'); useEffect(() => { - if ( - !isInViewportPending || - pendingMemberPaginationData.loading || - pendingMemberPaginationData.finishedFetching - ) { + if (!isInViewportPending || pendingMemberPaginationData.loading || pendingMemberPaginationData.finishedFetching) { return; } @@ -93,10 +85,11 @@ export const PendingMembers = ({ if (pendingMembers && pendingMembers.length) { return ( - setShowPendingRequests(!showPendingRequests)} - > - + setShowPendingRequests(!showPendingRequests)}> + Pending Requests {count} @@ -126,12 +119,13 @@ export const PendingMembers = ({ - +
)} -
+
); @@ -160,48 +160,20 @@ export const AcceptedMembers = ({ acceptedMembers, setAcceptedMemberPaginationData, acceptedMemberPaginationData, + accountStatus, chatId, theme, }: AcceptedMembersProps) => { - const { account } = useChatData(); + const { toast } = useChatData(); const acceptedMemberPageRef = useRef(null); - const [accountStatus, setAccountStatus] = useState( - null - ); - const [selectedMemberAddress, setSelectedMemberAddress] = useState< - string | null - >(null); + const [selectedMemberAddress, setSelectedMemberAddress] = useState(null); const dropdownRef = useRef(null); - const { - addMember, - removeMember, - modifyLoading, - addLoading, - removeLoading, - modifyParticipant, - } = useUpdateGroup(); - const groupInfoToast = useToast(); - const { fetchMemberStatus } = useGroupMemberUtilities(); + const { addMember, removeMember, modifyLoading, addLoading, removeLoading, modifyParticipant } = useUpdateGroup(); const isInViewportPending = useIsInViewport(acceptedMemberPageRef, '1px'); useEffect(() => { - if (account && chatId) { - (async () => { - const status = await fetchMemberStatus({ chatId, accountId: account }); - if (status) { - setAccountStatus(status); - } - })(); - } - }, []); - - useEffect(() => { - if ( - !isInViewportPending || - acceptedMemberPaginationData.loading || - acceptedMemberPaginationData.finishedFetching - ) { + if (!isInViewportPending || acceptedMemberPaginationData.loading || acceptedMemberPaginationData.finishedFetching) { return; } @@ -228,11 +200,16 @@ export const AcceptedMembers = ({ handleError(response, SUCCESS_MESSAGE[UPDATE_KEYS.REMOVE_MEMBER]); } } catch (error) { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: 'Please, try again', toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } finally { setSelectedMemberAddress(null); @@ -253,32 +230,46 @@ export const AcceptedMembers = ({ handleError(response, SUCCESS_MESSAGE[UPDATE_KEYS.REMOVE_ADMIN]); } } catch (error) { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: 'Please, try again', toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } finally { setSelectedMemberAddress(null); } }; - const handleError = (response: any, errMessage: string) => { if (typeof response !== 'string') { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Success', toastMessage: errMessage, toastType: 'SUCCESS', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } else { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: 'Error', toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); } }; @@ -319,8 +310,7 @@ export const AcceptedMembers = ({ key={index} member={item} dropdownValues={ - isAdmin(item) && - accountStatus?.role === GROUP_ROLES.ADMIN.toLowerCase() + isAdmin(item) && accountStatus?.role === GROUP_ROLES.ADMIN.toLowerCase() ? [removeAdminDropdown, removeMemberDropdown] : accountStatus?.role === GROUP_ROLES.ADMIN.toLowerCase() ? [addAdminDropdown, removeMemberDropdown] @@ -331,10 +321,16 @@ export const AcceptedMembers = ({ dropdownRef={dropdownRef} /> ))} -
+
{acceptedMemberPaginationData.loading && (
- +
)} @@ -381,8 +377,7 @@ const PendingSection = styled.div` const ArrowImage = styled(Image)` margin-left: auto; - transform: ${(props) => - props?.setPosition ? 'rotate(0)' : 'rotate(180deg)'}; + transform: ${(props) => (props?.setPosition ? 'rotate(0)' : 'rotate(180deg)')}; `; const Badge = styled.div` diff --git a/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx b/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx index b7aaa0e6f..ea26efc56 100644 --- a/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx @@ -1,13 +1,10 @@ -import React, { useContext } from 'react'; -import { - IChatTheme, - IChatViewComponentProps, - -} from '../exportedTypes'; +import React, { useContext, useEffect, useState } from 'react'; import { MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE } from '../../../types'; +import { IChatTheme, IChatViewComponentProps } from '../exportedTypes'; import { chatLimit, device } from '../../../config'; -import { Section, Span } from '../../reusables'; +import { deriveChatId } from '../../../helpers'; +import { Section, Span, Spinner } from '../../reusables'; import { ChatViewList } from '../ChatViewList'; import styled from 'styled-components'; @@ -25,9 +22,7 @@ interface IThemeProps { theme?: IChatTheme; } -export const ChatViewComponent: React.FC = ( - options: IChatViewComponentProps -) => { +export const ChatViewComponent: React.FC = (options: IChatViewComponentProps) => { const { chatId = null, chatFilterList = [], @@ -50,36 +45,73 @@ export const ChatViewComponent: React.FC = ( welcomeComponent = null, } = options || {}; - const { env, signer, account, pgpPrivateKey } = useChatData(); - - // const [conversationHash, setConversationHash] = useState(); - + const { user } = useChatData(); const theme = useContext(ThemeContext); const isMobile = useMediaQuery(device.mobileL); + if (!user) { + console.warn( + 'Chat::ChatView::You need to pass either push user, or a signer, or account and pgpPrivateKey in ChatViewComponent to send messages.' + ); + } + + // set loading state + const [initialized, setInitialized] = useState({ + loading: true, + derivedChatId: '', + }); + + useEffect(() => { + const fetchDerivedChatId = async () => { + setInitialized((currentState) => ({ ...currentState, loading: true })); + + if (chatId) { + const id = await deriveChatId(chatId, user); + setInitialized({ loading: false, derivedChatId: id }); + } else { + setInitialized({ loading: false, derivedChatId: '' }); + } + }; + + fetchDerivedChatId(); + }, [chatId, user]); // Re-run this effect if chatId or env changes + return ( - {chatId ? ( + {/* If initialized is loading then show spinner */} + {initialized.loading && ( +
+ +
+ )} + + {/* If chat id is present and initialized is not loading then show chat view */} + {!initialized.loading && chatId ? ( <> - {chatProfile && - } + {/* Load ChatProfile if in options */} + {chatProfile && ( + + )} + + {/* Load ChatViewList if in options */}
= ( flexDirection="column" justifyContent="start" > - { chatViewList && ( + {chatViewList && ( )}
- {/* )} */} - {!signer && !(!!account && !!pgpPrivateKey) && !isConnected && ( + + {/* Check if user is not in read mode */} + {/* This will probably be not needed anymore */} + {/* {!signer && !(!!account && !!pgpPrivateKey) && !isConnected && (
- - You need to either pass signer or isConnected to send messages{' '} - + +
+ )} */} + + {/* Load MessageInput if in options and user is present */} + {messageInput && user && ( +
+
)} - {messageInput && - (!!signer || (!!account && !!pgpPrivateKey) || isConnected) && ( -
- -
- )} ) : ( -
- { welcomeComponent } -
+
{welcomeComponent}
)}
); @@ -135,6 +169,5 @@ export const ChatViewComponent: React.FC = ( //styles const Conatiner = styled(Section)` border: ${(props) => props.theme.border?.chatViewComponent}; - backdrop-filter: ${(props) => props.theme.backdropFilter}; box-sizing: border-box; `; diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx index 9d5874222..f1702b277 100644 --- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx @@ -1,60 +1,46 @@ -import { - ReactElement, - ReactNode, - useContext, - useEffect, - useState, -} from 'react'; +import { ReactElement, ReactNode, useContext, useEffect, useState } from 'react'; import moment from 'moment'; -import styled from 'styled-components'; import { TwitterTweetEmbed } from 'react-twitter-embed'; +import styled from 'styled-components'; +import { MdDownload } from 'react-icons/md'; -import { Section, Span, Image } from '../../reusables'; -import { checkTwitterUrl } from '../helpers/twitter'; import { ChatDataContext } from '../../../context'; import { useChatData } from '../../../hooks'; +import { Image, Section, Span } from '../../reusables'; +import { checkTwitterUrl } from '../helpers/twitter'; import { ThemeContext } from '../theme/ThemeProvider'; +import { FILE_ICON } from '../../../config'; +import { formatFileSize, getPfp, pCAIP10ToWallet, shortenText } from '../../../helpers'; import { FileMessageContent } from '../../../types'; import { IMessagePayload, TwitterFeedReturnType } from '../exportedTypes'; -import { FILE_ICON } from '../../../config'; -import { - formatFileSize, - getPfp, - pCAIP10ToWallet, - shortenText, -} from '../../../helpers'; const SenderMessageAddress = ({ chat }: { chat: IMessagePayload }) => { - const { account } = useContext(ChatDataContext); + const { user } = useContext(ChatDataContext); const theme = useContext(ThemeContext); - return ( - <> - {chat.fromCAIP10.split(':')[1] !== account && ( - - {chat.fromDID.split(':')[1].slice(0, 6)}... - {chat.fromDID.split(':')[1].slice(-6)} - - )} - - ); + return chat.fromCAIP10?.split(':')[1] !== user?.account ? ( + + {chat.fromDID?.split(':')[1].slice(0, 6)}... + {chat.fromDID?.split(':')[1].slice(-6)} + + ) : null; }; const SenderMessageProfilePicture = ({ chat }: { chat: IMessagePayload }) => { - const { account, env } = useContext(ChatDataContext); + const { user } = useContext(ChatDataContext); const [pfp, setPfp] = useState(''); const getUserPfp = async () => { const pfp = await getPfp({ - account: chat.fromCAIP10.split(':')[1], - env: env, + user: user, + recipient: chat.fromCAIP10?.split(':')[1], }); if (pfp) { setPfp(pfp); @@ -62,10 +48,14 @@ const SenderMessageProfilePicture = ({ chat }: { chat: IMessagePayload }) => { }; useEffect(() => { getUserPfp(); - }, [account, chat.fromCAIP10]); + }, [chat.fromCAIP10]); + return ( -
- {chat.fromCAIP10.split(':')[1] !== account && ( +
+ {chat.fromCAIP10?.split(':')[1] !== user?.account && (
{pfp && ( {isGroup && } -
+
{isGroup && } {children}
-
); }; -const MessageCard = ({ - chat, - position, - isGroup, -}: { - chat: IMessagePayload; - position: number; - isGroup: boolean; -}) => { +const MessageCard = ({ chat, position, isGroup }: { chat: IMessagePayload; position: number; isGroup: boolean }) => { const theme = useContext(ThemeContext); const time = moment(chat.timestamp).format('hh:mm a'); return ( - + {' '} -
- {chat.messageContent.split('\n').map((str) => ( +
+ {chat?.messageContent?.split('\n').map((str) => ( {str} @@ -191,11 +166,7 @@ const MessageCard = ({ ? `${theme.fontWeight?.chatSentBubbleTimestampText}` : `${theme.fontWeight?.chatReceivedBubbleTimestampText}` } - color={ - position - ? `${theme.textColor?.chatSentBubbleText}` - : `${theme.textColor?.chatReceivedBubbleText}` - } + color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`} bottom="6px" right="10px" > @@ -206,22 +177,19 @@ const MessageCard = ({ ); }; -const FileCard = ({ - chat, - isGroup, -}: { - chat: IMessagePayload; - position: number; - isGroup: boolean; -}) => { - const fileContent: FileMessageContent = JSON.parse(chat.messageContent); +const FileCard = ({ chat, isGroup }: { chat: IMessagePayload; position: number; isGroup: boolean }) => { + const fileContent: FileMessageContent = JSON.parse(chat?.messageContent); const name = fileContent.name; const content = fileContent.content as string; const size = fileContent.size; return ( - +
extension icon -
- +
+ {shortenText(name, 11)} - + {formatFileSize(size)}
@@ -253,24 +230,19 @@ const FileCard = ({ rel="noopener noreferrer" download > -
); }; -const ImageCard = ({ - chat, - position, - isGroup, -}: { - chat: IMessagePayload; - position: number; - isGroup: boolean; -}) => { +const ImageCard = ({ chat, position, isGroup }: { chat: IMessagePayload; position: number; isGroup: boolean }) => { return ( - +
{ +const GIFCard = ({ chat, position, isGroup }: { chat: IMessagePayload; position: number; isGroup: boolean }) => { return ( - +
{ return ( - +
{ - const { account } = useChatData(); +export const ChatViewBubble = ({ + decryptedMessagePayload, + isGroup = false, +}: { + decryptedMessagePayload: IMessagePayload; + isGroup?: boolean; +}) => { + const { user } = useChatData(); const position = - pCAIP10ToWallet(decryptedMessagePayload.fromDID).toLowerCase() !== account?.toLowerCase() - ? 0 - : 1; + pCAIP10ToWallet(decryptedMessagePayload.fromDID).toLowerCase() !== user?.account?.toLowerCase() ? 0 : 1; const { tweetId, messageType }: TwitterFeedReturnType = checkTwitterUrl({ message: decryptedMessagePayload?.messageContent, }); - const [isGroup, setIsGroup] = useState(false); - useEffect(() => { - if (decryptedMessagePayload.toDID.split(':')[0] === 'eip155') { - if (isGroup) { - setIsGroup(false); - } - } else { - if (!isGroup) { - setIsGroup(true); - } - } - }, [decryptedMessagePayload.toDID, isGroup]); if (messageType === 'TwitterFeedLink') { decryptedMessagePayload.messageType = 'TwitterFeedLink'; } if (decryptedMessagePayload.messageType === 'GIF') { - return ; + return ( + + ); } if (decryptedMessagePayload.messageType === 'Image') { - return ; + return ( + + ); } if (decryptedMessagePayload.messageType === 'File') { - return ; + return ( + + ); } if (decryptedMessagePayload.messageType === 'TwitterFeedLink') { return ( @@ -386,17 +368,18 @@ export const ChatViewBubble = ({ decryptedMessagePayload }: { decryptedMessagePa /> ); } - return ; + return ( + + ); }; -const FileDownloadIcon = styled.i` - color: #575757; -`; - const FileDownloadIconAnchor = styled.a` font-size: 20px; `; -const MessageSection = styled(Section)<{border:string}>` -border: ${(props) => props.border}; +const MessageSection = styled(Section)<{ border: string }>` + border: ${(props) => props.border}; `; - diff --git a/packages/uiweb/src/lib/components/chat/ChatViewList/ActionRequestBubble.tsx b/packages/uiweb/src/lib/components/chat/ChatViewList/ActionRequestBubble.tsx new file mode 100644 index 000000000..46d5ae188 --- /dev/null +++ b/packages/uiweb/src/lib/components/chat/ChatViewList/ActionRequestBubble.tsx @@ -0,0 +1,236 @@ +import { IFeeds } from '@pushprotocol/restapi'; +import { Dispatch, useContext, useState } from 'react'; +import { MdCheckCircle } from 'react-icons/md'; +import styled from 'styled-components'; +import { useChatData } from '../../../hooks'; +import useApproveChatRequest from '../../../hooks/chat/useApproveChatRequest'; +import useRejectChatRequest from '../../../hooks/chat/useRejectChatRequest'; +import { Section, Span, Spinner } from '../../reusables'; +import ParticleEffectButton from '../../reusables/ParticleEffectButton'; +import { Group } from '../exportedTypes'; +import { IChatTheme } from '../theme'; +import { ThemeContext } from '../theme/ThemeProvider'; +import { ChatInfoResponse } from '../types'; +import { AcceptCircleIcon, CancelCircleIcon } from '../../../icons/PushIcons'; + +// Constants +const APPROVE_REQUEST_TEXT = { + GROUP: `You were invited to this group. Please accept to continue messaging in this group.`, + W2W: `This wallet wants to chat with you! Please accept to continue or reject to decline.`, +}; + +/** + * @interface IThemeProps + * this interface is used for defining the props for styled components + */ +interface IThemeProps { + theme?: IChatTheme; +} +export interface IActionRequestBubbleProps { + chatInfo?: ChatInfoResponse | null; +} + +export const ActionRequestBubble = ({ chatInfo = null }: IActionRequestBubbleProps) => { + const { user, toast } = useChatData(); + + const theme = useContext(ThemeContext); + const { approveChatRequest, loading: approveLoading } = useApproveChatRequest(); + const { rejectChatRequest, loading: rejectLoading } = useRejectChatRequest(); + + const [isApproved, setIsApproved] = useState(false); + const [isRejected, setIsRejected] = useState(false); + + const handleApproveChatRequest = async () => { + try { + if (!user || user.readmode()) { + return; + } + + if (chatInfo?.recipient) { + const response = await approveChatRequest({ + chatId: chatInfo?.recipient, // since recipient is chatId for group but wallet for dms + }); + setIsApproved(true); + } else { + toast.showMessageToast({ + toastTitle: 'Error', + toastMessage: 'Invalid Chat', + toastType: 'ERROR', + getToastIcon: (size: number) => ( + + ), + }); + } + } catch (err: Error | any) { + console.error(`UIWeb::ActionRequestBubble::handleApproveChatRequest::error`, err); + } + }; + + const handleRejectChatRequest = async () => { + try { + if (!user || user.readmode()) { + return; + } + + if (chatInfo?.recipient) { + const response = await rejectChatRequest({ + chatId: chatInfo?.recipient, // since recipient is chatId for group but wallet for dms + }); + setIsRejected(true); + + toast.showMessageToast({ + toastTitle: 'Invitation Declined', + toastMessage: 'This conversation has been removed from your request list.', + toastType: 'WARNING', + getToastIcon: (size: number) => ( + + ), + }); + } else { + toast.showMessageToast({ + toastTitle: 'Error', + toastMessage: 'Invalid Chat ID', + toastType: 'ERROR', + getToastIcon: (size: number) => ( + + ), + }); + } + } catch (err: Error | any) { + console.error(`UIWeb::ActionRequestBubble::handleRejectChatRequest::error`, err); + } + }; + + // Render + return ( +
+ +
+ ); +}; + +//styles +const Button = styled.button` + border: none; + cursor: pointer; + border-radius: 100%; + background: transparent; + padding: 0px; + border: none; + height: 40px; + width: 40px; + display: flex; + justify-content: center; + align-items: center; + + &.disabled { + cursor: not-allowed; + opacity: 0.5; + } + + &.primary.active { + background: ${(props) => props.theme.iconColor?.approveRequest}; + } + + &.secondary.active { + background: ${(props) => props.theme.iconColor?.rejectRequest}; + } +`; diff --git a/packages/uiweb/src/lib/components/chat/ChatViewList/ApproveRequestBubble.tsx b/packages/uiweb/src/lib/components/chat/ChatViewList/ApproveRequestBubble.tsx deleted file mode 100644 index 231f3b7a6..000000000 --- a/packages/uiweb/src/lib/components/chat/ChatViewList/ApproveRequestBubble.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { IFeeds } from '@pushprotocol/restapi'; -import { ThemeContext } from '../theme/ThemeProvider'; -import { Dispatch, useContext } from 'react'; -import { Section, Span, Spinner } from '../../reusables'; -import useApproveChatRequest from '../../../hooks/chat/useApproveChatRequest'; -import { useChatData } from '../../../hooks'; -import styled from 'styled-components'; -import { IChatTheme } from '../theme'; -import { Group } from '../exportedTypes'; -import useToast from '../reusables/NewToast'; -import { MdCheckCircle } from 'react-icons/md'; - -/** - * @interface IThemeProps - * this interface is used for defining the props for styled components - */ -interface IThemeProps { - theme?: IChatTheme; -} -export interface IApproveRequestBubbleProps { - chatId: string; - groupInfo?: Group | null; -} - - -export const ApproveRequestBubble = ({ - groupInfo = null, - chatId, -}: IApproveRequestBubbleProps) => { - const { pgpPrivateKey } = useChatData(); - - const ApproveRequestText = { - GROUP: `You were invited to the group ${groupInfo?.groupName}. Please accept to continue messaging in this group.`, - W2W: ` Please accept to enable push chat from this wallet`, - }; - - const theme = useContext(ThemeContext); - const { approveChatRequest, loading: approveLoading } = - useApproveChatRequest(); - const approveToast = useToast(); - - const handleApproveChatRequest = async () => { - try { - if (!pgpPrivateKey) { - return; - } - - const response = await approveChatRequest({ - chatId, - }); - - if (response) { - approveToast.showMessageToast({ - toastTitle: 'Success', - toastMessage: 'Group Invitation sent', - toastType: 'SUCCESS', - getToastIcon: (size) => , - }); - } - } catch (error_: Error | any) { - console.log(error_.message); - } - }; - return ( -
- - {groupInfo - ? ApproveRequestText.GROUP - : ApproveRequestText.W2W} - - - -
- ); -}; - -//styles -const Button = styled.button` - border: none; - cursor: pointer; - border-radius: 8px; - background: ${(props) => props.theme.backgroundColor!.buttonBackground}; - border: none; - color: ${(props) => props.theme.textColor!.buttonText}; - width: 100%; - font-size: 16px; - font-weight: 600; - line-height: 24px; - max-height: 48px; - min-height: 48px; - padding: 0px 24px; - display: flex; - justify-content: center; - align-items: center; -`; diff --git a/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx b/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx index 5d2a0ca77..a5461664e 100644 --- a/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx @@ -1,43 +1,36 @@ +// React + Web3 Essentials import React, { useContext, useEffect, useRef, useState } from 'react'; -import { - IMessageIPFS, - IMessageIPFSWithCID, - IUser, -} from '@pushprotocol/restapi'; +// External Packages +import { IMessageIPFS, IMessageIPFSWithCID, IUser } from '@pushprotocol/restapi'; import moment from 'moment'; -import styled from 'styled-components'; -import { ToastContainer } from 'react-toastify'; import { MdError } from 'react-icons/md'; +import styled from 'styled-components'; +// Internal Compoonents import { chatLimit } from '../../../config'; -import { - appendUniqueMessages, - dateToFromNowDaily, - getAddress, - pCAIP10ToWallet, - walletToPCAIP10, -} from '../../../helpers'; +import { appendUniqueMessages, dateToFromNowDaily, pCAIP10ToWallet, walletToPCAIP10 } from '../../../helpers'; import { useChatData, usePushChatStream } from '../../../hooks'; +import useFetchChat from '../../../hooks/chat/useFetchChat'; import useFetchMessageUtilities from '../../../hooks/chat/useFetchMessageUtilities'; +import useGetGroupByIDnew from '../../../hooks/chat/useGetGroupByIDnew'; +import useGroupMemberUtilities from '../../../hooks/chat/useGroupMemberUtilities'; +import usePushUser from '../../../hooks/usePushUser'; import { Section, Span, Spinner } from '../../reusables'; import { ChatViewBubble } from '../ChatViewBubble'; -import { Group, IChatViewListProps } from '../exportedTypes'; -import { IChatTheme } from '../theme'; +import { checkIfNewRequest, transformStreamToIMessageIPFSWithCID } from '../helpers'; +import { ActionRequestBubble } from './ActionRequestBubble'; +import { ENCRYPTION_KEYS, EncryptionMessage } from './MessageEncryption'; + +// Internal Configs import { ThemeContext } from '../theme/ThemeProvider'; -import useFetchChat from '../../../hooks/chat/useFetchChat'; -import { ApproveRequestBubble } from './ApproveRequestBubble'; -import { ENCRYPTION_KEYS, EncryptionMessage } from './MessageEncryption'; -import useGroupMemberUtilities from '../../../hooks/chat/useGroupMemberUtilities'; +// Assets + +// Interfaces & Types +import { Group, IChatViewListProps } from '../exportedTypes'; +import { IChatTheme } from '../theme'; import { ChatInfoResponse } from '../types'; -import useUserProfile from '../../../hooks/useUserProfile'; -import useGetGroupByIDnew from '../../../hooks/chat/useGetGroupByIDnew'; -import useToast from '../reusables/NewToast'; -import { - checkIfNewRequest, - transformStreamToIMessageIPFSWithCID, -} from '../helpers'; /** * @interface IThemeProps @@ -47,202 +40,162 @@ interface IThemeProps { theme?: IChatTheme; blur: boolean; } -const ChatStatus = { + +interface IChatViewListInitialized { + loading: boolean; + chatInfo: ChatInfoResponse | null; + groupInfo: Group | null; + isParticipant: boolean; + isHidden: boolean; + invalidChat: boolean; +} + +// Constants +const CHAT_STATUS = { FIRST_CHAT: `This is your first conversation with recipient.\n Start the conversation by sending a message.`, INVALID_CHAT: 'Invalid chatId', }; -export const ChatViewList: React.FC = ( - options: IChatViewListProps -) => { +// Exported Interfaces & Types + +// Exported Functions +export const ChatViewList: React.FC = (options: IChatViewListProps) => { + // setup loading state + const [initialized, setInitialized] = useState({ + loading: true, + chatInfo: null, + groupInfo: null, + isParticipant: false, + isHidden: false, + invalidChat: false, + }); + + const [loading, setLoading] = useState(true); + const { chatId, limit = chatLimit, chatFilterList = [] } = options || {}; - const { account, user } = useChatData(); + const { user, toast } = useChatData(); const [chatInfo, setChatInfo] = useState(null); const [groupInfo, setGroupInfo] = useState(null); const [userInfo, setUserInfo] = useState(null); - const [chatStatusText, setChatStatusText] = useState(''); + // const [chatStatusText, setChatStatusText] = useState(''); const [messages, setMessages] = useState([]); - const [loading, setLoading] = useState(true); - const { historyMessages, historyLoading: messageLoading } = - useFetchMessageUtilities(); + const { historyMessages, historyLoading: messageLoading } = useFetchMessageUtilities(); const listInnerRef = useRef(null); - const [isMember, setIsMember] = useState(false); + const [stopPagination, setStopPagination] = useState(false); const { fetchChat } = useFetchChat(); - const { fetchUserProfile } = useUserProfile(); const { getGroupByIDnew } = useGetGroupByIDnew(); const { fetchMemberStatus } = useGroupMemberUtilities(); - const chatViewListToast = useToast(); - - //hack for stream not working - const [chatStream, setChatStream] = useState({}); // to track any new messages - const [chatRequestStream, setChatRequestStream] = useState({}); // to track any new messages - - const [chatAcceptStream, setChatAcceptStream] = useState({}); // to track any new messages - const [participantRemoveStream, setParticipantRemoveStream] = useState( - {} - ); // to track if a participant is removed from group - const [participantLeaveStream, setParticipantLeaveStream] = useState({}); // to track if a participant leaves a group - const [participantJoinStream, setParticipantJoinStream] = useState({}); // to track if a participant joins a group - - const [groupUpdateStream, setGroupUpdateStream] = useState({}); - const [formattedChatId, setFormattedChatId] = useState(''); - - // const { - // chatStream, - // groupUpdateStream, - // chatAcceptStream, - // participantJoinStream, - // participantLeaveStream, - // participantRemoveStream, - // } = usePushChatStream(); - - //event listeners - usePushChatStream(); - useEffect(() => { - window.addEventListener('chatStream', (e: any) => setChatStream(e.detail)); - window.addEventListener('chatRequestStream', (e: any) => - setChatRequestStream(e.detail) - ); - window.addEventListener('chatAcceptStream', (e: any) => - setChatAcceptStream(e.detail) - ); - window.addEventListener('participantRemoveStream', (e: any) => - setParticipantRemoveStream(e.detail) - ); - window.addEventListener('participantLeaveStream', (e: any) => - setParticipantLeaveStream(e.detail) - ); - window.addEventListener('participantJoinStream', (e: any) => - setParticipantJoinStream(e.detail) - ); - window.addEventListener('groupUpdateStream', (e: any) => - setGroupUpdateStream(e.detail) - ); - return () => { - window.removeEventListener('chatStream', (e: any) => - setChatStream(e.detail) - ); - window.removeEventListener('chatRequestStream', (e: any) => - setChatRequestStream(e.detail) - ); - - window.removeEventListener('chatAcceptStream', (e: any) => - setChatAcceptStream(e.detail) - ); - window.removeEventListener('participantRemoveStream', (e: any) => - setParticipantRemoveStream(e.detail) - ); - window.removeEventListener('participantLeaveStream', (e: any) => - setParticipantLeaveStream(e.detail) - ); - window.removeEventListener('participantJoinStream', (e: any) => - setParticipantJoinStream(e.detail) - ); - window.removeEventListener('groupUpdateStream', (e: any) => - setGroupUpdateStream(e.detail) - ); - }; - }, []); + + // for stream + const { + chatStream, + chatAcceptStream, + chatRequestStream, + participantJoinStream, + participantLeaveStream, + participantRemoveStream, + groupUpdateStream, + } = useChatData(); + const theme = useContext(ThemeContext); const dates = new Set(); - const { env } = useChatData(); - useEffect(() => { - setChatStatusText(''); - }, [chatId, account, env, user]); - - useEffect(() => { - setChatInfo(null); - setMessages([]); - setGroupInfo(null); - }, [chatId, account, user, env]); + // Primary Hook that fetches and sets ChatInfo which then fetches and sets UserInfo or GroupInfo + // Which then calls await getMessagesCall(); to fetch messages useEffect(() => { (async () => { if (!user) return; if (chatId) { - let formattedChatId; - if (chatId.includes('.')) { - formattedChatId = (await getAddress(chatId, env))!; - } else formattedChatId = chatId; - setFormattedChatId(formattedChatId); - const chat = await fetchChat({ chatId: formattedChatId }); - if (Object.keys(chat || {}).length) { - setChatInfo(chat as ChatInfoResponse); + const info = await fetchChat({ chatId: chatId }); + + // get group info + let groupMeta; + if (info && info?.meta?.group) { + groupMeta = await getGroupByIDnew({ groupId: chatId }); } - setLoading(false); - } - })(); - }, [chatId, user, account, env]); - useEffect(() => { - (async () => { - let UserProfile, GroupProfile; - if ( - chatInfo && - !chatInfo?.meta?.group && - chatInfo?.participants && - account - ) { - UserProfile = await fetchUserProfile({ - profileId: pCAIP10ToWallet( - chatInfo?.participants.find( - (address) => address != walletToPCAIP10(account) - ) || formattedChatId - ), - env, - user, + // get member status + const status = await fetchMemberStatus({ + chatId: chatId, + accountId: user?.account || '', }); - if (UserProfile) setUserInfo(UserProfile); - setChatStatusText(ChatStatus.FIRST_CHAT); - } else if (chatInfo && chatInfo?.meta?.group) { - GroupProfile = await getGroupByIDnew({ groupId: formattedChatId }); - if (GroupProfile) setGroupInfo(GroupProfile); - else { - setChatStatusText(ChatStatus.INVALID_CHAT); + + // also find out if chat is encrypted + let hidden = false; + if ( + user && + !user.readmode() && + ((info?.meta?.group && status?.participant) || + (!info?.meta?.group && (info?.list === 'CHATS' || info?.list === 'REQUESTS')) || + (info?.meta?.group && groupMeta?.isPublic)) + ) { + hidden = false; + } else { + hidden = true; } + + // Finally initialize the component + setInitialized({ + loading: false, + chatInfo: Object.keys(info || {}).length ? (info as ChatInfoResponse) : null, + groupInfo: groupMeta ? groupMeta : null, + isParticipant: status?.participant ?? false, + isHidden: hidden, + invalidChat: info === undefined ? true : false, + }); } })(); - }, [chatInfo]); + + // cleanup + return () => { + setInitialized({ + loading: true, + chatInfo: null, + groupInfo: null, + isParticipant: false, + isHidden: false, + invalidChat: false, + }); + }; + }, [chatId, user, chatAcceptStream, participantJoinStream, participantLeaveStream, participantRemoveStream]); + + // When loading is done + useEffect(() => { + if (initialized.loading) return; + + (async function () { + await getMessagesCall(); + })(); + }, [initialized.loading]); //moniters stream changes useEffect(() => { - if ( - Object.keys(chatAcceptStream || {}).length > 0 && - chatAcceptStream.constructor === Object - ) { + if (Object.keys(chatAcceptStream || {}).length > 0 && chatAcceptStream.constructor === Object) { const updatedChatInfo = { ...(chatInfo as ChatInfoResponse) }; if (updatedChatInfo) updatedChatInfo.list = 'CHATS'; setChatInfo(updatedChatInfo); } }, [chatAcceptStream]); + useEffect(() => { - if ( - Object.keys(chatStream || {}).length > 0 && - chatStream.constructor === Object - ) { + if (Object.keys(chatStream || {}).length > 0 && chatStream.constructor === Object) { transformSteamMessage(chatStream); - setChatStatusText(''); + // setChatStatusText(''); scrollToBottom(); } }, [chatStream]); useEffect(() => { - if ( - Object.keys(chatRequestStream || {}).length > 0 && - chatRequestStream.constructor === Object - ) { + if (Object.keys(chatRequestStream || {}).length > 0 && chatRequestStream.constructor === Object) { transformSteamMessage(chatRequestStream); - setChatStatusText(''); + // setChatStatusText(''); scrollToBottom(); } }, [chatRequestStream]); useEffect(() => { - if ( - Object.keys(groupUpdateStream || {}).length > 0 && - groupUpdateStream.constructor === Object - ) + if (Object.keys(groupUpdateStream || {}).length > 0 && groupUpdateStream.constructor === Object) transformGroupDetails(groupUpdateStream); }, [groupUpdateStream]); @@ -250,17 +203,11 @@ export const ChatViewList: React.FC = ( if (!user) { return; } - if ( - chatInfo && - (item?.chatId == chatInfo?.chatId || checkIfNewRequest(item, formattedChatId)) - ) { + + if (initialized.chatInfo && (item?.chatId === initialized.chatInfo?.chatId || checkIfNewRequest(item, chatId))) { const transformedMessage = transformStreamToIMessageIPFSWithCID(item); if (messages && messages.length) { - const newChatViewList = appendUniqueMessages( - messages, - [transformedMessage], - false - ); + const newChatViewList = appendUniqueMessages(messages, [transformedMessage], false); setFilteredMessages(newChatViewList); } else { setFilteredMessages([transformedMessage]); @@ -282,57 +229,18 @@ export const ChatViewList: React.FC = ( } }; - useEffect(() => { - if (chatInfo) { - (async function () { - await getMessagesCall(); - })(); - } - }, [chatInfo, user?.readmode(), account, env, chatId]); - useEffect(() => { if (messages && messages?.length && messages?.length <= limit) { - setChatStatusText(''); + // setChatStatusText(''); scrollToBottom(); } }, [messages]); - useEffect(() => { - if (user && account && groupInfo) { - (async () => { - const status = await fetchMemberStatus({ - chatId: groupInfo.chatId!, - accountId: account, - }); - if (status && typeof status !== 'string') { - setIsMember(status?.participant); - } else { - //show toast - chatViewListToast.showMessageToast({ - toastTitle: 'Error', - toastMessage: 'Error in fetching member details', - toastType: 'ERROR', - getToastIcon: (size) => , - }); - } - })(); - } - }, [ - account, - groupInfo, - chatInfo, - chatAcceptStream, - participantJoinStream, - participantLeaveStream, - participantRemoveStream, - ]); - //methods const scrollToBottom = () => { setTimeout(() => { if (listInnerRef.current) { - listInnerRef.current.scrollTop = - listInnerRef.current.scrollHeight + 100; + listInnerRef.current.scrollTop = listInnerRef.current.scrollHeight + 100; } }, 0); }; @@ -355,46 +263,41 @@ export const ChatViewList: React.FC = ( const getMessagesCall = async () => { let reference = null; + let stopFetchingChats = false; if (messages && messages?.length) { reference = messages[0].link; + if (!reference) { + stopFetchingChats = true; + setStopPagination(stopFetchingChats); + } } - if (user) { + if (user && !stopFetchingChats) { const chatHistory = await historyMessages({ limit: limit, - chatId:formattedChatId, + chatId: chatId, reference, }); + if (chatHistory?.length) { + const reversedChatHistory = chatHistory?.reverse(); if (messages && messages?.length) { - const newChatViewList = appendUniqueMessages( - messages, - chatHistory.reverse(), - true - ); + const newChatViewList = appendUniqueMessages(messages, reversedChatHistory, true); setFilteredMessages(newChatViewList as IMessageIPFSWithCID[]); } else { - setFilteredMessages(chatHistory.reverse() as IMessageIPFSWithCID[]); + setFilteredMessages(reversedChatHistory as IMessageIPFSWithCID[]); } } } }; const setFilteredMessages = (messageList: Array) => { - const updatedMessageList = messageList.filter( - (msg) => !chatFilterList.includes(msg.cid) - ); + const updatedMessageList = messageList.filter((msg) => !chatFilterList.includes(msg.cid)); if (updatedMessageList && updatedMessageList.length) { setMessages([...updatedMessageList]); } }; - const ifBlurChat = () => { - return !!( - user && - ((groupInfo && !groupInfo?.isPublic && !isMember) || user?.readmode()) - ); - }; type RenderDataType = { chat: IMessageIPFS; @@ -415,8 +318,10 @@ export const ChatViewList: React.FC = ( ); }; + return ( = ( justifyContent="start" padding="0 2px" theme={theme} - blur={ifBlurChat()} onScroll={(e) => { e.stopPropagation(); - onScroll(); + if (!stopPagination) onScroll(); }} > - {loading ? : ''} - {!loading && ( - <> - {(userInfo && userInfo.publicKey) || - (groupInfo && !groupInfo?.isPublic) ? ( +
+ {initialized.loading && ( + + )} + + {!initialized.loading && + ((user && user.pgpPublicKey) || (initialized.groupInfo && !initialized.groupInfo?.isPublic) ? ( + ) : user && user.readmode() ? ( + ) : ( - - )} - - {chatStatusText && ( -
- - {chatStatusText} - -
- )} - {messageLoading ? : ''} + + ))} +
+ + {initialized.loading ? : ''} + {!initialized.loading && ( + <> + {/* Loading section and information about the chat */} +
+ + {messages && + messages.length === 0 && + !messageLoading && + !groupInfo && + !initialized.invalidChat && + CHAT_STATUS.FIRST_CHAT} + {initialized.invalidChat && CHAT_STATUS.INVALID_CHAT} + + + {messageLoading ? : ''} +
{ - <> -
- {messages && - messages?.map((chat: IMessageIPFS, index: number) => { - const dateNum = moment(chat.timestamp).format('L'); - const position = - pCAIP10ToWallet(chat.fromDID)?.toLowerCase() !== - account?.toLowerCase() - ? 0 - : 1; - return ( - <> - {dates.has(dateNum) - ? null - : renderDate({ chat, dateNum })} -
- -
- - ); - })} -
- {chatInfo && chatInfo?.list === 'REQUESTS' && ( - + + {messages && + messages?.map((chat: IMessageIPFS, index: number) => { + const dateNum = moment(chat.timestamp).format('L'); + // TODO: This is a hack as chat.fromDID is converted with eip to match with user.account creating a bug for omnichain + const position = + pCAIP10ToWallet(chat.fromDID)?.toLowerCase() !== user?.account?.toLowerCase() ? 0 : 1; + return ( + <> + {dates.has(dateNum) ? null : renderDate({ chat, dateNum })} +
+ +
+ + ); + })} + + {initialized.chatInfo && initialized.chatInfo?.list === 'REQUESTS' && ( + )} - +
} )} -
); }; @@ -515,11 +434,11 @@ const ChatViewListCard = styled(Section)` &::-webkit-scrollbar { width: 5px; } - ${({ blur }) => - blur && - ` - filter: blur(12px); - `} + overscroll-behavior: contain; scroll-behavior: smooth; `; + +const ChatViewListCardInner = styled(Section)` + filter: ${(props) => (props.blur ? 'blur(6px)' : 'none')}; +`; diff --git a/packages/uiweb/src/lib/components/chat/ChatViewList/MessageEncryption.tsx b/packages/uiweb/src/lib/components/chat/ChatViewList/MessageEncryption.tsx index 89a4cd2e2..9fc476822 100644 --- a/packages/uiweb/src/lib/components/chat/ChatViewList/MessageEncryption.tsx +++ b/packages/uiweb/src/lib/components/chat/ChatViewList/MessageEncryption.tsx @@ -1,20 +1,27 @@ -import styled from "styled-components"; -import { Div, Section, Span } from "../../reusables"; -import { useDeviceWidthCheck } from "../../../hooks"; -import { useContext } from "react"; -import { ThemeContext } from "../theme/ThemeProvider"; -import { NoEncryptionIcon } from "../../../icons/NoEncryption"; -import { EncryptionIcon } from "../../../icons/Encryption"; +import { useContext } from 'react'; +import styled from 'styled-components'; +import { useDeviceWidthCheck } from '../../../hooks'; +import { EncryptionIcon } from '../../../icons/Encryption'; +import { NoEncryptionIcon } from '../../../icons/NoEncryption'; +import { PublicChatIcon } from '../../../icons/PushIcons'; +import { Div, Section, Span } from '../../reusables'; +import { ThemeContext } from '../theme/ThemeProvider'; export const ENCRYPTION_KEYS = { ENCRYPTED: 'ENCRYPTED', NO_ENCRYPTED: 'NO_ENCRYPTED', - NO_ENCRYPTED_GROUP: 'NO_ENCRYPTED_GROUP' + NO_ENCRYPTED_GROUP: 'NO_ENCRYPTED_GROUP', + PREVIEW: 'PREVIEW', + LOADING: 'LOADING', } as const; -export type EncryptionKeys = (typeof ENCRYPTION_KEYS)[keyof typeof ENCRYPTION_KEYS]; +export type EncryptionKeys = typeof ENCRYPTION_KEYS[keyof typeof ENCRYPTION_KEYS]; -const EncryptionMessageContent = { +export const EncryptionMessage = ({ id, className }: { id: EncryptionKeys; className?: string }) => { + const theme = useContext(ThemeContext); + const isMobile = useDeviceWidthCheck(771); + + const EncryptionMessageContent = { ENCRYPTED: { IconComponent: , text: 'Messages are end-to-end encrypted. Only users in this chat can view or listen to them. Click to learn more.', @@ -22,48 +29,58 @@ const EncryptionMessageContent = { NO_ENCRYPTED: { IconComponent: , text: `Messages are not encrypted`, - }, NO_ENCRYPTED_GROUP: { IconComponent: , text: `Messages in this group are not encrypted`, }, - - }; - export const EncryptionMessage = ({ id }: { id: EncryptionKeys}) => { - const theme = useContext(ThemeContext); - const isMobile = useDeviceWidthCheck(771); - return ( -
- - {EncryptionMessageContent[id].IconComponent} - - - {EncryptionMessageContent[id].text} - - -
- ); + PREVIEW: { + IconComponent: ( + + ), + text: `Chat in preview mode. Only public groups messages are visible.`, + }, + LOADING: { + IconComponent: null, + text: `Please wait while Push Chat loads the status of this chat...`, + }, }; - //styles - const EncryptionMessageDiv = styled(Div)` - display:flex; + return ( +
+ + {EncryptionMessageContent[id].IconComponent ? EncryptionMessageContent[id].IconComponent : null} + + + {EncryptionMessageContent[id].text} + + +
+ ); +}; + +//styles +const EncryptionMessageDiv = styled(Div)` + display: flex; text-align: center; svg { vertical-align: middle; } -`; \ No newline at end of file +`; diff --git a/packages/uiweb/src/lib/components/chat/ConnectButton/ConnectButton.tsx b/packages/uiweb/src/lib/components/chat/ConnectButton/ConnectButton.tsx index c8c18a89e..6922db0de 100644 --- a/packages/uiweb/src/lib/components/chat/ConnectButton/ConnectButton.tsx +++ b/packages/uiweb/src/lib/components/chat/ConnectButton/ConnectButton.tsx @@ -6,10 +6,10 @@ import { ethers } from 'ethers'; import { useAccount, useChatData } from '../../../hooks'; import { ThemeContext } from '../theme/ThemeProvider'; - import { getAddressFromSigner } from '../../../helpers'; import { IChatTheme } from '../theme'; import { device } from '../../../config'; +import { CONSTANTS } from '@pushprotocol/restapi'; /** * @interface IThemeProps @@ -19,42 +19,36 @@ interface IThemeProps { theme?: IChatTheme; } +export const ConnectButtonSub = ({ autoConnect = false }) => { + const { user, preInitializeUser } = useChatData(); + const { wallet, connecting, connect, disconnect } = useAccount({ env: user ? user.env : CONSTANTS.ENV.PROD }); -export const ConnectButtonSub = ({autoConnect = false}) => { - const {env} = useChatData() - const {wallet, connecting , connect, disconnect} = useAccount({env}); - - const { - signer, - setAccount, - setSigner, - } = useChatData(); + const { signer, setAccount, setSigner } = useChatData(); const theme = useContext(ThemeContext); - const setUserData = () => { if (wallet) { (async () => { - const ethersProvider = new ethers.providers.Web3Provider(wallet.provider, 'any') - const signer = ethersProvider.getSigner() - const newAdd = await getAddressFromSigner(signer) - setSigner(signer) - setAccount(newAdd); - })() + const ethersProvider = new ethers.providers.Web3Provider(wallet.provider, 'any'); + const signer = ethersProvider.getSigner(); + const newAdd = await getAddressFromSigner(signer); + preInitializeUser(newAdd, signer); + })(); } else if (!wallet) { - setAccount('') - setSigner(undefined) + setAccount(''); + setSigner(undefined); } - } + }; useEffect(() => { - if(wallet && !autoConnect) - disconnect(wallet); - setUserData() - }, [wallet]) + if (wallet && !autoConnect) disconnect(wallet); + setUserData(); + }, [wallet]); return !signer ? ( - + ) : ( <> @@ -64,22 +58,21 @@ export const ConnectButtonSub = ({autoConnect = false}) => { //styles const ConnectButtonDiv = styled.div` width: fit-content; - - button{ + + button { background: ${(props) => `${props.theme.backgroundColor?.buttonBackground}!important`}; color: ${(props) => `${props.theme.textColor?.buttonText}!important`}; - text-align:center; + text-align: center; font-size: 1em; - cursor:pointer; + cursor: pointer; border-radius: 10px; padding: 10px 20px; outline: none; border: none; cursor: pointer; font-weight: 600; - } - button:hover{ + button:hover { scale: 1.05; transition: 0.3s; } @@ -89,4 +82,4 @@ const ConnectButtonDiv = styled.div` body.modal-open { overflow-y: hidden; } -`; \ No newline at end of file +`; diff --git a/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx b/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx index 1c893821f..6f564ec87 100644 --- a/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx +++ b/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx @@ -3,14 +3,7 @@ import { useContext, useEffect, useState } from 'react'; import styled from 'styled-components'; import { MdError } from 'react-icons/md'; -import { - Button, - DropDownInput, - DropdownValueType, - InfoContainer, - ModalHeader, - TextInput, -} from '../reusables'; +import { Button, DropDownInput, DropdownValueType, InfoContainer, ModalHeader, TextInput } from '../reusables'; import { Section, Span, Spinner } from '../../reusables'; import useMediaQuery from '../../../hooks/useMediaQuery'; import { ModalHeaderProps } from './CreateGroupModal'; @@ -39,13 +32,7 @@ import { TypeKeys, ReadonlyInputType, } from '../types'; -import useToast from '../reusables/NewToast'; -import { - CriteriaValidationErrorType, - GuildData, - PushData, - Rule, -} from '../types/tokenGatedGroupCreationType'; +import { CriteriaValidationErrorType, GuildData, PushData, Rule } from '../types/tokenGatedGroupCreationType'; import { checkIfCustomEndpoint, checkIfGuild, @@ -58,18 +45,13 @@ import { validationCriteria, } from '../helpers'; import { IChatTheme } from '../exportedTypes'; +import { CONSTANTS } from '@pushprotocol/restapi'; -const AddCriteria = ({ - handlePrevious, - onClose, - criteriaStateManager, -}: ModalHeaderProps) => { +const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHeaderProps) => { const [selectedTypeValue, setSelectedTypeValue] = useState(0); - const [validationErrors, setValidationErrors] = - useState({}); + const [validationErrors, setValidationErrors] = useState({}); const [selectedCategoryValue, setSelectedCategoryValue] = useState(0); - const [selectedSubCategoryValue, setSelectedSubCategoryValue] = - useState(0); + const [selectedSubCategoryValue, setSelectedSubCategoryValue] = useState(0); const [validationLoading, setValidationLoading] = useState(false); const [guildComparison, setGuildComparison] = useState(''); const [selectedChainValue, setSelectedChainValue] = useState(0); @@ -88,9 +70,9 @@ const AddCriteria = ({ value: 0, range: 0, }); - const { env } = useChatData(); + const { user, toast } = useChatData(); + const env = user ? user.env : CONSTANTS.ENV.PROD; const theme = useContext(ThemeContext); - const groupInfoToast = useToast(); const isMobile = useMediaQuery(device.mobileL); @@ -209,8 +191,7 @@ const AddCriteria = ({ const dropdownChainsValues: Array = [ { id: 0, - value: - BLOCKCHAIN_NETWORK[env as keyof typeof BLOCKCHAIN_NETWORK].ETHEREUM, + value: BLOCKCHAIN_NETWORK[env as keyof typeof BLOCKCHAIN_NETWORK].ETHEREUM, title: 'Ethereum', icon: EthereumSvg, function: () => setSelectedChainValue(0), @@ -231,16 +212,14 @@ const AddCriteria = ({ }, { id: 3, - value: - BLOCKCHAIN_NETWORK[env as keyof typeof BLOCKCHAIN_NETWORK].OPTIMISM, + value: BLOCKCHAIN_NETWORK[env as keyof typeof BLOCKCHAIN_NETWORK].OPTIMISM, title: 'Optimism', icon: OptimismSvg, function: () => setSelectedChainValue(3), }, { id: 4, - value: - BLOCKCHAIN_NETWORK[env as keyof typeof BLOCKCHAIN_NETWORK].ARBITRUM, + value: BLOCKCHAIN_NETWORK[env as keyof typeof BLOCKCHAIN_NETWORK].ARBITRUM, title: 'Arbitrum', icon: ArbitrumSvg, function: () => setSelectedChainValue(4), @@ -252,35 +231,27 @@ const AddCriteria = ({ icon: FuseSvg, function: () => setSelectedChainValue(5), }, - ]; - if(env !== ENV.PROD) - { - - dropdownChainsValues.push( { + if (env !== ENV.PROD) { + dropdownChainsValues.push({ id: 6, value: BLOCKCHAIN_NETWORK[env].BERACHAIN, title: 'Berachain', icon: BerachainSvg, function: () => setSelectedChainValue(6), - } as DropdownValueType) + } as DropdownValueType); } - const onQuantityChange = (e: any) => { setQuantity({ ...quantity, value: e.target.value }); }; const verifyAndDoNext = async () => { setValidationLoading(true); - const _type = dropdownTypeValues[selectedTypeValue].value as - | 'PUSH' - | 'GUILD'; + const _type = dropdownTypeValues[selectedTypeValue].value as 'PUSH' | 'GUILD'; const category: string = _type === 'PUSH' - ? (dropdownCategoryValues[_type] as DropdownValueType[])[ - selectedCategoryValue - ].value || CATEGORY.ERC20 + ? (dropdownCategoryValues[_type] as DropdownValueType[])[selectedCategoryValue].value || CATEGORY.ERC20 : 'ROLES'; let subCategory = 'DEFAULT'; @@ -337,24 +308,18 @@ const AddCriteria = ({ useEffect(() => { if (criteriaState.isUpdateCriteriaEnabled()) { //Load the states - const oldValue = - criteriaState.selectedRules[criteriaState.updateCriteriaIdx]; + const oldValue = criteriaState.selectedRules[criteriaState.updateCriteriaIdx]; if (oldValue.type === 'PUSH') { // category setSelectedCategoryValue( - (dropdownCategoryValues.PUSH as DropdownValueType[]).findIndex( - (obj) => obj.value === oldValue.category - ) + (dropdownCategoryValues.PUSH as DropdownValueType[]).findIndex((obj) => obj.value === oldValue.category) ); const pushData = oldValue.data as PushData; // sub category - if ( - oldValue.category === CATEGORY.ERC20 || - oldValue.category === CATEGORY.ERC721 - ) { + if (oldValue.category === CATEGORY.ERC20 || oldValue.category === CATEGORY.ERC721) { if (pushData.token) { setUnit(pushData.token); } @@ -364,21 +329,14 @@ const AddCriteria = ({ } // TODO: make helper function for this - const contractAndChain: string[] = ( - pushData.contract || 'eip155:1:0x' - ).split(':'); + const contractAndChain: string[] = (pushData.contract || 'eip155:1:0x').split(':'); setSelectedChainValue( - dropdownChainsValues.findIndex( - (obj) => - obj.value === contractAndChain[0] + ':' + contractAndChain[1] - ) + dropdownChainsValues.findIndex((obj) => obj.value === contractAndChain[0] + ':' + contractAndChain[1]) ); setContract(contractAndChain.length === 3 ? contractAndChain[2] : ''); setQuantity({ value: pushData.amount || 0, - range: dropdownQuantityRangeValues.findIndex( - (obj) => obj.value === pushData.comparison - ), + range: dropdownQuantityRangeValues.findIndex((obj) => obj.value === pushData.comparison), }); } else if (oldValue.category === CATEGORY.INVITE) { setInviteCheckboxes({ @@ -393,15 +351,10 @@ const AddCriteria = ({ // guild condition setGuildId((oldValue.data as GuildData).id); setSpecificRoleId((oldValue.data as GuildData).role); - setGuildComparison( - (oldValue.data as GuildData).comparison || - GUILD_COMPARISON_OPTIONS[2].value - ); + setGuildComparison((oldValue.data as GuildData).comparison || GUILD_COMPARISON_OPTIONS[2].value); } - setSelectedTypeValue( - dropdownTypeValues.findIndex((obj) => obj.value === oldValue.type) - ); + setSelectedTypeValue(dropdownTypeValues.findIndex((obj) => obj.value === oldValue.type)); } }, []); @@ -426,11 +379,16 @@ const AddCriteria = ({ }, [contract, selectedCategoryValue, selectedChainValue]); const showError = (errorMessage: string) => { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: errorMessage, toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); }; @@ -448,11 +406,7 @@ const AddCriteria = ({
-
+
{Array.isArray( getCategoryDropdownValues({ dropdownCategoryValues, @@ -564,7 +521,11 @@ const AddCriteria = ({ selectedValue={selectedChainValue} dropdownValues={dropdownChainsValues} /> -
+
- {!!validationErrors?.tokenError && ( - {validationErrors?.tokenError} - )} + {!!validationErrors?.tokenError && {validationErrors?.tokenError}}
-
+
- {!!validationErrors?.tokenAmount && ( - {validationErrors?.tokenAmount} - )} + {!!validationErrors?.tokenAmount && {validationErrors?.tokenAmount}}
)} @@ -599,7 +560,11 @@ const AddCriteria = ({ selectedCategoryValue, selectedTypeValue, }) && ( -
+
- {!!validationErrors?.url && ( - {validationErrors?.url} - )} + {!!validationErrors?.url && {validationErrors?.url}}
)} {checkIfPushInvite({ @@ -618,21 +581,20 @@ const AddCriteria = ({ selectedCategoryValue, selectedTypeValue, }) && ( -
+
{Object.keys(INVITE_CHECKBOX_LABEL).map((key) => ( setInviteCheckboxes({ admin: true, owner: true, }) } - checked={ - inviteCheckboxes[key as keyof typeof INVITE_CHECKBOX_LABEL] - } + checked={inviteCheckboxes[key as keyof typeof INVITE_CHECKBOX_LABEL]} /> ))}
@@ -640,7 +602,11 @@ const AddCriteria = ({ {checkIfGuild(dropdownTypeValues, selectedTypeValue) && ( <> -
+
- {!!validationErrors?.guildId && ( - {validationErrors?.guildId} - )} + {!!validationErrors?.guildId && {validationErrors?.guildId}}
-
+
- {!!validationErrors?.guildComparison && ( - {validationErrors?.guildComparison} - )} + {!!validationErrors?.guildComparison && {validationErrors?.guildComparison}}
{guildComparison === 'specific' && ( -
+
- {!!validationErrors?.guildRole && ( - {validationErrors?.guildRole} - )} + {!!validationErrors?.guildRole && {validationErrors?.guildRole}}
)} )} - { - const groupInfoToast = useToast(); - const { account } = useChatData(); + const { user, toast } = useChatData(); const addMemberToList = async (member: IUser) => { let errorMessage = ''; - if ( - pCAIP10ToWallet(member.wallets.toLowerCase()) === - pCAIP10ToWallet((account?? '').toLowerCase()) - ) - { - errorMessage = 'Group Creator cannot be added as member'; + if (pCAIP10ToWallet(member.wallets.toLowerCase()) === pCAIP10ToWallet((user?.account ?? '').toLowerCase())) { + errorMessage = 'Group Creator cannot be added as member'; + } + if (findObject(member, memberList, 'wallets')) { + errorMessage = 'Address is already added'; } - if(findObject(member, memberList, 'wallets')){ - errorMessage = 'Address is already added'; + if (errorMessage) { + toast.showMessageToast({ + toastTitle: 'Error', + toastMessage: errorMessage, + toastType: 'ERROR', + getToastIcon: (size: number) => ( + + ), + }); + } else { + const updatedMemberList = memberList; + updatedMemberList.push({ ...member, isAdmin: false }); + handleMemberList(updatedMemberList); } - if (errorMessage) { - - groupInfoToast.showMessageToast({ - toastTitle: 'Error', - toastMessage: errorMessage, - toastType: 'ERROR', - getToastIcon: (size) => , - }); - } else { - const updatedMemberList = memberList; - updatedMemberList.push( { ...member, isAdmin: false }) - handleMemberList(updatedMemberList); - } }; return ( @@ -72,4 +69,4 @@ export const AddGroupMembers = ({ handleMemberList={handleMemberList} /> ); -}; \ No newline at end of file +}; diff --git a/packages/uiweb/src/lib/components/chat/CreateGroup/CreateGroupModal.tsx b/packages/uiweb/src/lib/components/chat/CreateGroup/CreateGroupModal.tsx index 4114e71f5..99e39a8fe 100644 --- a/packages/uiweb/src/lib/components/chat/CreateGroup/CreateGroupModal.tsx +++ b/packages/uiweb/src/lib/components/chat/CreateGroup/CreateGroupModal.tsx @@ -1,7 +1,6 @@ import React, { useContext, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; -import { ToastContainer } from 'react-toastify'; import { AiTwotoneCamera } from 'react-icons/ai'; import { MdCheckCircle, MdError } from 'react-icons/md'; @@ -16,13 +15,10 @@ import useMediaQuery from '../../../hooks/useMediaQuery'; import { DefineCondtion } from './DefineCondition'; import AddCriteria from './AddCriteria'; import { ThemeContext } from '../theme/ThemeProvider'; -import { - CriteriaStateManagerType, - useCriteriaStateManager, -} from '../../../hooks/chat/useCriteriaState'; +import { CriteriaStateManagerType, useCriteriaStateManager } from '../../../hooks/chat/useCriteriaState'; import { AddGroupMembers } from './AddGroupMembers'; import { useCreateGatedGroup } from '../../../hooks/chat/useCreateGatedGroup'; -import useToast from '../reusables/NewToast'; +import { useChatData } from '../../../hooks'; import { Image } from '../../../config/styles'; import { ProfilePicture, device } from '../../../config'; @@ -40,8 +36,7 @@ export const CREATE_GROUP_STEP_KEYS = { ADD_MEMBERS: 5, } as const; -export type CreateGroupStepKeys = - typeof CREATE_GROUP_STEP_KEYS[keyof typeof CREATE_GROUP_STEP_KEYS]; +export type CreateGroupStepKeys = typeof CREATE_GROUP_STEP_KEYS[keyof typeof CREATE_GROUP_STEP_KEYS]; export interface GroupInputDetailsType { groupName: string; @@ -62,7 +57,7 @@ export const CreateGroupModal: React.FC = ({ CREATE_GROUP_STEP_KEYS.INPUT_DETAILS ); const { createGatedGroup, loading } = useCreateGatedGroup(); - const groupInfoToast = useToast(); + const { toast, user } = useChatData(); const handleNext = () => { setActiveComponent((activeComponent + 1) as CreateGroupStepKeys); }; @@ -90,29 +85,30 @@ export const CreateGroupModal: React.FC = ({ const useDummyGroupInfo = false; const [checked, setChecked] = useState(true); - const [groupInputDetails, setGroupInputDetails] = - useState({ - groupName: useDummyGroupInfo ? 'This is duumy group name' : '', - groupDescription: useDummyGroupInfo - ? 'This is dummy group description for testing' - : '', - groupImage: useDummyGroupInfo ? ProfilePicture : '', - groupMembers: [], - groupEncryptionType: GROUP_TYPE_OPTIONS[0].value, - }); + const [groupInputDetails, setGroupInputDetails] = useState({ + groupName: useDummyGroupInfo ? 'This is duumy group name' : '', + groupDescription: useDummyGroupInfo ? 'This is dummy group description for testing' : '', + groupImage: useDummyGroupInfo ? ProfilePicture : '', + groupMembers: [], + groupEncryptionType: GROUP_TYPE_OPTIONS[0].value, + }); const [isImageUploaded, setIsImageUploaded] = useState(false); const showError = (errorMessage: string) => { - groupInfoToast.showMessageToast({ + toast.showMessageToast({ toastTitle: 'Error', toastMessage: errorMessage, toastType: 'ERROR', - getToastIcon: (size) => , + getToastIcon: (size: number) => ( + + ), }); }; const getEncryptionType = () => { - console.debug(groupInputDetails.groupEncryptionType, 'encryptionTypeee'); if (groupInputDetails.groupEncryptionType === 'encrypted') { return false; } @@ -120,34 +116,53 @@ export const CreateGroupModal: React.FC = ({ }; const createGroupService = async () => { - const groupInfo = { - groupName: groupInputDetails.groupName, - groupDescription: groupInputDetails.groupDescription, - groupImage: groupInputDetails.groupImage || ProfilePicture, - isPublic: getEncryptionType(), - members: groupInputDetails.groupMembers - .filter((member: any) => !member.isAdmin) - .map((member: any) => member.wallets), - admins: groupInputDetails.groupMembers - .filter((member: any) => member.isAdmin) - .map((member: any) => member.wallets), - }; - const rules: any = checked ? criteriaStateManager.generateRule() : {}; - const { success: isGroupCreated, data: APIResponse } = - await createGatedGroup(groupInfo, rules); - if (isGroupCreated === true) { - onSuccess && onSuccess(APIResponse); - groupInfoToast.showMessageToast({ - toastTitle: 'Success', - toastMessage: 'Group created successfully', - toastType: 'SUCCESS', - getToastIcon: (size: string | number | undefined) => ( - - ), - }); - onClose(); - } else { - showError('Group creation failed'); + if (user) { + if (user.readmode()) { + console.error('UIWeb::CreateGroupModal::createGroupService::User is in read mode.Switch to write mode'); + toast.showMessageToast({ + toastTitle: 'Error', + toastMessage: 'Unable to create group in readMode. Switch to write mode', + toastType: 'ERROR', + getToastIcon: (size: number) => ( + + ), + }); + } else { + const groupInfo = { + groupName: groupInputDetails.groupName, + groupDescription: groupInputDetails.groupDescription, + groupImage: groupInputDetails.groupImage || ProfilePicture, + isPublic: getEncryptionType(), + members: groupInputDetails.groupMembers + .filter((member: any) => !member.isAdmin) + .map((member: any) => member.wallets), + admins: groupInputDetails.groupMembers + .filter((member: any) => member.isAdmin) + .map((member: any) => member.wallets), + }; + const rules: any = checked ? criteriaStateManager.generateRule() : {}; + const { success: isGroupCreated, data: APIResponse } = await createGatedGroup(groupInfo, rules); + if (isGroupCreated === true) { + onSuccess && onSuccess(APIResponse); + toast.showMessageToast({ + toastTitle: 'Success', + toastMessage: 'Group created successfully', + toastType: 'SUCCESS', + getToastIcon: (size: string | number | undefined) => ( + + ), + }); + onClose(); + } else { + showError('Group creation failed'); + } + } } }; @@ -246,7 +261,7 @@ export const CreateGroupModal: React.FC = ({ modalBackground={modalBackground} modalPositionType={modalPositionType} > - {renderComponent()} + {renderComponent()} ); }; @@ -261,17 +276,13 @@ export interface ModalHeaderProps { handleAddWallets?: () => void; isImageUploaded?: boolean; setIsImageUploaded?: React.Dispatch>; - setGroupInputDetails?: React.Dispatch< - React.SetStateAction - >; + setGroupInputDetails?: React.Dispatch>; groupInputDetails?: GroupInputDetailsType; } interface GroupDetailState { groupInputDetails: GroupInputDetailsType; - setGroupInputDetails: React.Dispatch< - React.SetStateAction - >; + setGroupInputDetails: React.Dispatch>; } export interface GroupTypeState { @@ -288,8 +299,7 @@ const CreateGroupDetail = ({ }: ModalHeaderProps & GroupDetailState) => { const { groupName, groupDescription, groupImage } = groupInputDetails; const theme = useContext(ThemeContext); - const [validationErrors, setValidationErrors] = - useState({}); + const [validationErrors, setValidationErrors] = useState({}); const fileUploadInputRef = useRef(null); const isMobile = useMediaQuery(device.mobileL); const [imageSrc, setImageSrc] = useState(); @@ -331,7 +341,7 @@ const CreateGroupDetail = ({ }); return; } - if (groupName.trim().length <3) { + if (groupName.trim().length < 3) { setValidationErrors({ groupName: 'Group name should have minimum 3 character', }); @@ -345,7 +355,7 @@ const CreateGroupDetail = ({ }); return; } - if (groupDescription.trim().length <3) { + if (groupDescription.trim().length < 3) { setValidationErrors({ groupDescription: 'Group Description should have minimum 3 character', }); @@ -373,7 +383,10 @@ const CreateGroupDetail = ({ justifyContent="start" width={!isMobile ? '400px' : '300px'} > - + {isImageUploaded ? ( groupImage ? ( @@ -401,7 +414,10 @@ const CreateGroupDetail = ({ ) ) : ( - + )} handleChange(e as unknown as Event)} /> -
+
- {!!validationErrors?.groupName && ( - {validationErrors?.groupName} - )} + {!!validationErrors?.groupName && {validationErrors?.groupName}}
-
+