From 9b4b9cb31c29fbdf78bcf2cc46e81f07fdd7bb03 Mon Sep 17 00:00:00 2001 From: Paul Anuschek Date: Thu, 19 Feb 2026 11:06:10 +0100 Subject: [PATCH 1/7] added Note component --- .../GroupCreation/GroupCreationModal.tsx | 40 ++++++++++++----- .../src/script/components/Note/Note.styles.ts | 43 ++++++++++++++++++ .../src/script/components/Note/Note.tsx | 45 +++++++++++++++++++ 3 files changed, 116 insertions(+), 12 deletions(-) create mode 100644 apps/webapp/src/script/components/Note/Note.styles.ts create mode 100644 apps/webapp/src/script/components/Note/Note.tsx diff --git a/apps/webapp/src/script/components/Modals/GroupCreation/GroupCreationModal.tsx b/apps/webapp/src/script/components/Modals/GroupCreation/GroupCreationModal.tsx index 667016d06c7..1d5ce7d8471 100644 --- a/apps/webapp/src/script/components/Modals/GroupCreation/GroupCreationModal.tsx +++ b/apps/webapp/src/script/components/Modals/GroupCreation/GroupCreationModal.tsx @@ -27,12 +27,13 @@ import {amplify} from 'amplify'; import cx from 'classnames'; import {container} from 'tsyringe'; -import {Button, ButtonVariant, Option, Select} from '@wireapp/react-ui-kit'; +import {Button, ButtonVariant, Option, Select, Text} from '@wireapp/react-ui-kit'; import {WebAppEvents} from '@wireapp/webapp-events'; import {FadingScrollbar} from 'Components/FadingScrollbar'; import * as Icon from 'Components/Icon'; import {ModalComponent} from 'Components/Modals/ModalComponent'; +import {Note} from 'Components/Note/Note'; import {SearchInput} from 'Components/SearchInput'; import {TextInput} from 'Components/TextInput'; import {InfoToggle} from 'Components/toggle/InfoToggle'; @@ -79,11 +80,13 @@ const GroupCreationModal = ({ isMLSEnabled: isMLSEnabledForTeam, isProtocolToggleEnabledForUser, isCellsEnabled: isCellsEnabledForTeam, + isAppsEnabled: isAppsEnabledForTeam, } = useKoSubscribableChildren(teamState, [ 'isTeam', 'isMLSEnabled', 'isProtocolToggleEnabledForUser', 'isCellsEnabled', + 'isAppsEnabled', ]); const {self: selfUser} = useKoSubscribableChildren(userState, ['self']); @@ -154,7 +157,13 @@ const GroupCreationModal = ({ const isGuestAndServicesRoom = accessState === ACCESS_STATE.TEAM.GUESTS_SERVICES; const isGuestRoom = accessState === ACCESS_STATE.TEAM.GUEST_ROOM; const isGuestEnabled = isGuestRoom || isGuestAndServicesRoom; - const isServicesEnabled = isServicesRoom || isGuestAndServicesRoom; + + const isAppsFeatureAvailable = + isTeam && + ((selectedProtocol.value == CONVERSATION_PROTOCOL.PROTEUS && teamState?.hasWhitelistedServices()) || + (selectedProtocol.value == CONVERSATION_PROTOCOL.MLS && isAppsEnabledForTeam)); + + const isServicesEnabled = isAppsFeatureAvailable && (isServicesRoom || isGuestAndServicesRoom); const {setCurrentTab: setCurrentSidebarTab} = useSidebarStore(); @@ -504,17 +513,24 @@ const GroupCreationModal = ({ name={t('guestOptionsTitle')} info={t('guestRoomToggleInfo')} /> - {selectedProtocol.value !== CONVERSATION_PROTOCOL.MLS && ( - + + + {!isAppsFeatureAvailable && ( + + + To improve your workflow with apps, your team needs configuration. Please contact your team admin. + + )} + {areReadReceiptsEnabled && ( = ({title, children}) => { + return ( +
+
+ + {title} +
+ +
+
{children}
+
+
+ ); +}; + +export {Note}; From 3c7190231796c3ecfaead95ed96bb2673d21ef59 Mon Sep 17 00:00:00 2001 From: Paul Anuschek Date: Tue, 24 Feb 2026 09:25:57 +0100 Subject: [PATCH 2/7] added apps disabled banner --- apps/webapp/src/i18n/en-US.json | 2 + .../CreateConversationSteps/Preference.tsx | 40 ++++++++++++------- .../GroupCreation/GroupCreationModal.tsx | 12 ++---- .../AppsDisabledNote/AppsDisabledNote.tsx | 33 +++++++++++++++ .../src/script/components/Note/Note.styles.ts | 16 +++++--- 5 files changed, 75 insertions(+), 28 deletions(-) create mode 100644 apps/webapp/src/script/components/Note/AppsDisabledNote/AppsDisabledNote.tsx diff --git a/apps/webapp/src/i18n/en-US.json b/apps/webapp/src/i18n/en-US.json index f9319f97ba3..7efda501999 100644 --- a/apps/webapp/src/i18n/en-US.json +++ b/apps/webapp/src/i18n/en-US.json @@ -1843,6 +1843,8 @@ "selfNotSupportMLSMsgPart1": "You can't communicate with {selfUserName}, as your device doesn't support the suitable protocol.", "selfNotSupportMLSMsgPart2": "to call, and send messages and files.", "selfProfileImageAlt": "Your profile picture", + "servicesNotEnabledNoteTitle": "Your team doesn't use apps yet", + "servicesNotEnabledBody": "To improve your workflow with apps, your team needs configuration. Please contact your team admin.", "servicesOptionsTitle": "Apps", "servicesRoomToggleInfo": "Open this conversation to apps.", "servicesRoomToggleInfoExtended": "Open this conversation to apps. You can always change it later.", diff --git a/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx b/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx index b480d986535..187132bdc66 100644 --- a/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx +++ b/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx @@ -20,6 +20,7 @@ import {CONVERSATION_PROTOCOL} from '@wireapp/api-client/lib/team'; import {container} from 'tsyringe'; +import {AppsDisabledNote} from 'Components/Note/AppsDisabledNote/AppsDisabledNote'; import {InfoToggle} from 'Components/toggle/InfoToggle'; import {TeamState} from 'Repositories/team/TeamState'; import {Config} from 'src/script/Config'; @@ -27,7 +28,6 @@ import {useKoSubscribableChildren} from 'Util/ComponentUtil'; import {t} from 'Util/LocalizerUtil'; import {useCreateConversationModal} from '../hooks/useCreateConversationModal'; -import {ConversationType} from '../types'; export const Preference = () => { const { @@ -44,9 +44,16 @@ export const Preference = () => { const teamState = container.resolve(TeamState); - const {isCellsEnabled: isCellsEnabledForTeam, isMLSEnabled} = useKoSubscribableChildren(teamState, [ + const { + isCellsEnabled: isCellsEnabledForTeam, + isMLSEnabled, + isAppsEnabled, + hasWhitelistedServices, + } = useKoSubscribableChildren(teamState, [ 'isCellsEnabled', 'isMLSEnabled', + 'isAppsEnabled', + 'hasWhitelistedServices', ]); const isCellsEnabledForEnvironment = Config.getConfig().FEATURE.ENABLE_CELLS; const isCellsOptionEnabled = isCellsEnabledForEnvironment && isCellsEnabledForTeam; @@ -55,7 +62,11 @@ export const Preference = () => { ? teamState.teamFeatures()?.mls?.config.defaultProtocol : CONVERSATION_PROTOCOL.PROTEUS; - // Read receipts are temorarily disabled for MLS groups and channels until it is supported + const isAppsFeatureAvailable = + (defaultProtocol === CONVERSATION_PROTOCOL.MLS && isAppsEnabled) || + (defaultProtocol === CONVERSATION_PROTOCOL.PROTEUS && hasWhitelistedServices); + + // Read receipts are temporarily disabled for MLS groups and channels until it is supported const areReadReceiptsEnabled = defaultProtocol !== CONVERSATION_PROTOCOL.MLS; return ( @@ -70,17 +81,18 @@ export const Preference = () => { dataUieName="read-receipts" /> - {conversationType === ConversationType.Group && ( - - )} + + + {!isAppsFeatureAvailable && } + {areReadReceiptsEnabled && ( - {!isAppsFeatureAvailable && ( - - - To improve your workflow with apps, your team needs configuration. Please contact your team admin. - - - )} + {!isAppsFeatureAvailable && } {areReadReceiptsEnabled && ( { + return ( + + {t('servicesNotEnabledBody')} + + ); +}; + +export {AppsDisabledNote}; diff --git a/apps/webapp/src/script/components/Note/Note.styles.ts b/apps/webapp/src/script/components/Note/Note.styles.ts index 748f141f2be..eea7cf35f26 100644 --- a/apps/webapp/src/script/components/Note/Note.styles.ts +++ b/apps/webapp/src/script/components/Note/Note.styles.ts @@ -20,11 +20,17 @@ import {CSSObject} from '@emotion/react'; export const ContainerStyle: CSSObject = { - gap: '12px', - padding: '16px 20px', - backgroundColor: '#e8f0fe', - border: '1px solid #1967d2', - borderRadius: '8px', + display: 'flex', + flexDirection: 'column', + gap: '0.3rem', + padding: '0.75rem', + background: 'var(--accent-color-50)', + '.theme-dark &': { + background: 'var(--accent-color-800)', + boxShadow: 'none', + }, + border: '1px solid var(--accent-color-500)', + borderRadius: '0.5rem', color: '#000', lineHeight: '1.5', }; From 2840a6113e22e5af052c47bb6f45084cec7511bf Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 24 Feb 2026 13:45:26 +0100 Subject: [PATCH 3/7] fixed apps not enabled note formatting --- .../CreateConversationSteps/Preference.tsx | 8 +++++--- apps/webapp/src/script/components/Note/Note.styles.ts | 2 +- apps/webapp/src/script/components/toggle/InfoToggle.tsx | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx b/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx index 187132bdc66..1f4292411ce 100644 --- a/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx +++ b/apps/webapp/src/script/components/Modals/CreateConversation/CreateConversationSteps/Preference.tsx @@ -20,6 +20,7 @@ import {CONVERSATION_PROTOCOL} from '@wireapp/api-client/lib/team'; import {container} from 'tsyringe'; +import {ConversationType} from 'Components/Modals/CreateConversation/types'; import {AppsDisabledNote} from 'Components/Note/AppsDisabledNote/AppsDisabledNote'; import {InfoToggle} from 'Components/toggle/InfoToggle'; import {TeamState} from 'Repositories/team/TeamState'; @@ -64,7 +65,9 @@ export const Preference = () => { const isAppsFeatureAvailable = (defaultProtocol === CONVERSATION_PROTOCOL.MLS && isAppsEnabled) || - (defaultProtocol === CONVERSATION_PROTOCOL.PROTEUS && hasWhitelistedServices); + (defaultProtocol === CONVERSATION_PROTOCOL.PROTEUS && + hasWhitelistedServices && + conversationType !== ConversationType.Channel); // Read receipts are temporarily disabled for MLS groups and channels until it is supported const areReadReceiptsEnabled = defaultProtocol !== CONVERSATION_PROTOCOL.MLS; @@ -89,10 +92,9 @@ export const Preference = () => { isDisabled={!isAppsFeatureAvailable} name={t('servicesOptionsTitle')} isChecked={isServicesEnabled && isAppsFeatureAvailable} + label={!isAppsFeatureAvailable && } /> - {!isAppsFeatureAvailable && } - {areReadReceiptsEnabled && ( void; + label?: React.ReactNode; } const InfoToggle = ({ @@ -39,6 +40,7 @@ const InfoToggle = ({ isDisabled, name, setIsChecked, + label, }: InfoToggleProps) => { const dataUieNameInfoText = `status-info-toggle-${dataUieName}`; const dataUieNameLabelText = `do-toggle-${dataUieName}`; @@ -77,6 +79,7 @@ const InfoToggle = ({ + {label} ); }; From 490b58e7b2bbd1a047636038017b665a774c0885 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 25 Feb 2026 11:13:46 +0100 Subject: [PATCH 4/7] fixed i18n.d.ts types --- apps/webapp/src/types/i18n.d.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/webapp/src/types/i18n.d.ts b/apps/webapp/src/types/i18n.d.ts index 25a858c12dd..da3ececd86d 100644 --- a/apps/webapp/src/types/i18n.d.ts +++ b/apps/webapp/src/types/i18n.d.ts @@ -717,13 +717,6 @@ declare module 'I18n/en-US.json' { 'conversationFileUploadOverlayDescription': `Drag & drop to add files`; 'conversationFileUploadOverlayTitle': `Upload files`; 'conversationFileVideoPreviewLabel': `Video file preview for: {src}`; - 'conversationFilterDrafts': `Drafts`; - 'conversationFilterMentions': `Mentions`; - 'conversationFilterNone': `No filter`; - 'conversationFilterPings': `Pings`; - 'conversationFilterReplies': `Replies`; - 'conversationFilterTooltip': `Filter conversations`; - 'conversationFilterUnread': `Unread`; 'conversationFoldersEmptyText': `Add your conversations to folders to stay organized.`; 'conversationFoldersEmptyTextLearnMore': `Learn more`; 'conversationFooterArchive': `Archive`; @@ -1798,6 +1791,7 @@ declare module 'I18n/en-US.json' { 'searchCreateGroup': `Create group`; 'searchCreateGuestRoom': `Create guest room`; 'searchDirectConversations': `Search 1:1 conversations`; + 'searchDraftsConversations': `Search in drafts`; 'searchFavoriteConversations': `Search favorites`; 'searchFederatedDomainNotAvailable': `The federated domain is currently not available.`; 'searchFederatedDomainNotAvailableLearnMore': `Learn more`; @@ -1816,6 +1810,7 @@ declare module 'I18n/en-US.json' { 'searchManageServices': `Manage Apps`; 'searchManageServicesNoResults': `Manage apps`; 'searchMemberInvite': `Invite people to join the team`; + 'searchMentionsConversations': `Search in mentions`; 'searchNoContactsOnWire': `You have no contacts on {brandName}.\nTry finding people by\nname or username.`; 'searchNoMatchesPartner': `No results`; 'searchNoServicesManager': `Apps are helpers that can improve your workflow.`; @@ -1826,6 +1821,8 @@ declare module 'I18n/en-US.json' { 'searchPeople': `People`; 'searchPeopleOnlyPlaceholder': `Search people`; 'searchPeoplePlaceholder': `Search for people and conversations`; + 'searchPingsConversations': `Search in pings`; + 'searchRepliesConversations': `Search in replies`; 'searchServiceConfirmButton': `Open Conversation`; 'searchServicePlaceholder': `Search by name`; 'searchServices': `Apps`; @@ -1835,6 +1832,7 @@ declare module 'I18n/en-US.json' { 'searchTrySearch': `Find people by\nname or username`; 'searchTrySearchFederation': `Find people in Wire by name or\n@username\n\nFind people from another domain\nby @username@domainname`; 'searchTrySearchLearnMore': `Learn more`; + 'searchUnreadConversations': `Search in unread`; 'selectAccountTypeHeading': `How will you use Wire?`; 'selectPersonalAccountTypeOptionButtonText': `Create Personal Account`; 'selectPersonalAccountTypeOptionDescription': `Chat with friends and family.`; @@ -1849,6 +1847,8 @@ declare module 'I18n/en-US.json' { 'selfNotSupportMLSMsgPart1': `You can\'t communicate with {selfUserName}, as your device doesn\'t support the suitable protocol.`; 'selfNotSupportMLSMsgPart2': `to call, and send messages and files.`; 'selfProfileImageAlt': `Your profile picture`; + 'servicesNotEnabledNoteTitle': `Your team doesn\'t use apps yet`; + 'servicesNotEnabledBody': `To improve your workflow with apps, your team needs configuration. Please contact your team admin.`; 'servicesOptionsTitle': `Apps`; 'servicesRoomToggleInfo': `Open this conversation to apps.`; 'servicesRoomToggleInfoExtended': `Open this conversation to apps. You can always change it later.`; @@ -1885,6 +1885,8 @@ declare module 'I18n/en-US.json' { 'success.openWebAppText': `Open Wire for web`; 'success.subheader': `What do you want to do next?`; 'systemMessageLearnMore': `Learn more`; + 'tabsFilterHeader': `Show filters`; + 'tabsFilterTooltip': `Customize visible tabs`; 'takeoverButtonChoose': `Choose your own`; 'takeoverButtonKeep': `Keep this one`; 'takeoverLink': `Learn more`; From 2075ba2e531e3ac7e0adab8565019e9d00a13f06 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 26 Feb 2026 08:55:12 +0100 Subject: [PATCH 5/7] reintroduced missing i18n.d.ts types --- apps/webapp/src/i18n/en-US.json | 7 +++++++ apps/webapp/src/types/i18n.d.ts | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/apps/webapp/src/i18n/en-US.json b/apps/webapp/src/i18n/en-US.json index 7efda501999..3b020706739 100644 --- a/apps/webapp/src/i18n/en-US.json +++ b/apps/webapp/src/i18n/en-US.json @@ -713,6 +713,13 @@ "conversationFileUploadOverlayDescription": "Drag & drop to add files", "conversationFileUploadOverlayTitle": "Upload files", "conversationFileVideoPreviewLabel": "Video file preview for: {src}", + "conversationFilterDrafts": "Drafts", + "conversationFilterMentions": "Mentions", + "conversationFilterNone": "No filter", + "conversationFilterPings": "Pings", + "conversationFilterReplies": "Replies", + "conversationFilterTooltip": "Filter conversations", + "conversationFilterUnread": "Unread", "conversationFoldersEmptyText": "Add your conversations to folders to stay organized.", "conversationFoldersEmptyTextLearnMore": "Learn more", "conversationFooterArchive": "Archive", diff --git a/apps/webapp/src/types/i18n.d.ts b/apps/webapp/src/types/i18n.d.ts index da3ececd86d..b6b94385073 100644 --- a/apps/webapp/src/types/i18n.d.ts +++ b/apps/webapp/src/types/i18n.d.ts @@ -717,6 +717,13 @@ declare module 'I18n/en-US.json' { 'conversationFileUploadOverlayDescription': `Drag & drop to add files`; 'conversationFileUploadOverlayTitle': `Upload files`; 'conversationFileVideoPreviewLabel': `Video file preview for: {src}`; + 'conversationFilterDrafts': `Drafts`; + 'conversationFilterMentions': `Mentions`; + 'conversationFilterNone': `No filter`; + 'conversationFilterPings': `Pings`; + 'conversationFilterReplies': `Replies`; + 'conversationFilterTooltip': `Filter conversations`; + 'conversationFilterUnread': `Unread`; 'conversationFoldersEmptyText': `Add your conversations to folders to stay organized.`; 'conversationFoldersEmptyTextLearnMore': `Learn more`; 'conversationFooterArchive': `Archive`; From 6819545784a32beda9f428e0e3afa2c4eb3fc4c3 Mon Sep 17 00:00:00 2001 From: Paul <44203546+panuschek@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:34:22 +0100 Subject: [PATCH 6/7] Update apps/webapp/src/script/components/Note/AppsDisabledNote/AppsDisabledNote.tsx Co-authored-by: Zafar Saeed Khan --- .../components/Note/AppsDisabledNote/AppsDisabledNote.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/webapp/src/script/components/Note/AppsDisabledNote/AppsDisabledNote.tsx b/apps/webapp/src/script/components/Note/AppsDisabledNote/AppsDisabledNote.tsx index 4b102e8a847..973859fbf1a 100644 --- a/apps/webapp/src/script/components/Note/AppsDisabledNote/AppsDisabledNote.tsx +++ b/apps/webapp/src/script/components/Note/AppsDisabledNote/AppsDisabledNote.tsx @@ -22,7 +22,7 @@ import React from 'react'; import {Note} from 'Components/Note/Note'; import {t} from 'Util/LocalizerUtil'; -const AppsDisabledNote: React.FC = () => { +const AppsDisabledNote = () => { return ( {t('servicesNotEnabledBody')} From d39247e2541b85c4a57b7499eb916a5bbad59602 Mon Sep 17 00:00:00 2001 From: Paul <44203546+panuschek@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:34:31 +0100 Subject: [PATCH 7/7] Update apps/webapp/src/script/components/Note/Note.tsx Co-authored-by: Zafar Saeed Khan --- apps/webapp/src/script/components/Note/Note.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/webapp/src/script/components/Note/Note.tsx b/apps/webapp/src/script/components/Note/Note.tsx index fda7d77960e..d3add20369a 100644 --- a/apps/webapp/src/script/components/Note/Note.tsx +++ b/apps/webapp/src/script/components/Note/Note.tsx @@ -27,7 +27,7 @@ interface NoteProps { children?: ReactNode; } -const Note: React.FC = ({title, children}) => { +const Note = ({title, children}: NoteProps) => { return (