({
+ isDesktopApp: jest.fn(() => false),
+}));
+
jest.mock('mattermost-redux/actions/admin', () => ({
...jest.requireActual('mattermost-redux/actions/admin'),
getPrevTrialLicense: () => ({type: 'MOCK_GET_PREV_TRIAL_LICENSE'}),
@@ -67,4 +75,17 @@ describe('components/onboarding_tasklist/onboarding_tasklist_completed.tsx', ()
await userEvent.click(noThanksLink[0]);
expect(dismissMockFn).toHaveBeenCalledTimes(1);
});
+
+ test('displays download apps link when not in desktop app', () => {
+ isDesktopAppMock.mockReturnValue(false);
+ const {container} = renderWithContext(, initialState);
+ expect(container.querySelectorAll('.download-apps')).toHaveLength(1);
+ });
+
+ test('hides download apps link when in desktop app', () => {
+ isDesktopAppMock.mockReturnValue(true);
+ const {container} = renderWithContext(, initialState);
+ expect(container.querySelectorAll('.download-apps')).toHaveLength(0);
+ isDesktopAppMock.mockReturnValue(false);
+ });
});
diff --git a/webapp/channels/src/components/onboarding_tasklist/onboarding_tasklist_completed.tsx b/webapp/channels/src/components/onboarding_tasklist/onboarding_tasklist_completed.tsx
index 7d3c9c37365..f3bcae1ce6d 100644
--- a/webapp/channels/src/components/onboarding_tasklist/onboarding_tasklist_completed.tsx
+++ b/webapp/channels/src/components/onboarding_tasklist/onboarding_tasklist_completed.tsx
@@ -7,6 +7,7 @@ import {useSelector, useDispatch} from 'react-redux';
import {CSSTransition} from 'react-transition-group';
import styled from 'styled-components';
+import {isDesktopApp} from '@mattermost/shared/utils/user_agent';
import type {GlobalState} from '@mattermost/types/store';
import {getPrevTrialLicense} from 'mattermost-redux/actions/admin';
@@ -212,24 +213,26 @@ const Completed = (props: Props): JSX.Element => {
/>
)}
-
-
- (
-
- {msg}
-
- ),
- }}
- />
-
-
+ {!isDesktopApp() && (
+
+
+ (
+
+ {msg}
+
+ ),
+ }}
+ />
+
+
+ )}
{showStartTrialBtn &&
({
+ isDesktopApp: jest.fn(() => false),
+}));
+
const WrapperComponent = (): JSX.Element => {
const taskList = useTasksList();
return (
@@ -87,4 +95,16 @@ describe('onboarding tasks manager', () => {
// verify visit_system_console and start_trial were removed
expect(screen.queryByText('invite_people')).not.toBeInTheDocument();
});
+
+ it('Removes download_app task when running in desktop app', () => {
+ isDesktopAppMock.mockReturnValue(true);
+ renderWithContext(
+ ,
+ initialState,
+ );
+
+ expect(screen.getAllByRole('listitem')).toHaveLength(5);
+ expect(screen.queryByText('download_app')).not.toBeInTheDocument();
+ isDesktopAppMock.mockReturnValue(false);
+ });
});
diff --git a/webapp/channels/src/components/onboarding_tasks/onboarding_tasks_manager.tsx b/webapp/channels/src/components/onboarding_tasks/onboarding_tasks_manager.tsx
index 2ef52001d99..1483cd77503 100644
--- a/webapp/channels/src/components/onboarding_tasks/onboarding_tasks_manager.tsx
+++ b/webapp/channels/src/components/onboarding_tasks/onboarding_tasks_manager.tsx
@@ -6,6 +6,8 @@ import {useIntl} from 'react-intl';
import {useDispatch, useSelector} from 'react-redux';
import {matchPath, useLocation} from 'react-router-dom';
+import {isDesktopApp} from '@mattermost/shared/utils/user_agent';
+
import {savePreferences} from 'mattermost-redux/actions/preferences';
import {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';
import {getLicense} from 'mattermost-redux/selectors/entities/general';
@@ -138,6 +140,10 @@ export const useTasksList = () => {
delete list.INVITE_PEOPLE;
}
+ if (isDesktopApp()) {
+ delete list.DOWNLOAD_APP;
+ }
+
return Object.values(list);
};
diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json
index a8450a2e1f4..ba270f32a04 100644
--- a/webapp/channels/src/i18n/en.json
+++ b/webapp/channels/src/i18n/en.json
@@ -5109,6 +5109,8 @@
"installed_integrations.edit": "Edit",
"installed_integrations.fromApp": "Managed by Apps Framework",
"installed_integrations.hideSecret": "Hide Secret",
+ "installed_integrations.last_used": "Last used on {lastUsed, date, full}",
+ "installed_integrations.never_used": "Never used",
"installed_integrations.regenSecret": "Regenerate Secret",
"installed_integrations.regenToken": "Regenerate Token",
"installed_integrations.showSecret": "Show Secret",
diff --git a/webapp/channels/src/utils/test_helper.ts b/webapp/channels/src/utils/test_helper.ts
index 8dacc70d202..cf3b21d2587 100644
--- a/webapp/channels/src/utils/test_helper.ts
+++ b/webapp/channels/src/utils/test_helper.ts
@@ -285,6 +285,7 @@ export class TestHelper {
create_at: 1,
update_at: 1,
delete_at: 1,
+ last_used: 0,
user_id: '',
channel_id: '',
team_id: '',
diff --git a/webapp/platform/types/src/integrations.ts b/webapp/platform/types/src/integrations.ts
index 3cdc5e592a7..b78cff05e8c 100644
--- a/webapp/platform/types/src/integrations.ts
+++ b/webapp/platform/types/src/integrations.ts
@@ -9,6 +9,7 @@ export type IncomingWebhook = {
create_at: number;
update_at: number;
delete_at: number;
+ last_used: number;
user_id: string;
channel_id: string;
team_id: string;