Compare commits

...

1419 commits

Author SHA1 Message Date
f013531d65 Update project configuration and add agent-ops skills
Some checks failed
ci / test (push) Has been cancelled
2026-03-21 13:05:45 +09:00
cb659b1b11 agent-ops: create-skill 및 create-domain-rule 스킬 추가
새 SKILL.md 와 도메인 rules.md 를 생성하기 위한 범용 스킬 2개 추가.
각 스킬은 중복 확인 → 탐색 → 생성 → router.md 등록 절차를 따르며
특정 프로젝트에 종속되지 않도록 설계함.
router.md 에 두 스킬에 대한 라우팅 축 추가.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 20:01:21 +09:00
toki
e986f4ef9c 아이콘 변경 2026-03-19 09:53:21 +09:00
toki
27b8c9b890 Rebrand app to com.tokilabs.mattermost and add dev environment configs
- Change Android package from com.mattermost.rnbeta to com.tokilabs.mattermost
  (build.gradle, source files, AndroidManifest, google-services.json)
- Change iOS bundle identifiers and app groups to com.tokilabs.mattermost
  (Info.plist, entitlements, project.pbxproj)
- Update auth URL scheme from mmauthbeta to mmauth_tokilabs
- Update all Fastlane env files and Fastfile references
- Replace google-services.json with own Firebase project
- Add .vscode/launch.json and settings.json for dev environment
- Update .gitignore to track .vscode config files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 08:36:05 +09:00
toki
dce5874400 log level = error 수준으로 교체 2026-03-19 07:47:42 +09:00
1d4a8d5b87 Fix trailing newline in .gitignore 2026-03-17 20:36:38 +09:00
1adf27c6a3 Correct update script to merge upstream into patch only 2026-03-17 20:36:03 +09:00
6489096ec6 Add manual update script from upstream 2026-03-17 20:34:12 +09:00
830eb54f09 Merge and sort .gitignore from .gitignore_my 2026-03-17 20:27:15 +09:00
Felipe Martin
3319aec473
Fix case-insensitive pre-auth header check in doPing (#9577)
* Fix case-insensitive pre-auth header check in doPing

HTTP headers are case-insensitive per RFC 7230, but the pre-auth
rejection check accessed x-reject-reason using an exact lowercase key.
Servers/proxies may return varying cases (e.g. X-Reject-Reason). Add a
getResponseHeader utility for case-insensitive lookup and use it in both
pre-auth check paths.

* Address PR feedback: optimize getResponseHeader and fix test description

Try exact match and lowercase match before falling back to a full scan
to avoid array allocation on every call. Fix test description to say
"uppercase" instead of "mixed case" to match the test data.
2026-03-17 12:07:07 +01:00
Carlos Garcia
82e5ff2ae8
prevent duplicate search when navigating back with a new hashtag (#9579)
Tapping a hashtag while search screen was showing previous results will
cause both useEffect and useDidUpdate to fire causing two concurrent search
calls. This guard prevents that scenario.
2026-03-17 11:12:39 +01:00
Carlos Garcia
5365109ca8
Fix search results layout overlap on hashtag search (#9582)
* Fix search results layout overlap on hashtag navigation

Defer handleSearch via requestAnimationFrame so React commits
state updates before the search starts, ensuring lockValue is
set before showResults becomes true.

* wait for search to be performed when testing hashtag search

* return cancel effect callback
2026-03-17 10:52:17 +01:00
Christopher Speller
6000e69886
Agents "RHS" view (#9318)
* Add agents RHS functionality for mobile

Implements a dedicated agents interface accessible from the home screen, featuring:
- Agent chat screen with bot selector and message input
- Thread list screen showing all agent conversations
- Remote actions for fetching bots and threads from plugin API
- Navigation between chat, threads, and individual conversations
- Integration with plus menu for easy access

Follows similar pattern to playbooks with modal screens and navigation helpers.

* Fix icon name for agents menu item

Change robot-happy-outline to robot-happy to resolve PropType validation error.

* Add agents button to sidebar and fix agent chat issues

- Add AgentsButton component to channel list sidebar below Drafts
- Fix thread navigation to use fetchAndSwitchToThread instead of switchToChannelById
- Replace custom TextInput with PostDraft component in agent_chat
- Fix icon name from message-reply-text-outline to reply-outline
- Add missing i18n translations for agents UI

* Implement automatic navigation to thread after sending agent message

* Implement bot selector bottom sheet with avatars. Replace click-and-cycle behavior with a proper bottom sheet menu showing all available agents with their profile pictures. Add bot avatar display to the dropdown button for better visual identification.

* Top bar design modifications.

* Add intro graphic and text

* Fix autocomplete not working

* Tweak styles and icons.

* Remove unused

* Add version/enabled check

* Remove excessive agent button

* Style fixes

* Use non-blocking then() for onPostCreated callback in send message hook

* Add unit tests for agents product components and actions

* Review feedback, offline support

* I18n

* Tests

* Address PR review feedback: deletion handling, UI fixes, schema docs

* Remove unnecessary deleteNotPresent flag from agents handlers

* Fix agents archived channel, empty data guard, and stale relative time

* Add smoke test for AgentChat and extend ToolCard test coverage

* Fix test quality issues: remove useless tests, strengthen assertions

* Address PR review: remove barrel file, add version comment

* Mock reanimated in CitationsList test to fix CI failure

* Fix CitationsList tests after always-mounted animation change

* Address PR review: typography, Pressable, FormattedText, schema bump, and cleanup

* Apply CLAUDE.md patterns across agents codebase: Pressable, typography, FormattedText, logDebug

* Fix schema test to expect version 19
2026-03-16 09:48:32 -07:00
Weblate (bot)
6f0d538dd7
Translations update from Mattermost Weblate (#9598)
* Translated using Weblate (German)

Currently translated at 100.0% (1615 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Russian)

Currently translated at 84.7% (1369 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Russian)

Currently translated at 87.4% (1412 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Russian)

Currently translated at 99.6% (1610 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 92.6% (1497 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 92.6% (1497 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.9% (1533 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 95.1% (1537 of 1615 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

---------

Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Dmitriy Q <krotesk@mail.ru>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
2026-03-16 13:35:25 +01:00
unified-ci-app[bot]
3b3bea56c4
Bump app build number to 730 (#9590)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-03-13 11:25:09 +02:00
Guillermo Vayá
1902340017
pin rexml to >=3.4.2 (#9533) 2026-03-11 10:52:43 +01:00
Weblate (bot)
9e30f87a98
Translated using Weblate (Polish) (#9581)
Automatic Merge
2026-03-09 14:25:23 +01:00
unified-ci-app[bot]
4b625e3517
Bump app build number to 729 (#9575)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-03-06 11:23:31 +02:00
Daniel Espino García
058b87ee4d
Add autotranslations to permalink previews (#9540)
* Add autotranslations to permalink previews

* Add missing change

* Address feedback and fix test

* Address feedback

* Fix test

* Revert "Fix test"

This reverts commit 8aa88c33eb9f805ed57be5f0d90412c2657cca8f.

* Revert "Address feedback"

This reverts commit c0249d3d0b7a326f777234850e6519e0f98ef41c.
2026-03-05 12:47:18 +01:00
Nuno Simões
b4798e78cc
workflows: fix bucket names (#9566) 2026-03-04 11:18:26 +01:00
Nick Misasi
e977303275
Fix iOS Sources panel expansion in agent citations (#9567)
* Fix iOS citations panel toggle reliability

Remove the animated maxHeight/opacity accordion from agent citations so the Sources section expands and collapses consistently on iOS without hidden or underlapping content.

Made-with: Cursor

* Restore citations panel animation with stable transitions

Use Reanimated enter/exit and layout transitions for the Sources panel so opening and closing stay animated while preserving the iOS reliability fix.

Made-with: Cursor

* Fix citations panel collapse animation overlapping content below

Replace entering/exiting animations with shared-value-driven height
and opacity transitions. Reanimated's exiting animations pull the view
out of layout flow as an absolute overlay, causing the fading content
to overlap the regenerate button during collapse. Using an always-mounted
Animated.View with measured content height and overflow clipping ensures
smooth expand/collapse without overlap.

Made-with: Cursor
2026-03-03 11:03:31 -05:00
Daniel Espino García
c391484cc8
Fix roles not updating on channel members updated websocket event (#9539) 2026-03-03 13:09:07 +01:00
Daniel Espino García
1a01c532a1
Fix connection banner not disappearing (#9532)
* Fix connection banner not disappearing

* Add relevant test
2026-03-03 13:08:45 +01:00
unified-ci-app[bot]
c313f7712f
Bump app build number to 726 (#9561)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-02-27 15:53:36 +02:00
Nick Misasi
46d46790b5
Fix Android image loads by attaching auth headers (#9554)
* Fix images not loading on android"

* Update app/components/expo_image/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update snapshots and remove accept

* Fix 16KB page size patch failing due to stale diff context (#9555)

The expo_image/index.tsx hunks in 9325-full.diff were generated before
the NetworkManager/header-handling code was added to ExpoImage. The stale
context lines caused patch's fuzzy matching to apply ExpoImage hunks to
ExpoImageBackground instead, then ExpoImageBackground hunks failed
because those sections were already modified.

Regenerated the expo_image diff hunks to match the current file state
with proper context lines for both ExpoImage (with header handling) and
ExpoImageBackground components.

https://claude.ai/code/session_01SGXWQzxrcPpWsq2YrjoUwd

Co-authored-by: Claude <noreply@anthropic.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Your Name <larkox@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-02-26 21:36:03 -05:00
Daniel Espino García
7afdaddd2b
Update google-services.json (#9553) 2026-02-26 18:28:06 -05:00
Nuno Simões
1cea8c6f0c
e2e: don't upload artifacts to s3 in e2e pipeline (#9546) 2026-02-25 14:48:31 -05:00
Guillermo Vayá
c3f83f9028
[MM-67456] Allow OptionItem labels to wrap to two lines (#9504) 2026-02-24 18:17:04 +01:00
Weblate (bot)
1757654882
Translations update from Mattermost Weblate (#9543)
Automatic Merge
2026-02-23 14:39:28 +01:00
unified-ci-app[bot]
0a3e701ba5
Bump app build number to 724 (#9538)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-02-20 11:26:08 +02:00
Nick Misasi
9e0735c00d
Add two-phase tool call approval for agents in channels (#9506)
* Add two-phase tool call approval for agents in channels

Implements the mobile counterpart to the webapp's multiplayer tool calling
feature. When a bot is @mentioned in a channel, tool call arguments and
results are redacted from other members. Only the invoker can approve/reject
tool execution (Phase 1) and decide whether to share results with the
channel (Phase 2).

See mattermost/mattermost-plugin-agents#491 for the server/webapp changes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add tests for channel tool calling utilities and remote actions

Tests for isToolCallRedacted, isPendingToolResult, getToolApprovalStage,
mergeToolCalls utility functions and fetchToolCallPrivate,
fetchToolResultPrivate, submitToolResult remote actions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add e2e tests and testIDs for agent tool calls in channels

Adds detox e2e tests covering tool call card rendering, approval buttons,
result approval phase, and multi-tool-call scenarios. Adds testID props
to ToolApprovalSet and ToolCard components to support the e2e tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Address PR review feedback for two-phase tool call approval

- Fix mergeToolCalls to preserve public-only tools instead of dropping them
- Fix stale closure race in handleToolDecision with functional setState
- Add forceLogoutIfNecessary to tool_private and tool_result remote actions
- Show snackbar on submit failure using existing error types
- Reset isDM in catch block to prevent stale state
- Sync animation shared values when isCollapsed changes externally
- Clear private data on streaming-to-persisted transition
- Wrap action buttons with usePreventDoubleTap
- Use toolCalls reference instead of toolCalls.length in effect dependency
- Fix grammar in warning callout ("its" -> "their")
- Change fontWeight from number to string per RN conventions

Co-authored-by: Cursor <cursoragent@cursor.com>

* Address PR review feedback: withObservables HOC, memoization, typography

- Refactor AgentPost to use withObservables HOC for channel observation
  instead of useEffect+subscribe, providing isDM as a prop
- Memoize undecidedCount in ToolApprovalSet and move before early return
- Replace manual font styles with typography() utility in ToolCard

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-19 11:20:25 -05:00
David Krauser
cef108db68
Reduce channel banner height to 26px (#9520)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-18 13:43:01 -05:00
Daniel Espino García
d0cc38d549
[MM-67563] Change websocket format for translation update events (#9515) 2026-02-18 16:16:13 +01:00
Daniel Espino García
cff12f7182
Enable exhaustive deps in the repo (#9508)
* Enable exhaustive deps in the repo

* Add tests for the new hooks

* Update claude.md

* Remove pre-commit overwrite
2026-02-18 11:56:16 +01:00
Nuno Simões
36439bd5f4
workflows: adjust permissions in releases (#9530)
https://github.com/mattermost/mattermost-mobile/actions/runs/22089238110
2026-02-18 11:12:50 +01:00
Daniel Espino García
058d080e9a
[MM-67507] Fix threads not being refetch when switching translations (#9512)
* [MM-67507] Fix threads not being refetch when switching translations

* Fix test
2026-02-17 16:07:10 +01:00
Felipe Martin
9793383832
feat: support fillewillbedownloaded and sendtoastmessage pluginapi (#9416)
* Handle FileWillBeDownloaded plugin hook rejections

- Add WebSocket handler for file_download_rejected events
- Show rejected files as file cards instead of broken thumbnails
- Display plugin rejection message in snackbar
- Store rejection reason in EphemeralStore for later retrieval
- Re-render file components when rejection events arrive
- Remove blurred preview to prevent visual blink on rejection

* chore: lint

* chore: lint and test

* fix: removed event from useEffect
2026-02-16 17:10:25 +01:00
Pablo Vélez
3735aa6ff8
MM-66813 - enhance sso callback metadata (#9422)
* MM-66813 - enhance sso callback metadata

* fix translation order

* Add serverUrl validation, remove non-null assertions
2026-02-16 11:05:31 -05:00
Felipe Martin
714c3dc769
feat: AI rewrite (#9280)
* feat: ai rewrite

* feat: allow crating content apart from editing it

* feat: feature parity with webapp

* feat: feature parity with webapp

* chore: fixed padding

* map ux to webapp

* refactored ai rewrite logic to separate package

* chore: tests and lint

* Update app/products/ai/rewrite/screens/options/options.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* rewrite post editor animation

* i18n

* ui feedback, centered icon and less top padding

* chore: lint

* Consolidate @ai product into @agents

Move all rewrite functionality from app/products/ai/ into
app/products/agents/ to unify under a single namespace.

- Add rewrite types, store, hooks, components, and screens to agents
- Merge AI client methods into agents client
- Update screen constants (AI_* -> AGENTS_*)
- Update all consumer imports
- Remove AI state from EphemeralStore
- Remove @ai path alias from config
- Delete app/products/ai/ directory

* refactor: load screens from product package

* refactor: move detection logic to the agents pacakge

* refactor: remove "backwards compatibility"

* refactor: move hooks to proper package

* refactor: styles

* refactor: remove unneedd position attribute

* refactor: remove unneeded cancel animation calls

* refactor: "backwards compat"

* refactor: optimize renderContent with useCallback for performance

* refactor: rename variable to avoid confusion

* refactor: update handleRewrite to use async/await for better error handling

* refactor: simplify handleRewrite by always dismissing keyboard

* refactor: use hook, always all keyboard.dismiss

* chore: enhance AgentSelector component with FlatList support

* feat: add rewriteMessage function for AI message rewriting and integrate it into useRewrite hook

* refactor: simplify message length calculation in useHandleSendMessage hook

* refactor: consolidate agent screen constants and integrate with existing screens

* fix: update dependency array in useMemo for isUnrevealedPost to include post expiration metadata

* refactor: remove unused variable to clean up Typing component

* refactor: simplify logic for atDisabled and slashDisabled flags in QuickActions component

* feat: add AIRewriteAction component for AI message rewriting functionality

* revert: thread.ts changes manually

* refactor: integrate useSafeAreaInsets

* refactor: cleanup unused methods

* chore: add comment to clarify casting

* refactor: use_agents

* chore: lint and test

* fix: trim

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-16 16:48:57 +01:00
Daniel Espino García
1db5cd456c
[MM-67253] Add support for DMs and GMs for autotranslations (#9505)
* [MM-67253] Add support for DMs and GMs for autotranslations

* Address copilot comments
2026-02-16 16:32:02 +01:00
Weblate (bot)
2bf0ffc95f
Translations update from Mattermost Weblate (#9516)
Automatic Merge
2026-02-16 17:09:28 +02:00
unified-ci-app[bot]
dbcf2d9bd5
chore: Update NOTICE.txt file with updated dependencies (#9513)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2026-02-16 12:43:21 +02:00
Nick Misasi
12c8d80f4a
[MM-66591] Channel Summaries with Agents (#9405)
* Add support for Channel Summarization, inline citations

* Add support for Channel Summarization, inline citations

* Revert package-lock to master

* i18n fixes

* e2e fixes

* Remove a few tests as they're already covered by unit

* Ensure channel summary is offline compatible

- Add channel persistence check before switching to summary channel
- Fetch and persist channel/membership if not in database
- Fix TypeScript error handling for unknown error types
- Update tests to properly mock DatabaseManager

* Fixes

* Fix expo-image patch file - remove accidental build artifacts

The patch file was accidentally corrupted with build artifacts from
node_modules/expo-image/android/build/ including .dex files, results.bin,
and Oops.rej. This was causing the 16KB page size compatibility patch
to fail during CI.

* Fix iOS date picker spacing and placeholder text

- Increase snap points on iOS to accommodate inline date picker spinner
- Update AI prompt placeholder to "Ask AI about this channel"

* Fix padding

* Address PR review feedback from larkox

- Fix i18n: use defineMessages pattern instead of separate labelId/defaultLabel
- Replace custom SummaryOptionItem with existing OptionItem component
- Add ScrollView for scrollability on smaller phones
- Extract AgentItem to separate file, use FlatList for virtualization
- Extract DateInputField component, unify DateTimePicker, add useCallback
- Consolidate types into app/products/agents/types/api.ts
- Remove unnecessary fetchPostById (WebSocket handles post delivery)
- Use jest.mocked() instead of 'as jest.Mock' for type safety
- Improve transform.ts: use urlParse, add post ID length constraint,
  validate internal links with serverUrl parameter, add subpath support
- Add transform.test.ts cases for external links, subpaths, URL encoding
- Remove unnecessary Platform.select in inline_entity_link
- Revert video_file.tsx and prefetch.ts to use cachePath (patches include types)

* Update en.json with new channel summary option translations

Added missing translation keys for the defineMessages pattern used
in channel summary sheet options.

* Fix regex patterns and add negative assertions per PR review

- Use exact 26-character constraint in post ID regex instead of
  permissive pattern followed by validation
- Use specific identifier pattern in channel regex instead of [^/]+
- Remove unused ID_PATH_PATTERN and IDENTIFIER_PATH_PATTERN imports
- Add negative assertions to processInlineEntities tests to verify
  mutual exclusivity of link vs inline_entity_link nodes

* Add test cases for non-internal URLs and escaped slashes

Per PR review feedback, added tests for:
- Non-internal URLs with similar shape to internal links
- URLs with escaped slashes (%2F) in various positions

* Improve UI consistency for channel summary date picker and AI input

- Add focus state (border highlight) to AI prompt input on Ask Agents sheet
- Add active state highlight to Start/End date fields in date range picker
- Increase back button tap area on date range picker using hitSlop
- Fix date picker theme mismatch by setting themeVariant based on app theme
- Apply initial date when opening picker so value matches displayed date

Co-authored-by: Cursor <cursoragent@cursor.com>

* Gate AskAgentsOption behind agents plugin availability check

Add a plugin availability check for the "Ask Agents" feature that
mirrors the webapp's useGetAgentsBridgeEnabled hook. Calls
GET /api/v4/agents/status on WebSocket connect and plugin status
change events, stores the result in an RxJS BehaviorSubject
ephemeral store, and conditionally renders the AskAgentsOption
component based on the plugin being available.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix quick actions tests and default date range to last 7 days

Mock useAgentsConfig in quick actions tests so the Ask Agents button
renders when agents plugin availability is gated. Default the date
range picker to the last 7 days instead of empty.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Address enahum's review feedback on channel summaries PR

- Remove pluginEnabled=false on network error in agents_status
- Use enableDynamicSizing for channel summary bottom sheet
- Extract channel navigation logic to switchToChannelByName action
- Move icon color to stylesheet, null guard to parent in InlineEntityLink
- Replace custom URL parsing with parseDeepLink in transform.ts
- Reorder channel membership check before API request in channel_summary
- Use FormattedText, FormattedDate, FloatingTextInput consistently
- Use getErrorMessage for proper intl error handling in alerts
- Simplify agent_item to always use expo-image, memoize styles
- Gate Ask Agents item count on agentsEnabled in header.tsx
- Clean up CLAUDE-IOS-SIMULATOR.md per review suggestions
- Update tests to match new behavior

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix i18n extraction for date_range_picker translated strings

Add defineMessages declarations so the i18n extraction tool can find
the translated string IDs passed through custom props to DateInputField.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix agent profile image not rendering on agent selector

* Reduce channel summary bottom sheet max height from 80% to 50%

The 80% snap point created too much whitespace below the options.
50% fits the main content well while still leaving room for the
iOS date picker spinner when the custom date range view is shown.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Adjust channel summary bottom sheet max height to 65%

50% was too short, cutting off the iOS date picker spinner.
65% provides enough room for the date range view with spinner
while keeping the main options view compact.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Use platform-specific max height for channel summary bottom sheet

iOS uses 65% to accommodate the inline date picker spinner.
Android uses 50% since its modal date picker doesn't need extra space.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Reduce height on android slightly

* Final tweaks for spacing

* Address PR review feedback from larkox and pvev

- Use MessageDescriptor props instead of separate id/defaultMessage strings in DateInputField
- Extract hitSlop constant outside component for render stability
- Normalize date range to UTC start/end of day to avoid timezone data loss
- Replace hardcoded '#FFFFFF' with theme.buttonColor

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 07:00:43 -05:00
Guillermo Vayá
9699318043
Show profile message actions for non-DM user profiles (#9496)
* Show profile message actions for non-DM user profiles

* Add DM profile visibility safeguards and coverage

* Simplify DM channel name parsing and add reversed order test

Remove redundant manual split('__') validation in
isDirectMessageWithViewedUser, relying on getUserIdFromChannelName
which already handles both name orderings. Add test for reversed
DM channel name order (B__A) to prevent regressions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 12:49:07 +01:00
kondo
f9001ec7cd
Role permissions are not updated on app launch (#9383)
* Force-fetch role permissions on app launch to ensure they are up-to-date

Co-authored-by: kondo97 <85671197+kondo97@users.noreply.github.com>

* Add test to verify roles are force-fetched on app launch

Co-authored-by: kondo97 <85671197+kondo97@users.noreply.github.com>

* Remove redundant test case for role permissions force-fetch

Co-authored-by: kondo97 <85671197+kondo97@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-02-13 12:43:14 +01:00
unified-ci-app[bot]
616483edbf
Bump app build number to 720 (#9511)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-02-13 11:41:14 +02:00
unified-ci-app[bot]
bf3f1d5241
Bump app build and version number (#9501)
* Bump app build number to 719

* Bump app version number to 2.38.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-02-11 09:55:31 +02:00
Daniel Espino García
23565b5135
Add autotranslations (#9324)
* Add autotranslations

* Develop latest changes and missing features

* i18n-extract

* Fix tests and update api behavior

* Fix minor bugs

* adjustments to shimmer animation, showtranslation modal style

* Update post.tsx

* Update show_translation.tsx

* adjust sizing and opacity of translate icon

* Add channel header translated icon

* Disable auto translation item if it is not a supported language

* Move channel info to the top

* Update edit channel to channel info

* Fix align of option items

* Fix i18n

* Add detox related changes for channel settings changes

* Add tests

* Address changes around the my channel column change

* Address feedback

* Fix test

* Fix bad import

* Fix set my channel autotranslation

* Fix test

* Address feedback

* Add missing files from last commit

* Remove unneeded change

---------

Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>
2026-02-10 17:50:39 +01:00
Daniel Espino García
61f10310dc
Database changes for autotranslations (#9495) 2026-02-10 15:04:35 +01:00
yasser khan
95d50125e4
iOS & Android: Migrate 29 Channel Settings tests from Rainforest to Detox (#9313) 2026-02-09 19:46:27 +05:30
Weblate (bot)
121980c7e5
Translations update from Mattermost Weblate (#9494)
Automatic Merge
2026-02-09 14:23:30 +02:00
Harshil Sharma
04de7b9745
Bor create post (#9393)
* Initial setup for new keyboard

* fix the offset calculation onMove by adding isKeyboardFullyOpened

* Done with the keyboard handling implementation

* Handled keyboard focus and blured state using context

* Added default height for input container

* Android support

* Tablet state handling

* Fix for refreshing offset in list

* Created a default context for mention post list

* Fix linter errors

* Fix tests

* Minor

* Fix the height issue for tablet view

* Review comments

* Dependency fix

* Reveiw comment

* keyboard animation only enabled with screen on top navigation

* added tests

* Added extra keyboard component for emoji picker (#9328)

* Added extra keyboard component

* handled swipe geature for extra keyboard

* scroll to bottom visible on emoji picker

* Check for stale event for keyboard geature area

* fix keyboard stale event for mid-gesture change swipe direction

* Closing emoji picker when message priority is opened

* changing to thread view closes emoji picker

* Close emoij picker and keyboard when attachment icons are clicked

* handle android emoji picker behaviour

* Remove emoji picker code

* fix tests

* Address reviev comments

* Test fixes

* usePreventDoubleTab for race condition and corrected comment on isInputAccessoryViewMode flag

* File attachments option in bottom sheet quick action (#9331)

* Added extra keyboard component

* handled swipe geature for extra keyboard

* File attachments option in bottom sheet quick action

* Updated tests

* i18n

* fix test

* Added tests

* Review comment

* fix tests

* Integrated Emoji picker to Extra keyboard component.  (#9339)

* Added extra keyboard component

* handled swipe geature for extra keyboard

* scroll to bottom visible on emoji picker

* Fix the post input container height change issue

* Added emoji picker with search functionality

* keyboard height not recorded fallback to default height, set search to false closing emoji picker

* fix search funcitonality in android

* scroll to end bottom dismissed with pressed

* Fixed the scroll issue for android

* fix the flickering post input issue

* Wired up the emoji picker

* Added keyboard and spaceback in emoji picker

* intl extract

* initial cursor position and simple calculation review comment

* separated grapheme to utils file

* Review comments

* nitpick

* Fix the bottom safe area and navigation stack restore fix

* Fix test

* disabled emoji picker in edit post screen

* change the name of the variable to name it clarier

* fix the tab gap issue in andriod

* disabled the emoji skin tone change on andriod

* fix the input container jump issue

* fix the failing test

* UX review

* added white space after the attachment icon

* When @ or / is press open keyboard on andriod also fix the scroll issue when keyboard is open

* back bottom closes emoji picker and opening keyboard jump fix

* reverted code

* fixed the flickering issue of input and scroll position fix

* Added BoR button

* Fix the gap issue in thread

* fix the warning reaminated issue when opening a channel

* Fix the extra space issue between input and emoij picker

* Minor fix for extra space between input and emoji picker

* WIP

* Fix thread view bottom safe area and gap between keyboard and searched emojis

* WIP

* refactor: make borConfig optional in BoRAction component

* refactor: remove optional borConfig and simplify state initialization

* Fix the keyboard issue in tablet

* Fix the warning issue react-native-keyboard-controller

* Fix tests

* Fix the tablet search hight issue

* Replaced the ExtraKeyboardProvider with KeyboardProvider from rnkc for permalink

* WIP

* Successfully toggeled bor status

* Displayed bor chip in draft editor

* Send bor post

* Displayed bor chip in draft editor with wrapping

* Added read receipt

* Bottom sheet jump issue resolved

* Search do not close after selecting emoji in search list

* Added the bottom inset height in search emoji for android

* integrated bor receipt count

* fix buid issue

* Added margin

* Handled updating receipts on sync

* test: add comprehensive tests for updateDraftBoRConfig

* test: add initial test file for burn on read label component

* test: add tests for BoRLabel component

* test: update BoRLabel tests to use toBeVisible and remove formatTime mock

* test: update BoR label tests to use renderWithIntl

* refactor: remove getBaseProps and specify props inline in BoRLabel tests

* refactor: improve test component formatting for readability

* test: add validation for BoRLabel time display formats

* test: add comprehensive tests for Burst on Read (BoR) functionality

* WIP

* test: add unit tests for BOR quick action component

* test: add comprehensive tests for BoR quick action component

* test: add missing props to QuickActions test setup

* test: add tests for BoR quick action rendering

* test: mock BoRQuickAction component for testing

* test: add comprehensive tests for observeIsBoREnabled function

* test: add initial test file for BOR read receipts screen

* test: add comprehensive tests for BORReadReceipts component

* test: add test cases for BOR read receipts display

* test: add comprehensive tests for humanReadable format in formatTime

* Added tests

* lint fix

* cleanup

* cleanup

* cleanup

* cleanup

* cleanup

* i18n fix

* Fix the cancel state to emoji picker

* Prevented displaying BoR quick action in threads

* Fixed a test

* lint fix

* review fixes

* review fixes

* i18n fix

* fixed tests

* review fixes

* lint fix

* restored podfile

* Fixed WS event handling for receiving bor post receipnt

* Fixed a test

* fixed TS

* Implemented burn post now for sender and receiver (#9401)

* Implemented burn post now for sender and receiver

* test: add tests for burnPostNow function

* test: add test for delete post option

* test: add comprehensive tests for DeletePostOption component

* Added tests

* Lint fix

* minor improvemenmts

* lint fix

* reset unintended changes

* reset unintended changes

* Bor delete when read by all (#9407)

* WIP

* Updated for all read

* cleanup

* test: add comprehensive tests for handleBoRPostAllRevealed

* test: add tests for BOR events in websocket event handler

* feat: add comprehensive tests for shouldUpdateForBoRPost function

* Added tests

* Lint fix

* fixed TS

* fixed padding

* UX fixes

---------

Co-authored-by: Rajat Dabade <a-rajat.dabade@mattermost.com>
Co-authored-by: Rajat Dabade <rajatdabade1997@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2026-02-09 17:00:54 +05:30
Nuno Simões
fe621047ce
workflow: fix build ios simulator for new bucket (#9492)
https://github.com/mattermost/mattermost-mobile/actions/runs/21746898064/job/62735186824

This failed with
```
It looks like you might be trying to authenticate with OIDC. Did you mean to set the `id-token` permission? If you are not trying to authenticate with OIDC and the action is working successfully, you can ignore this message.
```
2026-02-06 12:26:15 +01:00
unified-ci-app[bot]
717ea47735
Bump app build number to 718 (#9491)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-02-06 12:13:05 +02:00
Daniel Espino García
4611a350e0
[MM-67265] Fix permissions to invite people to team (#9467)
* [MM-67265] Fix permissions to invite people to team

* Consider inviting guests

* Address feedback

* Add tests
2026-02-06 10:10:25 +01:00
Guillermo Vayá
882c2ec57b
[MM-66995] Add editing summary for a checklist (#9414)
* Add editing summary for a checklist

* fix spacing

* fix duplication issue due to rerender off-screen

* remove worktree from cursor as I'm not using that

* add tests

* address PR review feedback

- add double-tap prevention to save button
- rename goToRenamePlaybookRun to goToEditPlaybookRun for consistency
- add debug log when local DB update fails after successful API call

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update playbook run rename spacing

* [MM-66995] Edit summary gatekeep (#9490)

* gatekeeping summary edit

* Fix playbook run summary edit gating

* more tests

* Use options object for playbook run edit

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 17:55:53 +01:00
Harshil Sharma
a9258543bb
Ensured BoR post actions matches those in webapp (#9362)
* Ensured VBoR post actions matches those in webapp

* Updated tests

* Fixed a value

* Review fixes
2026-02-04 12:18:35 +05:30
Matthew Birtch
8732cb9430
updated splash screen assets (#9483) 2026-02-03 11:19:59 -05:00
Nuno Simões
83e5b6026e
workflow, fastlane: upload release artifacts new bucket (#9410)
* workflow, fastlane: upload release artifacts new bucket

Update release workflows and fastlane to support uploading release
artifacts to both buckets (current and new) at the same time. It'll
happen during a specific period for validaation / testing phase.

* workflows: adjust permissions to use oidc

* fastfile: only upload to new bucket in release

* workflow, fastlane: add new upload_s3 lane for fastlane
2026-02-03 09:26:34 +01:00
Rajat Dabade
462d6d5052
Fix Emoji insert at end of post instead of caret position (#9473)
* Fix Emoji insert at end of post instead of caret position

* copilot code suggestions

* Added test
2026-02-02 19:32:11 +05:30
Weblate (bot)
6b0437a6e3
Translations update from Mattermost Weblate (#9486)
Automatic Merge
2026-02-02 15:23:29 +02:00
unified-ci-app[bot]
205b7a4aea
Bump app build number to 716 (#9482)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-01-30 11:51:25 +02:00
yasser khan
fdc559d70d
chore(e2e): Change iOS simulator to 26.1 from 17.2 (#9370) 2026-01-30 08:40:22 +05:30
Guillermo Vayá
d014856a3a
[MM-67361] Hide playbook (#9478)
* feat: hide Playbooks button when no running playbook runs in team

The PlaybooksButton on the home screen channel list now only appears
when there is at least one in-progress playbook run in the current team,
in addition to requiring the playbooks feature to be enabled.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* improve team query

* test: add unit tests for observeHasRunningPlaybookRunsInTeam query

Add tests to verify the new query correctly:
- Returns true when running playbook runs exist (end_at = 0)
- Returns false when all runs are finished (end_at > 0)
- Returns false when no runs exist
- Filters by team_id correctly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:58:58 +01:00
Felipe Martin
fbaf13c7aa
fix: prevent removal of pre-auth secret on logout (#9411)
* fix: prevent removal of pre-auth secret on logout

* fix: use pre-auth secret when reconnecting to server after logout

* test: verify pre-auth secret usage in switchToServerAndLogin
2026-01-27 15:52:37 +01:00
Scott Bishel
ca117805be
Add DialogRouter for Interactive Dialog to Apps Form migration (#9114)
* feat: Add DialogRouter for Interactive Dialog to Apps Form migration

Implements feature flag-controlled routing between legacy InteractiveDialog and modern AppsForm components to enable gradual migration.

Key Features:
- DialogRouter component with React.memo optimization for performance
- InteractiveDialogAdapter with WeakMap caching for form conversion
- Complete dialog/AppForm conversion utilities with validation
- Graceful fallback to legacy InteractiveDialog on conversion errors
- Type-safe implementation with optional subtype field support

Architecture:
- Feature flag controlled: FeatureFlagInteractiveDialogAppsForm
- Performance optimized: WeakMap cache, useMemo, useCallback patterns
- Error resilient: try/catch with fallback handling
- Mobile-first: Designed for React Native Navigation

Testing:
- 94 comprehensive unit tests covering all scenarios
- Cache behavior, error handling, edge cases
- Mock implementations for component integration
- Full TypeScript coverage with proper error cases

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* i18n-extract

* Add interactive dialog e2e tests and fix testID support for mobile form elements

This commit adds comprehensive e2e testing for interactive dialogs and fixes critical testID issues that were preventing form element interactions in mobile tests.

Key changes:
- Fix UserList component to use dynamic testID prop instead of hardcoded 'create_direct_message.user_list.user_item'
- Add testID support to BoolSetting and RadioSetting components for AppsForm elements
- Add testID support to ChannelListRow in IntegrationSelector for consistent channel selection
- Remove problematic disabled send button validation that was causing test failures
- Add comprehensive interactive dialog test suite with text, select, multiselect, and boolean field tests
- Implement wildcard testID discovery for dynamic user/channel element finding
- Add webhook server health check functionality matching webapp patterns
- Add Command and Webhook server API modules for test infrastructure
- Enable MM_FEATUREFLAGS_InteractiveDialogAppsForm feature flag in Detox config
- Optimize test performance by reducing unnecessary wait times
- Correct testID patterns from InteractiveDialogElement.* to AppFormElement.*

TestID chain fixes enable proper element discovery:
IntegrationSelector → ServerUserList → UserList → UserListRow → UserItem
All components now properly pass through and construct testID chains for e2e testing.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix ESLint errors in interactive dialog tests and components

- Remove console.log statements and replace with comments
- Replace for-await loops with sequential try-catch blocks to avoid no-await-in-loop violations
- Add missing dependency 'testID' to RadioSetting useMemo hook
- Fix UserList useCallback dependencies to match actual usage
- Add missing newlines at end of files
- Remove duplicate getBooleanDialog function definition in webhook_utils.js
- Fix trailing spaces and formatting issues

All lint and TypeScript checks now pass.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix TypeScript errors in interactive dialog test files

- Add null checks for array access in boolean_fields.e2e.ts and text_fields.e2e.ts to prevent 'string | undefined' errors
- Replace RegExp patterns with string patterns in select_fields.e2e.ts since Detox by.id() expects strings
- Add proper null checking for array elements before using them in element selection
- All test files now compile without TypeScript errors

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix useCallback dependencies in UserList component

- Remove unnecessary 'style' dependency from renderNoResults useCallback
- Fix React hooks/exhaustive-deps ESLint warning
- Ensures proper dependency tracking for useCallback optimization

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* cleanup

* cleanup

* fix tests

* Replace webhook-based interactive dialog tests with plugin-based versions

- Remove webhook server dependency from dialog tests
- Add plugin-based test files using /dialog commands
- Tests now use mattermost-plugin-demo instead of webhook_server.js
- Remove webhook and command support utilities
- Update screen and server API support for plugin-based testing
- Clean up debug logging and unnecessary comments

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update text_fields_plugin.e2e.ts

* Update webhook_utils.js

* add lf to eof

* Implement dynamic plugin installation and CSRF token handling for Detox tests

- Add DemoPlugin constants with dynamic version fetching from GitHub releases API
- Implement CSRF token handling in HTTP client following Cypress pattern
- Add server configuration functions (apiUpdateConfig, shouldHavePluginUploadEnabled)
- Update interactive dialog tests to use plugin-based approach with shared constants
- Fix naming conventions to follow established PascalCase/camelCase patterns

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix bad merge

* updates for new build name

* fix spacing lint issue

* Security: Fix information disclosure and SSRF vulnerabilities

- Prevent exposure of internal error messages in interactive dialog submissions
- Remove form structure enumeration in apps form error handling
- Add URL validation to prevent SSRF in plugin installation (test code)

Addresses Dryrun security scan findings.

* Update i18n strings for security fixes

* Improve plugin installation verification in interactive dialog tests

- Add error checking after plugin installation to fail fast with clear errors
- Verify plugin is actually active before running tests
- Add alert dismissal in afterEach to prevent cascading test failures
- Increase wait time for plugin initialization to 2 seconds

This fixes CI failures where the plugin installation silently failed,
causing tests to proceed and fail with "Plugin for /dialog is not working"
error alerts that blocked subsequent tests.

* Use linux-amd64 plugin build and add environment logging

  - Change demo plugin download to use linux-amd64 variant instead of generic tar.gz
    This is more reliable for CI environments running on Linux x86_64
  - Add environment logging (platform, arch, Node version, test server) at test start
  - Add specific error message for Cloudflare 524 timeouts with actionable solutions

  These changes help debug CI failures and should reduce plugin installation timeouts.

* Improve plugin installation with version checking and debugging

- Add comprehensive debug logging to track plugin installation status
  - Log target version, download URL, and current plugin state
  - Log installation actions taken (enable, remove, install)
  - Log final plugin status with version verification
- Fix plugin installation logic to handle version mismatches
  - Now removes old plugin versions before installing new ones
  - Only reactivates inactive plugins if version matches
  - Requires version parameter for proper version checking
- Add version validation to ensure correct plugin version is active
- Add detailed status messages for all installation paths

This helps diagnose plugin installation issues including architecture
mismatches and version upgrade problems.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Change plugin version mismatch from error to warning

Allow tests to continue even when plugin version doesn't match expected
version. This helps determine if the plugin commands work correctly
despite version metadata discrepancies.

The test will now log a warning but continue execution to verify if
/dialog commands are registered and functional.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add plugin enable logging and fix SSRF vulnerability in test code

Plugin API improvements:
- Add detailed logging for enable plugin API response (status, data, errors)
- Add immediate status check after enable to verify activation
- Switch back to linux-amd64 architecture for plugin downloads
- Fix SSRF vulnerability by removing arbitrary URL parameter
- Make apiUploadAndEnablePlugin DemoPlugin-specific

Test file updates:
- Update all test files to use simplified API without url/id params
- Remove unused DemoPlugin imports from test files
- Only basic_dialog_plugin.e2e.ts retains detailed debug logging

This will help diagnose why plugins are not activating after the enable
API call succeeds.

* Add robust plugin installation with fallback and 524 timeout handling

- Try to activate existing plugin first before downloading new version
- If download/install fails, fall back to activating existing plugin
- Handle 524 Cloudflare timeout errors by checking if plugin activated anyway
- Never remove old plugin before successful new installation (maintain fallback)
- Add comprehensive logging at each step for debugging
- Return proper error format with message field for test detection

This handles the CI infrastructure issue where Cloudflare times out during
plugin enable (HTTP 524) by checking if the plugin is actually active
despite the timeout, and falling back to existing plugins when downloads fail.

* Add server config logging to debug plugin activation timeouts

Check and log EnableGifPicker and EnablePublicLink settings before
plugin activation to determine if missing config is causing the
2+ minute activation timeouts (524 errors).

* minor fixes

* couple tweeks

* Combine dialog router tests in 1 spec to avoid race condition. (#9269)

* Simplify plugin disabling condition

* dont depend on secondary status check

* fix merge issues, add config setting

* disable plugin after tests, cleanup

* lint fixes

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2026-01-26 08:57:56 -07:00
Weblate (bot)
ab9d66c8b6
Translations update from Mattermost Weblate (#9469)
* Translated using Weblate (Dutch)

Currently translated at 99.9% (1545 of 1546 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

* Translated using Weblate (Polish)

Currently translated at 100.0% (1546 of 1546 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.4% (1460 of 1546 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

---------

Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
2026-01-26 15:56:06 +01:00
Rajat Dabade
20a70ae64d
At mentioned from quick action respect cursor position (#9425)
* At mentioned from quick action respect cursor position

* Reverted the unnecessary changes
2026-01-26 20:22:55 +05:30
Rajat Dabade
98bf396714
Fix: Keyboard opens on android when clicked on switch to keyboard btn in emoji picker (#9464) 2026-01-26 18:20:55 +05:30
unified-ci-app[bot]
71d67f27d0
Bump app build number to 714 (#9466)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-01-23 11:23:05 +02:00
Rajat Dabade
a3dc1a1bdc
Fix emoji picker section goes blank when User chooses Skin tone (#9436)
* Fix emoji picker section goes blank when User chooses Skin tone

* Removed the platform check
2026-01-23 10:40:43 +05:30
Rahim Rahman
6fb109faf1
fix(): update INTUNE_ENABLED within Github CI & Podfile (#9453)
* fix(): update INTUNE_ENABLED within Github CI & Podfile
* temporary switch to iOS 15 and false INTUNE_ENABLED
* revert INTUNE_ENABLED='false' and iOS 15
2026-01-21 16:50:35 -07:00
yasser khan
cbf300ffd3
Fix E2E Test Failures Due to Keyboard Controller Changes (#9371) 2026-01-21 15:09:34 +05:30
Amy Blais
678f1b1184
Update README.md (#9443) 2026-01-21 08:08:41 +02:00
Elias Nahum
bd1dcef010
Intune release clientID (#9440) 2026-01-20 20:45:43 +02:00
Rahim Rahman
3f284dec55
fix(): re-enable intune (#9442) 2026-01-20 10:20:04 -07:00
Rahim Rahman
855a6b8e26
feat(): update iOS min version to 16 (#9432) 2026-01-20 09:50:02 -07:00
Elias Nahum
944a542110
Update build-ios-release.yml (#9437)
disable intune in the release build
2026-01-20 15:40:42 +02:00
unified-ci-app[bot]
e436e1992e
Bump app build and version number (#9434)
* Bump app build number to 706

* Bump app version number to 2.37.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-01-20 10:45:29 +02:00
Rahim Rahman
4324846736
fix(MM-67224): MM Mobile v2.36.0 crash on iOS 16 and below (#9421)
* fix(MM-67224): iOS app hanging for at least 2000 ms.

* downgrade intune iOS SDK to 20.9.0

* update to version 20.9.2 (latest)

* reverse changes to .env files

* set INTUNE_IOS_SDK_VERSION to 20.9.2

* revert change

* Intune update

* remove echo
2026-01-19 16:45:56 -07:00
Daniel Espino García
c0fc0c868f
[MM-66839] (#9365)
* [MM-66839]

* i18n-extract

* Address feedback

* Fix lint
2026-01-19 17:40:45 +01:00
Weblate (bot)
cb3fcc9651
Translations update from Mattermost Weblate (#9428)
Automatic Merge
2026-01-19 17:54:28 +02:00
unified-ci-app[bot]
5e4b81f77a
chore: Update NOTICE.txt file with updated dependencies (#9424)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2026-01-19 12:17:55 +02:00
unified-ci-app[bot]
7c8d63ef28
Bump app build number to 705 (#9417)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-01-16 11:18:14 +02:00
Guillermo Vayá
97db6d1cc7
[MM-67173] to-fix: skip flaky playIncomingCallsRinging test in calls state (#9415)
* fix: skip flaky playIncomingCallsRinging test in calls state

Skip the playIncomingCallsRinging test that has been causing
intermittent failures. Added TODO comment to track that the
root cause still needs to be identified.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* add link to ticket that should fix the test

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 10:52:05 -04:00
Guillermo Vayá
90135d8580
[MM-67007] [MM-67008] Allow Item renaming and add-edit description (#9378)
* allow renaming and add-edit description

* address commit reviews

* fix tests

* missing tests, fix a problem with rebase/conflict

* use Pressable

* address review comments
2026-01-15 15:49:13 +01:00
Daniel Espino García
a3248d2a41
[MM-66753] Scope unified playbook view to team (#9366)
* [MM-66753] Scope unified playbook view to team

* Rename function
2026-01-14 15:06:44 +01:00
Rajat Dabade
e39b27be7e
New keyboard library Setup (#9278)
* Initial setup for new keyboard

* fix the offset calculation onMove by adding isKeyboardFullyOpened

* Done with the keyboard handling implementation

* Handled keyboard focus and blured state using context

* Added default height for input container

* Android support

* Tablet state handling

* Fix for refreshing offset in list

* Created a default context for mention post list

* Fix linter errors

* Fix tests

* Minor

* Fix the height issue for tablet view

* Review comments

* Dependency fix

* Reveiw comment

* keyboard animation only enabled with screen on top navigation

* added tests

* Added extra keyboard component for emoji picker (#9328)

* Added extra keyboard component

* handled swipe geature for extra keyboard

* scroll to bottom visible on emoji picker

* Check for stale event for keyboard geature area

* fix keyboard stale event for mid-gesture change swipe direction

* Closing emoji picker when message priority is opened

* changing to thread view closes emoji picker

* Close emoij picker and keyboard when attachment icons are clicked

* handle android emoji picker behaviour

* Remove emoji picker code

* fix tests

* Address reviev comments

* Test fixes

* usePreventDoubleTab for race condition and corrected comment on isInputAccessoryViewMode flag

* File attachments option in bottom sheet quick action (#9331)

* Added extra keyboard component

* handled swipe geature for extra keyboard

* File attachments option in bottom sheet quick action

* Updated tests

* i18n

* fix test

* Added tests

* Review comment

* fix tests

* Integrated Emoji picker to Extra keyboard component.  (#9339)

* Added extra keyboard component

* handled swipe geature for extra keyboard

* scroll to bottom visible on emoji picker

* Fix the post input container height change issue

* Added emoji picker with search functionality

* keyboard height not recorded fallback to default height, set search to false closing emoji picker

* fix search funcitonality in android

* scroll to end bottom dismissed with pressed

* Fixed the scroll issue for android

* fix the flickering post input issue

* Wired up the emoji picker

* Added keyboard and spaceback in emoji picker

* intl extract

* initial cursor position and simple calculation review comment

* separated grapheme to utils file

* Review comments

* nitpick

* Fix the bottom safe area and navigation stack restore fix

* Fix test

* disabled emoji picker in edit post screen

* change the name of the variable to name it clarier

* fix the tab gap issue in andriod

* disabled the emoji skin tone change on andriod

* fix the input container jump issue

* fix the failing test

* UX review

* added white space after the attachment icon

* When @ or / is press open keyboard on andriod also fix the scroll issue when keyboard is open

* back bottom closes emoji picker and opening keyboard jump fix

* reverted code

* fixed the flickering issue of input and scroll position fix

* Fix the gap issue in thread

* fix the warning reaminated issue when opening a channel

* Fix the extra space issue between input and emoij picker

* Minor fix for extra space between input and emoji picker

* Fix thread view bottom safe area and gap between keyboard and searched emojis

* Fix the keyboard issue in tablet

* Fix the warning issue react-native-keyboard-controller

* Fix tests

* Fix the tablet search hight issue

* Replaced the ExtraKeyboardProvider with KeyboardProvider from rnkc for permalink

* Bottom sheet jump issue resolved

* Search do not close after selecting emoji in search list

* Added the bottom inset height in search emoji for android

* fix buid issue

* Fix the cancel state to emoji picker

* use portals for autocomplete

* fix permalink extra space in post list

* Portal only for android

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
Co-authored-by: Harshil Sharma <harshilsharma63@gmail.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2026-01-13 22:38:35 +05:30
Felipe Martin
9632cfa141
fix: do not ping the server on edit if the preauth secret didn't change (#9368)
* fix: do not ping the server on edit if the preauth secret didn't change

* Update app/screens/edit_server/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-12 17:45:12 +01:00
Daniel Espino García
c3b141e77c
[MM-66858] Fix email notification screen not updating (#9364) 2026-01-12 15:55:55 +01:00
Harshil Sharma
4a05ae0cfd
Added BoR indicator in scheduled posts (#9355)
* Added type column to scheduled post and draft table

* removed console log

* fixed a test

* fixes

* Restored ununtended changes

* Added BoR indicator in scheduled posts

* used fixed padding

* used Tag for BoR chip

* test: add comprehensive tests for formatTime humanReadable parameter

* test: add initial test file for burn on read label component

* test: add comprehensive tests for BoRLabel component

* test: update BoRLabel tests to use deep rendering and remove mocks

* test: fix renderWithIntl import and usage in BoRLabel test

* refactor: Update BoRLabel tests to use renderWithIntl and remove formatTime mock

* refactor: simplify imports and remove renderWithIntl mock in test file

* Updated tests

* reset unintended changes

* reset unintended changes

* reset unintended changes

* i18n fixes

* fixed tests

* Matched BOR tag size to post priority tag

* Review fixes
2026-01-12 20:09:24 +05:30
Guillermo Vayá
f024e00ca6
[MM-67056] Show actions on image gallery for android (#9386)
* show actions on image gallery for android

* use a constant, update dependencies

* use original window metrics if safe insets fail

* restore deps
2026-01-12 14:52:41 +01:00
Weblate (bot)
6f1f739428
Translations update from Mattermost Weblate (#9409)
Automatic Merge
2026-01-12 14:47:33 +02:00
Guillermo Vayá
184f272965
[MM-67006] Delete task (#9381)
* delete button

* prevent deletion if we can't communicate with server
add tests

* I18n

* move to Pressable

* address review comments

* Use dedicated i18n IDs for delete task dialog

Replace reused generic translation IDs (mobile.post.cancel, post_info.del)
with playbooks-specific IDs for better maintainability and to avoid
unintended changes if source messages are modified.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-11 22:31:42 +01:00
Elias Nahum
1a563a7917
Fix android logout (#9398) 2026-01-08 13:20:10 +02:00
unified-ci-app[bot]
98b4191fec
Bump app build number to 701 (#9399)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2026-01-07 13:14:47 +02:00
Elias Nahum
a57d7aa926
use correct clientId for Intune in the beta builds (#9395) 2026-01-07 12:49:20 +02:00
Daniel Espino García
2111c8fb2c
[MM-66923] Fix scroll and private channel icon on invite user (#9363)
* [MM-66923] Fix scroll and private channel icon on invite user

* Address feedback

* Fix test
2026-01-07 08:13:59 +02:00
Guillermo Vayá
6dd4a01145
Playbook run attributes UI (#9279)
* migrate naming

* temp

* temp 2

* fixed button when editing

* some bugs solved

* fix bugs

* add localization

* some review requests

* review comments

* upgrade db to 16

* Refactor property fields handling to batch database operations for improved performance

* Enhance error handling in PropertyFieldsListComponent by logging fetch errors and improving type definitions for property fields

* added tests for value change

* fix missalignment

* fix indent & typing

* fix test version

* missing version
2026-01-06 11:07:10 +01:00
Weblate (bot)
83769b9265
Translated using Weblate (Indonesian) (#9388)
Automatic Merge
2026-01-05 13:32:00 +02:00
Weblate (bot)
53c7e6ba04
Translations update from Mattermost Weblate (#9385)
Automatic Merge
2025-12-29 21:31:59 +02:00
Elias Nahum
01673ac092
Refactor categories list (#9270)
* Refactor categories list from nested list to a flattened list

* Refactor categories list to be flatten instead of nested
2025-12-23 07:29:06 +02:00
Rahim Rahman
522812e126
feat(MM-65147): upgrade to react-native 0.77.3 (#9253)
* feat(MM-65147): upgrade to react-native 0.77.3
* basic iOS & Android changes
* patch packages
* react-native-network-client temporary until fix upstream
* local updates
* delete patch for react-native-network-client
* update react-native-network-client@1.9.0
* update RNN patch package to fix kotlin bug
* revert unneeded changes
* changes based on PR review
* ensure insert not happening if any of the values are null
* update watermelondb to 2.81.0
* update watermelon patch file name
* update secure-pdf-viewer to use latest lib
* fix typescript errors
* update podfile.lock
* update podfile.lock
* update podfile.lock again?
* podfile.lock update again
* temporarily update hermes engine
* temp
* fix alamo issue.
* revert changes to pod update
* pod update vs pod install
* remove cache for a bit
* revert the pod caching
* oops
* update podfile.lock again
* fix(MM-66825): dynamic patching of 16kb pagesize (#9361)
* fix(MM-66825): dynamic patching of 16kb pagesize
* fix lint and tsc errors
* add npx patch-package
* run patcing somewhere else instead, but this will break  iOS
* move reinstall around
* simplify script
* expo-image wasn't updating
* update caching restore key
* using git apply
* fix lint issues
* readme changes
* remove some wrong instructions
* remove redundant npx patch-package
* update build script
2025-12-22 07:35:38 -07:00
Weblate (bot)
3a4e7b6cd6
Translations update from Mattermost Weblate (#9377)
Automatic Merge
2025-12-22 16:31:25 +02:00
Guillermo Vayá
c3a27a6bcf
[MM-66610] Restore playbook run renaming (#9359)
* restore playbook run renaming

* move rename function to modal

* fix rebase

* prevent saving a non-trimmed value

* fix style

* remove tests that are no longer needed
2025-12-22 10:58:43 +01:00
unified-ci-app[bot]
d51a4a6641
Bump app build number to 697 (#9375)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-12-19 11:16:07 +02:00
Daniel Espino García
4934920e10
[MM-66711] Verify push notifications on magic link login (#9322)
* [MM-66711] Verify push notifications on magic link login

* Address copilot suggestion

* Add missing await

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-12-18 13:31:18 +01:00
Harshil Sharma
c42ebca8d3
BoR scheduled posts and drafts DB migrations (#9352)
* Added type column to scheduled post and draft table

* removed console log

* fixed a test

* fixes

* Restored ununtended changes

* Code uniformity
2025-12-18 11:26:24 +05:30
Guillermo Vayá
31fc648e50
Fix testing for checklists (#9332)
* Fix testing for checklists

* address review comments

* chevron tests

* improve new item test

* remove rerenders

* address comments

* missing empty line
2025-12-17 17:38:44 +01:00
yasser khan
d26c5c9757
chore(e2e): Fix E2E tests 2025-12-16 15:31:16 +05:30
Harshil Sharma
49efb4f470
Bor handle burned ws event (#9346)
* handled the websocket event when a user burns a BoR post as receiver

* test: add comprehensive tests for handleBoRPostBurnedEvent function

* Added tests

* reset unintended changes

* Minor fix
2025-12-16 13:09:30 +05:30
Weblate (bot)
397efd790b
Translations update from Mattermost Weblate (#9357)
* Translated using Weblate (Polish)

Currently translated at 100.0% (1488 of 1488 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/

* Translated using Weblate (German)

Currently translated at 100.0% (1511 of 1511 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Swedish)

Currently translated at 97.4% (1472 of 1511 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (Swedish)

Currently translated at 97.5% (1476 of 1513 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (German)

Currently translated at 100.0% (1513 of 1513 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Swedish)

Currently translated at 97.8% (1480 of 1513 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (German)

Currently translated at 100.0% (1525 of 1525 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Polish)

Currently translated at 100.0% (1525 of 1525 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Dutch)

Currently translated at 96.6% (1474 of 1525 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

* Translated using Weblate (Swedish)

Currently translated at 98.0% (1495 of 1525 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (Dutch)

Currently translated at 99.9% (1524 of 1525 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

---------

Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
2025-12-15 19:22:11 +00:00
Daniel Espino García
b237b3639c
Update the value for login type (#9329)
* Update the value for login type

* Centralize login type in a constant
2025-12-12 16:26:22 +01:00
Elias Nahum
23fec945a4
Fix login with Intune using the Authenticator app (#9349) 2025-12-12 13:24:03 +02:00
unified-ci-app[bot]
3ee8afb808
Bump app build and version number (#9350)
* Bump app build number to 695

* Bump app version number to 2.36.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-12-12 13:19:58 +02:00
unified-ci-app[bot]
1a063acd91
Bump app build number to 694 (#9348)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-12-12 11:16:24 +02:00
Daniel Espino García
d76791ebe6
Add guest invites (#9288)
* Add guest invites

* Fix tests and address copilot feedback

* Fix test

* Add magic link changes
2025-12-11 17:21:18 +01:00
Harshil Sharma
50372294c1
Handled the case of own BoR post not relying on post.metadata (#9341)
* Added scaffolding for unrevealed BoR post

* Displayed reveal UI

* Displayed expiry timer

* WIP

* Displayed own post indicator and blur text

* restored button

* Ungrouped BoR posts

* WIP

* WIP

* DIsplayed error message on revealing

* Added last run check on mobile app cleanup job

* Cleanup

* lint fix

* i18n-fix

* Added tests

* test: add test suite for revealBoRPost function

* test: add unrevealed burn on read post test file

* feat: add tests for UnrevealedBurnOnReadPost component

* test: update UnrevealedBurnOnReadPost test with PostModel type

* test: replace toBeTruthy with toBeVisible for component visibility assertions

* test: add initial test file for expiry timer component

* test: add comprehensive tests for ExpiryCountdown component

* refactor: clean up test formatting and remove redundant test case

* fix: adjust test timing for ExpiryCountdown onExpiry callback

* test: fix timer test by advancing timers in smaller increments

* Added tests

* Updated tests

* fixed accidental change

* restored package.resolved

* WIP review fixes

* Review fixes

* Review fixes

* Fixed tests

* restored package.resolved

* WIP

* test: add test for skipping BoR post cleanup within 15 minutes

* test: add comprehensive test cases for expiredBoRPostCleanup

* WIP

* WIP

* test: add bor.test.ts placeholder file

* test: add comprehensive tests for BoR utility functions

* test: add comprehensive tests for formatTime function

* WIP

* test: add comprehensive tests for getLastBoRPostCleanupRun function

* Added tests

* removed a commented code

* post list optimization

* test: add test case for updating unrevealed burn-on-read post

* fix: handle error logging in expiredBoRPostCleanup test

* test: add test case for updateLastBoRCleanupRun error handling

* review fixes

* lint fixes

* Added WS event handling (#9320)

* Added WS event handling

* test: add burn on read websocket action test

* test: add tests for handleBoRPostRevealedEvent in burn_on_read

* Added tests

* test: add comprehensive error handling test cases for burn on read

* Added tests and error handling

* BoR post - restricted actions (#9315)

* Restricted post actions for BoR post type

* Prevent opening thread fr nBoR post

* WIP

* fix: remove redundant observable wrapping in post options

* fixed a change

* removed broken

* restored package.resolved

* Added tests

* Awaiting for last run to be set

* Added tests for validating expiry timer behaviour (#9338)

* Added tests for validating expiry timer behaviour

* No need of use event setup

* Bor ux fixes (#9336)

* WIP

* UI and delete fixes

* lint fixes

* fixed tests

* Improved mocking

* Improved test

* Handled the case of own BoR post not relying on post.metadata
2025-12-11 10:29:29 +05:30
Harshil Sharma
2fb2e9d899
Burn On Read Posts (#9307)
* Added scaffolding for unrevealed BoR post

* Displayed reveal UI

* Displayed expiry timer

* WIP

* Displayed own post indicator and blur text

* restored button

* Ungrouped BoR posts

* WIP

* WIP

* DIsplayed error message on revealing

* Added last run check on mobile app cleanup job

* Cleanup

* lint fix

* i18n-fix

* Added tests

* test: add test suite for revealBoRPost function

* test: add unrevealed burn on read post test file

* feat: add tests for UnrevealedBurnOnReadPost component

* test: update UnrevealedBurnOnReadPost test with PostModel type

* test: replace toBeTruthy with toBeVisible for component visibility assertions

* test: add initial test file for expiry timer component

* test: add comprehensive tests for ExpiryCountdown component

* refactor: clean up test formatting and remove redundant test case

* fix: adjust test timing for ExpiryCountdown onExpiry callback

* test: fix timer test by advancing timers in smaller increments

* Added tests

* Updated tests

* fixed accidental change

* restored package.resolved

* WIP review fixes

* Review fixes

* Review fixes

* Fixed tests

* restored package.resolved

* WIP

* test: add test for skipping BoR post cleanup within 15 minutes

* test: add comprehensive test cases for expiredBoRPostCleanup

* WIP

* WIP

* test: add bor.test.ts placeholder file

* test: add comprehensive tests for BoR utility functions

* test: add comprehensive tests for formatTime function

* WIP

* test: add comprehensive tests for getLastBoRPostCleanupRun function

* Added tests

* removed a commented code

* post list optimization

* test: add test case for updating unrevealed burn-on-read post

* fix: handle error logging in expiredBoRPostCleanup test

* test: add test case for updateLastBoRCleanupRun error handling

* review fixes

* lint fixes

* Added WS event handling (#9320)

* Added WS event handling

* test: add burn on read websocket action test

* test: add tests for handleBoRPostRevealedEvent in burn_on_read

* Added tests

* test: add comprehensive error handling test cases for burn on read

* Added tests and error handling

* BoR post - restricted actions (#9315)

* Restricted post actions for BoR post type

* Prevent opening thread fr nBoR post

* WIP

* fix: remove redundant observable wrapping in post options

* fixed a change

* removed broken

* restored package.resolved

* Added tests

* Awaiting for last run to be set

* Added tests for validating expiry timer behaviour (#9338)

* Added tests for validating expiry timer behaviour

* No need of use event setup

* Bor ux fixes (#9336)

* WIP

* UI and delete fixes

* lint fixes

* fixed tests

* Improved mocking

* Improved test
2025-12-11 09:42:16 +05:30
Eva Sarafianou
ebb7a2241f
Update react-native-network-client (#9343)
* fresh install of react-native-network-client

* address feedback
2025-12-10 19:00:38 +02:00
Elias Nahum
44eb76bed7
feat(iOS): Add Microsoft Intune MAM integration with multi-server support (#9312)
* refactor: implement custom ExpoImage wrapper for cache control

Add ExpoImage component with automatic cacheKey/cachePath management and replace all expo-image imports across the app

* refactor(ios): convert Gekidou to CocoaPods

Migrate from Swift Package Manager to CocoaPods, add Keychain write operations, refactor notification handler to remove react-native-notifications headers, and upgrade Swift to 5.0

* npm audit

* update fastlane

* feat(ci): integrate Intune MAM for enterprise builds with strict OSS protection

Add Intune submodule, CI actions, Fastlane configuration, developer scripts, pre-commit hooks, and validation workflows to enable internal MAM builds while protecting OSS repository

* fix tests by mocking @mattermost/intune

* feat: implement Intune MAM integration with comprehensive security enforcement

Add IntuneManager, refactor SecurityManager/SessionManager for MAM policies, implement native OIDC auth flow, add biometric enforcement, conditional launch blocking, and file protection controls

* fix alerts when no server database is present

* Unify cache strategy

* fix emit config changed after it was stored in the db

* Handle Mid-Session Enrollment Detection

* fix ADALLogOverrideDisabled missing in Fastfile

* fix flow for initial enrollment

* fix and add unit tests

* enable Intune configuration for PR and beta builds, CLIENT_ID should be changed before actual release

* Update intune submodule with addressed feedback

* fix validate-intune-clean workflow

* feat(intune): add comprehensive error handling and SAML+Entra support

Add production-ready error handling for native Entra authentication with
user-friendly i18n messages, comprehensive test coverage, and support for
Entra login when server requires SAML.

* update i18n

* update intune submodule

* update build-pr token

* fix race condition between server auth and intune enrollment

* fix CI workflow to build with intune

* use deploy key for intune submodule

* set the config directly in the submodule .git

* debug injection

* try setting GIT_SSH_COMMAND

* remove action debug

* fix server url input

* match pod cache with intune hash

* Fastfile and envs

* have workflows check for intune/.git

* have ci cache intune frameworks as well

* update Fastlane to set no-cache to artifacts uploaded

* fix s3 upload

* fix pblist template

* Attempt to remove the cache control for PR uploads to s3

* use hash from commit for S3 path

* Implement crash-resilient selective wipe with automatic retry and add removeInternetPassword to Gekidou Keychain

* Fix surface errors from intune login

* fix postinstall scripts

* use cacheKey for draft md images

* remove unnecessary double await during test

* Have isMinimumLicenseTier accept valid license sku tier as target

* Add missing Auth error messages

* remove the last period for intune errors in i18n

* do not call unenroll with wipe on manual logout

* Fix tests and Intune error messages

* do not filter any SSO type regardless of which is used for Intune

* fix 412 to not retry

* fix tests, app logs sharing and share_extension avatar cache

* apply setScreenCapturePolicy on license change

Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>

* re-apply screen capture on enrollment

Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>

* use userData from intunr login and prevent getMe

Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>

* Check for Biometrics and Jailbreak as we used to

---------

Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>
2025-12-10 13:07:28 +02:00
yasser khan
6fdfd57c11
E2E: Automate Edit profile tests from Rainforest (#9290) 2025-12-10 11:01:04 +05:30
Christopher Speller
0c675ec2db
Agents posts on mobile (#9317)
* Agents streaming

* Fix bug and lint

* Add reasoning summaries to mobile agents

* Add tool call approval UI for mobile agents

* Add citations and annotations support for mobile agents

Implements Phase 4 from the agents mobile plan:
- WebSocket event handling for annotations control signal
- CitationsList component displaying sources below agent responses
- Collapsible sources section with source count
- Each citation shows title, domain, and opens URL on tap
- Citations persisted in post.props.annotations
- Touch-optimized UI with 44pt minimum tap targets

* Add stop and regenerate controls for mobile agents

* Add tests

* Fix tool approval buttons not updating after accept/reject

- Remove optimistic WebSocket event approach that didn't work
- Clear component streaming state on ENDED event to force switch to persisted data
- Remove delays in streaming store cleanup (500ms and 100ms)
- POST_EDITED event now properly updates UI for both accept and reject
- Remove debug console.log statements
- Fix ESLint issues (unused vars, nested callbacks, nested ternary)

* Refactor agents code: remove unused client mixin, fix bugs, and simplify logic

* Fixes

* Add CLAUDE.md

* Review feedback.

* Review feedback inline functions

* Learnings

* Address review feedback: StyleSheet.create, parent mount checks, utils

* Move to observables

* Last style fix

* Style tweaks
2025-12-09 03:56:12 -08:00
Weblate (bot)
f243f1cd28
Translations update from Mattermost Weblate (#9340)
Automatic Merge
2025-12-08 15:54:16 +02:00
Matthew Birtch
4ba3099d69
MM-62240 illustration updates (#9308)
* update onboarding illustrations and background

* update forgot password illustration

* updated mfa illustration

* updated text style on forgot password

* Update background.tsx

* optimize background svg
2025-12-05 08:31:59 -05:00
Elias Nahum
ca44fdd56f
remove duplicate models in processTeamChannels (#9334) 2025-12-05 19:11:17 +08:00
Rahim Rahman
723e727f05
fix(MM-66553): temporary fix for CVE-2025-11953 (#9330) 2025-12-04 10:56:36 -07:00
Rahim Rahman
abe7a24be5
feat(MM-65145): low connectivity manager (#9283)
* feat(MM-65145): low connectivity manager
* forgot localization
* connection banner showing limited network connectivity
* network_performance_manager test
* adding some test related to network performance monitoring
* add comment about count-based sliding window
* component and hook tests
* clean up some code based on review.
* changes based on CP review
2025-12-04 10:44:33 -07:00
Daniel Espino García
51393f13f3
[MM-66375] Allow managing own membership on a channel (#9301)
* [MM-66375] Allow managing own membership on a channel

* Add e2e test
2025-12-03 17:20:20 +01:00
Weblate (bot)
3990de8932
Translations update from Mattermost Weblate (#9323)
* Translated using Weblate (Korean)

Currently translated at 93.8% (1377 of 1468 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/

* Translated using Weblate (Portuguese)

Currently translated at 28.5% (419 of 1468 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt/

---------

Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: Manuela Silva <mmsrs@sky.com>
2025-12-01 14:30:10 +01:00
yasser khan
5e9fbcf892
Migrate Custom Status tests from Rainforest to Detox (#9309) 2025-11-27 06:01:44 +05:30
Matthew Birtch
8fa0cbfa23
MM-66509: Reduce channel banner height and adjust padding (#9267)
* MM-66509: Reduce channel banner height and adjust padding
- Reduce banner height from 40px to 32px
- Decrease padding from 10px to 5px (top/bottom) and 16px to 8px (left/right)
- Add center alignment to banner text container
- Apply typography styles directly to banner text
2025-11-25 09:02:07 -05:00
Daniel Espino García
9bb3b9897b
[MM-66485] Add separator to add a new run button (#9296) 2025-11-25 10:37:49 +01:00
Weblate (bot)
71599a8ea9
Translated using Weblate (Korean) (#9314)
Automatic Merge
2025-11-24 17:47:21 +02:00
Weblate (bot)
0015467f97
Translations update from Mattermost Weblate (#9311)
Automatic Merge
2025-11-24 14:17:21 +02:00
unified-ci-app[bot]
ae545ab62d
Bump app build number to 689 (#9306)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-11-21 11:14:13 +02:00
Guillermo Vayá
79e8d37365
fix 0 pending tasks message MM-66695 (#9300)
fix 0 pending tasks message MM-66695
2025-11-20 17:26:28 +01:00
Guillermo Vayá
c4a2ce38da
I18n issues (#9303) 2025-11-20 13:01:32 +01:00
Daniel Espino García
a341ef8981
Easy Login (#9261)
* Login screen for easy login

* Deep link changes

* Fix login flow

* Address feedback

* Rebranding

* Add deactivated flow

* Apply changes to the get type API

* Address feedback
2025-11-20 12:38:06 +01:00
Felipe Martin
c653d7c665
chore: update default error message for server validation (#9299) 2025-11-20 09:02:40 +01:00
Guillermo Vayá
93b749eb79
[MM-66690][MM-66691] Checklist improvements (#9294)
* fix no response + handle error

* address comment review

* add a screen to allow user to name the checklist

* handle local update errors

* can save as a memoized item

* change touchableopacity into a button

* fix typo

* memoize canSave
2025-11-19 16:14:03 +01:00
unified-ci-app[bot]
d0a28cdc67
Bump app build and version number (#9297)
* Bump app build number to 688

* Bump app version number to 2.35.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-11-19 14:42:50 +02:00
dependabot[bot]
b19e15f181
Bump js-yaml (#9295)
Bumps  and [js-yaml](https://github.com/nodeca/js-yaml). These dependencies needed to be updated together.

Updates `js-yaml` from 4.1.0 to 4.1.1
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1)

Updates `js-yaml` from 3.14.1 to 3.14.2
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: indirect
- dependency-name: js-yaml
  dependency-version: 3.14.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-19 12:25:21 +08:00
Rajat Dabade
f6eeaa7e07
E2E test for permalink preview (#9141)
* E2E test for permalink preview

* Fix e2e test for ios

* revert unncessary changes

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-11-17 23:47:24 +05:30
Weblate (bot)
c984d4f84d
Translations update from Mattermost Weblate (#9293)
Automatic Merge
2025-11-17 14:01:54 +02:00
Amy Blais
9dcfd149d8
Update supported ESR version (#9205)
* Update supported ESR version

* Update supported_server.ts

* Update full_description.txt

* Update changelog
2025-11-17 08:15:50 +02:00
unified-ci-app[bot]
6129c8571d
Bump app build number to 687 (#9287)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-11-14 11:16:41 +02:00
Guillermo Vayá
be5b6c196c
Checklist (#9234) 2025-11-12 20:46:59 +01:00
Felipe Martin
af2c35b03b
feat: edit server pre-authentication secret (#9128)
* feat: show potential pre-auth secret error on server create

* chroe: address comments

* chore: updated message

* feat: read response header to check error source

* fix: i18n

* chore: rename pre-auth to just auth

* Add show/hide toggle to authentication secret field

Modified server form to match login form UX with password visibility toggle

* Add preauth secret field to edit server with validation and auto-open options

* chore: added missing 18n

* Increase form padding for better error message spacing

* Fix preauth secret removal when not provided

* Change edit server title from 'Edit server name' to 'Edit server'

* Add custom ping function and improve validation in edit server

* chore: revert en_AU

* chore: improved error message

* feat: animate advanced options

* fix: auth secret label being cropped

* refactor: doPing
2025-11-12 16:07:19 +01:00
Pratyush
34ea6b2821
Added Image check for Allowed Image Extentions to categorize raw came… (#9241)
* Added Image check for Allowed Image Extentions to categorize raw camera formats as attachments

* Incorporated Copilot suggestion for constant and resuable method also updated method to satify test cases
2025-11-12 13:42:29 +01:00
Weblate (bot)
4a2cad681d
Translations update from Mattermost Weblate (#9277)
Automatic Merge
2025-11-10 17:01:49 +02:00
Elias Nahum
c615e37982
Fix gallery image dimensions (#9247) 2025-11-10 19:18:27 +08:00
Rahim Rahman
308aa0c45e
refactor(MM-64981): text change for no internet connection (#9271) 2025-11-07 09:57:53 -07:00
unified-ci-app[bot]
b11b7d1d17
Bump app build number to 686 (#9273)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-11-07 11:13:36 +02:00
Daniel Espino García
47e4bbca78
[MM-66420] Add missing tests for playbooks (#9258)
* [MM-66420] Add missing tests for playbooks

* i18n-extract

* Update message keys to more accurate ones

* Update status update post to use a more standard error handling and fix linter bugs

* Add post-merge tests and address feedback

* Fix failing test

* Address feedback
2025-11-06 12:01:25 +01:00
Daniel Espino García
db154996f4
[MM-66419] Playbooks on mobile UX fixes (#9250)
* [MM-66419] Playbooks on mobile UX fixes

* Address UX feedback
2025-11-05 11:00:48 +01:00
Rahim Rahman
72b97f60f5
revert: floating banner & low connectivity (#9254)
* Revert "feat(MM-65625): low connectivity feature toggle in advance settings (#9191)"

This reverts commit c872e2e2b1.

* Revert "feat(MM-65145): Network connectivity/performance observer (#9173)"

This reverts commit 597e03d7d8.

* Revert "feat(MM-65625): floating banner (#9162)"

This reverts commit 5887c3ab46.

* Revert "feat(MM-65625): enhance navigation overlay management (#9165)"

This reverts commit f1554f0341.

* revert advanced.test.tsx changes
2025-11-04 07:15:51 -07:00
Daniel Espino García
1d8568ade8
Improve markdown code (#9164)
* Improve markdown code

* Add missing changes

* Simplify style composition

* Address feedback

* Fix color issue introduced by channel banner
2025-11-04 10:05:56 +01:00
Pratyush Sabharwal
d713ea5b39
Fixed IOS Header Emoji Alignment (#9236)
* Fixed IOS Header Emoji Alignment

* Created Styling Variable and used Plaform method select instead of OS

* Removed Empty Line Causing CI Pipeline to fail
2025-11-03 16:50:30 +01:00
Serhii Khomiuk
ec007aedec Translated using Weblate (Ukrainian)
Currently translated at 96.4% (1401 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-11-03 11:51:11 +00:00
jprusch
52f2b896c9 Translated using Weblate (German)
Currently translated at 100.0% (1453 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-11-03 11:51:11 +00:00
Vlastimil Pecinka
907421e3a1 Translated using Weblate (Czech)
Currently translated at 97.8% (1422 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-11-03 11:51:11 +00:00
Serhii Khomiuk
017e27f475 Translated using Weblate (Ukrainian)
Currently translated at 96.2% (1398 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-11-03 11:51:11 +00:00
master7
ec1e0c3c84 Translated using Weblate (Polish)
Currently translated at 100.0% (1453 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-11-03 11:51:11 +00:00
Serhii Khomiuk
b16084fad3 Translated using Weblate (Ukrainian)
Currently translated at 94.9% (1379 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-11-03 11:51:11 +00:00
Daniel Espino García
6cf1bb447b
[MM-66380] Only show playbook runs if enabled (#9252) 2025-11-03 12:36:29 +01:00
Elias Nahum
31556bfed6
Fix race condition that prevents bottom tab bar from showing (#9246) 2025-11-03 18:10:51 +08:00
Elias Nahum
84846b01a9
MM-66173 fixes crash when receiving notifications (#9243)
* MM-66173 fixes crash when receiving notifications

* Update ios/Gekidou/Sources/Gekidou/PushNotification/PushNotification+Signature.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update ios/Gekidou/Sources/Gekidou/PushNotification/PushNotification+Signature.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update ios/Gekidou/Sources/Gekidou/DataTypes/ChannelMember.swift

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-01 19:19:31 +08:00
unified-ci-app[bot]
67e709b414
Bump app build number to 683 (#9249)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-10-31 11:13:49 +02:00
Guillermo Vayá
cf88dd89fc
remove patch for bug (#9245) 2025-10-30 14:55:02 +01:00
Pratyush Sabharwal
dbd7575f41
Latex styling update for incorrect baseline for the respective mobile OS (#9238)
* Latex styling update for incorrect baseline for the respective mobile OS

* Fixed style formatting causing the pipeline to fail

* Updated Platform OS method to Platform Select for latex styling
2025-10-29 11:20:09 +01:00
Elias Nahum
c0eaeefbe0
Properly handle android system bars (#9242) 2025-10-29 09:11:11 +08:00
Weblate (bot)
5d47f062f3
Translations update from Mattermost Weblate (#9240)
Automatic Merge
2025-10-27 16:59:10 +02:00
Tom De Moor
b3ccf3648f Translated using Weblate (Dutch)
Currently translated at 99.9% (1452 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-10-20 14:02:09 +02:00
master7
570ea2fb75 Translated using Weblate (Polish)
Currently translated at 100.0% (1453 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-10-20 14:02:09 +02:00
Tom De Moor
2291175c53 Translated using Weblate (Dutch)
Currently translated at 98.4% (1430 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-10-20 14:02:09 +02:00
Frank Paul Silye
26741d5a89 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.2% (1428 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-10-20 14:02:09 +02:00
Kaya Zeren
327210f943 Translated using Weblate (Turkish)
Currently translated at 100.0% (1453 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2025-10-20 14:02:09 +02:00
MArtin Johnson
bb0f4a4568 Translated using Weblate (Swedish)
Currently translated at 99.8% (1451 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-10-20 14:02:09 +02:00
master7
d3c0850cb3 Translated using Weblate (Polish)
Currently translated at 98.8% (1436 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-10-20 14:02:09 +02:00
Tom De Moor
794d60b58a Translated using Weblate (Dutch)
Currently translated at 97.2% (1413 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-10-20 14:02:09 +02:00
jprusch
8a299c9bb2 Translated using Weblate (German)
Currently translated at 100.0% (1453 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-10-20 14:02:09 +02:00
l-ra
ec657b4c4b Translated using Weblate (Czech)
Currently translated at 97.8% (1422 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-10-20 14:02:09 +02:00
Serhii Khomiuk
90ec660963 Translated using Weblate (Ukrainian)
Currently translated at 91.9% (1336 of 1453 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-10-20 14:02:09 +02:00
unified-ci-app[bot]
aa88019582
Bump app build and version number (#9223)
* Bump app build number to 681

* Bump app version number to 2.34.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-10-17 13:39:51 +03:00
unified-ci-app[bot]
c2e78dc452
Bump app build number to 679 (#9220)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-10-17 12:12:59 +03:00
Daniel Espino García
910fd2b449
Quick fix for disappearing links (#9216) 2025-10-17 11:54:58 +03:00
Daniel Espino García
468b271928
Add create run (#9203)
* Add playbook start a run

* UI fixes

* Add i18n

* Address feedback

* Fix typo
2025-10-13 21:35:06 +02:00
Daniel Espino García
9272efe2a8
Add playbooks unified view (#9177)
* Add playbooks unified view

* Update tests

* Fix client function not throwing

* Fix types
2025-10-13 21:02:24 +02:00
Daniel Espino García
6d136a1343
Add post update to playbooks (#9120)
* Add Floating Label Autocomplete Selector

* Add post update to playbooks

* Add intro message and template default

* Fix type issue

* Add missing texts

* Fix test

* Minor fix and refactor

* Address feedback
2025-10-13 20:31:12 +02:00
master7
b44aace169 Translated using Weblate (Polish)
Currently translated at 100.0% (1406 of 1406 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-10-13 15:21:46 +02:00
Tom De Moor
dc30200051 Translated using Weblate (Dutch)
Currently translated at 99.9% (1405 of 1406 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-10-13 15:21:46 +02:00
kaakaa
403bdb6856 Translated using Weblate (Japanese)
Currently translated at 100.0% (1406 of 1406 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-10-13 15:21:46 +02:00
Frank Paul Silye
8d358c321a Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.2% (1392 of 1403 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-10-13 15:21:46 +02:00
Hosted Weblate
4424b58fab Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2025-10-13 15:21:46 +02:00
homerCOD
b1d4910e28 Translated using Weblate (Serbian)
Currently translated at 2.9% (41 of 1399 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sr/
2025-10-13 15:21:46 +02:00
Takuya N
828bf7ee45 Translated using Weblate (Japanese)
Currently translated at 100.0% (1399 of 1399 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-10-13 15:21:46 +02:00
Rahim Rahman
c872e2e2b1
feat(MM-65625): low connectivity feature toggle in advance settings (#9191) 2025-10-12 23:21:11 -06:00
Guillermo Vayá
0b7820c2b9
[MM-65160] Playbook Conditions UI (#9195)
* add new value to conditionAction

* update progress management regarding conditions

* hide items

* add test to filtering

* icon added for condition reason

* add conditional reason to bottom sheet

* improve UI

* i18n

* this might need to be reverted later. Fix for condition changes not triggering updates

* cosmetic changes

* improve branch icon positioning

* pressing on checklist item should display bottom sheet

* review improvements
2025-10-12 21:49:45 +02:00
Guillermo Vayá
87395e1210
[MM-65984] DB changes to handle Playbook Run Attributes (#9172)
* db changes

* temp tests

* missing mock models

* test helpers improvement

* address naming errors

* added comments to schema

* x2

* minor corrections

* Update app/products/playbooks/database/models/playbook_run_attribute_value.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* docs

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-12 21:48:50 +02:00
Rahim Rahman
597e03d7d8
feat(MM-65145): Network connectivity/performance observer (#9173)
* feat: implement floating banner system

- Add FloatingBanner component with gesture support and keyboard awareness
- Implement BannerManager singleton for banner lifecycle management
- Create floating banner screen with SafeAreaProvider integration
- Add comprehensive banner configuration types and positioning
- Update Banner component to use modern gesture handling
- Enhance BannerItem with improved typography and spacing (40px height)
- Add ConnectionBanner improvements with better sizing
- Remove ConnectionBanner from channel list (moved to floating system)
- Update screens constants (remove FLOATING_BANNER - handled as overlay)
- Add i18n support for limited network connection message

The system provides:
- Auto-hide functionality with customizable duration
- Position-aware rendering (top/bottom with keyboard adjustment)
- Tablet-specific offset handling
- Swipe-to-dismiss with configurable thresholds
- Custom component support alongside default banner items
- Comprehensive test coverage with device-specific scenarios

* docs: add floating banner system documentation and cleanup

- Add comprehensive floating-banner.md with architecture diagrams
- Remove incompatible connection_banner/index.ts file
- Update device.ts hooks for better keyboard handling
- Simplify screens/index.tsx floating banner registration
- Update test/setup.ts to remove deprecated keyboard mocks
- Clean up keyboard height logic and ESLint issues

The documentation covers:
- System architecture and component relationships
- API reference and usage patterns
- Performance considerations and best practices
- Integration points and troubleshooting guide
- Comprehensive testing strategy

All tests now pass with the updated setup.

* fix issue with translation file

* some self cleanup.

* renamed index.tsx => Banner.tsx

* creaete meaningful tests for Banner component and all the hooks.

* fix tests

* cleanup based on initial review by AI

* dismissible was set to true, changing to what was configured.

* making title and message optional

* feat(MM-65145): Network connectivity/performance observer

* add MONITOR_NETWORK_PERFORMANCE

* i18n stuff

* remove unused props

* Undo some AI changes that caught by another AI

* network connectivity observation md

* addressed some comments in PR

* more fixes based on PR review.

* added future enhancement

* dismissOverlay will be awaited
* delay dismissing overlay so we don't have to show a new one all the time

* make the banner stackable

* Fix issue with last banner dismissal delayed by 2s

* update floating-banner test

* put back an extra space

* add a todo to use namespace
* add comment on priority order for connectivity performance
* use static const vs magic number

* add a guard against adding performanceSubject when server has been removed
* fix failing tests

* clean-up based on review by @enahum

* fix failing test

* fix failiing tests

* rename confusing var

* update changes to types

* fixed issue with swipe not working on android

* performance and connectivity use the same id so that 2 banners won't appear

* fix issue w/ android not registering touch events behind the overlay

* fix failing test

* hideBanner now needs id.

* Connection status unknown added in en.json

* update the doc

* animate the banner moving up when bottom banner first appear.

* removed unused functions and update tests

* add useMemo and useCallback

* update jsdoc to say dismissable is default true

* fix failing test
2025-10-12 10:10:05 -06:00
Rahim Rahman
5887c3ab46
feat(MM-65625): floating banner (#9162)
* feat: implement floating banner system

- Add FloatingBanner component with gesture support and keyboard awareness
- Implement BannerManager singleton for banner lifecycle management
- Create floating banner screen with SafeAreaProvider integration
- Add comprehensive banner configuration types and positioning
- Update Banner component to use modern gesture handling
- Enhance BannerItem with improved typography and spacing (40px height)
- Add ConnectionBanner improvements with better sizing
- Remove ConnectionBanner from channel list (moved to floating system)
- Update screens constants (remove FLOATING_BANNER - handled as overlay)
- Add i18n support for limited network connection message

The system provides:
- Auto-hide functionality with customizable duration
- Position-aware rendering (top/bottom with keyboard adjustment)
- Tablet-specific offset handling
- Swipe-to-dismiss with configurable thresholds
- Custom component support alongside default banner items
- Comprehensive test coverage with device-specific scenarios

* docs: add floating banner system documentation and cleanup

- Add comprehensive floating-banner.md with architecture diagrams
- Remove incompatible connection_banner/index.ts file
- Update device.ts hooks for better keyboard handling
- Simplify screens/index.tsx floating banner registration
- Update test/setup.ts to remove deprecated keyboard mocks
- Clean up keyboard height logic and ESLint issues

The documentation covers:
- System architecture and component relationships
- API reference and usage patterns
- Performance considerations and best practices
- Integration points and troubleshooting guide
- Comprehensive testing strategy

All tests now pass with the updated setup.

* fix issue with translation file

* some self cleanup.

* renamed index.tsx => Banner.tsx

* creaete meaningful tests for Banner component and all the hooks.

* fix tests

* cleanup based on initial review by AI

* dismissible was set to true, changing to what was configured.

* making title and message optional

* addressed some comments in PR

* more fixes based on PR review.

* added future enhancement

* dismissOverlay will be awaited
* delay dismissing overlay so we don't have to show a new one all the time

* make the banner stackable

* Fix issue with last banner dismissal delayed by 2s

* update floating-banner test

* clean-up based on review by @enahum

* fix failing test

* fix failiing tests

* rename confusing var

* fixed issue with swipe not working on android

* fix issue w/ android not registering touch events behind the overlay

* fix failing test

* animate the banner moving up when bottom banner first appear.

* removed unused functions and update tests

* add useMemo and useCallback

* update jsdoc to say dismissable is default true

* fix failing test
2025-10-12 09:33:51 -06:00
Rahim Rahman
f1554f0341
feat(MM-65625): enhance navigation overlay management (#9165)
* feat: enhance navigation overlay management

- Add overlay tracking to NavigationStore with exception handling
- Implement dismissAllOverlays with individual overlay dismissal
- Add overlay management methods (add, remove, filter exceptions)
- Preserve floating-banner-overlay when dismissing other overlays
- Add comprehensive tests for overlay stack management
- Update navigation command listeners for overlay events

This improves overlay management by tracking overlays in the store
and providing fine-grained control over which overlays to dismiss,
particularly preserving floating banners during navigation cleanup.

* make tests more meaningful in navigation

* ChatGPT review fix

* revert changes to dismissAllOverlays
* create a new function dismissAllOverlaysWithExceptions
* add new function removeAllOverlaysFromStack to clear the entire overlays

* added a mock to dismissAllOverlays

* update thread to call dismissAllOverlays with exceptions instead.

* remove unneeded removeAllOverlaysWithExceptions()

* silly ai

* use set instead of array.
2025-10-10 11:31:36 -06:00
Rahim Rahman
f6e8ebc2e9
fix(MM-64763): search page doesn't clear hashtag on search input (#9194) 2025-10-10 10:51:56 -06:00
Rahim Rahman
6ed8a56be4
fix(MM-63466): hashtag displaying in smaller font size (#9193) 2025-10-08 08:24:10 -06:00
Weblate (bot)
62ab383773
Translations update from Mattermost Weblate (#9190)
Automatic Merge
2025-10-06 18:13:37 +03:00
unified-ci-app[bot]
d50e5e904f
chore: Update NOTICE.txt file with updated dependencies (#9189)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2025-10-06 13:19:26 +03:00
Daniel Espino García
240f7c5aab
Fix selected users not showing in add member screen (#9183)
* Fix selected users not showing in add member screen

* Fix other instances where the set was still treated as an object
2025-10-03 13:28:51 +02:00
Daniel Espino García
1f9fc9bda7
Fix error on notification reply on iOS (#9181)
* Fix error on notification reply on iOS

* Revert unneeded change

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-03 13:43:46 +03:00
unified-ci-app[bot]
dcf2a3c6e1
Bump app build number to 676 (#9184)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-10-03 12:19:29 +03:00
Kohei Adachi
85fcdacee7
[GH-8911] Fix file upload request when CSRF protection is enabled (#8912)
* Fix file upload for csrf protection

* Fix use profile upload for csrf protection

* Fix tests

* Fix files.test.ts
2025-10-01 11:00:55 -03:00
Rajat Dabade
a8ddf0472a
Fix the Edited post incorrect line spacing on Android (#9170) 2025-10-01 21:26:57 +08:00
Yair Szarf
42988fddc3
Add a notification disabled notice to notification settings (#9145)
* Adding the notification disabled notice

* Change the color of the icon on the section notice to red.

* Fix Linter Issues

* Add new line due to CI failure

* Adressing pull request comments and change requests.

* i18 Strings alphabetical order

* result of `npm run i18n-extract`

* Add a couple more tests for notifications

* Remove two unneeded styles

* fix linter issue
2025-10-01 08:20:22 -04:00
Daniel Espino García
3efc301da5
Add Floating Label Autocomplete Selector (#9119)
* Add Floating Label Autocomplete Selector

* Address feedback

* Revert unintended change

* Move database connection to index file
2025-10-01 13:31:16 +02:00
Rajat Dabade
ffa40dac11
Fix: Team mention count including muted channel (#9161)
* Fix: Team mention count including muted channel

* Added test
2025-09-30 18:53:00 +05:30
JG Heithcock
2d6a5d5097
Mobile-side for MM-65084 (#9115)
* Mobile fix for MM-65084

* Changing test/setup.ts to use a deterministic fill

This avoids the ci issue about parenthesis and is more clear that this is just a fixed sequence for testing, similar to randomUUID above.

* Add setBearerToken and setCSRFToken to Client definition

* Use setClientCredentials and memoize createPkceBundle

* Restoring the preauthSecret back to the Client constructors

This came out of a response to MM-65085: Support Pre Shared Password on server connect where preauthSecret was added in the buildConfig. Claude (correctly imo) identified this as now redundant and so removed it but it is valid to keep it as well. In any case, putting it back to be consistent with ClientTracking and ClientBase.

* Rename PKCE to SAML based terminology, similar to server

* Fix lint issue with too many blank lines at eof

* Removing plain on mobile side

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-29 14:29:37 -07:00
Weblate (bot)
cf04ce34cf
Translations update from Mattermost Weblate (#9167)
Automatic Merge
2025-09-29 14:36:18 +03:00
Daniel Espino García
1cedc7b7e1
Add playbooks finish run (#9144)
* Add playbooks finish run

* Add missing texts

* Fix tablet reconnect issue

* Add body to put method

* Fix tests
2025-09-26 17:33:13 +02:00
Daniel Espino García
f384ddb65d
Add subtitles for playbook bottom sheet screens to add the run name (#9130)
* Add subtitles for playbook bottom sheet screens to add the run name

* Add missing change
2025-09-25 18:21:15 +02:00
Daniel Espino García
167d0c6579
Fix playbooks bottom sheet not scrolling on ipad (#9137)
* Fix playbooks bottom sheet not scrolling on ipad

* Address copilot feedback
2025-09-25 18:20:26 +02:00
Elias Nahum
5b0b099a95
Some UI fixes (#9149) 2025-09-23 19:49:26 +08:00
Weblate (bot)
5dbd67512b
Translations update from Mattermost Weblate (#9155)
Automatic Merge
2025-09-22 15:36:17 +03:00
Guillermo Vayá
c193dbd255
[MM-65657] Conditional results db-only (#9135)
* database and types

* transformers

* fix schema version

* fix schema tests

* add missing condition_reason

* add missing tests
2025-09-22 14:07:25 +02:00
Daniel Espino García
d4fb05d4bb
Add onPress on full chip (#9134)
* Add onPress on full chip

* Address feedback

* Fix test
2025-09-22 12:07:49 +02:00
unified-ci-app[bot]
3c6ae12634
Bump app build and version number (#9151)
* Bump app build number to 672

* Bump app version number to 2.33.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-09-19 12:29:09 +03:00
unified-ci-app[bot]
5fa57e5787
Bump app build number to 671 (#9150)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-09-19 12:13:01 +03:00
Daniel Espino García
62aba308f1
Add several UX fixes to set command screen on playbooks (#9136)
* Add several UX fixes to set command screen on playbooks

* Update app/products/playbooks/screens/edit_command/edit_command.test.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update app/components/autocomplete/autocomplete.test.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix keyboard overlap

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-19 08:10:05 +03:00
ladudu
a4e495a2a6
fix Slack attachment button color looks wrong color for dark themes (#8959)
- Moved STATUS_COLORS declaration outside of the conditional block for better readability.
- Updated hexColor assignment logic to ensure a default color is applied when buttonColor is not provided.
- Adjusted customButtonStyle and customButtonTextStyle to use the updated hexColor logic.
2025-09-17 11:44:55 +02:00
Felipe Martin
432cfb08fe
feat: show pre-auth secret error on field on server create (#9102)
* feat: show potential pre-auth secret error on server create

* chroe: address comments

* chore: updated message

* feat: read response header to check error source

* fix: i18n

* chore: rename pre-auth to just auth
2025-09-17 08:04:28 +02:00
yasser khan
0835f6e6aa
feat: add AI-powered pilot framework for Detox E2E testing (#8981) 2025-09-16 09:33:38 +05:30
MArtin Johnson
cdeac46f6c Translated using Weblate (Swedish)
Currently translated at 100.0% (1390 of 1390 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-09-15 16:07:09 +02:00
Tom De Moor
6495e35c15 Translated using Weblate (Dutch)
Currently translated at 100.0% (1390 of 1390 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-09-15 16:07:09 +02:00
Tom De Moor
c4ef9ca976 Translated using Weblate (Dutch)
Currently translated at 99.7% (1387 of 1390 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-09-15 16:07:09 +02:00
Frank Paul Silye
ab9a5f6bc6 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.6% (1358 of 1390 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-09-15 16:07:09 +02:00
Hosted Weblate
9d7885ca9f Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2025-09-15 16:07:09 +02:00
Frank Paul Silye
518234023f Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.9% (1340 of 1382 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-09-15 16:07:09 +02:00
master7
107c9bd0fd Translated using Weblate (Polish)
Currently translated at 100.0% (1382 of 1382 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-09-15 16:07:09 +02:00
Tom De Moor
c6a1b13aea Translated using Weblate (Dutch)
Currently translated at 99.5% (1376 of 1382 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-09-15 16:07:09 +02:00
jprusch
9f68860d7d Translated using Weblate (German)
Currently translated at 100.0% (1382 of 1382 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-09-15 16:07:09 +02:00
master7
cc501cfe87 Translated using Weblate (Polish)
Currently translated at 100.0% (1380 of 1380 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-09-15 16:07:09 +02:00
avasconcelos114
2b33ad83e7 Translated using Weblate (Korean)
Currently translated at 83.4% (1151 of 1380 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2025-09-15 16:07:09 +02:00
jprusch
6d142df877 Translated using Weblate (German)
Currently translated at 100.0% (1380 of 1380 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-09-15 16:07:09 +02:00
Daniel Espino García
0df334dd2f
Add set due date functionality to playbooks (#9091)
* Add set due date functionality to playbooks

* Fix i18n

* Fix test

* Add tests

* Address feedback

* Remove unneeded line break

* Fix test
2025-09-12 16:37:56 +02:00
Rajat Dabade
4e95364344
Navigation for permalink and Tablet fixes (#9116)
* typescript and view component for permalink with user and message

* Old post edited handling in permalink

* Added test and update flag value to EnablePermalinkPreview

* Added test for permalink_preview component

* Added test for content/index.tsx for permalink

* Addressed review comments

* Unit test for missing file and review comments

* Added test to check handlePostEdited permalink sync only calls one time only

* Change TouchableOpacity to Pressable

* When user not found fetch the user from the server

* Removed the redundant test in the test for permalink_preview/index?

* ts to tsx

* Removed the circular dependency

* Address review comments

* displayname fallback

* remove permalink when permalink post is deleted

* UX review comments

* Linter fixes

* Test fixes

* File attachment in permalink preview component

* Fix the width and height of the image in permalink

* Added gredient when exceeds height of permalink container

* Minor

* Updated tests

* Minor

* Review comments

* Minor review comments

* type fixes

* Review comments

* Minor

* Mention ability in permalink preview

* Support for external link in permalink

* Handle device not connected update permalink post

* test fixes

* Address review comments

* Minor

* Merge fixes

* Addressed review comments

* Fix content.test.tsx after permalink branch merge

- Updated test expectations to use embedData prop instead of post prop
- Fixed assertions to match the new PermalinkPreview API
- All content tests now pass

* review comments

* Review comments

* Some more review comments

* Minor

* Fixed the undefined issue for opengraph component metadata

* More fixes

* Navigation for permalink

* Tablet fixes

* type chech for site name

* linter fixes

* UX review and remove show more height not require

* Fix tests

* Fixed the navigation issue for DM's

* Minor fixes due to merge main

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-09-12 17:46:39 +05:30
Daniel Espino García
a5d7bf7db4
Add select user screen to select owner and task assignee (#9089)
* Add select user screen to select owner and task assignee

* Fix i18n

* Add tests

* Address feedback

* Fix test

* Address UX feedback

* Fix test

* Put the no assignee button inline with the search
2025-09-12 12:13:25 +02:00
unified-ci-app[bot]
530cbb4ba5
Bump app build number to 670 (#9123)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-09-12 12:13:37 +03:00
Rajat Dabade
da2f38e072
Mention, embedded link and handling of post update on offline device (#9104)
* typescript and view component for permalink with user and message

* Old post edited handling in permalink

* Added test and update flag value to EnablePermalinkPreview

* Added test for permalink_preview component

* Added test for content/index.tsx for permalink

* Addressed review comments

* Unit test for missing file and review comments

* Added test to check handlePostEdited permalink sync only calls one time only

* Change TouchableOpacity to Pressable

* When user not found fetch the user from the server

* Removed the redundant test in the test for permalink_preview/index?

* ts to tsx

* Removed the circular dependency

* Address review comments

* displayname fallback

* remove permalink when permalink post is deleted

* UX review comments

* Linter fixes

* Test fixes

* File attachment in permalink preview component

* Fix the width and height of the image in permalink

* Added gredient when exceeds height of permalink container

* Minor

* Updated tests

* Minor

* Review comments

* Minor review comments

* type fixes

* Review comments

* Minor

* Mention ability in permalink preview

* Support for external link in permalink

* Handle device not connected update permalink post

* test fixes

* Address review comments

* Minor

* Merge fixes

* Addressed review comments

* Fix content.test.tsx after permalink branch merge

- Updated test expectations to use embedData prop instead of post prop
- Fixed assertions to match the new PermalinkPreview API
- All content tests now pass

* review comments

* Review comments

* Some more review comments

* Minor

* Fixed the undefined issue for opengraph component metadata

* More fixes

* type chech for site name

* linter fixes

* UX review and remove show more height not require

* Fix tests

* Review nitpick and fixes

* Minor UX changes

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-09-12 14:06:58 +05:30
Rajat Dabade
d732b5a33e
Ability to show attachment if the permalink post contains attachments. (#9101)
* typescript and view component for permalink with user and message

* Old post edited handling in permalink

* Added test and update flag value to EnablePermalinkPreview

* Added test for permalink_preview component

* Added test for content/index.tsx for permalink

* Addressed review comments

* Unit test for missing file and review comments

* Added test to check handlePostEdited permalink sync only calls one time only

* Change TouchableOpacity to Pressable

* When user not found fetch the user from the server

* Removed the redundant test in the test for permalink_preview/index?

* ts to tsx

* Removed the circular dependency

* Address review comments

* displayname fallback

* remove permalink when permalink post is deleted

* UX review comments

* Linter fixes

* Test fixes

* File attachment in permalink preview component

* Fix the width and height of the image in permalink

* Added gredient when exceeds height of permalink container

* Minor

* Updated tests

* Minor

* Review comments

* Minor review comments

* type fixes

* Review comments

* Minor

* Address review comments

* Minor

* Merge fixes

* Addressed review comments

* Some more review comments

* linter fixes

* UX review and remove show more height not require

* Fix tests

* Review fixes, dev and ux

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-09-12 13:44:54 +05:30
Rajat Dabade
71fed8aa50
(Android) Common component for upload item for main application and share extension (#9028)
* Common component for upload item for main application and share extension

* Addressed review comments

* intl fixes

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-11 12:54:54 +05:30
Rajat Dabade
113f9d942c
Typescript support and view component for permalink with user and message (#9052)
* typescript and view component for permalink with user and message

* Old post edited handling in permalink

* Added test and update flag value to EnablePermalinkPreview

* Added test for permalink_preview component

* Added test for content/index.tsx for permalink

* Addressed review comments

* Unit test for missing file and review comments

* Added test to check handlePostEdited permalink sync only calls one time only

* Change TouchableOpacity to Pressable

* When user not found fetch the user from the server

* Removed the redundant test in the test for permalink_preview/index?

* ts to tsx

* Removed the circular dependency

* Address review comments

* displayname fallback

* remove permalink when permalink post is deleted

* UX review comments

* Linter fixes

* Test fixes

* Address review comments

* Minor

* Some more review comments

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-09-10 17:12:16 +05:30
Daniel Espino García
82c7787dc4
Do not show the playbooks item on DMs/GMs (#9098)
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-09 09:53:38 +02:00
Weblate (bot)
303dbf3367
Translations update from Mattermost Weblate (#9112)
Automatic Merge
2025-09-08 15:49:12 +03:00
Daniel Espino García
b227837fa5
Add playbooks edit command functionality (#9084)
* Add playbooks edit command functionality

* Fix tests

* Add tests

* Remove option to change command when the run is disabled (not participant or finished)

* Fix tests

* Address feedback

* Fix test

* Remove unneeded variables
2025-09-08 14:29:15 +02:00
Rahim Rahman
881342cb5f
chore: error on react-hooks/exhaustive-deps during pre-commit (#9105)
* chore: exhaustive-deps error
* faster precommit using tsc --incremental
* don't exit until both check has ran
2025-09-05 06:08:01 -06:00
unified-ci-app[bot]
bb2321da26
Bump app build number to 669 (#9106)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-09-05 12:36:29 +03:00
sabril
06057a423e
fix sorting test scripts and add dotenv (#9099) 2025-09-02 16:58:52 +08:00
Weblate (bot)
6ffdf79b7a
Translations update from Mattermost Weblate (#9097)
Automatic Merge
2025-09-01 17:34:07 +03:00
Felipe Martin
f50056f57b
MM-65085: Support Pre Shared Password on server connect (#9082)
* feat: add shared server password to server setup

* feat: allow editing the sever

* refactor: changed password -> secret, styling and tests

* e2e: draft e2e tests

* chore: lint fix

* feat: also send preauth secret header when using native share

* fix: removed unused server database migration

credentials are being stored in the keychain

* i18n: added missing english translations

* test(e2e): simplified connection tests

* test(e2e): rework

* refactor: remove setBearerToken

* chore: restore migrations the way it was

* chore: reverted file to original state

* chore: removed unneeded test and renamed password to secret

* chore: function version

* chore: updated forms i18n keys

* chore: remove if from test

* chore: unneeded variable

* fix: add missing key on object list

* refactor: swift keychain access to retrieve all credentials in one call

* revert: edit server screen

* refactor: credentials use getGenericCredential

* fix: objc code calling old method

* fix: added scroll to login screen

* chore: variable names

* fix: avoid inline styles

* fix: Improved appVersion positioning

* Update app/screens/server/form.tsx

Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>

* feat: show error message on 403

* Revert "feat: show error message on 403"

This reverts commit f41630c767e10211adf1885321ceefd8a0931e32.

---------

Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>
2025-09-01 11:24:15 +02:00
Elias Nahum
2c1d896e9b
update react-native-network-client (#9094) 2025-09-01 16:22:26 +08:00
Daniel Espino García
4978269156
Fix playbooks not getting updated by websocket (#9088) 2025-08-26 14:01:04 +02:00
Anonymous
4dd88ee6b6 Translated using Weblate (Indonesian)
Currently translated at 4.4% (61 of 1361 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/id/
2025-08-25 15:12:00 +02:00
Anonymous
d251095fae Translated using Weblate (Hindi)
Currently translated at 13.3% (182 of 1361 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hi/
2025-08-25 15:12:00 +02:00
Hosted Weblate
e6c4d19f37 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2025-08-25 15:12:00 +02:00
Frank Paul Silye
3a335b96c0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.9% (1348 of 1362 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-08-25 15:12:00 +02:00
Daniel Espino García
8aa13c4e0a
Add bottom sheet for playbooks checklist items (#9065)
* Add bottom sheet for playbooks checklist items

* i18n extract

* Remove unneeded test case

* Add tests

* Address feedback

* Remove unneeded useCallback and add needed useMemo

* Address feedback

* Add missing translation string
2025-08-25 12:37:29 +02:00
Daniel Espino García
0c4a42a06a
Remove tand prevent double tap (#9078)
* Remove the t function and all wrong uses of preventDoubleTap

* Fix existing typo

* Fix tests

* Address comments

* Fix test
2025-08-25 12:03:01 +02:00
unified-ci-app[bot]
1965b4777d
Bump app build number to 666 (#9083)
Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-08-22 12:12:31 +03:00
unified-ci-app[bot]
ebc39fd386
Bump app build and version number (#9080)
* Bump app build number to 665

* Bump app version number to 2.32.0

---------

Co-authored-by: Mattermost CI Bot <ci-bot@mattermost.com>
2025-08-20 15:06:21 +03:00
Daniel Espino García
a27c82da90
Refactor and cleanup of option item (#9067)
* Refactor and cleanup of option item

* Fix tests and minor cleanup

* Fix bug and address feedback
2025-08-19 14:01:56 +02:00
Daniel Espino García
2e5bbb9f62
Fix share screenshot on ios 26 (#9068)
* Fix share screenshot on ios 26

* Address copilot feedback

* Address more copilot comments
2025-08-19 09:04:37 +02:00
Rahim Rahman
882097a668
feat(MM-63937): fetch initial team data only on entry (#8894)
* feat(MM-63936): add mark function in performance metrics manager
* feat(MM-63563): fetch initial team data ONLY on entry
* remove all performance mark()
* revert changes to processEntryModels
* using processNextTeam to download team in sequence
* separate restDeferredAppEntryActions into two parts
* remove console.log
* fixed issue with conflict post.id
* regression from fetchPostsForUnreadChannels
* extracted deferred functions into deferred.ts
* missing mock
* extract combineChannelsData to it's own function
* remove isDelete
* use logDebug vs logInfo
* add logDebug and logWarning in the mocking
* add combineChannelsData test
* revert the use of logDebug
* spelling errors
* undo logDebug changes
* moving fetchMissingDirectChannelsInfo into setTimeout saved quite a bit of time when it comes to TTI
* changes to accommodate other recent changes
* keep the channelsMap smaller by moving delete_at.
* using for loop instead of recursive
* making this function more readable
* add jsdoc
* changes based on review
* team will not get omitted from the sidebar if there is an error
* fix test as well
* added a new test
* remove comments on categories
* add categories to fix failing test
* fix failing test
2025-08-18 10:06:15 -06:00
MArtin Johnson
7b6fe1e84a Translated using Weblate (Swedish)
Currently translated at 99.7% (1359 of 1362 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-08-18 15:32:02 +02:00
Hosted Weblate
1587dc3d92 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2025-08-18 15:32:02 +02:00
unified-ci-app[bot]
faf5e923f2
chore: Update NOTICE.txt file with updated dependencies (#9073)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2025-08-18 13:11:35 +03:00
unified-ci-app[bot]
eb4609a890
Bump app build number to 662 (#9069)
Co-authored-by: Anka <runner@Mac-1755248560088.local>
2025-08-15 12:12:38 +03:00
Daniel Espino García
4f27a022c3
Make relatives times coherent with web (#9062)
* Make relatives times coherent with web

* Fix test
2025-08-12 14:28:25 +02:00
Daniel Espino García
71cec5a3e2
Purge leftover information in my channel table when purging playbooks (#9057)
* Purge leftover information in my channel table when purging playbooks

* Add comment

* Clear the sync ephemeral store on plugin disable
2025-08-12 14:27:52 +02:00
Daniel Espino García
d653d55cbc
Fix long name playbooks channel header (#9051)
* Fix long name playbooks channel header

* Address nitpick

* Fix unintended android change
2025-08-12 14:18:05 +02:00
Matthew Williams
f5ded51b02 Translated using Weblate (English (Australia))
Currently translated at 100.0% (1374 of 1374 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2025-08-11 15:23:46 +02:00
Rajat Dabade
abb8fc84e9
(IOS) Consistent component for upload item for share extension (#9030)
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-08-11 16:56:46 +05:30
Daniel Espino García
a102b6147e
Add ellipsis to the checklist title (#9059) 2025-08-08 13:41:05 +02:00
unified-ci-app[bot]
464b15ffb0
Bump app build number to 661 (#9063)
Co-authored-by: Anka <runner@Mac-1754641802002.local>
2025-08-08 12:18:13 +03:00
Elias Nahum
e8a0be4589
Upgrade SQLite.Swift to 0.15.4 (#9061) 2025-08-08 07:09:51 +08:00
Guillermo Vayá
499198bd96
fix sort_order 0 being converted to MAX_INTEGER (#9050) 2025-08-06 18:12:37 +02:00
unified-ci-app[bot]
22118854a1
chore: Update NOTICE.txt file with updated dependencies (#9056)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2025-08-05 11:14:06 +03:00
Amy Blais
9bf54d18f7
Update NOTICE.txt (#9055) 2025-08-05 10:54:08 +03:00
Elias Nahum
64dda92be2
Update package.json (#9053) 2025-08-05 10:21:33 +03:00
Rajat Dabade
1dce89c97e
Reschedule time picker should open with post's scheduled date time (#9035) 2025-08-04 19:22:35 +05:30
Martin Mičuda
9f92c0c83b Translated using Weblate (Czech)
Currently translated at 100.0% (1374 of 1374 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-08-04 15:04:11 +02:00
Tom De Moor
b2820aca07 Translated using Weblate (Dutch)
Currently translated at 100.0% (1374 of 1374 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-08-04 15:04:11 +02:00
master7
a59f4dc130 Translated using Weblate (Polish)
Currently translated at 100.0% (1374 of 1374 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-08-04 15:04:11 +02:00
jprusch
dac0730a83 Translated using Weblate (German)
Currently translated at 100.0% (1374 of 1374 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-08-04 15:04:11 +02:00
Manuela Silva
6d5dfaf41f Translated using Weblate (Portuguese)
Currently translated at 29.9% (412 of 1374 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt/
2025-08-04 15:04:11 +02:00
Manuela Silva
2c4ca0a26d Translated using Weblate (Portuguese)
Currently translated at 28.8% (396 of 1371 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt/
2025-08-04 15:04:11 +02:00
master7
761d3fcadd Translated using Weblate (Polish)
Currently translated at 100.0% (1371 of 1371 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-08-04 15:04:11 +02:00
jprusch
527a385267 Translated using Weblate (German)
Currently translated at 100.0% (1371 of 1371 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-08-04 15:04:11 +02:00
Guillermo Vayá
f7162c9ab6
Fix flaky biometric authentication test (#8995)
* Fix flaky biometric authentication test

Eliminates timing race conditions in SecurityManager test by using fixed timestamps instead of real Date.now() values. The test was failing inconsistently due to timing variations between test runs.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* use fake timers

* revert changes

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-04 10:41:03 +02:00
unified-ci-app[bot]
f4530653e3
Bump app build number to 660 (#9047)
Co-authored-by: Anka <runner@Mac-1754038924271.local>
2025-08-01 12:15:57 +03:00
Lucas Reis
bcdd00dc34
MM-30000 fix: enabling again the channel link on the attachment title (#9020) 2025-07-31 13:22:18 -04:00
Elias Nahum
1103ddb8f4
MM-64960 ask users to fill Playbook run retrospective on web or desktop (#9044) 2025-07-31 18:21:11 +08:00
Elias Nahum
40d8a0cbb4
Playbooks update (#9039)
* Playbook run status update post

* Show Playbooks button in Channel Info screen only if playbooks is enabled

* Handle Playbook links

* Fetch playbook if needed

* fix playbooks migration

* fix deeplinks using parsedUrl

* update last time playbooks where fetched if no errors

* show participants for run status update post

* fix tests

* remove console.log in test

* feedback review

* wrap participants footer

* add fastlane FASTLANE_XCODEBUILD_SETTINGS_RETRIES env vars
2025-07-29 21:55:41 +08:00
Serhii Khomiuk
21708aa2ee Translated using Weblate (Ukrainian)
Currently translated at 97.7% (1328 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-07-28 20:33:48 +02:00
master7
d2d7ac644a Translated using Weblate (Polish)
Currently translated at 100.0% (1359 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-07-28 20:33:48 +02:00
Tom De Moor
6218aeff0e Translated using Weblate (Dutch)
Currently translated at 100.0% (1359 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-07-28 20:33:48 +02:00
Frank Paul Silye
cb0773833e Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.0% (1346 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-07-28 20:33:48 +02:00
ThrRip
98c65c1942 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1359 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-07-28 20:33:48 +02:00
Serhii Khomiuk
1627441b96 Translated using Weblate (Ukrainian)
Currently translated at 97.2% (1321 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-07-28 20:33:48 +02:00
jprusch
0fe0f99ef0 Translated using Weblate (German)
Currently translated at 100.0% (1359 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-07-28 20:33:48 +02:00
Martin Mičuda
e453d275bc Translated using Weblate (Czech)
Currently translated at 100.0% (1359 of 1359 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-07-28 20:33:48 +02:00
Martin Mičuda
e1b47bb7c5 Translated using Weblate (Czech)
Currently translated at 100.0% (1358 of 1358 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-07-28 20:33:48 +02:00
jprusch
f4600efec7 Translated using Weblate (German)
Currently translated at 100.0% (1358 of 1358 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-07-28 20:33:48 +02:00
sabril
d00407c330
attempt to fix base timeout error on fastlane for release build (#9037) 2025-07-29 00:16:06 +08:00
Elias Nahum
85d6915bad
use alertOnlyPDFSupported for document files (#9023) 2025-07-27 18:05:49 +08:00
unified-ci-app[bot]
b2cec1c7a1
Bump app build number to 656 (#9027)
Co-authored-by: Anka <runner@Mac-1753434238346.local>
2025-07-25 12:16:46 +03:00
Maria A Nunez
b0560b77e7
Update Playbooks version to latest 2025-07-24 10:42:25 -04:00
Daniel Espino García
80e3659c53
Fix order of finished runs and add a show more button (#8999)
* Fix order of finished runs and add a show more button

* Add missing text

* Add prevent double tap

* Fix show more button showing when it shouldn't

* fix tests

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2025-07-24 11:59:30 +08:00
Daniel Espino García
2be07ec6d0
Address plugin changes around incremental websocket (#9011)
* Address plugin changes around incremental websocket

* ensure change_fields is set and is an object before processing

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2025-07-24 10:16:52 +08:00
dependabot[bot]
7086158e76
Bump brace-expansion from 1.1.11 to 1.1.12 (#8921)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 16:36:43 +08:00
dependabot[bot]
dd4e0f3432
Bump on-headers and compression (#9004)
Bumps [on-headers](https://github.com/jshttp/on-headers) and [compression](https://github.com/expressjs/compression). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: indirect
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 15:23:54 +08:00
dependabot[bot]
a434059169
Bump nokogiri from 1.18.7 to 1.18.9 in /fastlane (#9017)
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.7 to 1.18.9.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.18.7...v1.18.9)

---
updated-dependencies:
- dependency-name: nokogiri
  dependency-version: 1.18.9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 15:23:20 +08:00
dependabot[bot]
1563d538b1
Bump form-data from 3.0.3 to 3.0.4 (#9016) 2025-07-22 14:02:32 +08:00
Elias Nahum
5eb3a1ab41
Refactor gallery gestures (#8752) 2025-07-22 14:00:57 +08:00
Daniel Espino García
19a258c755
Fix misalignment in quick actions item (#9000)
* Fix missalign in quick actions item

* Fix flaky test

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-07-21 12:39:37 -04:00
Daniel Espino García
4444826147
Fix tests leaks and other minor improvements (#9001)
* Fix tests leaks and other minor improvements

* Fix flaky test and remove unneeded flags

* Add comments

* test: create ci specific test commands (#9010)

* test: create ci specific test commands
* use test:ci as base for test:ci:coverage

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-07-21 07:29:26 -06:00
Weblate (bot)
6cbc2c8118
Translations update from Mattermost Weblate (#9015)
Automatic Merge
2025-07-21 16:28:43 +03:00
Amy Blais
2618f69c43
Update build.gradle (#8996) 2025-07-21 10:49:24 +03:00
unified-ci-app[bot]
a098de3481
Bump app build and version number (#9013)
* Bump app build number to 655

* Bump app version number to 2.31.0

---------

Co-authored-by: Anka <runner@Mac-1753071427258.local>
2025-07-21 08:00:49 +03:00
Rahim Rahman
9d67acb8cc
fix(MM-63596): custom theme cannot be reselected (#8960)
* initialTheme should not be a dependent of useCallback since its a ref
* a few cleanup on test to make it more clearer
* add a bit more description
* fix(MM-64710): changing themes repeatedly in rapid succession cause the theme to not register (#8980)
* add more test, doubleTap prevention test
* changes based on comments
* remove the use of currentTheme
* consolidate handleSelectTheme with setThemePreference
* add comment to explain why we're storing customTheme in a state
2025-07-18 06:48:29 -06:00
Daniel Espino García
6678003def
Fix progress numbers on playbook runs (#8998)
* Fix progress numbers on playbook runs

* Update checkList for checklist
2025-07-18 12:10:49 +02:00
Daniel Espino García
5a034aa51f
Fetch playbooks when we reconnect and we are on a channel (#8993)
* Fetch playbooks when we reconnect and we are on a channel

* Fix test

* Address feedback
2025-07-18 11:37:43 +02:00
unified-ci-app[bot]
394b441874
Bump app build number to 654 (#9006)
Co-authored-by: Anka <runner@Mac-1752828286516.local>
2025-07-18 12:34:30 +03:00
Daniel Espino García
ae409d185c
Fix tables on playbook runs (#8997) 2025-07-18 11:14:23 +02:00
Daniel Espino García
2455ecf39f
Remove playbooks on delete channel (#8994)
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-07-17 11:54:14 +02:00
Daniel Espino García
b925baa21b
Purge playbooks data when the plugin gets disabled (#8989)
* Purge playbooks data when the plugin gets disabled

* Address copilot comments
2025-07-17 11:32:42 +02:00
Weblate (bot)
741baae3de
Translations update from Mattermost Weblate (#8988)
Automatic Merge
2025-07-14 18:58:43 +03:00
Rajat Dabade
bfe6852ae7
Fix stale search results when files are deleted from posts (#8985)
* Fix stale search results when files are deleted from posts

* Minor

* cleaned the  dependency from useDidUpdate to not trigger unnecessary API call

* Added comment
2025-07-14 18:03:24 +05:30
Rajat Dabade
0d3369d062
Fix the count issue in channel header when removing or adding attachment in the post (#8986)
* Fix the count issue in channel header when removing or adding attachment in the post

* Optimisation

* Added utils function
2025-07-14 17:57:09 +05:30
Rajat Dabade
b5969fdfb4
Edit mode when no text and no attachment on save calls delete post (#8984)
* Edit mode when no text and no attachment on save calls delete post

* Removed the hasAttachment and isPost props to use shouldDirectlyReact props
2025-07-14 17:55:27 +05:30
Daniel Espino García
bb7ff622af
Add Playbooks read-only support for mobile devices (#8978)
* Add the channel options to get into playbooks (#8750)

* Add the channel options to get into playbooks

* Use playbook run id instead of playbook id

* i18n

* Fix issues and move playbooks to the products folder

* Address some tests

* Fix test

* Address design issues

* Add requested comment

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* Playbooks database (#8802)

* Add lastPlaybookFetchAt to channel table (#8916)

* Add lastPlaybookFetchAt to channel table

* Add missing commit

* Use my_channel table instead

* Fix test

* Address feedback

* First implementation of playbooks API (#8897)

* First implementation of playbooks API

* Add version check

* Address feedback

* Fix test

* Add last fetch at usage and other improvements

* Simplify test

* Add sort_order, update_at and previousReminder columns (#8927)

* Add sort_order, update_at and previousReminder columns

* Remove order from the schema

* Fix tests

* Add tests

* Add websockets for playbooks (#8947)

* Add websocket events for playbooks

* Fix typo

* Add playbook run list (#8761)

* Add the channel options to get into playbooks

* Use playbook run id instead of playbook id

* i18n

* Fix issues and move playbooks to the products folder

* Address some tests

* Fix test

* Add playbook run list

* Add missing texts

* Add back button support and item size to flash list

* Address design issues

* Add requested comment

* Standardize tag and use it in the card

* Fix merge

* Add API related functionality

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* Add playbooks run details (#8872)

* Add the channel options to get into playbooks

* Use playbook run id instead of playbook id

* i18n

* Fix issues and move playbooks to the products folder

* Address some tests

* Fix test

* Add playbook run list

* Add missing texts

* Add back button support and item size to flash list

* Address design issues

* Add requested comment

* Standardize tag and use it in the card

* Add playbooks run details

* Fix merge

* Add API related functionality

* Add API related changes

* Order fixes

* Several fixes

* Add error state on playbook run

* i18n-extract

* Fix tests

* Fix test

* Several fixes

* Fixes and add missing UI elements

* i18n-extract

* Fix tests

* Remove files from bad merge

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* Add missing tests for playbooks (#8976)

* Add the channel options to get into playbooks

* Use playbook run id instead of playbook id

* i18n

* Fix issues and move playbooks to the products folder

* Address some tests

* Fix test

* Add playbook run list

* Add missing texts

* Add back button support and item size to flash list

* Address design issues

* Add requested comment

* Standardize tag and use it in the card

* Add playbooks run details

* Fix merge

* Add API related functionality

* Add API related changes

* Order fixes

* Several fixes

* Add error state on playbook run

* i18n-extract

* Fix tests

* Fix test

* Several fixes

* Fixes and add missing UI elements

* i18n-extract

* Fix tests

* Remove files from bad merge

* Add tests

* Fix typo

* Add missing strings

* Fix tests and skip some

* Fix test

* Fix typo

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* Address feedback

* Address feedback and fix tests

* Address comments and fix tests

* Address feedback

* Address plugin changes and fix bugs

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2025-07-14 09:21:37 +02:00
unified-ci-app[bot]
dff9119519
Bump app build number to 653 (#8983)
Co-authored-by: Anka <runner@Mac-1752222762174.local>
2025-07-11 12:11:16 +03:00
Serhii Khomiuk
87fbd5d4ea Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-07-07 11:56:33 +00:00
MArtin Johnson
17c0a0e96e Translated using Weblate (Swedish)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-07-07 11:56:33 +00:00
Serhii Khomiuk
b6f7621d9d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-07-07 11:56:33 +00:00
Tom De Moor
0e8dfde5c9 Translated using Weblate (Dutch)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-07-07 11:56:33 +00:00
Rajat Dabade
10cbd31801
MM-64415 Attachment style updated for draft and Edit post screen (#8961)
* MM-64415 Attachment style updated for draft and Edit post screen

* Minor

* constants

* Addressed Review comments

* UX review comments

* Error state changes

* Fix the style issue for retry state on the attachment

* Fix some styling

* Fix the space extra char issue in post
2025-07-07 16:24:27 +05:30
unified-ci-app[bot]
4c301f8fd3
Bump app build number to 652 (#8973)
Co-authored-by: Anka <runner@Mac-1751618430506.local>
2025-07-04 12:11:09 +03:00
Guillermo Vayá
7891079a61
[MM-64358] don't save unneeded custom profile attributes (#8971)
* send only needed changes, take saml into account

* adhere to naming conventions

* fix tests

* address review comments
2025-07-02 17:49:55 +02:00
Rajat Dabade
6bdcf2be49
Remaining test for draft and Scheduled post (#8887)
* Added test for draft_scheduled_post and header component

* Added test for drafts_button/index.ts

* Added test for send_button/index.ts

* Added test for servers/scheduled_post.ts queries

* Added test for global_scheduled_post_list/index.ts

* Added test for rescheduled draft index file and minor update

* Added test for core option and index

* Added test for scheduled post options

* Added test for send_draft index file

* updated test for draft_scheduled_post and draft_scheduled_post_header

* Updated test for drafts_button index

* Updated test for send_button index

* Updated test for server/scheduled_post

* Updated test for global_scheduled_post/index

* removed the unnecessary config and team data to populate in db for test

* Update app/components/draft_scheduled_post/draft_scheduled_post.test.tsx

Co-authored-by: Daniel Espino García <larkox@gmail.com>

* linter fixes

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Daniel Espino García <larkox@gmail.com>
2025-07-01 13:47:02 +05:30
Weblate (bot)
d804f70d08
Translations update from Mattermost Weblate (#8968)
* Translated using Weblate (German)

Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/

* Translated using Weblate (Czech)

Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/

* Translated using Weblate (Serbian)

Currently translated at 2.8% (37 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

---------

Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: Sharuru <mave@foxmail.com>
Co-authored-by: Martin Mičuda <micuda@rematiptop.cz>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
2025-06-30 12:57:14 -03:00
Rajat Dabade
5cceaee7c5
Changed the Edited text style in the post from (edited) to icon + Edited (#8937)
* Viewing Files in Edit mode in mobile with ability to delete and save

* Added upload attachment to keyboard tracker view

* using state instread of use ref

* Minor

* Added tests

* intl extract

* new function getFiles
ById, batch file deletion and tests

* Files fetching in edit options and tests

* Removed DeviceEventEmitter and used React context

* Added support to check minimum required version to show edit file attachments

* resolve forward ref issue

* Minor

* memotized props for context and observe config with value

* Ability to show quick action and add files to edit post

* type safety for EditPostContext

* Reverted back the post priority props

* constant shift

* Added test for QuickAction to show slashcomand

* Added test for edit_post, upload_item and upload_remove

* Added test for Edit_post_input and edit_post index

* fix the height issue between attachment and keyboard due to safeArea

* Minor: removed debugging border color

* Changed the Edited text style in the post from (edited) to icon + Edited

* Import fixes

* Ability to show quick action and add files to edit post

* type safety for EditPostContext

* Reverted back the post priority props

* constant shift

* Added test for QuickAction to show slashcomand

* Added test for edit_post, upload_item and upload_remove

* Added test for Edit_post_input and edit_post index

* fix the height issue between attachment and keyboard due to safeArea

* Minor: removed debugging border color

* Addressed dev review comments

* Import fixes

* Address UX comments

* Fixed props for UploadItem and remove effective Edit mode

* handled save button disabled state when uploading attachments

* handled newly added and retry file removal without alert message

* Test updated

* Added test for input_quick_action index.tsx

* Added test for not in edit mode for upload_item index

* Added test for upload_remove component when not in edit mode

* added tests for file_upload_error hook

* Added test for calling callback when in edit mode

* Test for edit post input for server version check

* linter fixes

* Changed font size from 16 to 14px for edited

* separated common component and test

* Removed the margin styles from the text as it is not been applied.

* removed the duplicate code from rebase
2025-06-29 12:39:18 +05:30
unified-ci-app[bot]
a204494e41
Bump app build number to 651 (#8965)
Co-authored-by: Anka <runner@Mac-1751013947507.local>
2025-06-27 12:16:19 +03:00
Lucas Reis
d38bf60050
Disable Animations when Accessibility configuration is to remove it (#8743)
* feat: add support for reduced motion in BottomSheet and TabBar components

* fix: remove reduceMotion option from animation timing in login, onboarding, and server screens

* feat: integrate reduced motion support to the entire app and switch accordingly

* feat: positions the Login screen differently if animations are disabled

* fix: remove mock implementation of useReducedMotion in react-native-reanimated

* revert login screen

* fix: remove unused effect that resets translateX value in LoginOptions

* feat: add reduced motion support to ForgotPassword screen and reset translateX on LoginOptions mount

* feat: integrate reduced motion support in Onboarding and Slide components

* feat: add reduced motion support to MFA and SSO screens

* feat: update ReducedMotionConfig to use system preference in withServerDatabase

* refactor: remove ReducedMotionConfig from withServerDatabase component

* feat: remove reduced motion configuration from screens and adjust animations accordingly

* feat: integrate reduced motion handling in Server component animations

* feat: enhance BottomSheet animation with reduced motion support and update test setup for react-native-reanimated

* fix: update channel list row snapshots with collapsable and animated props

* test: update react-native-reanimated mock setup for improved testing

* fix: enhance react-native-reanimated mock to support reduced motion and prevent default call

* fix: refactor animationConfigs to use useMemo for improved performance and clarity

* feat: implement screen transition animation hook and integrate it into ForgotPassword screen

* fix: refactor LoginOptions to utilize useScreenTransitionAnimation for improved animation handling

* refactor: streamline MFA component by removing unused imports and integrating useScreenTransitionAnimation for enhanced transitions

* refactor: simplify Onboarding component by removing unused imports and integrating useScreenTransitionAnimation for smoother transitions

* refactor: enhance useScreenTransitionAnimation hook to support animated transitions and integrate it into Server component

* refactor: replace custom animation logic with useScreenTransitionAnimation in SSO component for improved transition handling
2025-06-26 11:25:48 +02:00
Rajat Dabade
dae4b75720
Ability to show quick action and add files to edit post (#8926)
* Viewing Files in Edit mode in mobile with ability to delete and save

* Added upload attachment to keyboard tracker view

* using state instread of use ref

* Minor

* Added tests

* intl extract

* new function getFiles
ById, batch file deletion and tests

* Files fetching in edit options and tests

* Removed DeviceEventEmitter and used React context

* Added support to check minimum required version to show edit file attachments

* resolve forward ref issue

* Minor

* memotized props for context and observe config with value

* Import fixes

* Ability to show quick action and add files to edit post

* type safety for EditPostContext

* Reverted back the post priority props

* constant shift

* Added test for QuickAction to show slashcomand

* Added test for edit_post, upload_item and upload_remove

* Added test for Edit_post_input and edit_post index

* fix the height issue between attachment and keyboard due to safeArea

* Minor: removed debugging border color

* Addressed dev review comments

* Import fixes

* Address UX comments

* Fixed props for UploadItem and remove effective Edit mode

* handled save button disabled state when uploading attachments

* handled newly added and retry file removal without alert message

* Test updated

* Added test for input_quick_action index.tsx

* Added test for not in edit mode for upload_item index

* Added test for upload_remove component when not in edit mode

* added tests for file_upload_error hook

* Added test for calling callback when in edit mode

* Test for edit post input for server version check
2025-06-25 16:04:08 +05:30
MArtin Johnson
65c0f418b0 Translated using Weblate (Swedish)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-06-23 13:46:59 +00:00
Son Le
bd0ae8fd66 Translated using Weblate (Vietnamese)
Currently translated at 80.0% (1058 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/
2025-06-23 13:46:59 +00:00
Frank Paul Silye
823772c934 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-06-23 13:46:59 +00:00
Tom De Moor
774c162612 Translated using Weblate (Dutch)
Currently translated at 100.0% (1321 of 1321 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-06-23 13:46:59 +00:00
Manuela Silva
44259d1408 Translated using Weblate (Portuguese)
Currently translated at 10.9% (144 of 1317 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt/
2025-06-23 13:46:59 +00:00
Frank Paul Silye
ed537db2e7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (1306 of 1317 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-06-23 13:46:59 +00:00
jprusch
408cd10b37 Translated using Weblate (German)
Currently translated at 100.0% (1317 of 1317 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-06-23 13:46:59 +00:00
Hosted Weblate
ac64ca1d03 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2025-06-23 13:46:59 +00:00
Manuela Silva
0c003e9f01 Translated using Weblate (Portuguese)
Currently translated at 6.5% (86 of 1307 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt/
2025-06-23 13:46:59 +00:00
Ekaterine Papava
b05ea2d6c8 Translated using Weblate (Georgian)
Currently translated at 3.3% (44 of 1307 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ka/
2025-06-23 13:46:59 +00:00
kaakaa
601eb67409 Translated using Weblate (Japanese)
Currently translated at 100.0% (1307 of 1307 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-06-23 13:46:59 +00:00
Amy Blais
a6a0913df9
Update NOTICE.txt (#8957) 2025-06-23 14:58:39 +03:00
Maria A Nunez
dbb6890fe6
Update additional images branding (#8672)
* Updated search empty images

* Updated channel empty state images

* Styling

* Added unreads, threads, mentions and saved messages empty state images

* Removed withTheme

* Update snapshot

* Update review app image

* Updated loading error svg

* Added draft svg

* Removed unused image

* update snapshots
2025-06-20 11:41:26 -04:00
Rajat Dabade
8e1af4298d
Viewing Files in Edit mode in mobile with ability to delete and save (#8918)
* Viewing Files in Edit mode in mobile with ability to delete and save

* Added upload attachment to keyboard tracker view

* using state instread of use ref

* Minor

* Added tests

* intl extract

* new function getFiles
ById, batch file deletion and tests

* Files fetching in edit options and tests

* Removed DeviceEventEmitter and used React context

* Added support to check minimum required version to show edit file attachments

* resolve forward ref issue

* Minor

* memotized props for context and observe config with value

* Import fixes
2025-06-20 01:03:57 +05:30
Angelos Kyratzakos
a207be38ce
fix android sbom path (#8953) 2025-06-19 14:38:46 +03:00
Angelos Kyratzakos
ac09f887be
Update GitHub Actions workflow for SBOM generation and Snyk versioning (#8952)
- Set SNYK_VERSION and CYCLONEDX_VERSION as environment variables for easier updates.
- Modify Snyk installation to use the defined SNYK_VERSION.
- Adjust working directories for iOS and Android SBOM generation.
- Enhance error handling for CycloneDX CLI download and SBOM file checks.
- Ensure required SBOM files are present before consolidation.
2025-06-19 13:52:36 +03:00
Elias Nahum
b91e42615f
Secure Files and preview PDF inline (#8844) 2025-06-19 15:30:56 +08:00
Angelos Kyratzakos
b365cb34d6
fix typo on curl command of cyclonedx (#8945) 2025-06-19 10:14:17 +03:00
Angelos Kyratzakos
075d7b2986
add manual invocation for github release workflow (#8944) 2025-06-19 09:22:24 +03:00
unified-ci-app[bot]
1dbedaae0e
Bump app build and version number (#8942)
* Bump app build number to 649

* Bump app version number to 2.30.0

---------

Co-authored-by: Anka <runner@Mac-1750308866906.local>
2025-06-19 08:52:31 +03:00
Lorenzo
1ee2c8814c
Fix commit hashes for download artifacts for SBOM generation (#8939) 2025-06-18 10:08:50 -06:00
Lucas Reis
24d2ab57b0
feat: add minimumHashtagLength to Markdown observables (#8924) 2025-06-17 09:53:11 +02:00
Claudio Costa
5030525c3e
Derive connection state for current call from RTC peer (#8878)
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-16 15:08:06 -06:00
Weblate (bot)
47241539d4
Translations update from Mattermost Weblate (#8932)
Automatic Merge
2025-06-16 14:46:11 +03:00
Daniel Espino García
c3b9285f18
Fix style issues with scroll on report a problem screen (#8906) 2025-06-16 11:30:58 +02:00
unified-ci-app[bot]
2e511f6e02
Bump app build number to 647 (#8925)
Co-authored-by: Anka <runner@Mac-1749804309863.local>
2025-06-13 12:11:45 +03:00
Pablo Vélez
6f1d06ec4c
MM-63935 - docs abac end user indicators db schema updates (#8893)
* MM-63935 - docs abac end user indicators db schema updates

* revert auto not null from quick db
2025-06-12 14:29:13 +02:00
Guillermo Vayá
972bd34da6
[MM-62700] User Attribute types (#8903)
* add basic types to user_profile

* fix storing multiselect in DB

* fix storing multi-select on db

* add tests

* add tests for select-multiselect

* imporove testing

* improve intl, add tests

* address comments and tests

* review comments

* more test refactoring

* remove styling tests

* remove styling tests

* small improvements

* nitpick

* improve messaging

* safer stringify

* fix tests
2025-06-12 10:59:13 +02:00
Guillermo Vayá
efeabb48a2
[MM-64358] Don't send custom profile info if the feature is not enabled (#8904)
* don't send custom profile info if the feature is not enabled

* add tests

* missing changes

* missing check

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-11 13:22:51 +02:00
Daniel Espino García
cdd91dbbb8
Standardize tags and chips through the app (#8856)
* Standardize tags and chips through the app

* Add missing texts

* Fix tests and snapshots

* Address feedback

* Fix snapshots

* Address UX feedback

* Apply text styles to outer text component

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-11 10:11:05 +02:00
Claudio Costa
9b1d8cccee
Fix orientation issue in Calls screen (#8873)
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-10 21:56:11 +02:00
Daniel Espino García
9fcc6e580d
Fix GM/DM unread threads highlighting all teams as unreads (#8905)
* Fix GM/DM unread threads highlighting all teams as unreads

* Use options object instead of boolean flags

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-10 15:30:58 +02:00
Claudio Costa
1a695a1273
Update calls-common (#8913)
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-10 10:00:34 +02:00
MArtin Johnson
a7d73b1dd7 Translated using Weblate (Swedish)
Currently translated at 100.0% (1302 of 1302 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-06-09 12:34:37 +00:00
Lucas Reis
29e2d3ddb1
Add Accept Header on ClientTracking (#8895)
* feat: add HEADER_ACCEPT constant and update requestOptions in ClientTracking

* feat: add HEADER_ACCEPT to request headers and improve request options handling

* feat: add Accept header to performance report requests
2025-06-06 12:42:09 +02:00
unified-ci-app[bot]
9f638d11ba
Bump app build number to 645 (#8914)
Co-authored-by: Anka <runner@Mac-1749199144215.local>
2025-06-06 12:17:47 +03:00
Weblate (bot)
e3bb675e90
Translations update from Mattermost Weblate (#8902)
Automatic Merge
2025-06-02 15:00:11 +03:00
Rajat Dabade
542420eb73
MM-64243 Fix the animation delay while send the post in the channel (#8868)
* MM-64243 Fix the animation delay while send the post in the channel

* Updated test and logic

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-06-02 08:29:17 +03:00
Rahim Rahman
dffb30de47
feat(MM-64410): batch write all posts for all channels by team (#8892)
* feat(MM-64410): batch write all posts for all channels on team-by-team basis
* skipAuthor=false, so the authors will be fetched after post fetching
* renaming a file
* revert unplanned changes
* missing end line
* fix broken test
* Review comment. Using 20 posts
2025-06-01 07:40:38 -06:00
Daniel Espino García
2ad6fec90f
Unify buttons (#8865)
* Unity buttons

* Fix texts and use defineMessages

* Update snapshots

* Fix disabled style
2025-05-30 15:59:15 +02:00
Rahim Rahman
705ed603bc
feat(MM-64361): categoryChannels update ONLY when necessary (#8880) 2025-05-29 13:20:19 -06:00
Daniel Espino García
6c53533080
Standardize tabs across different components (#8691)
* Standardize tabs across different components

* Add tests and minor fixes

* Remove unneeded tests

* Add missing change

* Fix test

* Refactor to remove the component from the hook

* Rename hasDot for requiresUserAttention.

* Apply the changes to scheduled posts

* Fix texts

* Fix tests and fix minor style issue on iOS

* Fix filter positioning

* Fix some e2e tests

* Fix tests

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-28 16:23:37 +02:00
Guillermo Vayá
db569fe2c3
[MM-62565] Custom Profile attributes websocket changes (#8758)
* user_info websocket listening

* add to edit profile

* add tests

* fix user_info test

* improved types

* add websocket tests

* fix tests to adapt to the database

* temp

* fix test, remove unneeded file

* Update app/actions/remote/custom_profile.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix test and storing fields and attributes

* consistency

* remove await from loop

* remove db from component

* simplify functions

* address reviews

* adress review comments

* fix promises not being fulfilled before ordering

* fix tests

* address comments

* address review comments

* test_helper

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-27 16:24:40 +02:00
Weblate (bot)
e56423ce28
Translations update from Mattermost Weblate (#8890)
Automatic Merge
2025-05-26 14:30:10 +03:00
Lucas Reis
5838887066
Custom Emojis not updating on application (#8853)
* feat: add custom emoji deletion logic to handleCustomEmojis method

* test: add custom emoji deletion logic to HandleCustomEmojis test case

* fix: improve custom emoji deletion logic
2025-05-23 14:58:51 +02:00
Daniel Espino García
085e3f3839
Fix scheduled messages tooltip entering an infinite resize loop (#8877) 2025-05-23 13:05:31 +02:00
unified-ci-app[bot]
30070000e1
Bump app build number to 641 (#8885)
Co-authored-by: Anka <runner@Mac-1747989230737.local>
2025-05-23 12:10:13 +03:00
Guillermo Vayá
975495eb92
simplify managing crossteams (#8879) 2025-05-23 11:01:06 +02:00
Rahim Rahman
22b4616f72
feat(MM-63936): add mark function in performance metrics manager (#8823) 2025-05-20 12:47:29 -06:00
Elias Nahum
190be37fe0
Random fixes (#8874)
* sort desc lastAccessAt server in security manager

* do not export let binding in context/device
2025-05-20 22:40:11 +08:00
unified-ci-app[bot]
42a54407a4
Bump app build and version number (#8870)
* Bump app build number to 640

* Bump app version number to 2.29.0

---------

Co-authored-by: Anka <runner@Mac-1747715958810.local>
2025-05-20 08:31:12 +03:00
Elias Nahum
292a20824c
use the actual url in the metadata if there is an image proxy being used (#8852) 2025-05-20 05:52:42 +08:00
Pablo Vélez
1569f712d2
Mm 63935 abac end user indicators (#8848)
* MM-63935 - abac end user indicators

* rename policy variables to clearly indicate are from abac

* update attributes hook to cache processed data

* use policyEnforce property

* add missing type

* rename policy_enforced to abac_policy_enforced part 1

* add channel policy enforced type

* fix translation file

* remove unnecesary stop propagation

* use existing components

* remove unnecesary files

* fix snapshot

* update snapshot

* do not tie styles to the abac feature

* remove unnecesary margin top

* simplify props, add style for flat banner, remove unncesary index

* simplify condition, extract inline to component function

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-05-19 15:34:03 +02:00
Weblate (bot)
dbaf534a32
Translations update from Mattermost Weblate (#8867)
Automatic Merge
2025-05-19 15:30:15 +03:00
dependabot[bot]
ec0f31757f
Bump the github-actions-updates group across 2 directories with 1 update (#8866)
Bumps the github-actions-updates group with 1 update in the /.github/actions/prepare-mobile-build directory: [ruby/setup-ruby](https://github.com/ruby/setup-ruby).
Bumps the github-actions-updates group with 1 update in the /.github/workflows directory: [ruby/setup-ruby](https://github.com/ruby/setup-ruby).


Updates `ruby/setup-ruby` from 1.238.0 to 1.242.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](e34163cd15...cb0fda56a3)

Updates `ruby/setup-ruby` from 1.238.0 to 1.242.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](e34163cd15...cb0fda56a3)

---
updated-dependencies:
- dependency-name: ruby/setup-ruby
  dependency-version: 1.242.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.242.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-19 14:28:43 +03:00
unified-ci-app[bot]
1928112084
Bump app build number to 639 (#8864)
Co-authored-by: Anka <runner@Mac-1747384959693.local>
2025-05-16 12:41:40 +03:00
Amy Blais
5fddeec385
Update supported ESR version (#8835)
* Update README.md

* Update full_description.txt

* Update changelog

* Update supported_server.ts
2025-05-16 09:28:47 +03:00
Claudio Costa
3887ce30a8
Remove long deprecated Calls code (#8747) 2025-05-15 18:20:45 +02:00
Daniel Espino García
9e52d794a4
Fix ephemeral messages disappearing when updating them (#8838) 2025-05-15 17:48:36 +02:00
Pablo Vélez
8b5d382d2a
MM-63935- abac end user indicators db fix (#8862) 2025-05-15 16:29:17 +02:00
Pablo Vélez
84a1520698
Mm 63935 abac end user indicators db isolated changes (#8860)
* MM-63935 - abac end user indicators db changes
2025-05-15 00:25:47 +02:00
Elias Nahum
934ed2a773
Revert "MM-63935 - abac end user indicators db changes (#8849)" (#8859)
This reverts commit d838f74273.
2025-05-15 06:15:20 +08:00
Pablo Vélez
d838f74273
MM-63935 - abac end user indicators db changes (#8849)
* MM-63935 - abac end user indicators

* rename policy variables to clearly indicate are from abac

* update attributes hook to cache processed data

* use policyEnforce property

* add missing type

* rename policy_enforced to abac_policy_enforced part 1

* add channel policy enforced type

* fix translation file

* remove unnecesary stop propagation

* MM-63935 - abac end user indicators db changes

* rename the policy name to clarify which policy does refer to

* update property name and add documentation to clarify intention

* rename policy_enforced to abac_policy_enforced db changes side
2025-05-14 23:55:47 +02:00
Daniel Espino García
a5fbd66320
Fix edit post scroll (#8845)
* Fix edit post scroll

* Minor improvement on readability
2025-05-13 17:09:25 +02:00
Daniel Espino García
af0a7525c8
Refactor Open Profile (#8746)
* Refactor Open Profile

* Add missing changes

* Fix tests

* Fix tests

* Address feedback
2025-05-13 17:07:13 +02:00
dependabot[bot]
305fbee513
Bump the github-actions-updates group across 2 directories with 1 update (#8851)
Bumps the github-actions-updates group with 1 update in the /.github/actions/prepare-mobile-build directory: [ruby/setup-ruby](https://github.com/ruby/setup-ruby).
Bumps the github-actions-updates group with 1 update in the /.github/workflows directory: [ruby/setup-ruby](https://github.com/ruby/setup-ruby).


Updates `ruby/setup-ruby` from 1.237.0 to 1.238.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](eaecf785f6...e34163cd15)

Updates `ruby/setup-ruby` from 1.237.0 to 1.238.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](eaecf785f6...e34163cd15)

---
updated-dependencies:
- dependency-name: ruby/setup-ruby
  dependency-version: 1.238.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.238.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-13 08:29:46 +03:00
Vasily Belousov
7c3914bd13
[MM-61995] Correct copying instructions when long-pressing an email in messages & headers (#8798)
* feat: fixed email copy interface

* feat: changed message when long-pressing an email on mobile in messages & headers

* implemented changes: message decriptors outside component; email/url check and cleanHref outside renderContent function
2025-05-13 11:56:38 +08:00
Christopher Poile
c983de91fa
[MM-63553] Fix for: messages received on the background on iOS lose the props (#8811)
* convert attachment fields short and disabled to bool

* a more robust existence test

* only perform the conversion on iOS

* add tests
2025-05-12 15:21:56 -03:00
unified-ci-app[bot]
b86172924c
chore: Update NOTICE.txt file with updated dependencies (#8850)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2025-05-12 13:09:56 +03:00
Claudio Costa
dea9e16de2
Calls: Fix scrolling in participants list (#8829) 2025-05-12 10:46:01 +02:00
unified-ci-app[bot]
e3b7d6e7a1
Bump app build number to 637 (#8847)
Co-authored-by: Anka <runner@Mac-1746780044821.local>
2025-05-09 12:14:32 +03:00
Eva Sarafianou
941ea0db3a
Update transitive prismjs (#8846) 2025-05-09 10:43:08 +03:00
Guillermo Vayá
fcdef7b488
[MM-63548] Address potential risks (#8816)
* Address potential risks
2025-05-07 17:20:33 +02:00
Colton Shaw
ec1c0e4f58
[MM-62491] Removing exported receivers. (#8466)
* removing exported receivers

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2025-05-07 08:06:55 -06:00
Elias Nahum
f320dd65ad
Add is_blocked to FileModel (#8842)
* Add is_blocked to FileModel

* fix type in the docs

* use correct type in docs
2025-05-07 15:33:04 +08:00
Jesse Hallam
974f2419ef
[MM-63963] Remove unused constants from SelfHostedProducts (#8839)
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-05-06 14:40:36 -03:00
dependabot[bot]
e0dc08dcd6
Bump the github-actions-updates group across 5 directories with 4 updates (#8836)
Bumps the github-actions-updates group with 1 update in the /.github/actions/prepare-ios-build directory: [actions/cache](https://github.com/actions/cache).
Bumps the github-actions-updates group with 2 updates in the /.github/actions/prepare-mobile-build directory: [actions/cache](https://github.com/actions/cache) and [ruby/setup-ruby](https://github.com/ruby/setup-ruby).
Bumps the github-actions-updates group with 2 updates in the /.github/actions/prepare-node-deps directory: [actions/cache](https://github.com/actions/cache) and [actions/setup-node](https://github.com/actions/setup-node).
Bumps the github-actions-updates group with 1 update in the /.github/actions/test-coverage directory: [actions/cache](https://github.com/actions/cache).
Bumps the github-actions-updates group with 2 updates in the /.github/workflows directory: [ruby/setup-ruby](https://github.com/ruby/setup-ruby) and [actions/github-script](https://github.com/actions/github-script).


Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `ruby/setup-ruby` from 1.221.0 to 1.237.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](32110d4e31...eaecf785f6)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `ruby/setup-ruby` from 1.221.0 to 1.237.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](32110d4e31...eaecf785f6)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/setup-node` from 4.2.0 to 4.4.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](1d0ff469b7...49933ea528)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `actions/cache` from 4.2.1 to 4.2.3
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c907a75c2...5a3ec84eff)

Updates `ruby/setup-ruby` from 1.230.0 to 1.237.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](32110d4e31...eaecf785f6)

Updates `actions/github-script` from 6 to 7
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v6...v7)

Updates `ruby/setup-ruby` from 1.230.0 to 1.237.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](32110d4e31...eaecf785f6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.237.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.237.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/setup-node
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-version: 4.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.237.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/github-script
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.237.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-06 11:27:27 +03:00
Daniel Espino García
b0df5edc1a
Fix category sorting difference between mobile and web (#8828) 2025-05-06 09:51:06 +02:00
Daniel Espino García
d27c56af88
Add error boundary to latex code (#8822)
* Add error boundary to latex code

* Add test
2025-05-06 09:48:36 +02:00
Weblate (bot)
2a0ec47278
Translations update from Mattermost Weblate (#8837)
Automatic Merge
2025-05-05 19:28:43 +03:00
Guillermo Vayá
040fe0f9fc
[MM-63643] Show image for video even if public link is disabled (#8824)
preview videos even if public link is disabled
2025-05-05 17:45:37 +02:00
Daniel Espino García
738681a69a
Fix iPad hw keyboard overlapping input (#8815) 2025-05-05 11:42:38 +02:00
Daniel Espino García
c8d6175d74
Fix back button not closing the app (#8827) 2025-05-05 08:05:05 +03:00
Harshil Sharma
45773e359d
Renamed premium SKU to Enterprise Advanced (#8819) 2025-05-02 05:12:27 +05:30
Claudio Costa
0e67bc8944
[MM-63382] Calls: Fix rendering of long user/channel name in call bar (#8804)
* Calls: Fix rendering of long user/channel name in call bar

* Fix linting
2025-04-30 13:32:00 -06:00
Lorenzo
8453eee0e3
Snyk SBOM (#8249) 2025-04-30 08:54:53 -06:00
Christopher Poile
65ca3bffa3
[MM-63509] Fix: Protect against license can be undefined (#8784)
* protect against license can be undefined

* linting
2025-04-29 16:56:57 -04:00
Rajat Dabade
38f6011caf
Android: Fix Rescheduling pop back calendar (#8810) 2025-04-29 18:04:32 +05:30
Daniel Espino García
f963855875
Fix Find channels not being interactable (#8794)
* Fix Find channels not being interactable

* fix(e2e): Uncomment find channel tests

* Fix tsc

* Use platform select

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-04-29 13:56:22 +02:00
Rajat Dabade
098c219932
Unlicensed server should not show the tooltip on channel send button (#8806)
* Unlicensed server should not show the tooltip on channel send button

* Added config and license check for fetching and displaying scheduled post
2025-04-29 17:21:09 +05:30
Tom De Moor
2f60d474c7 Translated using Weblate (Dutch)
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-04-28 21:03:37 +02:00
MArtin Johnson
195ddf4acd Translated using Weblate (Swedish)
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-04-28 21:03:37 +02:00
Tom De Moor
829362cc52 Translated using Weblate (Dutch)
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-04-28 21:03:37 +02:00
Serhii Khomiuk
24b6b2b8f0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-04-28 21:03:37 +02:00
jprusch
ef0b6a0bc6 Translated using Weblate (German)
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-04-28 21:03:37 +02:00
ThrRip
7acc9cf54f Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-04-28 21:03:37 +02:00
master7
b77ef2090a Translated using Weblate (Polish)
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-04-28 21:03:37 +02:00
Tom De Moor
09162a7c8e Translated using Weblate (Dutch)
Currently translated at 99.0% (1286 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-04-28 21:03:37 +02:00
Matthew Williams
ba336f31b1 Translated using Weblate (English (Australia))
Currently translated at 100.0% (1298 of 1298 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2025-04-28 21:03:37 +02:00
Serhii Khomiuk
0c76aa0c40 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1282 of 1282 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-04-28 21:03:37 +02:00
master7
77f1936ee5 Translated using Weblate (Polish)
Currently translated at 98.1% (1258 of 1282 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-04-28 21:03:37 +02:00
Claudio Costa
7192d21134
[MM-63889] Calls: Add backend version check to enable DC locking (#8799)
* Calls: Add backend version check to enable DC locking

* Update calls-common
2025-04-28 09:04:49 -06:00
Jesse Hallam
e3e4fe245c
Fix direct message screen showing deactivated accounts (#8795)
* Fix direct message screen showing deactivated accounts

Fixes MM-63374. The create direct message screen was showing deactivated accounts in the user list. Fixed by:
1. Setting allow_inactive: false in userSearchFunction when searching profiles
2. Setting active: true in userFetchFunction when fetching profiles
3. Added a test to verify that deactivated users don't appear in the search results

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix test for deactivated users in DM creation screen

Updated the test to properly handle quotation marks that differ between CI and local environments.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-04-25 10:22:41 -03:00
unified-ci-app[bot]
04dedb3898
Bump app build number to 631 (#8800)
Co-authored-by: Anka <runner@Mac-1745570942917.local>
2025-04-25 12:10:41 +03:00
Jesse Hallam
d33ad7b2a0
Add watchman watch-del to clean script (#8797)
* Add watchman watch-del-all to clean script

This ensures watchman watches are reset during cleanup, preventing issues after upgrades.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Use watchman watch-del instead of watch-del-all

Only reset watches for the current project directory instead of all watches.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-04-24 19:05:30 -03:00
Daniel Espino García
b01cc5ea34
Fix typo troubleshouting vs troubleshooting (#8796) 2025-04-24 16:20:21 +02:00
Daniel Espino García
5c2153f83b
Add Report a Problem functionality (#8605)
* Add Report a Problem functionality

* update cache pinned SHA version from 4.0.2 to 4.2.0

* Address feedback

* Fix tests

* Fix some issues and update kotlin coroutines version

* Fix delete file for iOS

* Bump 1 more version for coroutines

* Use rxjava instead of kotlin coroutines to avoid security issue

* Move path prefix to avoid test error

* Address feedback

* Address feedback

* Address feedback

* Use mailto on iOS

* Fix tests related to button changes

* Address feedback

* Update icon and fix onboarding buttons

* Fix test

---------

Co-authored-by: Angelos Kyratzakos <angelos.kyratzakos@mattermost.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-04-24 11:12:55 +02:00
yasser khan
3cbde1663d
E2E feature schedule posts (#8709)
- Fix iOS and Android CI.
- Fixes E2E tests on both platform
- Added tests for scheduled draft feature.
2025-04-23 12:10:37 +05:30
Elias Nahum
11118c43c5
Explicitly build the universal apk (#8790)
* Explicitly build the universal apk

* remove universal APK link from github release
2025-04-22 13:16:15 +03:00
unified-ci-app[bot]
753295548f
Bump app build and version number (#8787)
* Bump app build number to 629

* Bump app version number to 2.28.0

---------

Co-authored-by: Anka <runner@Mac-1745295415004.local>
2025-04-22 08:23:23 +03:00
Tom De Moor
8259c0ae4a Translated using Weblate (Dutch)
Currently translated at 99.7% (1279 of 1282 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-04-21 19:00:53 +00:00
Matthew Williams
3f53a454ca Translated using Weblate (English (Australia))
Currently translated at 99.7% (1279 of 1282 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2025-04-21 19:00:53 +00:00
Bohdan
b958270f20 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1282 of 1282 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-04-21 19:00:53 +00:00
Sharuru
f600ec9742 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1282 of 1282 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-04-21 19:00:53 +00:00
kaakaa
cf0baba545 Translated using Weblate (Japanese)
Currently translated at 100.0% (1280 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-04-21 19:00:53 +00:00
jprusch
1daa982000 Translated using Weblate (German)
Currently translated at 100.0% (1280 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-04-21 19:00:53 +00:00
jprusch
f33ea1229c Translated using Weblate (German)
Currently translated at 99.2% (1271 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-04-21 19:00:53 +00:00
jprusch
51223fe4e0 Translated using Weblate (German)
Currently translated at 99.1% (1269 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-04-21 19:00:53 +00:00
jprusch
69a74c7afa Translated using Weblate (German)
Currently translated at 98.9% (1267 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-04-21 19:00:53 +00:00
Frank Paul Silye
b2ddce9539 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.8% (1278 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-04-21 19:00:53 +00:00
kaakaa
bf665157e0 Translated using Weblate (Japanese)
Currently translated at 96.4% (1235 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-04-21 19:00:53 +00:00
Frank Paul Silye
b29d5c7d9d Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.6% (1276 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-04-21 19:00:53 +00:00
Frank Paul Silye
e19e1c97ca Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.2% (1271 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-04-21 19:00:53 +00:00
master7
2b470ef0e4 Translated using Weblate (Polish)
Currently translated at 97.5% (1248 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-04-21 19:00:53 +00:00
Frank Paul Silye
bd0e57aa92 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.1% (1256 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-04-21 19:00:53 +00:00
Frank Paul Silye
4dd99889db Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.5% (1249 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-04-21 19:00:53 +00:00
master7
2bd0249276 Translated using Weblate (Polish)
Currently translated at 96.7% (1238 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-04-21 19:00:53 +00:00
Sharuru
4667576cbe Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1280 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-04-21 19:00:53 +00:00
Serhii Khomiuk
53d653e08b Translated using Weblate (Ukrainian)
Currently translated at 96.7% (1238 of 1280 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-04-21 19:00:53 +00:00
Lorenzo
a0790169e8
Remove unused dependency (#8777) 2025-04-21 08:32:41 -06:00
Jesse Hallam
15f59b7eee
[MM-63728] Add license load metric to About screen (#8769)
* Add license load metric to About screen

- Add REST endpoint to fetch license load percentage
- Display load metric in About screen next to server version

Fixes: https://mattermost.atlassian.net/browse/MM-63728

* MM-63728: Address PR feedback from enahum

- Move license load metric fetch to a remote action
- Use isMinimumServerVersion to check for server 10.8.0 or higher

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Simplify getLicenseLoadMetric to directly return number

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Move getLicenseLoadMetric to dedicated license.ts file

- Create new remote action file specifically for license-related functions
- Add test file for the license actions
- Update imports in about.tsx

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Remove redundant license check in about.tsx

- Rely on getLicenseLoadMetric to handle the license check

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Update E2E tests for license load metric

- Add license load metric test IDs to about screen
- Update E2E test to check for load metric when license is enabled
- Handle cases where server might not support the feature

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* recover app/actions/remote/general.ts

* MM-63728: Return error from getLicenseLoadMetric instead of silent failure

- Remove silent failure and debug logging
- Return the error object when API call fails
- Update the About component to handle possible error responses
- Update tests to verify error handling

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Remove groupLabel parameter from getLicenseLoadMetric

- Remove groupLabel parameter from client getLicenseLoadMetric method in interface and implementation
- Update client tests to reflect the parameter removal
- Update license action test to verify no parameter is passed

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* simplify about screen checks

* MM-63728: Use jest.mocked and real version checks in license tests

- Removed isMinimumServerVersion mock, letting tests use real version checking
- Used proper type casting for mock Client
- Added comprehensive version compatibility test cases
- Simplified test setup

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Remove redundant server version test

- Removed redundant test for different server versions
- Existing tests already cover the necessary version compatibility cases

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* MM-63728: Refactor license test to use better mocking pattern

- Refactored the test file to use a better mocking pattern similar to custom_emoji.test.ts
- Simplified mock declarations using jest.mock()
- Added type import for Client for better readability
- Improved type casting for mock objects

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* npm run fix

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-04-17 17:29:47 -03:00
Rajat Dabade
0ca03da161
MM-63571 Android Sentry Error Checks (#8773)
* MM-63571 Android Sentry Error Checks

* popTo the stack and update the props
2025-04-16 17:31:02 +05:30
Tom De Moor
b0d188872a Translated using Weblate (Dutch)
Currently translated at 99.8% (1226 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-04-14 17:08:48 +00:00
Bohdan
f47623a4e8 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1228 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-04-14 17:08:48 +00:00
Konstantin
114231c302 Translated using Weblate (Russian)
Currently translated at 100.0% (1228 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-04-14 17:08:48 +00:00
Frank Paul Silye
1a1fe896f7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (1228 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-04-14 17:08:48 +00:00
jprusch
b4ae1807e5 Translated using Weblate (German)
Currently translated at 100.0% (1228 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-04-14 17:08:48 +00:00
MArtin Johnson
abb34bb4f9 Translated using Weblate (Swedish)
Currently translated at 100.0% (1228 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-04-14 17:08:48 +00:00
master7
193b2d9c53 Translated using Weblate (Polish)
Currently translated at 100.0% (1228 of 1228 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-04-14 17:08:48 +00:00
Rajat Dabade
f75c50ad2b
Feature schedule posts (#8509) 2025-04-14 22:08:59 +05:30
dependabot[bot]
5b72465e40
Bump the github-actions-updates group across 1 directory with 3 updates (#8771)
Bumps the github-actions-updates group with 3 updates in the /.github/workflows directory: [actions/upload-artifact](https://github.com/actions/upload-artifact), [mattermost/actions](https://github.com/mattermost/actions) and [ruby/setup-ruby](https://github.com/ruby/setup-ruby).


Updates `actions/upload-artifact` from 4.6.0 to 4.6.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](65c4c4a1dd...ea165f8d65)

Updates `mattermost/actions` from 746563b58e737a17a8ceb00b84a813b9e6e1b236 to d5174b860704729f4c14ef8489ae075742bfa08a
- [Commits](746563b58e...d5174b8607)

Updates `ruby/setup-ruby` from 1.221.0 to 1.230.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](32110d4e31...e5ac7b085f)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 4.6.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-updates
- dependency-name: mattermost/actions
  dependency-version: d5174b860704729f4c14ef8489ae075742bfa08a
  dependency-type: direct:production
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-version: 1.230.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-14 12:40:23 +03:00
Rahim Rahman
c85101af10
fix(MM-63733): patch expo-image to use the latest version of APNG4Android (#8765) 2025-04-12 19:52:18 -06:00
Claudio Costa
972f59b6cd
Update calls-common (#8762) 2025-04-11 07:59:14 -06:00
unified-ci-app[bot]
dc3dc56eb2
Bump app build number to 626 (#8766)
Co-authored-by: Anka <runner@Mac-1744361261538.local>
2025-04-11 12:10:01 +03:00
Elias Nahum
9a83813c23
Fix build on Xcode 16.3 (#8760) 2025-04-10 09:09:03 +08:00
Guillermo Vayá
6a060cd505
[MM-62565] DB only custom profile attributes and fields (#8739)
Database only
2025-04-09 15:35:27 +02:00
Elias Nahum
74ee271012
Fix SecurityManager flaky test (#8753) 2025-04-08 20:25:14 +08:00
Daniel Espino García
1c0e201edf
Refactor chips (#8740)
* Refactor chips

* Fix tsc

* Rename showXButton
2025-04-08 10:14:01 +02:00
Harshil Sharma
738c7e6b1d
Channel banner display (#8735)
* channel banner DB migration

* Display channel banner

* Updated database docs

* used premium sku

* misc fixes

* Handled channel banner with calls

* Updated tests

* Updated tests

* test: Add comprehensive tests for shouldShowChannelBanner function

* Added more tests

* lint fix

* minor refactoring

* lint fix

* reverted package.resolved changes

* made a param mandatory

* Added some comments
2025-04-08 11:15:18 +05:30
Claudio Costa
52330847e2
Update calls-common to latest (#8745) 2025-04-07 15:50:09 -06:00
Weblate (bot)
ce57a3df8a
Translations update from Mattermost Weblate (#8755)
Automatic Merge
2025-04-07 16:08:43 +03:00
unified-ci-app[bot]
7949a35481
chore: Update NOTICE.txt file with updated dependencies (#8754)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2025-04-07 13:10:25 +03:00
dependabot[bot]
767d4d920a
Bump image-size from 1.1.1 to 1.2.1 (#8744)
Bumps [image-size](https://github.com/image-size/image-size) from 1.1.1 to 1.2.1.
- [Release notes](https://github.com/image-size/image-size/releases)
- [Commits](https://github.com/image-size/image-size/compare/v1.1.1...v1.2.1)

---
updated-dependencies:
- dependency-name: image-size
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-07 12:07:39 +08:00
Elias Nahum
374f812b98
Update dependencies (#8721)
* update fastlane

* update dev dependencies

* update to eslint 9+

* update testing-library

* update react-intl

* update bottom-sheet

* update expo

* update reanimated

* upgrade msgpack

* upgrade datepicker

* upgrade react-navigation

* update sentry

* update FlasList

* update fuse.js moment-timezone node-html-parser and semver

* update gesture-handler

* update image-picker

* update react-native-keychain

* update react-native-localize

* update react-native-navigation

* update watermelonDB

* update react-native-permissions

* update react-native-safe-area-context and react-native-screens

* update react-native-share and react-native-svg

* update react-native-video and react-native-webrtc

* update @mattermost/rnutils

* update @mattermost/rnshare

* update @mattermost/hardware-keyboard

* fix isMainActivity

* update android dependencies

* fix upload file progress indicator

* fix entry update config & license

* revert to stable version of @sentry/react-native

* update react-intl again

* update moment-timezone

* upgrade @react-native-camera-roll/camera-roll

* update @react-native-clipboard/clipboard

* update @react-navigation again

* update @shopify/flash-list

* update eslint

* update expo again

* update html-entities

* update mime-db

* update react-native-permissions

* Revert "update react-intl again"

This reverts commit e8e6d5a60dfa56b82b810cbbd7cdffec7697ffc7.

* Revert "update react-intl"

This reverts commit c77f329bb38910aeeba03869b72d77a8b0e00ba1.

* update react-native-keychain

* update and patch react-intl

* mend

* feedback during review 1
2025-04-07 09:30:06 +08:00
Daniel Espino García
fefa164a06
Unify Is Read Only logic to avoid code repetition and improve redability (#8720) 2025-04-06 17:50:19 +02:00
Jesse Hallam
250732d3fc
upgrade to @mattermost/commonmark@0.31.2-0 (#8722) 2025-04-05 00:42:51 +08:00
unified-ci-app[bot]
41cddcd8f2
Bump app build number to 624 (#8748)
Co-authored-by: Anka <runner@Mac-1743756606006.local>
2025-04-04 12:10:38 +03:00
Harshil Sharma
6480fe52aa
channel banner DB migration (#8733)
* channel banner DB migration

* Updated database docs
2025-04-04 12:24:17 +05:30
Lucas Reis
6c51f3948c
feat: enabling autofill on inputs on the Login page (#8729) 2025-04-02 16:40:10 +02:00
David Krauser
7be0de3202
[MM-63576] Send websocket ping immediately after connecting (#8724) 2025-04-02 10:25:20 -04:00
Antonis Stamatiou
41c563bf68
Add setup-xcode action to prepare-ios-build workflow (#8742) 2025-04-02 16:27:14 +03:00
Antonis Stamatiou
af22bc8d79
Add "APNG4Android" to ignoreDependencies in config.yaml (#8741) 2025-04-02 09:34:25 +03:00
Frank Paul Silye
56171a68d2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.8% (1213 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-03-31 17:26:36 +00:00
Benjamin Danon
ca13a595f3 Translated using Weblate (French)
Currently translated at 93.6% (1149 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2025-03-31 17:26:36 +00:00
Ricky Tigg
d71c1923d9 Translated using Weblate (Finnish)
Currently translated at 46.2% (568 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fi/
2025-03-31 17:26:36 +00:00
Bohdan
1a2f7cffd6 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-03-31 17:26:36 +00:00
Ricardo Galvão
e58c298f67 Translated using Weblate (Portuguese (Brazil))
Currently translated at 46.4% (570 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt_BR/
2025-03-31 17:26:36 +00:00
Ricardo Galvão
584e7a8e60 Translated using Weblate (Portuguese (Brazil))
Currently translated at 45.4% (558 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt_BR/
2025-03-31 17:26:36 +00:00
boristrbrt
cb48cc97dd Translated using Weblate (French)
Currently translated at 93.6% (1149 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2025-03-31 17:26:36 +00:00
jprusch
11f284ca58 Translated using Weblate (German)
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-03-31 17:26:36 +00:00
Konstantin
62ec9a60c3 Translated using Weblate (Russian)
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-03-31 17:26:36 +00:00
Pineoak
f0cd4fabd2 Translated using Weblate (Portuguese (Brazil))
Currently translated at 45.3% (556 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pt_BR/
2025-03-31 17:26:36 +00:00
unified-ci-app[bot]
d0d7e187e7
Bump app build number to 622 (#8730)
Co-authored-by: Anka <runner@Mac-1743151443622.local>
2025-03-28 11:10:15 +02:00
Daniel Espino García
85e01a7fb6
Add model mocks to TestHelper (#8715)
* Add model mocks to TestHelper

* Address feedback
2025-03-28 09:40:08 +01:00
Julien Tant
97210af090
turn cross team search ff into a config value (#8694) 2025-03-26 10:37:14 -07:00
Guillermo Vayá
427d61efd4
[MM-62176] fix ordering after edit (#8719)
* check render order
2025-03-26 11:01:29 +01:00
Takuya N
18305e3cbf
chore(deps-dev): allow devs to use Node.js 22 (LTS) (#8657)
Also upgrade the default version of Node.js to 22.14.0.

Signed-off-by: Takuya Noguchi <takninnovationresearch@gmail.com>
2025-03-24 16:28:11 -06:00
Martin Mičuda
5112e048b2 Translated using Weblate (Czech)
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-03-24 14:02:33 +00:00
ThrRip
a642963460 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-03-24 14:02:33 +00:00
Bohdan
24c4944de3 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-03-24 14:02:33 +00:00
Matthew Williams
39ba29dedd Translated using Weblate (English (Australia))
Currently translated at 100.0% (1227 of 1227 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2025-03-24 14:02:33 +00:00
dependabot[bot]
4fe0325e55
Bump nokogiri from 1.18.3 to 1.18.4 in /fastlane (#8708) 2025-03-22 08:27:49 +08:00
Guillermo Vayá
60d4e95229
[MM-63481] Don't substract keyboard height in Android as it was already substracted (#8697)
* don't substract keyboard height in Android as it was already substracted
2025-03-21 11:41:01 +01:00
unified-ci-app[bot]
f4685b8db3
Bump app build number to 619 (#8705)
Co-authored-by: Anka <runner@Mac-1742546606063.local>
2025-03-21 11:12:34 +02:00
Rahim Rahman
1ddaf5c32f
fix(MM-63460): HTTPClientError spam (#8693) 2025-03-20 11:15:05 -06:00
unified-ci-app[bot]
96f1c59e0f
Bump app build and version number (#8695)
* Bump app build number to 615

* Bump app version number to 2.27.0

---------

Co-authored-by: Anka <runner@Mac-1742449667584.local>
2025-03-20 08:13:41 +02:00
Daniel Espino García
94eae2b93d
Better handle threads sync (#8641)
* Better handle threads sync

* Update app/actions/remote/thread.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-03-19 09:23:22 +01:00
Weblate (bot)
f21cf86066
Translations update from Mattermost Weblate (#8685)
Automatic Merge
2025-03-19 04:23:15 +02:00
Rahim Rahman
ecc199ea08
ci(MM-63199): fix download artifact issue (#8690)
* remove some test

* clean error

* use has_coverage_from_main

* revert sentry.test.ts
* remove use of github_token

* trying github.token instead

* see if permissions write will solve the Resource not accessible problem

* would github-token help solve that problem?

* see if permissions on the workflow itself would fix the problem

* trying pull_request_target

* add branches to pull request target

* remove branches for now.

* changed to the proper event_name

* check if it's forked repo.

* using is_fork
2025-03-18 13:18:12 -06:00
Daniel Espino García
b475f2bedb
Fix team sidebar not showing thread unreads (#8624)
* Fix team sidebar not showing thread unreads

* Fix tests

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-03-18 13:33:15 +01:00
Elias Nahum
59252d98fb
update react-native-emm fixes navigation perf degradation on iOS (#8681) 2025-03-17 19:31:53 +08:00
Rahim Rahman
abb526cf83
ci(MM-63199): code coverage tracking (#8642)
* ci(MM-63199): code coverage tracking

* try to download existing coverage file

* read coverage

* add token

* use github.token instead

* passing github token

* github_token passing from workflow

* remove download

* re-add download

* wrong param

* try download all artifacts

* add run-id so to retrieve with download later

* remove read coverage temp

* use run-id to download

* put files into current-coverage

* using last run id

* temporary comment

* can retrieve last run id?

* remove hard-coding

* echo into github_env vs export

* comparing new and old

* comparison improvement

* post to github

* fix coverage text

* refactor to main from current-coverage

* formatting changes

* fix missing content

* small tweaking

* showing the Warning to make sure

* formatting

* remove +

* checking to see if the error shows via echo

* revert the change to error

* separate to a new file

* comment the actual test for now

* prep node deps

* only run certain things on main

* trying cache-hit

* real trying cache-hit

* testing to make sure cache-run-id runs

* save-always true

* save-always deprecated

* let's try different strategy

* add key

* restore-key adding a -

* only perform on `main`

* only run on main or if its a PR

* coverage_threshold

* remove comments

* add total

* removing unneeded comments

* calculate total

* run test in `release-*` only

* making sure that only PR will run

* only do more steps if upload-coverage successful

* trying thollander/actions-comment-pull-request

* using diff way to comment.

* comment on how things work

* testing to trigger warning and see if comment is updated vs new comment

* omit echo messages

* see if giving github token would work.

* wrong use of param

* try without github token

* adding a very simple change to see where it lands

* using cache hit instead.

* creating the cache again.  how did i lose it?

* revert back

* cache-hit might be off

* debug

* debug with failing cache restoration

* check for run-id.txt instead

* all into action

* missing "

* remove unneeded actions
* change threshold to 0.5

* relative time

* skeptical about date formatting

* revert back to the threshold trigger

* below 80% total coverage threshold

* only show one error/warning at  time.

* testing if the coverage drop below 80

* debug output

* add Reset Test Coverage label use

* try using contains vs direct comparsion

* remove the label checker

* temp change

* ooops

* revert back

* let's post before exiting

* consistency

* total coverage threshold reset to 80%
2025-03-14 13:21:25 -06:00
Daniel Espino García
782b1c69a8
Make attachments and app bindings more robust yet secure (#8570)
* Make attachments and app bindings more robust yet secure

* Fix tests

* i18n extract

* Address feedback

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-03-14 12:02:32 +01:00
unified-ci-app[bot]
78997d059d
Bump app build number to 614 (#8679)
Co-authored-by: Anka <runner@Mac-1741942667838.local>
2025-03-14 11:10:47 +02:00
Maria A Nunez
7063e5efa8
Updated empty state images (#8659)
* Updated search empty images

* Updated channel empty state images

* Styling

* Added unreads, threads, mentions and saved messages empty state images

* Removed withTheme

* Update snapshot

* Fixed color for unread sidebar svg
2025-03-13 17:03:30 -04:00
Elias Nahum
a5a1e53827
Biometric prompt, Jailbreak / Root detection and screenshot prevention (#8645)
* Handle biometric authentication

* jailbreak/root detection and biometric small fixes

* remove server from initializeSecurityManager and fix loginEntry

* Add screen capture prevention and other small fixes

* added unit tests to SecurityManager

* added shielded nativeID to protect views

* use MobilePreventScreenCapture instead of MobileAllowScreenshots in config type definition

* Apply Swizzle for screen capture on iOS

* Apply patch to bottom sheet to prevent screen captures

* fix ios sendReply

* Fix SDWebImage swizzle to use the correct session

* Fix potential crash on Android when using hardware keyboard

* rename patch for network library to remove warning

* add temp emm reference

* fix initializeSecurityManager tests

* fix translations

* use siteName for jailbreak detection when connecting to a new server

* fix i18n typo

* do not query the entire config from the db only the required fields

* migrate manage_apps to use defineMessages

* use TestHelper.wait in tests

* use defineMessages for security manager

* fix missing else statement for gm_to_channel

* created a TestHelper function to mockQuery and replace as jest.Mock with jest.mocked

* fix unit tests

* fix unit tests (again) and include setting the test environment to UTC

* Fix keyboard disappearing on iOS

* update react-native-emm
2025-03-13 14:07:41 -04:00
Elias Nahum
d84a0afd3a
Avoid unnecessary re-renders (#8673)
* Only set the height on the message component if it ends up being greater than the maxHeight to avoid re-renders

* Cache the teams theme to avoid unnecessary computation and re-renders

* useDidUpdate instead of useEffect to avoid setting the theme preference without need

* add comment on clear cache
2025-03-13 21:28:48 +08:00
Daniel Espino García
4f9323ee25
Update useExternalLink to match webapp (#8675) 2025-03-13 12:28:00 +01:00
dependabot[bot]
49c6079af3
Bump @babel/helpers from 7.26.0 to 7.26.10 (#8668)
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.26.0 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-13 08:17:04 +08:00
dependabot[bot]
6314c763d1
Bump @babel/runtime from 7.26.0 to 7.26.10 (#8667)
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-13 07:55:10 +08:00
Elias Nahum
6446eb96a3
fix keyboard blocking input on mentions notifications settings (#8664) 2025-03-13 07:53:24 +08:00
Elias Nahum
9bdaed498a
Fix list scrolling inside bottom sheet (#8648) 2025-03-12 17:29:50 +08:00
David Krauser
c27f0eade2
[MM-62925] introduce websocket client-side ping (#8633)
This commit introduces new functionality on the client side to send PING messages over the websocket. If the server doesn't respond within PING_INTERVAL (currently 30 seconds), the connection is closed and re-created. This will allow us to find broken connections more quickly.
2025-03-11 11:48:09 -04:00
Elias Nahum
0c24a646d4
Improve emoji picker performance introducing flashList (#8650) 2025-03-11 22:09:46 +08:00
Elias Nahum
915692d828
Do not use extra keyboard on Android (#8651) 2025-03-11 22:04:15 +08:00
Elias Nahum
1c8770c74d
MM-62896 Keyboard blocks input (#8646)
* WIP

* fix keyboard blocking text input for interactive dialog

* do not use extra keyboard and windowSoftInputMode:adjustNothing on Android 10 and under

---------

Co-authored-by: Devin Binnie <devin.binnie@mattermost.com>
2025-03-11 08:56:17 -04:00
dependabot[bot]
5231ee6553
Bump axios from 1.7.9 to 1.8.2 in /detox (#8660)
Bumps [axios](https://github.com/axios/axios) from 1.7.9 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.9...v1.8.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-11 11:26:47 +08:00
Elias Nahum
2c32322bc7
Fix more messages indicator on read only channels (#8652) 2025-03-11 07:32:22 +08:00
Weblate (bot)
02a0e8636d
Translations update from Mattermost Weblate (#8653)
Automatic Merge
2025-03-10 15:36:35 +02:00
Kaya Zeren
6047586e37 Translated using Weblate (Turkish)
Currently translated at 100.0% (1219 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2025-03-03 15:51:53 +00:00
Frank Paul Silye
4a1e6e63ae Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.5% (1214 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-03-03 15:51:53 +00:00
Frank Paul Silye
247e2d1b10 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.6% (1202 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-03-03 15:51:53 +00:00
Martin Mičuda
7dc55cf99b Translated using Weblate (Czech)
Currently translated at 100.0% (1219 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-03-03 15:51:53 +00:00
Martin Mičuda
db49829822 Translated using Weblate (Czech)
Currently translated at 100.0% (1219 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-03-03 15:51:53 +00:00
Konstantin
2fb4b44ee7 Translated using Weblate (Russian)
Currently translated at 100.0% (1219 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-03-03 15:51:53 +00:00
Frank Paul Silye
44fc9ec940 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.6% (1202 of 1219 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-03-03 15:51:53 +00:00
Rahim Rahman
1ecba213f0
fix(MM-62375): OutOfMemoryError issue with better catching (#8622)
* fix(MM-62375): OutOfMemoryError issue with gif

* add APNG4Android as npm module instead
2025-02-28 10:16:55 -07:00
Daniel Espino García
1ee03c73e7
Only fetch bookmarks when the license allows to use them (#8616)
* Only fetch bookmarks when the license allows to use them

* Fix tests

* Clarify condition

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-02-28 10:25:32 +01:00
unified-ci-app[bot]
5429dac612
Bump app build number to 611 (#8640)
Co-authored-by: Anka <runner@Mac-1740732270635.local>
2025-02-28 11:10:31 +02:00
Daniel Espino García
802a67c4f2
Enforce names for singleton imports (#8639) 2025-02-27 12:46:17 +01:00
Guillermo Vayá
63bba67eaf
[MM-62666] Cpa sort order (#8618)
* refactor: Use fetchCustomAttributes for user profile custom attributes

feat: Add optional filter for empty custom attributes

simplify and fix types

add again the request time, take into account errors

test: Update fetchCustomAttributes tests for filterEmpty parameter

feat: Add sort_order to CustomAttribute in fetchCustomAttributes

feat: Add optional sort_order to CustomAttribute type

fix: Add type definition for sort_order in CustomProfileField attrs

feat: Add sorting function for custom profile attributes

docs: Add JSDoc comment explaining sortCustomProfileAttributes function

refactor: Improve sortCustomProfileAttributes with nullish coalescing and localeCompare

add order to custom profile attributes

* remove blank line

* add ordering to edit_profile screen

* keep types together

* address code review
2025-02-25 10:54:38 +01:00
Weblate (bot)
5590f853d7
Translations update from Mattermost Weblate (#8630)
Automatic Merge
2025-02-24 17:20:11 +02:00
Daniel Espino García
a1ccdcb0da
Add ios native logs (#8555)
* Add ios native logs

* Use correct version

* Revert unneeded changes in package-lock
2025-02-24 11:50:39 +01:00
Daniel Espino García
99fa0598c1
Bump package-lock.json version to 2.26 (#8617) 2025-02-21 13:45:29 +01:00
unified-ci-app[bot]
e25708a78f
Bump app build number to 609 (#8623)
Co-authored-by: Anka <runner@Mac-1740127977996.local>
2025-02-21 11:10:44 +02:00
dependabot[bot]
5626b371e6
Bump nokogiri from 1.16.7 to 1.18.3 in /fastlane (#8614)
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.16.7 to 1.18.3.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.18.3/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.16.7...v1.18.3)

---
updated-dependencies:
- dependency-name: nokogiri
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-20 08:11:03 +02:00
enzowritescode
a6a101cd76
Pin and bump nokogiri (#8608) 2025-02-19 12:50:22 -07:00
Guillermo Vayá
0addf49021
[MM-62701] [MM-62176]Edit custom profile attributes in user profile (#8557)
* feat: Add support for custom profile attributes in edit profile form

feat: Add support for custom profile attributes in edit profile

refactor: Normalize whitespace in CustomAttribute type definition

fix: Resolve type mismatch for customAttributes in UserInfo interface

test: Add test for udpateCustomProfileAttributeValues method

fix typing, submit changes to server

missing files

test: Add tests for CustomProfileField component

fix naming

fix imports

fix

feat: Add field_refs hook for managing field references

feat: Make `setRef` ref parameter optional with default no-op implementation

refactor: Replace CustomProfileField with useFieldRefs for profile form

refactor: Optimize edit profile screen imports and custom attributes handling

refactor: Move custom attributes logic to remote actions in user.ts

address PR reviews

test: Add tests for custom attributes in edit profile

test: Add tests for EditProfile component with custom attributes

fix: Add UserModel type assertion to currentUser in edit profile tests

test: Add tests for ProfileForm custom attributes functionality

test: Add comprehensive tests for useFieldRefs hook

test: Add tests for fetchCustomAttributes and updateCustomAttributes

add tests

remove unneeded files

review changes

remove counter from hook

remove package.resolved

create interface for reuse of record

* fix signature type
2025-02-19 15:51:59 +01:00
dependabot[bot]
e83ed142dc
Bump the github-actions-updates group across 5 directories with 6 updates (#8613)
Bumps the github-actions-updates group with 1 update in the /.github/actions/prepare-android-build directory: [actions/checkout](https://github.com/actions/checkout).
Bumps the github-actions-updates group with 1 update in the /.github/actions/prepare-ios-build directory: [actions/cache](https://github.com/actions/cache).
Bumps the github-actions-updates group with 2 updates in the /.github/actions/prepare-mobile-build directory: [actions/cache](https://github.com/actions/cache) and [ruby/setup-ruby](https://github.com/ruby/setup-ruby).
Bumps the github-actions-updates group with 2 updates in the /.github/actions/prepare-node-deps directory: [actions/cache](https://github.com/actions/cache) and [actions/setup-node](https://github.com/actions/setup-node).
Bumps the github-actions-updates group with 4 updates in the /.github/workflows directory: [actions/checkout](https://github.com/actions/checkout), [ruby/setup-ruby](https://github.com/ruby/setup-ruby), [actions/upload-artifact](https://github.com/actions/upload-artifact) and [github/codeql-action](https://github.com/github/codeql-action).


Updates `actions/checkout` from 3.3.0 to 4.2.2
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](ac59398561...11bd71901b)

Updates `actions/cache` from 4.0.2 to 4.2.1
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c45773b62...0c907a75c2)

Updates `actions/cache` from 4.0.2 to 4.2.1
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c45773b62...0c907a75c2)

Updates `ruby/setup-ruby` from 1.180.0 to 1.221.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](ff740bc00a...32110d4e31)

Updates `actions/cache` from 4.0.2 to 4.2.1
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0c45773b62...0c907a75c2)

Updates `actions/setup-node` from 4.0.2 to 4.2.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](60edb5dd54...1d0ff469b7)

Updates `actions/checkout` from 3 to 4
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](ac59398561...11bd71901b)

Updates `ruby/setup-ruby` from 1.180.0 to 1.221.0
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](ff740bc00a...32110d4e31)

Updates `actions/upload-artifact` from 4.3.1 to 4.6.0
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.3.1...65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08)

Updates `github/codeql-action` from 2 to 3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/cache
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions-updates
- dependency-name: ruby/setup-ruby
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-updates
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-19 14:28:06 +02:00
Antonis Stamatiou
c97556f33d
fix: Proper glob path for dependabot (#8612) 2025-02-19 14:13:17 +02:00
Lucas Reis
8e854a8bdd
Implementing the Audio Playback/Download on the chat (#7900)
* feat: added new check for isAudio and added the supported mime types

* feat: adding the progress and audio on the audio file message

* feat: finishing the layout of the audio_file

* feat: play and pause audio

* feat: update the progress bar when audio is playing

* feat: update the timeframe of the audio

* feat: update with the new design

* feat: adding download and preview

* feat: creates a hook for the file download and preview

* feat: adding useCallback to make the return stable

* fix: iOS issue when playing in loop

* feat: adding localization for the error

* fix: removing code tha was inserted for debug

* feat: add a new line on the en.json

* fix: fixing types

* feat: adding the onSeek method inside the progress bar

* feat: changing progress value to animated value

* feat: changing to GestureDetector and making the seek method work

* feat: adding a touchable without feedback to prevent the audio to triggering other page

* feat: adding the drag on the seek method

* feat: making the download button more gray

* fix: fix tests

* fix: prevent onProgress from clearing the seconds when the audio is paused

* feat: clamping the position of the cursor to never be dragged offscreen

* feat: enhancing the experience of dragging the cursor on the progress bar

* feat: differentiate between the throttles

* feat: remvoing the aac audio files support

* feat: pausing if the focus has changed

* feat: render differently the audio file when in the files list

* refactor: optimize audio file component by using useCallback for event handlers

* refactor: extract stopPropagation function for better readability in AudioFile component

* feat: implement custom useThrottled hook and replace lodash throttle in AudioFile component

* refactor: update useThrottled hook to accept a generic callback type

* fix: loading of uri of audio files after merge

* feat: add audioFile style to enhance layout for audio files

* fix: tests
2025-02-19 11:17:30 +01:00
Antonis Stamatiou
4a9678ed01
fix: Add multiple directories for dependabot (#8610) 2025-02-19 11:15:32 +02:00
Antonis Stamatiou
8453e08e44
feat/Add-dependabot-for-gha (#8606) 2025-02-18 19:01:34 +02:00
enzowritescode
e8d72d8a8c
Random Cleanup (#8592)
* Consts and helper functions in NotificationHelper.kt

* remove dead code in RandomId.kt
2025-02-17 08:23:19 -07:00
NCPSNetworks
f675761f34 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-02-17 15:04:56 +00:00
MArtin Johnson
e0949deb9c Translated using Weblate (Swedish)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-02-17 15:04:56 +00:00
Frank Paul Silye
7754e33ef0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.9% (1187 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-02-17 15:04:56 +00:00
master7
de6978e3ad Translated using Weblate (Polish)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-02-17 15:04:56 +00:00
Daniel Espino García
779fe31c3b
Fix MM-61975 (#8459)
* Fix MM-61975

* Add missing strings

* Ensure the app gets logged out after not accepting the ToS

* Fix i18n and add comment

* Fix tests and address feedback

* Check for the right value coming from status

* Update texts
2025-02-17 13:45:12 +01:00
unified-ci-app[bot]
24e6750482
Bump app build and version number (#8595)
* Bump app build number to 606

* Bump app version number to 2.26.0

---------

Co-authored-by: Anka <runner@Mac-1739773484484.local>
2025-02-17 09:06:56 +02:00
Amy Blais
4f710ef131
Update README.md (#8588) 2025-02-14 11:26:58 +02:00
unified-ci-app[bot]
08db7a1635
Bump app build number to 605 (#8590)
Co-authored-by: Anka <runner@Mac-1739523078859.local>
2025-02-14 11:09:46 +02:00
yasser khan
9976cacec4
Add ability to run detox tests on Android (#8553) 2025-02-14 01:26:53 +05:30
Rahim Rahman
985fa692a6
fix(MM-62375): OOM on gif (#8573)
* fix(MM-62375): OOM on gif
* add APNG4Android into github action script to download
* change to mattermost/APNG4Android
2025-02-12 08:18:54 -07:00
Elias Nahum
4407ca06cf
2.25 fixes (#8578) 2025-02-11 17:21:26 +08:00
Julien Tant
d0073617ed
[MM-62898] Reset filter when changing team (#8564)
* refactor: Improve search team change handling and filter removal

* fix: revert package.resolved

* add test file

* extract regex and fix formatting of useCallback

* improve tests

* fix style
2025-02-10 10:33:08 -07:00
Martin Mičuda
316ad84ea3 Translated using Weblate (Czech)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-02-10 15:07:42 +00:00
Kaya Zeren
46d5175f5d Translated using Weblate (Turkish)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2025-02-10 15:07:42 +00:00
kaakaa
561201a973 Translated using Weblate (Japanese)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-02-10 15:07:42 +00:00
Matthew Williams
0f1312520d Translated using Weblate (English (Australia))
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2025-02-10 15:07:42 +00:00
Serhii Khomiuk
2140e70d26 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-02-10 15:07:42 +00:00
Konstantin
4fb37228d3 Translated using Weblate (Russian)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-02-10 15:07:42 +00:00
Tom De Moor
99ea6c633e Translated using Weblate (Dutch)
Currently translated at 99.8% (1210 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-02-10 15:07:42 +00:00
liul8258
49869182d5 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-02-10 15:07:42 +00:00
jprusch
caebf9a20b Translated using Weblate (German)
Currently translated at 100.0% (1212 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-02-10 15:07:42 +00:00
Frank Paul Silye
a84730d205 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.4% (1181 of 1212 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-02-10 15:07:42 +00:00
Martin Mičuda
3cac04e15e Translated using Weblate (Czech)
Currently translated at 100.0% (1211 of 1211 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-02-10 15:07:42 +00:00
jprusch
c2bc2d23f0 Translated using Weblate (German)
Currently translated at 100.0% (1211 of 1211 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-02-10 15:07:42 +00:00
Elias Nahum
ee66890d32
MM-62915 and MM-62919 (#8568) 2025-02-08 07:17:15 +08:00
Joram Wilander
c804a1a589
MM-59445 + others - Add tests for channel bookmarks, systems, apps and tos files in remote/actions (#8558) 2025-02-07 23:57:17 +08:00
unified-ci-app[bot]
d07e5c10d0
Bump app build number to 602 (#8569)
Co-authored-by: Anka <runner@Mac-1738918279511.local>
2025-02-07 11:09:39 +02:00
Elias Nahum
f2383f8bc5
Fix Android keyboard gap using navigation events (#8565) 2025-02-06 11:18:05 +01:00
Julien Tant
fb9760151c
[MM-60405] Crossteam search (#8411)
* Add new team picker for search

* try fix result header

* fix style

* add test for team picker

* add some tests

* add tests on team list and team list item

* hide All Teams search behind FF

* use style variable for separator

* ALL TEAMS does not have a search history

* Update app/components/team_list/index.test.tsx

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* move ALL_TEAMS_ID to a constant file

* memoize the construction of team list to prevent useless allocation

* combine pushes

* move style to stylesheet

* revert changes to Package.resolved

* improve team list index tests

* add test to ensure team picker does not show for just one team

* add test to ensure the file icon filter only shows when i'm on the file tab

* improve jsx readability by making the if test positive

* add test to make sure team picket does not show if there's only one team

* test: remove snapshot and add expect that separator exists in index 0 but index 1 (#8474)

* Trigger Build

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-02-05 13:46:38 -07:00
Elias Nahum
1207b0e0cd
Fix plus menu on home screen (#8560)
* fix plus menu on home screen

* fix snapshot tests

* Update index.test.tsx.snap

* Update index.test.tsx.snap
2025-02-05 10:50:04 +01:00
Elias Nahum
762bbabfa0
Fix android keyboard area when switching apps (#8554) 2025-02-05 08:12:57 +08:00
Daniel Espino García
c8f42ee67e
Add the Component Library to the app (#8319)
* Add the Component Library to the app

* fix i18n

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2025-02-04 13:32:55 +01:00
Daniel Espino García
46f1cf3969
Check file id instead of metadata for file removal (#8549) 2025-02-03 15:02:28 +01:00
Joram Wilander
84f2a7d1f7
test: Add tests for AppsManager (#8545) 2025-02-03 08:56:46 -05:00
Joram Wilander
61ad688277
test: Add tests for NavigationStore (#8541) 2025-02-03 08:56:16 -05:00
Joram Wilander
fe2cc0673d
test: Add tests for launch.ts initialization logic (#8547) 2025-02-03 08:22:16 -05:00
Weblate (bot)
53b8b6e59f
Translated using Weblate (Turkish) (#8550)
Automatic Merge
2025-02-03 15:20:10 +02:00
Elias Nahum
a1da0a720f
fix: remove from channel (#8539) 2025-01-31 10:09:46 -07:00
Joram Wilander
6f8d6632b6
MM-59761 Add tests for i18n functionality (#8510)
* test: Add tests for i18n functionality

* Remove test causing i18n ci check failure
2025-01-31 09:30:42 -05:00
Joram Wilander
444364b63c
test: Add entry query function tests (#8534) 2025-01-31 08:22:11 -05:00
Daniel Espino García
737fa985ef
Add logs for push errors on android (#8540) 2025-01-31 10:35:10 +01:00
unified-ci-app[bot]
79e90d1a8a
Bump app build number to 598 (#8543)
Co-authored-by: Anka <runner@Mac-1738312832897.local>
2025-01-31 11:09:47 +02:00
Guillermo Vayá
8782f4e3a4
[MM-62777] Fix errors being nested. Make MFA code more resilient to this situation (#8531)
* Fix errors being nested. Make code more resilient to this situation

* address review comments

* code review comment
2025-01-31 08:31:15 +02:00
Joram Wilander
1cc6e7c3de
MM-59790 Add tests for team queries (#8527)
* test: Add tests for team queries

* Factor our common test variables

* Updates per review feedback
2025-01-30 08:26:26 -05:00
Joram Wilander
fe2b96bcd4
test: Add tests for role queries (#8532) 2025-01-30 08:26:08 -05:00
Joram Wilander
0565a687c5
test: Add tests for push notifications module (#8535) 2025-01-30 08:25:44 -05:00
Rahim Rahman
dc45bcb4a6
fix(MM-62461): uploading image attachment shows new message (#8528)
* fix(MM-62461): uploading image attachment shows new message

* remove console.logs

* clean up unit test

* clean up unneeded unit tests
2025-01-29 22:44:40 -07:00
Joram Wilander
1d254d4529
MM-59787 Add tests for preference query functions (#8530)
* test: Add tests for preference query functions

* sync test changes

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-01-29 17:10:21 -05:00
Joram Wilander
0bac4b96f0
Fix flaky client/rest/general/ping test (#8533) 2025-01-29 13:33:34 -05:00
Guillermo Vayá
8fae132afa
fix loop (#8524) 2025-01-29 13:25:00 +01:00
dependabot[bot]
7e1e047e61
Bump undici from 6.21.0 to 6.21.1 (#8506) 2025-01-28 23:59:43 +08:00
Joram Wilander
4187e9f81a
MM-59741 + others - Add tests for remaining app/hooks files (#8517)
* test: Add tests for useHandleSendMessage hook

* test: Add tests for header hooks

* test: Add tests for device hooks

* test: Add tests for useChannelSwitch hook

* test: Add tests for useTeamSwitch hook

* test: Add tests for useInputPropagation hook

* test: Add tests for useWhyDidYouUpdate hook

* test: Add tests for useFreeze hook

* test: Add tests for useAutocompleteDefaultAnimatedValues hook

* test: Add tests for usePersistentNotificationProps hook

* test: Add tests for useFetchingThreadState hook

* test: Add tests for useBackNavigation hook

* test: Add tests for useShowMoreAnimatedStyle hook

* test: Add tests for useTeamsLoading hook

* test: Add tests for useNavButtonPressed hook

* test: Add tests for useDidUpdate hook

* test: Add tests for useAppBinding hook

* Fix type error and test
2025-01-28 08:51:50 -05:00
Joram Wilander
3ef637ff9d
MM-59426 Add tests for entry common functions (#8515)
* test: Add tests for entry common functions

* increase functions coverage to 80%

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-01-28 08:09:43 -05:00
Joram Wilander
6a96ca52ad
test: Add tests for session manager (#8504) 2025-01-28 08:09:15 -05:00
Rajat Dabade
1bd2e0b665
MM-62726 fix the active label color for channel and thread (#8523)
* MM-62726 fix the active label color for channel and thread

* Updated snapshot
2025-01-28 14:43:45 +05:30
Elias Nahum
0364a9d197
Fix broken windows (#8406)
* MM-62043 fix image dimensions when iPad screen size changes

* MM-61951 fix share feedback screen layout

* MM-62100 fix download video on playback error
2025-01-28 09:58:48 +08:00
Rahim Rahman
11022322d6
fix(MM-60645): missing bookmark emoji (#8518)
* fix(MM-60645): missing bookmark emoji
* add test
2025-01-27 11:01:08 -07:00
master7
167d8a37b9 Translated using Weblate (Polish)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-01-27 18:12:49 +01:00
Sharuru
c525c84985 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-01-27 18:12:49 +01:00
Sharuru
b9d3ff1fb6 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-01-27 18:12:49 +01:00
Carrie Warner (Mattermost)
1d22270f37 Added translation using Weblate (Arabic (Saudi Arabia)) 2025-01-27 18:12:49 +01:00
MArtin Johnson
a5eebb1ea6 Translated using Weblate (Swedish)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2025-01-27 18:12:49 +01:00
Konstantin
d5756697a6 Translated using Weblate (Russian)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-01-27 18:12:49 +01:00
Ricardo Obregón
7f35294573 Translated using Weblate (Spanish)
Currently translated at 88.9% (1076 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2025-01-27 18:12:49 +01:00
unified-ci-app[bot]
9f3d09c97f
Bump app build number to 596 (#8520)
Co-authored-by: Anka <runner@Mac-1737708156830.local>
2025-01-24 11:20:55 +02:00
Rahim Rahman
0a0e2a7898
Update environment variable COLLECT_NETWORK_METRICS (#8505) 2025-01-22 07:55:00 -07:00
Daniel Espino García
25919131fc
Fix styles for add people ephemeral message (#8494) 2025-01-22 13:12:59 +01:00
yasserfaraazkhan
2830d06fc2
E2E: Mobile Drafts tests cases (#8469) 2025-01-22 04:02:14 +05:30
Claudio Costa
44bce6c319
[MM-59773] Add unit tests for Calls (#8480)
* Unit tests for app/products/calls/observers

* Unit tests for app/products/calls/actions

* Unit tests for app/products/calls/client

* Unit tests for app/products/calls/connection

* Unit tests for app/products/calls/connection/websocket_event_handlers.ts

* Unit tests for app/products/calls/connection/connection.ts

* Unit tests for app/products/calls/state/actions.ts

* Unit tests for app/products/calls/utils.ts

* Unit tests for app/products/calls/alerts.ts

* Unit tests for app/products/calls/calls_manager.ts

* Unit tests for app/products/calls/hooks.ts

* Factor out force logout error

* Reduce use of 'as jest.Mock'

* Add test case

* Use constants

* Better naming

* Fix types after merge

* Fix test
2025-01-21 12:02:03 -06:00
Joram Wilander
681585d5db
test: Add websocket manager tests (#8496) 2025-01-21 08:42:35 -05:00
Joram Wilander
575a689407
Add tests to remaining actions/websocket files (#8495)
* test: Add comprehensive tests for websocket roles actions

* test: Add comprehensive tests for websocket category actions

* test: Add comprehensive tests for websocket preferences actions

* test: Add comprehensive tests for websocket threads actions

* test: Add comprehensive tests for websocket reactions actions

* test: Add comprehensive tests for websocket system actions

* test: Add comprehensive tests for websocket integrations actions
2025-01-21 08:42:09 -05:00
Joram Wilander
e8ed761d30
MM-59740 + others - Add tests for various files in hooks/ (#8448)
* Add tests for hooks/android_back_handler

* Add tests for hooks/gallery

* Add tests for hooks/files

* Add tests for hooks/emoji_category_bar

* Add tests for hooks/markdown

* Increase more coverage for hooks/gallery.ts

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2025-01-21 08:41:52 -05:00
Martin Juřen
2e027d2d98 Translated using Weblate (Czech)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-01-20 14:38:11 +01:00
Serhii Khomiuk
bfeb2dfeb5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-01-20 14:38:11 +01:00
kaakaa
fadcb1e4f2 Translated using Weblate (Japanese)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2025-01-20 14:38:11 +01:00
Tom De Moor
8b7229e906 Translated using Weblate (Dutch)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2025-01-20 14:38:11 +01:00
jprusch
4009f7add5 Translated using Weblate (German)
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-01-20 14:38:11 +01:00
Serhii Khomiuk
7281b9c69f Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1208 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-01-20 14:38:11 +01:00
master7
ba39290f0b Translated using Weblate (Polish)
Currently translated at 100.0% (1208 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2025-01-20 14:38:11 +01:00
Serhii Khomiuk
63d2d8f765 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (1203 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/
2025-01-20 14:38:11 +01:00
jprusch
817a4ca8f9 Translated using Weblate (German)
Currently translated at 100.0% (1208 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2025-01-20 14:38:11 +01:00
Konstantin
9ed473b57c Translated using Weblate (Russian)
Currently translated at 100.0% (1208 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-01-20 14:38:11 +01:00
Martin Mičuda
f29a58cf4a Translated using Weblate (Czech)
Currently translated at 100.0% (1208 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2025-01-20 14:38:11 +01:00
Konstantin
728eeca769 Translated using Weblate (Russian)
Currently translated at 99.1% (1198 of 1208 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2025-01-20 14:38:11 +01:00
ThrRip
6e9f5c40e7 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1192 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2025-01-20 14:38:11 +01:00
unified-ci-app[bot]
46b6d0a513
chore: Update NOTICE.txt file with updated dependencies (#8499)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2025-01-20 12:13:23 +02:00
unified-ci-app[bot]
2580eccab9
Bump app build and version number (#8497)
* Bump app build number to 595

* Bump app version number to 2.25.0

---------

Co-authored-by: Anka <runner@Mac-1737356984917.local>
2025-01-20 09:50:35 +02:00
Joram Wilander
0663d39365
Add tests to index, group and users websocket actions (#8486)
* test: Add tests for websocket index actions

* test: Add tests for websocket group actions

* test: Add tests for websocket users actions

* Fix missing import in index.test.ts

* Fix type in test after main merge

* Fix tests after main merge

* Updates per review feedback

* Remove unused import
2025-01-17 14:25:12 -05:00
unified-ci-app[bot]
36bbaf3cad
Bump app build number to 594 (#8491)
Co-authored-by: Anka <runner@Mac-1737103065399.local>
2025-01-17 16:18:54 +02:00
Daniel Espino García
438edd96f6
Fix edit attachments (#8468)
* Fix edit attachments

* Address feedback
2025-01-17 12:41:14 +01:00
Daniel Espino García
592b3805f1
Fix timezone crash (#8485)
* Fix timezone crash by adding all timezones to the polyfill

* update snapshots; be careful about undefined: diff on local vs CI

* one more that's different locally vs CI

* i18n

---------

Co-authored-by: Christopher Poile <cpoile@gmail.com>
2025-01-16 17:29:57 -05:00
Elias Nahum
d1d3fda83a
Request metrics improvements (#8420)
* Network metrics

* update network-client ref

* fix unit tests

* missing catch error parsing

* Replace API's to fetch all teams and channels for a user
Update groupLabel to use a type definition
Include effective Latency and Average Speed in the metrics
Include parallel and sequential request counts

* update network library and fix tests

* feat(MM-61865): send network request telemetry data to the server (#8436)

* feat(MM-61865): send network info telemetry data

* unit testing

* fix latency vs effectiveLatency

* cleanup test

* fix failing tests

* fix spelling error

* fix failing test

* more cleanup

* fix: improve parallel requests calculation (#8439)

* fix: improve parallel requests calculation

* fix test issue

* multiple parallelGroups testing

* calculateAverageSpeedWithCategories test

* categorizedRequests in it's own describe

* clean up duplicate tests

* check for when groupLabel is non-existent

* a case when groupLabel is non-existent

* more testing with effective latency.

* resolveAndFlattenModels with a capital F

* add try..catch within resolveAndFlattenModels

* update groupLabel to fix failing lint

* fix linting issue due to unknown group label

* forgot to push changes

* fix the indentation problem again

* add env var option for COLLECT_NETWORK_METRICS

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-01-16 13:55:29 -07:00
Joram Wilander
a314c6059f
Add tests for actions/websocket/teams (#8479) 2025-01-16 15:21:30 -05:00
Daniel Espino García
7f9d393f3b
Fix package lock identation (#8484) 2025-01-16 17:26:04 +01:00
Elias Nahum
2f3dfbbbfa
Update dependencies and upgrade to RN 0.76.5 (#8421)
* update dev deps

* partial update dependencies

* update watermelondb

* update rn to 0.76.5, expo to 52.0.18 and others

* upgrade android firebase

* upgrade detox deps

* fix package-lock.json

* update emm and paste-input

* update turbo-log

* update network library

* fix tests

* review feedback

* fix Keyboard blocking signIn button

* Fall back to iphone 14 iOS 17.2 simulator as app crashes on iOS 17.4

* changes in deleteCredentialsForServer is causing a crash

* withOptions x2 clearly is wrong

* re-add cli-platform-apple fix

* fix: RN 0.76.5 issue with bottom sheet disappearing (#8478)

* experiment, using view vs BottomSheetView

* revert previous & try disabling enableDynamicSizing

* revert an unintended removal

---------

Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-01-16 07:11:32 -07:00
kondo
52e05fba13
MM-62411 Retrying SSO does not trigger a redirect (#8458)
* The server url is being registered as invalid.
Even if the URL is valid upon retry, it is still being registered as invalid.

* Delete unnecessary import

* Delete serverUrl

* Delete serverUrl props on test
2025-01-16 13:02:23 +01:00
Daniel Espino García
4b068889e7
Add some improvements to thread handling (#8407)
* Add some improvements to thread handling

* Add missing changes

* Android changes

* iOS changes

* Avoid copys

* Refactor getReplyAt
2025-01-16 11:48:28 +01:00
yasserfaraazkhan
0ad2679595
Add android detox apk build workflow (#8405) 2025-01-16 12:26:10 +05:30
Joram Wilander
6ffc24a1fd
Add tests for queries/app/servers (#8477) 2025-01-15 14:43:01 -05:00
Guillermo Vayá
805c14af6d
fix spacing between bookmarks, align + icon (#8476) 2025-01-15 14:50:40 +01:00
Joram Wilander
263dddd22a
MM-59585 Add tests for utils/url (#8462)
* Add tests for utils/url

* Update per review feedback
2025-01-13 19:55:44 -05:00
Joram Wilander
cdbb9ebfd7
Add tests for actions/websocket/event (#8470) 2025-01-13 19:19:00 -05:00
Joram Wilander
e6c19637b9
Add tests for actions/websocket/posts (#8465) 2025-01-13 19:18:42 -05:00
Guillermo Vayá
fff6788e94
View custom profile attributes (#8460)
* feat: Add custom attributes section to user profile
2025-01-13 20:38:14 +01:00
Rajat Dabade
84eded1bde
Mobile drafts (#8280)
* refactor: started with draft, done until new tabs for draft

* refactor: change the query and added the screen for draft

* added condition for fetching draft for channel delete or not

* refactor: added draft screen

* linter fixes

* Added draft post component

* added avatar and header display name for the draft post list

* added channel info component

* channel info completed

* proper naming

* added image file markdown acknowledgement support

* draft actions

* Fix the draft receiver in drafts

* separated send message handler

* Done with send drafts

* done with delete drafts

* change save to send draft

* handle lengthy message with show more button

* done with persistent message edit, send and delete drafts

* added alert for sending message

* added update at time for the drafts

* en.json extract fix

* Updated dependencies for useCallback

* refactor: added drafts list to animated list

* added swipeable component and delete conformation for drafts

* done with rendering of images in markdown for drafts

* en.json issue fixed

* fix en.json issue

* refactor: en.json fix

* addressed review comments

* updated image metadata handling code

* linter fixes

* added the empty draft screen

* linter fix

* style fix

* back button an android takes to the channel list page

* en.json fix

* draft actions theme compatible

* CSS fix for draft channel_info and avatar component

* removed the badge icon and change font style drafts

* fix send alert sender name for GMs

* updated snapshot

* added testId to the drafts components

* updated send draft test id

* clicking on draft takes to the channel

* Added toptip for draft tours

* intl extract

* Rebase to main and reverted local testing changes

* Added tooltip for drafts

* addressed review comments

* reset navigation when click on a draft in draft tabs

* fix the theme issue and navigation issue

* reverted back the draft click navigation changes

* observing draft when hitting back button

* removed the unwanted animiation

* updated regex for parsing markdown

* removed unnecessary checks and change folder name

* removed react memo and merge unwanted observes function

* removed unnecessary comments

* changed the name for observing and querying draft function

* removed memo from component level

* Text to FormattedText component

* Text to formatted text, change image name

* added confirmation modal for deleting draft from bottomsheet

* using common send_handler for both draft and post

* removed magic number for tooltip and bottomsheet

* renamed channel_info to draft_post_header

* text to formattedText for Edit drafts

* removed unnecessary changes

* minor fixes

* mounting draft only when there is draft

* map to reduce

* renamed SwipeableDraft to DraftSwipeAction

* name fixes

* isValidUrl to isParsableUrl and added test

* added test and addressed minor review comments

* added inline component for the duplicate code

* inlt fixes

* clearDraft is not optional

* optimised categories_list.tsx component

* Swipeable to ReanimatedSwipeable, TouchableWithoutFeedback to Pressable and folder name changes

* Added comment and disabled eslint rule for showing warning

* fixed component file name

* minor'

* Removed deprecated Animated createAnimatedComponent flatlist

* added test for missing protocol check

* import change for SwipeableMethod

* active tab for tablet view

* Updated the drafts icons

* Updated compass-icon version to v0.1.48

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-01-13 18:40:03 +05:30
unified-ci-app[bot]
ffbca2889a
Bump app build number to 592 (#8467)
Co-authored-by: Anka <runner@Mac-1736497995177.local>
2025-01-10 11:10:05 +02:00
Rahim Rahman
8b5c50e6e8
test(MM-59431): file.ts unit test (#8424)
* test(MM-59431): file.ts unit test

* get to 100% coverage

* add regression proof for some callback methods in uploadFile

* add unhappy path
2025-01-08 20:19:24 -07:00
Joram Wilander
e15e7d3a57
Add tests for utils/user (#8453) 2025-01-08 15:30:48 -05:00
Joram Wilander
38e7901660
MM-59684 Add tests for client/websocket (#8452)
* Add tests for client/websocket

* Updates per review feedback
2025-01-08 12:38:44 -05:00
Joram Wilander
d1e3048bc7
MM-59433 Add unit tests to actions/remote/retry (#8445)
* Add unit tests to actions/remote/retry

* Factor out some common test variables

* add some other test

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-01-08 12:30:16 -05:00
Joram Wilander
86727fec71
MM-59583 Add tests for utils/theme (#8455)
* Add tests for utils/theme

* Imprve some test names

* Combine all tests for getKeyboardAppearanceFromTheme under one describe
2025-01-08 11:59:52 -05:00
Joram Wilander
1bb024e202
Add tests for utils/server (#8456) 2025-01-08 09:41:02 -05:00
Joram Wilander
4fedb846bc
MM-59683 + more - Add tests to client/rest (#8447)
* Add tests to client/rest/users

* Add tests to client/rest/channels

* Add tests to client/rest/posts

* Add tests to client/rest/teams

* Add tests to client/rest/general

* Minor clean-up

* Add tests to client/rest/file

* Add tests to client/rest/threads

* Add tests to client/rest/emojis

* Add tests to client/rest/integrations

* Add tests to client/rest/categories

* Add tests to client/rest/groups

* Add tests to client/rest/channel_bookmark

* Add tests to client/rest/preferences

* Add tests to client/rest/tos

* Add tests to client/rest/nps and client/rest/plugins

* Minor clean-up

* Fix type error with proper client.searchFiles definition

* add more test to cover 100%

* add teamId test

* improve users test

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-01-07 08:23:28 -05:00
Joram Wilander
2307985539
MM-59600 Add unit tests to utils/opengraph (#8444)
* Add unit tests to utils/opengraph

* exporting only for tests

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-01-06 15:30:48 -05:00
Joram Wilander
72ccd763e6
MM-62394 Add unit tests to utils/message_attachment (#8443)
* Add unit tests to utils/message_attachment

* keep some functions "private"

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2025-01-06 12:13:52 -05:00
Frank Paul Silye
b7635dc46a Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.4% (1173 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2025-01-06 13:06:18 +00:00
unified-ci-app[bot]
5ce4f490b1
Bump app build number to 591 (#8446)
Co-authored-by: Anka <runner@Mac-1735892971448.local>
2025-01-03 11:08:34 +02:00
unified-ci-app[bot]
c0cf5818b7
Bump app build number to 589 (#8440)
Co-authored-by: Anka <runner@Mac-1735287273517.local>
2024-12-31 17:15:09 +01:00
Jihyeon Gim
798bdcd191 Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Jihyeon Gim
501c2fc447 Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Jihyeon Gim
f2116dfe1d Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Jihyeon Gim
c27dbc0efd Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Jihyeon Gim
ecd3bd2376 Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Jihyeon Gim
3cea350ba8 Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Jihyeon Gim
db48c5eaf2 Translated using Weblate (Korean)
Currently translated at 89.5% (1067 of 1192 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-12-30 14:24:13 +00:00
Weblate (bot)
7a88bf4895
Translations update from Mattermost Weblate (#8438)
Automatic Merge
2024-12-23 14:48:31 +02:00
unified-ci-app[bot]
dca341e625
Bump app build number to 588 (#8437)
Co-authored-by: Anka <runner@Mac-1734684035963.local>
2024-12-20 12:55:53 +01:00
Daniel Espino García
32453b320c
Fix interactive dialog number handling (#8431) 2024-12-19 09:45:03 +01:00
Daniel Espino García
d75cbcde7f
Fix interactive dialogs not showing (#8427)
* Fix interactive dialogs not showing

* Use conditionals
2024-12-18 15:54:08 -05:00
Rahim Rahman
61ccc959cf
chore: add .aider* to gitignore (#8425) 2024-12-18 11:35:39 -07:00
Joram Wilander
663cda2b77
MM-59652 Add unit tests to actions/websocket/channel (#8417)
* Add unit tests to actions/websocket/channel

* Updates per review feedback
2024-12-18 08:19:37 -05:00
Elias Nahum
fb57c423c7
Network metrics (#8390)
* Network metrics

* update network-client ref

* fix unit tests

* missing catch error parsing

* add client tracking unit tests

* fix typos
2024-12-17 19:51:26 +08:00
Daniel Espino García
640ff93e01
Android native logs (#8384)
* Android native logs

* Use latest version of the library
2024-12-17 18:16:11 +08:00
unified-ci-app[bot]
3cda8df6f4
Bump app build and version number (#8418)
* Bump app build number to 585

* Bump app version number to 2.24.0

---------

Co-authored-by: Anka <runner@Mac-1734412880694.local>
2024-12-17 08:33:24 +02:00
Weblate (bot)
8b3947ad4f
Translations update from Mattermost Weblate (#8416)
* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Czech)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Czech)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/

---------

Co-authored-by: Serhii Khomiuk <sergiy.khomiuk@gmail.com>
Co-authored-by: Martin Mičuda <micuda@rematiptop.cz>
2024-12-16 15:31:11 +01:00
unified-ci-app[bot]
b3d3ce3d81
Bump app build number to 584 (#8414)
Co-authored-by: Anka <runner@Mac-1734078079268.local>
2024-12-13 11:08:38 +02:00
Amy Blais
9ac635d2ee
Update supported ESR version (#8410)
v9.11 ESR is the latest supported ESR version.

Ticket
https://mattermost.atlassian.net/browse/CLD-8696

```release-note
NONE
```
2024-12-13 09:02:55 +02:00
Rahim Rahman
6d94675955
fix(MM-49742): broken user avatar (#8356)
* fix(MM-49742): broken user avatar

* add border for both focused and unfocused for profile photo on the bottom tab bar
* status size reduced to 12 from default 14
* the size of the profile photo has been reduced from 28 to 22 to be inline with other icons on tab bar

* revert initial commit

* add unit test for Account

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-12-12 10:33:17 -07:00
Daniel Espino García
da38976cff
Remove end user message for unsupported servers (#8404)
* Remove end user message for unsupported servers

* Update test
2024-12-12 13:02:17 +01:00
yasserfaraazkhan
63889c03c6
Fix: Android build for Detox e2e (#8362) 2024-12-09 23:20:05 +05:30
Weblate (bot)
854d6207b0
Translations update from Mattermost Weblate (#8401)
Automatic Merge
2024-12-09 13:47:38 +01:00
unified-ci-app[bot]
9703d51727
Bump app build number to 583 (#8400)
Co-authored-by: Anka <runner@Mac-1733472953540.local>
2024-12-06 11:08:58 +02:00
fxnm
9607f42243
fix: fixed image overflow in message attachments (#8361)
* fix: fixed image overflow in message attachments

* fix: fixed image overflow in message attachments
2024-12-06 08:27:42 +02:00
Joram Wilander
d468d34a5d
Add tests for queries/server/channel (#8395) 2024-12-06 09:35:21 +08:00
Daniel Espino García
d996ed8133
Fix join/leave messages not showing (#8396) 2024-12-06 07:46:15 +08:00
Pablo Vélez
8b9779d4b3
MM-56899 - prevent app block when setting custom status if no internet (#8283)
* MM-56899 - prevent app block when setting custom status if no internet

* remove alert and use build in error message

* remove unused translations

* implement pr feedback

* keep function in local file

* remove unnecessary change

* fix placeholder position

* block the done button while the server replies

* add close button to the modal
2024-12-05 15:53:54 -05:00
Daniel Espino García
9632ce5038
Surround text on file info for searches (#8391) 2024-12-04 07:57:23 +02:00
Pattara Kiatisevi
21e929dca2
Fix Thai search keywords not properly hi-lighted in the search results. (#8347) 2024-12-04 02:40:07 +08:00
Daniel Espino García
7f21754b78
Fix 60879 (#8344)
* Fix 60879

* Address feedback

* Address feedback

* Add tests
2024-12-03 10:49:38 +01:00
Weblate (bot)
eff552f2a7
Translated using Weblate (Norwegian Bokmål) (#8389)
Automatic Merge
2024-12-02 13:47:37 +01:00
unified-ci-app[bot]
421301e573
Bump app build number to 579 (#8386)
Co-authored-by: runner <runner@Mac-1732865257136.local>
2024-11-29 11:17:16 +02:00
yasserfaraazkhan
acfccb170f
Fix: Env variabled to pick up right simulator device for tests (#8367) 2024-11-29 11:48:35 +05:30
Elias Nahum
7cb2ee75b3
Fix bottomSheet bottom insets (#8331)
* Fix bottomSheet bottom insets

* fix search team picker on android

* ux review

* fix footer padding for message priority modal on iPad
2024-11-29 12:50:09 +08:00
Elias Nahum
d25c6fe245
Extra keyboard (#8348)
* Add support to use the keyboard area with a component

* fix import

* add missing providers to involved screens

* Change the way we handle the keyboard to allow using custom components in that area

* review feedback
2024-11-29 11:58:13 +08:00
Daniel Espino García
732b17a75c
Add post props validation (#8323)
* Validate props

* Add calls changes and fix attachments

* Address feedback
2024-11-28 15:59:30 +01:00
Daniel Espino García
f911a29e4c
Fix MM-61710 (#8368) 2024-11-27 16:18:08 +01:00
Elias Nahum
7123c7f3c0
Ensure myTeam.id is not undefined (#8375) 2024-11-26 20:15:34 +08:00
Weblate (bot)
50a7b14b6a
Translations update from Mattermost Weblate (#8373)
* Translated using Weblate (Swedish)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Czech)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1194 of 1194 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

---------

Co-authored-by: MArtin Johnson <martinjohnson@bahnhof.se>
Co-authored-by: Serhii Khomiuk <sergiy.khomiuk@gmail.com>
Co-authored-by: Martin Mičuda <micuda@rematiptop.cz>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: ThrRip <coding@thrrip.space>
2024-11-25 18:47:29 +01:00
Joram Wilander
1f29c77a6e
MM-59432 Add tests for actions/remote/custom_emoji (#8372)
* Add tests for actions/remote/custom_emoji

* Expect calls to forceLogoutIfNecessary in tests
2024-11-25 12:02:59 -05:00
Joram Wilander
71f1d99041
Increase branch test coverage of actions/remote files (#8370)
* Increase branch test coverage for actions/remote/command

* Increase branch test coverage for actions/remote/session

* Increase branch test coverage for actions/remote/post
2024-11-25 12:02:34 -05:00
Joram Wilander
99383f265f
Add tests for actions/remote/category (#8371) 2024-11-25 11:58:50 -05:00
unified-ci-app[bot]
8d2e52b817
Bump app build number to 577 (#8369)
Co-authored-by: runner <runner@Mac-1732258145494.local>
2024-11-22 13:13:58 +01:00
Rahim Rahman
84d320afcf
test: more meaningful AnimatedNumber component test (#8309)
* better unit test for animated_number

* updated test

* update test

* clean up based on comments
2024-11-21 10:30:30 -07:00
Joram Wilander
f803edfbf4
Increase branch test coverage to over 80% for actions/local (#8366) 2024-11-21 08:16:19 -05:00
unified-ci-app[bot]
d259fb00b4
Bump app build and version number (#8364)
* Bump app build number to 576

* Bump app version number to 2.23.0

---------

Co-authored-by: runner <runner@Mac-1732099083966.local>
2024-11-20 13:13:20 +01:00
Guillermo Vayá
9b450cf68b
prevent overlap of clear button, fix font, reduce space on recent statuses (#8322)
* prevent overlap of clear button, fix font, reduce space on recent statuses

* remove font size

* prevent newlines on android external keyboard

* move to reducer action

* change newline behaviour to space
2024-11-19 11:19:57 +01:00
Elias Nahum
59c76dc5e6
bump cross-spawn (#8357) 2024-11-19 17:43:35 +08:00
Elias Nahum
37fd1609c7
fix screen position for server / login / forgot password & mfa (#8340)
* fix screen position for server / login / forgot password & mfa

* refactor to use a hook

* fix scroll to offset not to height

* feedback review
2024-11-19 08:36:47 +08:00
Weblate (bot)
7d8d4a4c68
Translations update from Mattermost Weblate (#8355)
Automatic Merge
2024-11-18 12:47:13 +01:00
Elias Nahum
59a49b3972
fix entry logic to not re-fetch data for the initial team (#8349) 2024-11-18 17:49:44 +08:00
Elias Nahum
97788aa22f
include EMM/MDM integration in the arch diagram (#8327) 2024-11-16 06:53:36 +08:00
Harrison Healey
0efa409023
MM-61148 Rewrite table parsing and improve error handling around Markdown code (#8300)
* MM-61148 Rewrite table parsing based off cmark-gfm

* MM-61148 Add better error handling to Markdown code

* Use logError instead of console.error

* Switch back to published release

* Update import paths
2024-11-15 12:23:44 -05:00
Amy Blais
1f28e9bd8b
Update README.md (#8330)
* Update README.md

* Update full_description.txt

* Update changelog
2024-11-15 08:05:22 -05:00
unified-ci-app[bot]
700c708679
Bump app build number to 575 (#8350)
Co-authored-by: runner <runner@Mac-1731657997849.local>
2024-11-15 07:59:05 -05:00
Rahim Rahman
a2af0aa1ad
chore: patch getBuildSettings to allow run ios from cli (#8345) 2024-11-14 03:48:17 +08:00
Elias Nahum
6e032a7a6f
Animate gif as default until MM-22242 is implemented (#8339) 2024-11-13 19:17:10 +08:00
Elias Nahum
e99735e310
update fastlane (#8335) 2024-11-13 18:55:53 +08:00
Elias Nahum
8c87ec1fc3
remove patch warning (#8334) 2024-11-13 08:21:55 +08:00
Elias Nahum
ea2cb45a18
Login improvement (#8306)
* refactor to improve requests on login

* include in team sidebar order by display name teams not present in the order preference

* Fix iOS reload while developing

* fix code causing tests to fail

* feedback review

* update network-client
2024-11-13 08:06:12 +08:00
Guillermo Vayá
f6bc8ae50b
remove warning due to patch version missmatch (#8332) 2024-11-13 08:05:07 +08:00
Joram Wilander
268bb807e7
MM-59444 Add tests for actions/remote/command (#8326)
* Add tests for actions/remote/command/executeCommand

* Add tests for actions/remote/command/executeAppCommand

* Add tests for the rest of actions/remote/command
2024-11-11 08:29:32 -05:00
unified-ci-app[bot]
91df3cea79
chore: Update NOTICE.txt file with updated dependencies (#8328)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2024-11-11 08:28:13 -05:00
Weblate (bot)
66f5ce12cc
Translations update from Mattermost Weblate (#8329)
Automatic Merge
2024-11-11 13:47:13 +01:00
Daniel Espino García
e0992c0bf6
Add test notification tool (#8271)
* Add test notification menu

* Reduce the minimum version for testing purposes

* Address feedback

* Add missing strings

* Address feedback

* Fix snapshots

* Bump version limit and use correct link

* Fix tests

* Fix URL issues
2024-11-11 10:22:57 +01:00
Rahim Rahman
83189afa88
fix(MM-60638): Insecure File Provider Paths (#8294) 2024-11-08 08:28:19 -07:00
unified-ci-app[bot]
d27d56f102
Bump app build number to 572 (#8321)
Co-authored-by: runner <runner@Mac-1731051082886.local>
2024-11-08 07:51:29 -05:00
Jesse Hallam
09697c5a8b
bump Ruby verison (#8315) 2024-11-07 12:34:24 -04:00
Daniel Espino García
2649b4b63a
Remove app alias for imports (#8314) 2024-11-07 08:34:49 +08:00
Elias Nahum
d7e54999c9
fix iPad split screen (#8317) 2024-11-07 08:30:54 +08:00
Jesse Hallam
6f381cfcf5
MM-53775: hide Thread Overview until a reply occurs (#8316) 2024-11-06 13:01:42 -04:00
Rahim Rahman
97e74c92af
feat:proper badge theme use for server list (#8313)
* fix(MM-61209): mention badge incorrect theme color

* @asaadmahmood color correction

* @asaadmahmood borderWidth 1px

* remove borderWidth: 1
2024-11-05 07:11:17 -07:00
Rahim Rahman
aa85f22729
fix(MM-61209): mention badge incorrect theme color (#8312)
* fix(MM-61209): mention badge incorrect theme color

* removed expect-error with proper typing
2024-11-05 06:25:34 -07:00
Weblate (bot)
7eec0ff44d
Translations update from Mattermost Weblate (#8311)
Automatic Merge
2024-11-04 14:47:18 +01:00
Joram Wilander
3764bf031e
MM-59449 Add tests for actions/remote/post (#8301)
* Add cud tests to actions/remote/post

* Remove unused fetchPostsForCurrentChannel

* Add fetch tests to actions/remote/post

* Update app/actions/remote/post.ts

* fix tests

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2024-11-04 08:27:20 -05:00
Joram Wilander
a3582c42a9
MM-59423 Add tests to actions/remote/notifications (#8302)
* Add tests to actions/remote/notifications

* Fix typing error in test
2024-11-04 08:27:03 -05:00
Joram Wilander
cd2725ea31
MM-59422 Add tests to actions/remote/search (#8304)
* Add tests to actions/remote/search

* Better confirm results of searchFiles test
2024-11-04 08:26:50 -05:00
Joram Wilander
99db5bdee8
Add tests to actions/remote/groups (#8303) 2024-11-04 19:24:01 +08:00
TheoForger
ece82d75ca
[MM-60236] Remove ephemeral posts on refresh/during initial load (#8260)
* fix: remove ephemeral posts on refresh

* fix: remove ephemeral posts during app launch

* fix: remove code to await the cleanup

* use built in constant instead of string `system_ephemeral`

* remove sort from `queryPostsByType()`

* switch back to the `await` approach in `cleanupEphemeralPosts`

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-11-01 09:28:06 -06:00
unified-ci-app[bot]
2a02a61b6b
Bump app build number to 571 (#8307)
Co-authored-by: runner <runner@Mac-1730449069657.local>
2024-11-01 08:04:25 -04:00
Rahim Rahman
41ab86cd2d
fix(MM-53762): missing file and reaction (#8284)
* fix: missing file and reaction

* update import
* simplify code

* update post test to show the changes fix emoji and reaction
* clean up  test
2024-10-30 14:55:34 -06:00
Nicolas Le Cam
0c587ab427
feat: Switch FormattedDate component to Intl.DateTimeFormat (#8276)
* feat: Switch FormattedDate component to Intl.DateTimeFormat

* feat: Revert stylistic only changes

* Add tests

* Take code review into account

* Fix tests by forcing timezone

* Use constant formats in DateSeparator to avoid uneeded rerenders

* Add UserTimezone tests
2024-10-30 14:30:17 -06:00
Joram Wilander
f2198137aa
Add tests to actions/remote/preference (#8299) 2024-10-30 07:53:05 -04:00
Elias Nahum
534aeaaef6
Fix sidebar teams order (#8281) 2024-10-30 17:12:58 +08:00
Tanmay Thole
a580642114
feat: Add visible to you text on ephemeral posts (#8245)
* feat: Add visible to you text on ephemeral posts

* docs: update localization file

* style: system header of ephemeral post

* feat: visible to you text for ephemeral posts
2024-10-30 10:01:49 +01:00
dependabot[bot]
4ee91dc81b
Bump rexml from 3.3.7 to 3.3.9 in /fastlane (#8297)
Bumps [rexml](https://github.com/ruby/rexml) from 3.3.7 to 3.3.9.
- [Release notes](https://github.com/ruby/rexml/releases)
- [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/rexml/compare/v3.3.7...v3.3.9)

---
updated-dependencies:
- dependency-name: rexml
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-30 09:57:51 +08:00
Joram Wilander
e4d895df85
MM-59438 Add tests to actions/remote/session (#8296)
* Add tests to actions/remote/session

* Fix styling

* Fix typing in session_manager
2024-10-29 11:06:01 -04:00
Daniel Espino García
2e8c9ce9a5
Reconnect the network when we switch network types (#8034) 2024-10-29 10:14:31 +01:00
Weblate (bot)
3a712350a8
Translations update from Mattermost Weblate (#8292)
* Translated using Weblate (Ukrainian)

Currently translated at 74.1% (879 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 74.1% (879 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Polish)

Currently translated at 100.0% (1186 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Ukrainian)

Currently translated at 74.1% (879 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 74.1% (879 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 74.1% (879 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 76.4% (907 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 76.4% (907 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 77.7% (922 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 77.7% (922 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 82.4% (978 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 83.0% (985 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/uk/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1186 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 98.0% (1163 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (1186 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 98.0% (1163 of 1186 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

---------

Co-authored-by: Arsenii Potapov <arch130troll@gmail.com>
Co-authored-by: Serhii Khomiuk <sergiy.khomiuk@gmail.com>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: ThrRip <coding@thrrip.space>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
2024-10-29 08:57:25 +01:00
dependabot[bot]
ac6bdd8a8a
Bump rexml from 3.3.5 to 3.3.9 (#8295) 2024-10-29 08:22:11 +08:00
Elias Nahum
1beb9a99c2
Add logs when notification device tokens is registered or fails to do so (#8282) 2024-10-29 08:18:51 +08:00
Joram Wilander
c1b66b364b
Add tests to actions/remote/thread (#8289) 2024-10-28 09:40:06 -04:00
Joram Wilander
daf13fa1b9
Add tests to actions/remote/reactions (#8290) 2024-10-28 09:16:31 -04:00
TheoForger
e932cf30a0
Add Index to 'type' column in 'Post' table (#8278)
* update `Post` table schema and migration plan to index `type` column

* use `unsafeExecuteSql()` for adding index during migration

* Update SQL query to create index

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* Update docs

* Remove `UNIQUE` from SQL query

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2024-10-26 14:14:56 +02:00
unified-ci-app[bot]
c5171418b6
Bump app build number to 569 (#8286)
Co-authored-by: runner <runner@Mac-1729845732528.local>
2024-10-25 08:43:30 -04:00
Claudio Costa
751bb2dfb1
Ensure full validation of Calls post props (#8279) 2024-10-24 16:10:49 -06:00
Rajat Dabade
e4dc8dbbfe
MM-59973: fix the emoji count 0 issue when archive and unarchive chan… (#8146)
* MM-59973: fix the emoji count 0 issue when archive and unarchive channels

* ref to null and initialing it

* refactor: added a safe condition

* refactor code

* more clean up

* clean-ups

* index to tosting as a key to component

* refactor code

* fix: (MM-59973) emoji count 0 update (#8256)

* reversed from all useMemo to useMemo + useEffect
* tried to include everything into useMemo was an anti-pattern
* moved back to useMemo + useEffect
* previousNumber and animateToNumber comparison has some flaw when dealing with difference length between the two

* simple fix

* fix more silly mistakes

* move _previousNumberString to constant

* Test: increase timeout-minutes to 120 for e2e test

* reverted the timeout-minutes back to 40

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-10-23 16:17:37 +05:30
Elias Nahum
8c7c02d298
Add support for Auth Scheme customization (#8261) 2024-10-23 08:44:12 +08:00
Joram Wilander
05f7875d22
Add tests to actions/remote/user (#8273) 2024-10-21 11:12:42 -04:00
Rahim Rahman
9338a1c479
chore: exhaustive-deps eslint rules from 'off' to 'warn' (#8272) 2024-10-21 09:06:28 -06:00
Weblate (bot)
7484583865
Translations update from Mattermost Weblate (#8277)
Automatic Merge
2024-10-21 16:44:34 +02:00
unified-ci-app[bot]
e5a7c91f1f
Bump app build and version number (#8269)
* Bump app build number to 568

* Bump app version number to 2.22.0

---------

Co-authored-by: runner <runner@Mac-1729252885614.local>
2024-10-18 08:39:18 -04:00
unified-ci-app[bot]
bfa1d93deb
Bump app build number to 567 (#8268)
Co-authored-by: runner <runner@Mac-1729240293461.local>
2024-10-18 08:29:38 -04:00
Elias Nahum
418f43cf16
Add utils/post_list unit tests (#8265) 2024-10-18 12:45:08 +08:00
Elias Nahum
eba51a73c6
Add utils/role unit tests (#8266) 2024-10-18 06:30:34 +08:00
Elias Nahum
0df47511a9
Add utils/search unit tests (#8267) 2024-10-18 06:29:49 +08:00
Tanmay Thole
f8a1a5f187
feat: Add copy button on code view (#8244)
* feat: Add copy button on code view

* docs: Update localization file

* Update app/screens/code/index.tsx

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>

* refactor: Update deps array

---------

Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
2024-10-17 10:24:07 +02:00
Elias Nahum
98b8bf109f
fix bookmarks sort order when WS does not bump update_at (#8264) 2024-10-17 09:05:01 +08:00
Rajat Dabade
647b8c8eb6
MM-60705 DB migration: added update_at column to draft table for mobile (#8237)
* MM-60705 DB migration: added update_at column to draft table for mobile

* refactor: updated docs

* refactor: reverted unwanted changes and updated default value for update_at columns

* refactor: changed the condition for excepting 0 value for update_at column
2024-10-15 19:49:22 +05:30
unified-ci-app[bot]
c6583b7f90
chore: Update NOTICE.txt file with updated dependencies (#8258)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2024-10-15 08:39:53 -04:00
Daniel Espino García
bc8a42b161
Native set load measured (#8242)
* Track notification loaded on native side instead of JS

* iOS details and iOS 18 changes

* Fix tests
2024-10-14 16:07:06 +02:00
Rahim Rahman
e7d597f70e
test: mitmproxy + low bandwidth + automated QA using detox (#8202)
* experimental github action

* start mtmproxy then kill it

* suspend test for now

* dont need to be in a PR to trigger

* trying again with mitmdump

* where is .mitmproxy folder?

* run with +e

* not sure why exit code 1

* if this is a better path

* let's try killing using trap?

* trying a different path

* maybe using ~  would work?

* looking at output to networksetup command

* minor mistake

* throttling bandwidth

* lets try with sudo

* missing sudo

* using mitmdump

* remove spaces

* tried diff path

* change to the proper file

* upload artifacts

* install cert

* added cert to simulator

* getting simulator UDID

* proper scoped var

* using github outputs

* getenv doesn't have IOS_SIMULATOR_UDID

* using echo command

* maybe forgot to scope outputs

* lets run the command directly

* changed to iPhone 14

* let me see all the devices

* try something new

* rearrange my steps to get cert

* getenv booted

* remove too many outputs

* using mm mobile test server

* tie it all together with detox test

* removed dependency for another job

* put dependency on a job

* simplify process even more

* add github-token on download artifact

* add run-id, hopefully that's what needed to download

* incorrect speed for download

* update to the correct dummynet syntax

* proper mitmdump flow report

* update allow-hosts

* commenting out mitmdump for now

* back to rahim-experiments

* overly commented out

* cacert not --ca-cert

* maybe i allow the wrong host?

* maybe i just forgotr to kill mitmdump after I'm done?

* using pm2

* reinstate jobs. and longer timeout for detox

* need sudo

* recording videos and limiting to 1 test

* just want to run 1 test.

* back to experimenting

* using wget

* test using chrome

* using chrome and add delay

* ok test again with detox

* go back to testing all server_login

* compare booted simulators

* few more experiments

* no \

* using github_outputs

* using fromJSON

* too many $

* can i do this another way?

* two runs to get the it assigned

* try again

* .

* trying to access devices array

* try again

* using jq

* keep it simple

* might not need outputs

* forgot pipe

* will this work?

* will first element of an array works

* see if we got the udid

* did we get it wrong?

* will this work?

* let's assign?

* we have to put into string

* ok 1 more

* will it have quotes?

* echo in an echo

* is this working?

* let's hope this works.

* it's actually using 17.4 iPhone 14 not 17.0

* broke because i add &

* removed failed step

* lowering ping and going back to 10 parallel test

* double-up ONE_SEC to see if tests will pass

* why curl failed after?

* getting more data from failures

* let's get more logs with pm and mitmdump

* more logging and improvement

* silly error!

* problem with throttling, let's figure out where we can improve

* increase timeout for low-bandwidth

* increased delay + run all tests

* lets see if this will be better for throttling

* try set +e to see if it will return failure

* check disk space.

* deleting zip and trash to free up space.

* try to do pfctl twice to see if that would help

* making bandwidth-throttling a composite action

* would 5 seconds make a diff?

* add shell

* throttle bandwidth experiment

* fix quick problem

* 5s sleep, and throttling at the right time

* the throttling was working better earlier.

* add a flush in between

* no exit, see if it works well

* trying continue-on-error

* resetting with continue-on-error vs checking for if steps before worked

* adding flush before throttling to see if it makes a diff

* put it back where we think is the best spot

* change timeout to 60 and some cleanup

* forgot a simple $

* move network throttling again to see if this is better?

* rearranging

* move throttling back to where it used to work well
making bandwidth-throttling action taking inputs

* forgot shell

* inputs not input, and continue-on-error

* getting host from site_1_url

* update the sed script

* move more steps into composite action file

* add shell

* add more shell

* action cleanup

* see if our reset network setting works

* delete unused files

* more clean up

* wrong indentation

* wrong context

* see if not having low bandwidth enabled would cause stuff to break

* will it fail on non-existent step name?

* things are failing after proxy started

* start using low_bandwidth_mode input

* incorrect use of curly bracket

* low_bandwidth_mode vs low_bandwidth

* correcting the use of curly bracket in if check

* low_bandwidth_mode correction

* why would https:// makes a diff?

* just going to start pm2 after stopping

* move things around again

* some more re-arranging

* exit 1

* rearranged too much

* clean up

* start-proxy action

* incorrect variable name

* use test_server_url instead

* reverting back to original

* use pull_request

* using env var prepend

* using existing artifact

* not in ""

* not going to prepend anymore

* incorrectly removed input instead of env

* close to final

* using original e2e-detox-template

* timeout-minutes need to be higher for low_bandwidth.

* using label instead of push to branch

* add check-label

* remove unneeded test

* renamed ci.yml back to original

* different way to remove label
remove experiment files
reinstate ci.yml

* remove experiment file

* see label again

* output labels

* another experiment

* test again

* fix issue when checking for low bandwidth

* revert changes to package.json in detox/

* changed download to upload in the description

* changes based on review

* add github.event.label.name to the group "id" per @mvitale1989 suggestion

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-10-14 07:56:52 -06:00
Weblate (bot)
b2240e37f5
Translations update from Mattermost Weblate (#8259)
Automatic Merge
2024-10-14 15:14:33 +02:00
Claudio Costa
fa7e7ef44d
Update calls-common (#8255)
* Bump rtc monitor interval to 10s

* Update calls-common
2024-10-11 13:47:49 -06:00
Daniel Espino García
94a7231a05
Add fixes for xCode 16 changes (#8254) 2024-10-11 17:02:45 +02:00
unified-ci-app[bot]
0549a51e38
Bump app build number to 566 (#8253)
Co-authored-by: runner <runner@Mac-1728635924924.local>
2024-10-11 08:02:58 -04:00
Abdullahi Abass
7dcb6ad4ce
fix: render channel links in threads list (#8205)
fixes: https://github.com/mattermost/mattermost/issues/27859

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-10-11 00:55:24 -06:00
Claudio Costa
e693431dec
[MM-45894] Calls: support for signaling media tracks using data channels (#8246)
* Replace pako with fflate

* Allow signaling through data channel

* Update calls-common
2024-10-09 16:33:33 -06:00
Lucas Reis
603ea793f9
MM-60425 Making clickable images work inside Markdown (#8215)
* fix: disables the gallery click on images inside a markdown link

* feat: removing the logic for acknowledging children that is inside link

* chore: renaming for consistency
2024-10-07 15:57:26 -04:00
unified-ci-app[bot]
1c299c4c7a
Bump app build number to 563 (#8243)
Co-authored-by: runner <runner@Mac-1728031584864.local>
2024-10-04 08:51:25 -04:00
Joram Wilander
d486f4861a
Add tests to actions/remote/team (#8241) 2024-10-03 08:18:27 -04:00
Pablo Vélez
0cbbe7266d
MM-60534 -fix rate my app broken styles (#8232)
* MM-60534 -fix rate my app broken styles

* use a simpler and more general approach
2024-09-30 18:17:11 +02:00
Weblate (bot)
197e251e0f
Translations update from Mattermost Weblate (#8238)
Automatic Merge
2024-09-30 14:44:33 +02:00
unified-ci-app[bot]
4a19e07ed9
Bump app build number to 561 (#8233)
Co-authored-by: runner <runner@Mac-1727425978022.local>
2024-09-27 08:30:15 -04:00
Elias Nahum
629683a310
update mobile app version in package-lock.json 2024-09-26 06:40:46 +08:00
lindalumitchell
35b68654f7
Update autocomplete.e2e.ts (#8231)
Removed references to now-closed issue https://mattermost.atlassian.net/browse/MM-50351
2024-09-23 21:21:15 -07:00
Weblate (bot)
250f8d04f6
Translations update from Mattermost Weblate (#8230)
Automatic Merge
2024-09-23 14:44:33 +02:00
unified-ci-app[bot]
d67199ee2d
Bump app build number to 560 (#8229)
Co-authored-by: runner <runner@Mac-1726821919831.local>
2024-09-20 08:10:27 -04:00
unified-ci-app[bot]
a4c346e8d8
Bump app build and version number (#8226)
* Bump app build number to 559

* Bump app version number to 2.21.0

---------

Co-authored-by: runner <runner@Mac-1726744671843.local>
2024-09-19 07:55:33 -04:00
lindalumitchell
8e27dcacec
Update message_reply.e2e.ts (#8225)
Remove outdated note ` -- KNOWN ISSUE: MM-50206`
2024-09-18 17:29:44 +08:00
lindalumitchell
152cdc5130
Update message_draft.e2e.ts (#8224)
Removed reference to fixed issue ` -- KNOWN ISSUE: MM-50298`.
2024-09-18 17:28:31 +08:00
Elias Nahum
f04838d9b1
open an external browser when the server config for MobileExternalBrowse is set to true (#8220) 2024-09-17 06:40:12 +08:00
Weblate (bot)
af31eed17c
Translations update from Mattermost Weblate (#8222)
Automatic Merge
2024-09-16 13:44:33 +02:00
Elias Nahum
c0f3cff531
Remove axios and detox from package.json in the root folder (#8219)
* Remove axios and detox from package.json in the root folder

* fix ts
2024-09-16 10:51:43 +08:00
Elias Nahum
991cecdeb3
Fix iPad split view (#8199)
* Fix iPad split view

* remove unused type def
2024-09-16 10:49:46 +08:00
unified-ci-app[bot]
20e0638a1f
Bump app build number to 558 (#8221)
Co-authored-by: runner <runner@Mac-1726216990647.local>
2024-09-13 08:18:23 -04:00
dependabot[bot]
cc1169c655
Bump serve-static from 1.15.0 to 1.16.2 (#8218)
Bumps [serve-static](https://github.com/expressjs/serve-static) from 1.15.0 to 1.16.2.
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-13 07:45:15 +08:00
Elias Nahum
394da4487c
Various Fixes (#8212) 2024-09-13 04:46:15 +08:00
Daniel Espino García
20d248fb99
Send notification status information to the server (#8060)
* Send notification status information to the server

* Add version and update names

* Update props names

* Use the single endpoint
2024-09-12 16:52:52 +02:00
Weblate (bot)
3a6f9809b7
Translations update from Mattermost Weblate (#8210)
* Translated using Weblate (Polish)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/

---------

Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
2024-09-09 16:25:47 +02:00
Pablo Vélez
c31ec8a711
MM-60312- rename ssoOffice 365 to sso EntraId (#8209)
* MM-60312- rename ssoOffice 365 to sso EntraId

* address pr comments, remove old icon and fix i18n
2024-09-09 11:52:18 +02:00
Daniel Espino García
f864947c7c
Remove unneeded permissions (#8201)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-09-06 16:25:38 +02:00
unified-ci-app[bot]
f45a7905fe
Bump app build number to 557 (#8207)
Co-authored-by: runner <runner@Mac-1725612120421.local>
2024-09-06 08:35:51 -04:00
Rahim Rahman
00e05d581e
fix: MM-58164 Search text is behind the textbox while searching (#8026)
* fix: MM-58164 search text hides behind textbox
* clean up unit test for useCollapsibleHeader
* simplify math
* unlock doesn't need to use useCallback as it doesn't have any deps
* revert changes on unlock
* using lockValue & headerOffset directly into children props
* disable scrolling to prevent scrollValue from being updated
* properly snapping flatlist to the proper spot in a few scenarios

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-09-05 11:28:00 -06:00
Weblate (bot)
2e46f6c015
Translations update from Mattermost Weblate (#8198)
* Translated using Weblate (German)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/

* Translated using Weblate (Russian)

Currently translated at 99.8% (1181 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/

* Translated using Weblate (Russian)

Currently translated at 100.0% (1183 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Croatian)

Currently translated at 43.4% (514 of 1183 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/

---------

Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: ThrRip <coding@thrrip.space>
Co-authored-by: ja49619 <ja49619@gmail.com>
Co-authored-by: MArtin Johnson <martinjohnson@bahnhof.se>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
2024-09-02 17:43:35 +02:00
Elias Nahum
ad54f53df6
update network-client to fix ssl error (#8194) 2024-08-30 13:35:50 -04:00
Harrison Healey
a41f1a867d
MM-55972/MM-59809 Update Markdown library to improve handling of tables (#8137)
* MM-59972/MM-59809 Update Markdown library to improve handling of tables

* Change Commonmark back to the published version of our fork

* Actually use the new version
2024-08-30 21:26:18 +08:00
unified-ci-app[bot]
94a6b9bcb1
Bump app build number to 555 (#8189)
Co-authored-by: runner <runner@Mac-1725007804168.local>
2024-08-30 08:20:59 -04:00
Joram Wilander
aba68c45d5
MM-59440 Add unit tests for actions/remote/channel (#8184)
* Add member tests for actions/remote/channel

* Add channel and dm tests to actions/remote/channel

* Update app/actions/remote/channel.test.ts

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2024-08-29 09:46:16 -04:00
Elias Nahum
a2dca382c7
add unit tests to app/utils/notification (#8140) 2024-08-29 00:04:12 +08:00
Elias Nahum
2174c679e1
add unit tests for app/utils/navigation (#8139) 2024-08-29 00:03:50 +08:00
Elias Nahum
358417dd7b
add unit tests to app/utils/permalink (#8141) 2024-08-29 00:03:25 +08:00
Elias Nahum
48af5fdcd5
add unit tests to app/utils/post (#8142) 2024-08-29 00:02:40 +08:00
Claudio Costa
13ca346155
[MM-60291] Fix rendering of live captions (#8185)
* Load jobs state from call state

* Fix rendering of live captions overlay
2024-08-28 07:28:12 -06:00
Elias Nahum
8b869c246b
fix sso login success message (#8174)
* fix sso login success message

* fix if statement

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-08-27 08:06:51 +08:00
yasserfaraazkhan
0bf501a14a
Mock date.now in flaky app/actions/team tests (#8171) 2024-08-27 01:44:00 +08:00
Joram Wilander
16b4ec8b60
Add unit tests for actions/local/user (#8170) 2024-08-26 08:22:58 -04:00
Joram Wilander
ee5a84ddc7
Add unit tests for actions/local/thread (#8169) 2024-08-26 08:22:37 -04:00
Weblate (bot)
5d0e55b46c
Translations update from Mattermost Weblate (#8149)
* Translated using Weblate (German)

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Polish)

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Russian)

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (1181 of 1181 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

---------

Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: Konstantin <eleferen@gmail.com>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: MArtin Johnson <martinjohnson@bahnhof.se>
2024-08-26 13:48:21 +02:00
Daniel Espino García
8eba95ad5c
Quick fix for post input not capitalizing the start of sentences (#8168) 2024-08-26 10:48:44 +02:00
unified-ci-app[bot]
f89fda480b
Bump app build number to 550 (#8167)
Co-authored-by: runner <runner@Mac-1724402433523.local>
2024-08-23 08:24:43 -04:00
Daniel Espino García
6ad21e1da3
Fix hardware keys not working as expected (#8156) 2024-08-22 10:15:39 +02:00
Elias Nahum
d7e8015f71
update ruby gems dependencies to build the ios app (#8158) 2024-08-21 09:07:06 -04:00
Claudio Costa
52d04ca252
[MM-57994] Hide Calls buttons/actions if plugin is not enabled (#8121)
* Limit group calls to DMs only on unlicensed servers

* Hide Calls buttons/actions if plugin is disabled

* Fix lint

* Address feedback
2024-08-19 09:33:20 -06:00
unified-ci-app[bot]
fe0dd4b5af
Bump app build and version number (#8151)
* Bump app build number to 547

* Bump app version number to 2.20.0

---------

Co-authored-by: runner <runner@Mac-1724066792823.local>
2024-08-19 07:56:22 -04:00
unified-ci-app[bot]
cd6574a0c5
Bump app build number to 546 (#8148)
Co-authored-by: runner <runner@Mac-1723797112117.local>
2024-08-16 08:08:32 -04:00
yasserfaraazkhan
0698cf558d
Add Unit tests to app/actions/local/teams.ts (#8088) 2024-08-13 20:21:17 +05:30
Rajat Dabade
8f536f7597
Attachment list in view info for DMs and GMs mobile (#8120)
* Attachment list in view info for DMs and GMs mobile

* refactor: only get currentID for DMs and GMs

* used typing
2024-08-13 19:33:10 +05:30
Claudio Costa
4e4bd8fe27
[MM-57781] Limit group calls to DMs only on unlicensed servers (#8075)
* Limit group calls to DMs only on unlicensed servers

* Update calls-common
2024-08-13 08:25:13 +02:00
Daniel Espino García
3eab5b9d2d
Remove location strings from info.plist (#8144) 2024-08-12 17:49:58 +02:00
Weblate (bot)
c0183fe2e5
Translations update from Mattermost Weblate (#8143)
Automatic Merge
2024-08-12 17:57:51 +03:00
dependabot[bot]
446e720124
Bump rexml from 3.2.9 to 3.3.3 in /fastlane (#8138)
Bumps [rexml](https://github.com/ruby/rexml) from 3.2.9 to 3.3.3.
- [Release notes](https://github.com/ruby/rexml/releases)
- [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/rexml/compare/v3.2.9...v3.3.3)

---
updated-dependencies:
- dependency-name: rexml
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-12 09:45:42 +03:00
Elias Nahum
5261e29c38
add unit tests to app/utils/markdown (#8135) 2024-08-12 09:16:11 +03:00
Elias Nahum
0b83938d3c
update dependencies (#8131)
* update project depdendencies

* update detox dependencies

* update fastlane

* remove silencing console
2024-08-12 09:15:49 +03:00
unified-ci-app[bot]
5190af9e0c
Bump app build number to 545 (#8136)
Co-authored-by: runner <runner@Mac-1723192955401.local>
2024-08-09 08:36:01 -04:00
Elias Nahum
bde7e3e006
add unit tests to app/utils/general (#8133) 2024-08-08 14:21:17 +03:00
Elias Nahum
6b5de21317
Add unit tests for app/utils/images (#8134) 2024-08-08 14:20:40 +03:00
Joram Wilander
7a595d0ccb
Add unit tests for actions/local/channel_bookmark (#8125) 2024-08-06 14:20:45 -04:00
Joram Wilander
728fef8c64
MM-59618 Add unit test coverage of app/actions/local/systems (#8128)
* Add return values to storeConfigAndLicense

* Add unit tests for actions/local/systems
2024-08-06 14:20:26 -04:00
Weblate (bot)
a80e1b1952
Translations update from Mattermost Weblate (#8130)
* Translated using Weblate (Arabic)

Currently translated at 1.8% (22 of 1180 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ar/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.8% (1119 of 1180 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 96.0% (1133 of 1180 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1180 of 1180 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/

---------

Co-authored-by: Mohamed-sobhi95 <elmohasebsobhy@gmail.com>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
2024-08-06 14:46:49 +00:00
Elias Nahum
e7fe7c23ff
add unit tests to utils/gallery (#8117) 2024-08-06 13:17:36 +03:00
Elias Nahum
e799135826
update fastlane (#8116) 2024-08-06 13:16:45 +03:00
Rahim Rahman
1de7b5e9b7
fix: (MM-59956) Android crash when sharing (#8122) 2024-08-02 09:05:52 -06:00
unified-ci-app[bot]
1c66504b66
Bump app build number to 541 (#8124)
Co-authored-by: runner <runner@Mac-1722587881867.local>
2024-08-02 08:33:24 -04:00
Weblate (bot)
4e1259ab70
Translations update from Mattermost Weblate (#8118)
Automatic Merge
2024-07-29 18:27:54 +03:00
Elias Nahum
4048b70713
fix cannot read data when opening a deeplink (#8109) 2024-07-27 03:37:57 +08:00
Elias Nahum
ca00ab21da
fix loop counters should not be assigned within the loop body (#8112) 2024-07-26 09:03:33 -04:00
unified-ci-app[bot]
3114c4e984
Bump app build number to 540 (#8113)
Co-authored-by: runner <runner@Mac-1721983148917.local>
2024-07-26 08:17:49 -04:00
Elias Nahum
01a60803fd
fix ios and android build (#8114) 2024-07-26 19:34:50 +08:00
Claudio Costa
3656bff4bd
[MM-57698] Implement client ICE candidate pairs metric (#8051)
* Implement client ICE candidate pairs metric

* Update calls package
2024-07-26 10:14:33 +02:00
Claudio Costa
7682c5ccce
[MM-52657] AV1 support (#8037)
* AV1 support

* Guard functionality behind config flag

* Update calls package

* Fix default config

* fix
2024-07-26 10:01:33 +02:00
Joram Wilander
806a4d44ec
Add an architecture diagram to docs (#8110) 2024-07-25 10:52:55 -04:00
Daniel Espino García
26ae247d0f
Avoid registering wrong performance load logs (#8107) 2024-07-24 18:42:31 +02:00
Elias Nahum
a3ac7535f1
added unit tests for utils/file/file-picker (#8099) 2024-07-23 20:15:05 +08:00
Elias Nahum
de6ccaef01
SSL Pinned Certificate (#8055) 2024-07-23 18:26:20 +08:00
Weblate (bot)
c34a131cdd
Translations update from Mattermost Weblate (#8106)
Automatic Merge
2024-07-22 18:27:52 +03:00
Elias Nahum
23e85aac16
update fastlane (#8101) 2024-07-22 22:15:58 +08:00
unified-ci-app[bot]
8e0e1a4cd7
chore: Update NOTICE.txt file with updated dependencies (#8105)
Co-authored-by: unified-ci-app[bot] <121569378+unified-ci-app[bot]@users.noreply.github.com>
2024-07-22 09:01:52 -04:00
unified-ci-app[bot]
065bff85dd
Bump app build and version number (#8103)
* Bump app build number to 538

* Bump app version number to 2.19.0

---------

Co-authored-by: runner <runner@Mac-1721389338722.local>
Co-authored-by: Amy Blais <29708087+amyblais@users.noreply.github.com>
2024-07-19 08:11:55 -04:00
unified-ci-app[bot]
82c31254d4
Bump app build number to 537 (#8102)
Co-authored-by: runner <runner@Mac-1721378073919.local>
2024-07-19 08:03:04 -04:00
Elias Nahum
5b510cb780
fix issues found by sonarqube (#8095)
* fix issues found by sonarqube

* fix unit test
2024-07-18 09:40:47 +08:00
Elias Nahum
b330847d95
Channel Bookmarks (#7817) 2024-07-18 09:10:28 +08:00
Elias Nahum
ea8adb5167
Fix server list bottom sheet on tablet (#8094) 2024-07-16 14:47:59 -04:00
Weblate (bot)
62a694b8ca
Translations update from Mattermost Weblate (#8089)
Automatic Merge
2024-07-15 15:27:54 +03:00
yasserfaraazkhan
cdaae87017
Add unit test cases for reactions.ts (#8084) 2024-07-15 17:44:25 +05:30
Pablo Vélez
d02e39b1f3
MM-56933 - password dont disable autocomplete (#8057) 2024-07-15 12:55:33 +02:00
Elias Nahum
e4d8d1177e
add file utils unit tests (#8079) 2024-07-15 16:55:23 +08:00
Saturnino Abril
58b50b1a5b
test: app/actions/app/global.ts (#8087) 2024-07-15 16:53:32 +08:00
Joram Wilander
3c6d5aa4ae
Add tests for actions/local/post (#8083) 2024-07-15 16:52:44 +08:00
Saturnino Abril
8fb0b32d89
fix: saving e2e test report in Zephyr (#8080) 2024-07-12 21:07:31 +05:30
unified-ci-app[bot]
c3dc4c699e
Bump app build number to 535 (#8082)
Co-authored-by: runner <runner@Mac-1720773707918.local>
2024-07-12 08:38:50 -04:00
Joram Wilander
333b594561
Add unit tests for app/actions/local/file and app/actions/local/group (#8077)
* Add tests for actions/local/file

* Add tests for actions/local/group
2024-07-11 12:49:27 -04:00
Joram Wilander
6031e8da6e
Add unit tests for app/actions/local/draft (#8067)
* Add tests for actions/local/draft/updateDraftFile

* Add tests for actions/local/draft/removeDraftFile

* Add tests for actions/local/draft/updateDraftMessage

* Add tests for actions/local/draft/addFilesToDraft

* Add tests for actions/local/draft/removeDraft

* Add tests for actions/local/draft/updateDraftPriority

* Fix updateDraftMessage test case

* Update app/actions/local/draft.test.ts

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* place common beforeeach/aftereach top of file (#8076)

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
2024-07-11 10:10:37 -04:00
Elias Nahum
9bdb5c15e1
more utils unit test coverage (#8068) 2024-07-11 20:18:55 +08:00
Rahim Rahman
b9f4000dd0
fix: add mkdir of "android/app/src/main/res/raw/" in postinstall (#8070) 2024-07-10 02:59:31 +08:00
Mario Vitale
0fbeea83f3
Add Amy as a reviewer for the weekly build number bump PRs (#8071)
* Add Amy as a reviewer for the weekly build number bump PRs

* PR_REVIEWERS is a comma-separated list
2024-07-09 20:02:56 +02:00
Joram Wilander
8c44c54448
Update jest config to show coverage for correct folders (#8069) 2024-07-09 08:58:46 -04:00
Daniel Espino García
f3de4445c2
Restore out of channel and some cleanup (#8050)
* Restore out of channel and some cleanup

* Fix i18n
2024-07-09 11:31:31 +02:00
Elias Nahum
10135091d1
Fix button ui when disabled (#8056) 2024-07-09 07:12:59 +08:00
unified-ci-app[bot]
773fcc3494
Bump app build number to 532 (#8048)
Co-authored-by: runner <runner@Mac-1719563817324.local>
2024-07-08 18:17:53 +02:00
Weblate (bot)
17d15c6953
Translations update from Mattermost Weblate (#8065)
Automatic Merge
2024-07-08 18:27:50 +03:00
Joram Wilander
dd3a38b5fe
Add unit tests for app/actions/local/channel (#8063)
* Add tests for actions/local/channel/removeCurrentUserFromChannel

* Add tests for actions/local/channel/setChannelDeleteAt

* Add tests for actions/local/channel/selectAllMyChannelIds

* Add tests for actions/local/channel/markChannelAsUnread

* Add tests for actions/local/channel/resetMessageCount

* Add tests for actions/local/channel/storeMyChannelsForTeam

* Fix test names

* Add tests for actions/local/channel/updateMyChannelFromWebsocket

* Add tests for actions/local/channel/updateChannelInfoFromChannel

* Add tests for actions/local/channel/updateLastPostAt

* Add tests for actions/local/channel/updateChannelsDisplayName

* Add tests for actions/local/channel/showUnreadChannelsOnly

* Add tests for actions/local/channel/updateDmGmDisplayName

* Remove unnecessary spying
2024-07-08 08:30:12 -04:00
Joram Wilander
2c29172135
Add unit tests for app/actions/local/category (#8058)
* Add unit tests for app/actions/local/category

* Remove unnecessary forEach

* Run setup only once
2024-07-08 08:29:57 -04:00
Daniel Espino García
095b97425f
Graciously handle load measure when there is no mark (#8052)
* Graciously handle load measure when there is no mark

* Make public interface cleaner
2024-07-08 13:31:00 +02:00
Elias Nahum
a7224479d5
added utils unit tests (#8040) 2024-07-05 07:17:09 +08:00
Christopher Poile
92bdb2847b
[MM-57486] [MM-58008] Calls: Mobile ringing for incoming calls (#7984)
* notification ringing, settings screen, native code patch, ringing mp3s

* i18n

* play preview on first press

* prevent playing from background (only affects Android) to match iOS beh

* stop ringing/vibration on entering background

* ring when coming back from background and new incoming call is present

* no push notification sound when it's a call; improve ringing

* move sounds to asset folder; copy on postinstall for android bundling

* make Ringtone type a string enum

* make Android ring async + await ring and stop; changes from PR comments

* missing fields after merge

* release lock on an exception

* cancel sample ringing when turning notifications off

* copy sound files for android build

* typo

* update snapshots

* testing if the problem is copying the mp3 files

* fix android mp3 assets when building for non-release

* add sounds to .gitignore

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2024-07-03 10:22:46 -04:00
ckaznable
331d3130bc
Fix User Agent issue in some device (#8049)
* Remove deviceName from User Agent

* Use modelName for User Agent
2024-07-03 15:41:48 +02:00
Weblate (bot)
1f6194d59d
Translations update from Mattermost Weblate (#8053)
* Translated using Weblate (Russian)

Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/

---------

Co-authored-by: Konstantin <eleferen@gmail.com>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
2024-07-02 15:53:37 +02:00
Mario Vitale
013335acb9
Fix the Universal Android build download URL for releases (#8045) 2024-06-27 13:13:57 +02:00
Daniel Espino García
de5e85d71f
Fix null reference error in notifications (#8042) 2024-06-27 09:47:57 +02:00
unified-ci-app[bot]
41f8b078bb
chore: Update NOTICE.txt file with updated dependencies (#8043) 2024-06-26 22:33:01 +08:00
yasserfaraazkhan
351c877a82
fix reporting variables in the community report (#7997) 2024-06-26 19:43:30 +05:30
Mario Vitale
b828277250
Ignore local deps in notice-file-generator config (#8041) 2024-06-26 11:29:26 +02:00
Mario Vitale
c6725ab6d3
Fix typo in UIRequiredDeviceCapabilities for iOS (#8036) 2024-06-24 18:05:22 +02:00
unified-ci-app[bot]
1e01a6c709
Bump app build number to 530 (#8033)
Co-authored-by: runner <runner@Mac-1718958773482.local>
2024-06-24 15:53:12 +02:00
Frank Paul Silye
ca086cab75 Translated using Weblate (Norwegian Bokmål)
Currently translated at 93.7% (1069 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-24 15:02:23 +03:00
ThrRip
d67bd81a81 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-06-24 15:02:23 +03:00
Frank Paul Silye
f7dbd6de23 Translated using Weblate (Norwegian Bokmål)
Currently translated at 84.2% (961 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-24 15:02:23 +03:00
Tom De Moor
87af4deb55 Translated using Weblate (Dutch)
Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-06-24 15:02:23 +03:00
Matthew Williams
7f610c5834 Translated using Weblate (English (Australia))
Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-06-24 15:02:23 +03:00
Frank Paul Silye
a808f00648 Translated using Weblate (Norwegian Bokmål)
Currently translated at 76.7% (875 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-24 15:02:23 +03:00
master7
33794bcda7 Translated using Weblate (Polish)
Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-06-24 15:02:23 +03:00
jprusch
71471bcac4 Translated using Weblate (German)
Currently translated at 100.0% (1140 of 1140 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-06-24 15:02:23 +03:00
Hosted Weblate
91e1712fe9 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-06-24 15:02:23 +03:00
Frank Paul Silye
ae79384836 Translated using Weblate (Norwegian Bokmål)
Currently translated at 68.1% (774 of 1136 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-24 15:02:23 +03:00
Frank Paul Silye
65f97fe599 Translated using Weblate (Norwegian Bokmål)
Currently translated at 59.0% (671 of 1136 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-24 15:02:23 +03:00
MArtin Johnson
787c478b1c Translated using Weblate (Swedish)
Currently translated at 100.0% (1136 of 1136 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-06-24 15:02:23 +03:00
jprusch
5732c71562 Translated using Weblate (German)
Currently translated at 100.0% (1136 of 1136 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-06-24 15:02:23 +03:00
Anonymous
bb76a88e68 Translated using Weblate (Malayalam)
Currently translated at 25.5% (290 of 1136 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ml/
2024-06-24 15:02:23 +03:00
Hosted Weblate
591ceaab3b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-06-24 15:02:23 +03:00
Frank Paul Silye
86145e3411 Translated using Weblate (Norwegian Bokmål)
Currently translated at 57.5% (654 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-24 15:02:23 +03:00
Konstantin
16c42951ee Translated using Weblate (Russian)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-06-24 15:02:23 +03:00
Daniel Espino García
b7791add7c
Use UUID native functions (#8032) 2024-06-20 18:22:59 +08:00
Christopher Poile
53b011068e
[MM-58561] Calls: Add stop recording confirmation; update call screen (#8007)
* add rec confirmation; update call screen

* add EnableTranscriptions to dep array

* remove unneeded asyncs

* properly center title; fix horizontal spacing for title buttons

* cleanup
2024-06-19 17:01:49 -04:00
Elias Nahum
b8c088cc70
Upgrade RN as well as update or replace other dependencies (#8011)
* start upgrade to RN 74

* migrate react-native-fs to expo-file-system

* exclude expo-asset module

* fix database manager remove directory

* fix: android network helper

* include expo on android

* temporarily disable android dep lock

* replace react-native-create-thumbnail with expo-video-thumnails

* update patches file version

* fix android build on 74

* create local library to replace MattermostManaged, Notifications and SplitView modules with new arch support

* migrate app to use new mattermost-rnutils library

* remove unused flipper class for android unsigned

* fix mattermost-rnutils android foldedObserver lifecycle

* use mattermost-rnutils on Android

* use mattermost-rnutils on iOS

* path react-native-navigation to not crash when activity is not NavigationActivity

* create local library for android share extension with new arch support

* Replace ShareModule with @mattermost/rnshare library

* remove ShareModule from android native code

* update react-intl

* update nodejs to 20.x.x npm to 10.x.x and dev deps

* update @gorhom/bottom-sheet

* use MattermostShare conditionally based on the platform

* update @react-native-camera-roll/camera-roll

* remove unused react-native-calendars

* fix metro config

* fix terminate session race condition

* remove unused analytics

* replace react-native-device-info with expo-application and expo-device

* update @react-native-clipboard/clipboard

* update @react-native-community/datetimepicker

* update @react-native-community/netinfo

* update @sentry/react-native

* update react-native-document-picker

* update react-native-gesture-handler

* update react-native-share

* update react-native-svg and react-native-svg-transformer

* update react-native-vector-icons

* update babel

* update react-native-shadow-2

* update semver

* remove react-native-svg-transformer and convert svg files to svg components

* fix @mattermost/rnshare new-arch build on android

* remove react-native-create-thumbnail resolution in build.gradle

* create @mattermost/hardware-keyboard library to replace hw-keyboard-events

* fix hardware-keyboard library

* fix rnutils library

* create @mattermost/keyboard-tracker library

* replace react-native-keyboard-tracking-view with @mattermost/keyboard-tracker

* fix: rnutils to not crash on lateinit context

* fix: rnutils delete database

* revert changes to session_manager

* Removed react-native-webview and added expo-web-browser instead

With expo-web-browser we no longer need the webview for SSO login
the SSO login is now done by using "custom Chrome tabs" on Android
and ASWebAuthenticationSession on iOS

* remove patch for react-native-keyboard-tracking-view

* replace react-native-linear-gradient with expo-linear-gradient

* replace react-native-in-app-review with expo-store-review

* fix: shared group database directory on ios

* replace react-native-fast-image with expo-image

* remove unusued type def for react-native-keyboard-tracking-view

* replace react-native-elements and react-native-button with @rneui

* node version

* update sizzling methods

* fix tests using jest-expo

* replace jail-monkey with expo-device

* update babel deps

* update typescript eslint

* update rn and expo

* react-native-document-picker @react-native-camera-roll/camera-roll @react-native-community/datetimepicker react-native-reanimated react-native-safe-area-context

* update patches

* update @sentry/react-native

* upgrade react-native-navigation

* update expo & expo-image

* upgrade to working version of @sentry/react-native

* update node, cocoapods, bundler, fastlane versions

* @testing-library/react-native and eslint-plugin-jest

* fix: FloatingTextInput causing a crash with reanimated

* update sentry, localize, @types/lodash and uuid

* fix floating text input label

* update react-native-video

* fix: cannot calculate shadow efficiently on some components

* fix: reduce motion warning for bottomSheet

* fix: shadow on YouTube component

* update react-native-webrtc expo and @typescript-eslint

* audit fix

* fix swizzling bad merge

* temp use of github dependency for @mattermost libraries

* feedback review

* feedback review

* npm audit fix

* update bundle deps

* update @mattermost/react-native-turbo-log

* update deps
2024-06-19 09:33:45 +08:00
Christopher Poile
1f2a71c499
[MM-58581] Calls: End call confirmations (#8004)
* end call confirmations

* i18n

* remove unneeded asyncs

* better alert for android
2024-06-18 10:02:24 -04:00
Antonis Stamatiou
8cef881db6
fix: Upgrade packages to fix broken release (#8021) 2024-06-17 16:49:16 +03:00
unified-ci-app[bot]
6195833723
Bump app build and version number (#8023)
* Bump app build number to 528
* Bump app version number to 2.18.0

---------

Co-authored-by: runner <runner@Mac-1718623031725.local>
2024-06-17 15:22:28 +02:00
Zenocode
685fe4507f Translated using Weblate (French)
Currently translated at 93.1% (1059 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2024-06-17 14:41:31 +03:00
Frank Paul Silye
f278c9b2ff Translated using Weblate (Norwegian Bokmål)
Currently translated at 47.9% (545 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nb_NO/
2024-06-17 14:41:31 +03:00
kaakaa
53fd1b725f Translated using Weblate (Japanese)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-06-17 14:41:31 +03:00
Kaya Zeren
ee1911338e Translated using Weblate (Turkish)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-06-17 14:41:31 +03:00
Daniel Espino García
b694809da1
Improve websocket behavior (#7976)
* Improve websocket behavior

* Revert uninteded changes

* Address feedback
2024-06-17 09:58:58 +02:00
Elias Nahum
dddd09aa9b
Add unit tests to utils config, datetime, error_handling, errors and files (#8018) 2024-06-15 01:29:03 +08:00
Amy Blais
bc29223315
Update README.md (#7996) 2024-06-14 08:28:55 -04:00
Elias Nahum
aea670745f
Add unit tests to Utils buttonStyles and categories (#8015)
* utils/buttonStyles tests

* utils/categories tests
2024-06-14 17:11:36 +08:00
Amy Blais
f17d4872ce
Update NOTICE.txt (#8012) 2024-06-12 09:27:03 -04:00
Antonis Stamatiou
c1829bd24f
fix: Remove mobile builds out of the template (#8000)
* fix: Remove mobile builds out of the template

* fix: Use proper variables

* fix: Create proper summary from detox output

* fix: Test with free runners for now

* fix: Switch to M1

* fix: Add removed node modules

* fix: statsPercent

* fix: Remove skipped from successful passes
2024-06-12 13:02:36 +03:00
Daniel Espino García
5f01f9e9af
Add performance metrics to the app (#7953)
* Add performance metrics to the app

* add batcher and improve handling

* Add tests

* Fix test

* Address feedback

* Address feedback

* Address feedback

* update podfile
2024-06-12 09:45:27 +02:00
Elias Nahum
daa38c5fd1
T271: Prevent access to Android components if they do not need external communication (#7990) 2024-06-12 00:45:35 +08:00
Elias Nahum
e5ce796770
fix android push notifications when app is closed (#7989) 2024-06-11 05:15:20 +08:00
Elias Nahum
f0e80aa7eb
replace swizzle method_exchangeImplementations with method_setImplementation (#7991) 2024-06-11 05:14:53 +08:00
Daniel Espino García
b966e1f356
Fix priority footer on tablets (#7966) 2024-06-10 17:08:53 +02:00
MArtin Johnson
fc06c0e189 Translated using Weblate (Swedish)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-06-10 14:41:31 +03:00
master7
050b00b28d Translated using Weblate (Polish)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-06-10 14:41:31 +03:00
Tom De Moor
925b2180e1 Translated using Weblate (Dutch)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-06-10 14:41:31 +03:00
jprusch
1a76011352 Translated using Weblate (German)
Currently translated at 100.0% (1137 of 1137 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-06-10 14:41:31 +03:00
kaakaa
ebcdac48cb Translated using Weblate (Japanese)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-06-10 14:41:31 +03:00
Antonis Stamatiou
54d009d6f1
feat: Introduce Mobile CMT testing (#7994) 2024-06-10 14:06:37 +03:00
Christopher Poile
c93e16218a
[MM-57250] Calls: Provide feedback after user clicks Start call (#7967)
* make joinCall async; adding loading spinner to join/start button

* always close channelInfo

* i18n

* change how we compute active text

* use isPreferred for leave & join call button

* add joiningChannelId to calls state to track when joining a call
2024-06-06 15:39:15 -04:00
yasserfaraazkhan
f46ddb49d0
Add workflow to run detox iOS tests (#7878) 2024-06-04 22:42:58 +05:30
Weblate (bot)
cf254f8a86
Translated using Weblate (Russian) (#7988)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/

Co-authored-by: Konstantin <eleferen@gmail.com>
2024-06-03 14:38:21 +02:00
unified-ci-app[bot]
0473c1bfc8
Bump app build number to 525 (#7987)
Co-authored-by: runner <runner@Mac-1717409210410.local>
2024-06-03 13:00:56 +02:00
Daniel Espino García
9628e15fb8
Fix user autocomplete not showing users not in channel (#7980) 2024-05-31 15:10:11 -04:00
Elias Nahum
83e4aba522
fix update image on account screen when updating profile image (#7978) 2024-05-31 16:44:31 +02:00
Daniel Espino García
663f9ba01a
Fix user autocomplete not always showing on search screen (#7977) 2024-05-31 09:10:04 +02:00
MArtin Johnson
5a661cd581 Translated using Weblate (Swedish)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-05-27 19:11:31 +03:00
Tom De Moor
b241e612ee Translated using Weblate (Dutch)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-05-27 19:11:31 +03:00
MArtin Johnson
a5a8ab718e Translated using Weblate (Swedish)
Currently translated at 99.3% (1128 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-05-27 19:11:31 +03:00
master7
b594a4708d Translated using Weblate (Polish)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-05-27 19:11:31 +03:00
Matthew Williams
6bca4f3dca Translated using Weblate (English (Australia))
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-05-27 19:11:31 +03:00
jprusch
4a6c572a58 Translated using Weblate (German)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-05-27 19:11:31 +03:00
Ori maimon
23e41a1b04 Translated using Weblate (Hebrew)
Currently translated at 4.1% (47 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/he/
2024-05-27 19:11:31 +03:00
ThrRip
a78a9f2dae Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-05-27 19:11:31 +03:00
Hosted Weblate
21dcf36b05 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-05-27 19:11:31 +03:00
unified-ci-app[bot]
c00bf9cb4b
Bump app build number to 523 (#7974)
Co-authored-by: runner <runner@Mac-1716820087705.local>
2024-05-27 17:23:21 +02:00
Mario Vitale
1206309c82
Fix MILESTONE_FOUND command (#7972) 2024-05-27 16:35:21 +02:00
Christopher Poile
3f7fa8b1a1
[MM-57267] Calls: Update post UI (#7965)
* MM-58259 - allow current host to run /end call; fix deprecated test fns

* update call card UI

* update call ended icon

* make joinCall async; adding loading spinner to join/start button

* Revert "make joinCall async; adding loading spinner to join/start button"

This reverts commit bbb136690702c46ce2d4430a6b49aa96f143fb5e.

* shadowRadius 3 -> 1
2024-05-24 14:16:28 -04:00
Christopher Poile
5e1c75fd6d
[MM-57291] Calls: Add channel name to call header (#7968) 2024-05-24 13:50:04 -04:00
Weblate (bot)
aecd50c636
Translations update from Mattermost Weblate (#7962)
* Translated using Weblate (German)

Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

---------

Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
2024-05-20 15:08:51 +02:00
unified-ci-app[bot]
32e4e0a74b
Bump app build and version number (#7959)
* Bump app build number to 522

* Bump app version number to 2.17.0

---------

Co-authored-by: runner <runner@Mac-1715946646591.local>
2024-05-17 08:39:02 -04:00
Mario Vitale
2d66605422
Move away from curl and jq for the version bump script (#7957) 2024-05-17 14:29:21 +02:00
Amy Blais
08c38259cb
Update README.md (#7946)
* Update README.md

* Update full_description.txt

* Update changelog
2024-05-16 08:05:49 -04:00
Mario Vitale
7b14ea27ec
Bump app build number to 521 (#7952)
Co-authored-by: runner <runner@Mac-1715329932711.local>
2024-05-14 09:27:25 +02:00
master7
3489bb2093 Translated using Weblate (Polish)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-05-13 15:04:39 +03:00
kaakaa
bff2169033 Translated using Weblate (Japanese)
Currently translated at 100.0% (1135 of 1135 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-05-13 15:04:39 +03:00
jprusch
6ac3b75ee8 Translated using Weblate (German)
Currently translated at 100.0% (1127 of 1127 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-05-13 15:04:39 +03:00
MArtin Johnson
5189605b40 Translated using Weblate (Swedish)
Currently translated at 100.0% (1127 of 1127 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-05-13 15:04:39 +03:00
master7
ee5e24d9fb Translated using Weblate (Polish)
Currently translated at 100.0% (1127 of 1127 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-05-13 15:04:39 +03:00
Christopher Poile
59db1839ec
[MM-57460] - Calls: Host controls, add mute all to participant list (#7945)
* add mute all to participant list

* i18n

* hostControlsAvailable

* mute-all -> mute-others
2024-05-10 16:51:11 -04:00
Christopher Poile
7fbd2e52e2
[MM-58129] Calls: Host controls remove participant, view profile (#7938)
* host remove command, host removed feedback

* add view profile control

* i18n; dismissBottomSheet later

* PR comments

* remove confusing setPreviousCall(null)

* our own separator, bit more space for Android

* no need for previousCall due to changes on server

* move host removed alert to an error

* channel_id is not send via the msg.broadcast

* channel_id is still sent via the msg.broadcast
2024-05-10 16:43:35 -04:00
Daniel Espino García
4992a96891
Avoid race condition setting the badge number when the app is in the background (#7925) 2024-05-10 09:21:32 +02:00
Daniel Espino García
22e21a4026
Fix notification impeding the input in the rest of the app (#7942) 2024-05-09 13:02:22 +02:00
Daniel Espino García
25326a623a
Fix server options text by in Quartz theme (#7944) 2024-05-09 12:07:04 +02:00
Daniel Espino García
82713830de
Fix more messages style (#7943) 2024-05-09 12:06:46 +02:00
unified-ci-app[bot]
c27abc9986
Bump app build number to 520 (#7941)
Co-authored-by: runner <runner@Mac-1715088900980.local>
2024-05-07 15:50:03 +02:00
Amy Blais
9ed31e8fe3
Update NOTICE.txt (#7936) 2024-05-07 08:06:25 -04:00
Elias Nahum
1fd32bbab5
MM-58137 Fix crash by importing the correct Animated component (#7937) 2024-05-07 17:56:08 +08:00
Christopher Poile
2eb8adb3f6
[MM-57958] Calls: Host controls: stop screenshare, mute, lower hand (#7929)
* add muteSession & stopScreenshare controls; obey mute host ctrl

* lower hand host control; obey lower hand ws msg

* no need to await host api call
2024-05-06 15:14:40 -04:00
Hosted Weblate
ce485bbde0 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-05-06 16:04:39 +03:00
jprusch
a486e8c376 Translated using Weblate (German)
Currently translated at 100.0% (1127 of 1127 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-05-06 16:04:39 +03:00
kaakaa
3983ef9063 Translated using Weblate (Japanese)
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-05-06 16:04:39 +03:00
Matthew Williams
9edef14eae Translated using Weblate (English (Australia))
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-05-06 16:04:39 +03:00
Elias Nahum
9c69ab05dc
disable Flipper on iOS (#7855)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-05-06 18:05:31 +08:00
Daniel Espino García
b4a3d7ff4d
Fix MM57562 (#7920)
* Fix MM57562

* fix: Add proper java version for android build

---------

Co-authored-by: Antonis Stamatiou <stamatiou.antonis@gmail.com>
2024-05-06 12:02:12 +02:00
Elias Nahum
b43cdd6fea
fix localization (#7933) 2024-05-06 18:00:30 +08:00
Daniel Espino García
b98c184e7c
Fix gallery footer author image showing old image (#7910)
* Fix gallery footer author image showing old image

* Fix tests

* Address feedback

* Fix tests and minor refactor
2024-05-06 12:00:19 +02:00
Daniel Espino García
a6d043670a
Properly unset the active channel in the server (#7919) 2024-05-06 10:46:20 +02:00
Ilya Polozov
105073ce76
Prioritize @ autocomplete results based on recency and thread activity (#7506)
* changed autocomplete results on recency

* fixed issues

* fixed imports, moved get fucn to queries folder

* fixed en.json file

* fixed lint promblems

---------

Co-authored-by: Ilia Polozov <ilya.polozov@onza.me>
2024-05-06 10:45:44 +02:00
unified-ci-app[bot]
8799f2bb55
Bump app build number to 519 (#7921)
Co-authored-by: runner <runner@Mac-1714114726289.local>
2024-05-06 07:16:13 +02:00
Daniel Espino García
9070c27349
Use Java 17 in CI (#7930) 2024-05-03 11:08:19 +03:00
Christopher Poile
c009013356
[MM-58074] Calls: Fix crashing app when starting/joining call (#7926) 2024-05-01 11:15:42 -04:00
MArtin Johnson
4f34fcea7a Translated using Weblate (Swedish)
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-04-29 21:34:39 +03:00
ThrRip
66cd49d6fa Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-04-29 21:34:39 +03:00
Konstantin
b83714cc82 Translated using Weblate (Russian)
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-04-29 21:34:39 +03:00
master7
8a0e03fed5 Translated using Weblate (Polish)
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-04-29 21:34:39 +03:00
Tom De Moor
84a017ca73 Translated using Weblate (Dutch)
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-04-29 21:34:39 +03:00
jprusch
1db4d9638f Translated using Weblate (German)
Currently translated at 100.0% (1126 of 1126 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-04-29 21:34:39 +03:00
Konstantin
5d30a85057 Translated using Weblate (Russian)
Currently translated at 100.0% (1123 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-04-29 21:34:39 +03:00
MArtin Johnson
bd6f71abb6 Translated using Weblate (Swedish)
Currently translated at 100.0% (1123 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-04-29 21:34:39 +03:00
master7
47cbcb07ba Translated using Weblate (Polish)
Currently translated at 100.0% (1123 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-04-29 21:34:39 +03:00
Tom De Moor
12b6695f90 Translated using Weblate (Dutch)
Currently translated at 100.0% (1123 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-04-29 21:34:39 +03:00
Jihyeon Gim
7118f9d678 Translated using Weblate (Korean)
Currently translated at 96.5% (1084 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2024-04-29 21:34:39 +03:00
jprusch
76b02948c2 Translated using Weblate (German)
Currently translated at 100.0% (1123 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-04-29 21:34:39 +03:00
Sharuru
05c8026e74 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.9% (1122 of 1123 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-04-29 21:34:39 +03:00
Christopher Poile
c071eaf617
[MM-57707] - Calls: Add host controls menu (#7905)
* add host controls screen; add control for make host

* licensing & host logic

* refactor participant card; dynamic profile sizing; PR comments

* render participant name and profile changes in ParticipantsList

* package-lock update after rebase onto main

* use config's HostControlsAllowed
2024-04-24 17:23:23 -04:00
Daniel Espino García
c5e6e34fea
Fix MM 56723 (#7883)
* Fix MM 56723 (iOS)

* Add android

* Android fixes and version checking

* Add version check to ios

* Address feedback

* Add all versions to android

* Check all versions on iOS

* Fix unhandled version case

* Add comments

* Add final version numbers
2024-04-24 17:12:56 +02:00
Matthew Birtch
205816cb93
MM-37809 Update Default Themes (#7907) 2024-04-24 06:54:09 +08:00
Aaron Hopkins
42b36b2e1e
Update post_options.tsx (#7912)
[MM-52675] Use message_source in copy text action (#26674)
2024-04-23 12:07:53 +02:00
Christopher Poile
1774445715
[MM-57706] Calls: Participants list for call screen (#7895)
* Add participants bottom sheet to call screen

* i18n

* fix ruby-version

* use tag instead of host_badge

* extract Participant, use FlatList

* fix for android

* android participants list close button
2024-04-22 11:01:18 -04:00
Milo Ivir
a41c3a149e Translated using Weblate (Croatian)
Currently translated at 46.2% (518 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2024-04-22 08:34:23 -04:00
Matthew Williams
c953d8541d Translated using Weblate (English (Australia))
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-04-22 08:34:23 -04:00
Daniel Espino García
9d1030a445
Push react native to 0.73.6 (#7863)
* Bump react native to 0.73.6

* iOS changes

* Fix gallery

* Fix test

* Add missing patch

* Unify react native navigation patch

* Update the rest of libraries

* iOS updates

* Update mattermost libraries

* Fix tests and final bumps

* iOS podfile update

* Update android locks

* Revert webrtc update because it was messing with the tests

* Update podfile for webrtc
2024-04-22 12:44:39 +02:00
Daniel Espino García
ca7915e2e3
Fix erratic behavior of pull to refresh on threads (#7911) 2024-04-22 09:55:20 +02:00
Rahim Rahman
4084b21165
fix: use polyfill-force to improve startup time (#7904)
* shouldPolyfill on some instances cost > 2s
* polyfill-force skips shouldPolyfill() call
2024-04-22 09:54:52 +02:00
unified-ci-app[bot]
c3e31b6813
Bump app build and version number (#7915)
* Bump app build number to 518

* Bump app version number to 2.16.0

---------

Co-authored-by: runner <runner@Mac-1713529249511.local>
2024-04-19 08:28:38 -04:00
Aditya Pratap Singh Hada
6dcefaf1e4
[MM-56585]Show only unreads filter stays active after changing the 'Group unreads' setting (#7790)
* showing unread and threads, of group unread setting in on

* using third variable to maintain state for showing categories

* removed useState from useMemo

* Removed state, return orderctegroies if onlyUnreads & unreadsOnTop is true

* test cases updates

* removed onlyUnreads props from threads

* removed onlyUnreads

* test cases updated

* removed unnecessary changes

* removed onlyUnreads from dep

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-04-16 12:29:59 +02:00
Philippe Karle
02261eb8c0
Fix channel members list not fully loaded (#7896)
* Load more users when reaching bottom of the list

Fix mattermost issue when typing quickly within search input

* Update: logic to load next users on bottom list reached

* Update: logic refactored

---------

Co-authored-by: Philippe Ka <philippe.karle@infomaniak.com>
2024-04-16 12:23:00 +02:00
Daniel Espino García
65e59724f1
Add missing privacy requirements (#7902) 2024-04-16 07:44:10 +08:00
Kaya Zeren
1229f3e4f3 Translated using Weblate (Turkish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-04-15 15:30:35 +03:00
Kaya Zeren
6ca969b1bf Translated using Weblate (Turkish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-04-15 15:30:35 +03:00
Kaya Zeren
f073032d64 Translated using Weblate (Turkish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-04-15 15:30:35 +03:00
Kaya Zeren
5f8e23da71 Translated using Weblate (Turkish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-04-15 15:30:35 +03:00
Kaya Zeren
07368a1a95 Translated using Weblate (Turkish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-04-15 15:30:35 +03:00
master7
b09c59c21e Translated using Weblate (Polish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-04-15 15:30:35 +03:00
unified-ci-app[bot]
1eab3a9a6f
Bump app build number to 515 (#7901)
Co-authored-by: runner <runner@Mac-1712912495407.local>
2024-04-15 11:15:47 +03:00
unified-ci-app[bot]
c2f631ed24
Bump app build number to 514 (#7899)
Co-authored-by: runner <runner@Mac-1712671935360.local>
2024-04-09 16:33:54 +02:00
Daniel Espino García
c8ca39e91e
Update sentry to fix error with the Privacy files (#7897)
* Update sentry to fix error with the Privacy files

* Update sentry cocoa
2024-04-09 15:53:58 +02:00
Daniel Espino García
31b737da73
Fix id error when moving to a channel (#7890) 2024-04-08 09:52:42 +02:00
unified-ci-app[bot]
e239887cef
Bump app build number to 513 (#7887)
Co-authored-by: runner <runner@Mac-1711702917950.local>
2024-04-05 19:08:11 +02:00
Daniel Espino García
f4e3193b57
Add needed access reasons to APIs (#7891) 2024-04-04 10:06:17 +02:00
ThrRip
c8c81a63e8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-04-01 20:30:34 +03:00
kaakaa
0471e1638f Translated using Weblate (Japanese)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-04-01 20:30:34 +03:00
jprusch
6a52e1600d Translated using Weblate (German)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-04-01 20:30:34 +03:00
MArtin Johnson
5eeba2b6a0 Translated using Weblate (Swedish)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-04-01 20:30:34 +03:00
Konstantin
c87c904967 Translated using Weblate (Russian)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-04-01 20:30:34 +03:00
Tom De Moor
66b08020d2 Translated using Weblate (Dutch)
Currently translated at 100.0% (1121 of 1121 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-04-01 20:30:34 +03:00
unified-ci-app[bot]
baf3d96560
Bump app build number to 512 (#7877)
Co-authored-by: runner <runner@Mac-1711097107491.local>
2024-03-28 14:13:54 +01:00
Elias Nahum
73fc79903f
Allow iOS to connect to servers without SSL (#7881) 2024-03-28 20:09:50 +08:00
Tanmay Thole
97b06ccaf6
feat: Scroll to bottom element (#7851)
* feat: Scroll to bottom element

* fix: Scroll to bottom element message

* refactor: Removed unnecessary code

* refactor: code quality improved

* Update app/components/post_list/scroll_to_end_view.tsx

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

* ci: update i18n

---------

Co-authored-by: Daniel Espino García <larkox@gmail.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2024-03-26 13:46:09 +01:00
Daniel Espino García
0c31d22ec7
Add gradle lockfile (#7875) 2024-03-26 10:27:35 +01:00
Weblate (bot)
9ce56503f4
Translations update from Mattermost Weblate (#7879)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/

* Translated using Weblate (German)

Currently translated at 100.0% (1119 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/

* Translated using Weblate (Polish)

Currently translated at 100.0% (1119 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1119 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/

* Translated using Weblate (Thai)

Currently translated at 3.4% (39 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/th/

* Translated using Weblate (Spanish)

Currently translated at 84.0% (941 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (1119 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/

* Translated using Weblate (Spanish)

Currently translated at 97.6% (1093 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1119 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (1119 of 1119 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/

---------

Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: ThrRip <coding@thrrip.space>
Co-authored-by: RyoKub <ryo.sakhu@gmail.com>
Co-authored-by: Angel Mendez Cano <amendez1988@gmail.com>
Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: MArtin Johnson <martinjohnson@bahnhof.se>
2024-03-26 10:05:19 +01:00
Mario Vitale
2891e90092
CLD-7307 Add set -e to i18n checker script (#7857)
* Add set -e to i18n checker script
* Fix translations

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-03-20 15:33:06 +01:00
Christopher Poile
4e68662899
[MM-57019] Calls: Live captions support for mobile (#7854)
* mobile support for live captions

* add the 'Live captions turned on' ephemeral notice

* PR comments

* message should be translatable

* run i18n-extract

* call_recording_state -> call_job_state; ccAvailable is now dynamic

* backwards compatibility with pre calls v0.26.0

* correct mobile version in deprecation comments

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2024-03-20 09:10:05 -04:00
Weblate (bot)
e48e9f4a88
Translations update from Mattermost Weblate (#7868)
* Translated using Weblate (Polish)

Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/

---------

Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: Kaya Zeren <kayazeren@gmail.com>
2024-03-18 15:12:41 +01:00
unified-ci-app[bot]
b75ab03701
Bump app build and version number (#7870)
* Bump app build number to 511

* Bump app version number to 2.15.0

---------

Co-authored-by: runner <runner@Mac-1710764125160.local>
2024-03-18 13:22:53 +01:00
Martin Popp Fredslund (SektorCERT)
ec93e4fe7e Translated using Weblate (Danish)
Currently translated at 5.7% (64 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/da/
2024-03-11 14:21:10 +02:00
MArtin Johnson
b7d83ffe4b Translated using Weblate (Swedish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-03-11 14:21:10 +02:00
Kaya Zeren
f6fdb10490 Translated using Weblate (Turkish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2024-03-11 14:21:10 +02:00
ThrRip
e2cf788127 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-03-11 14:21:10 +02:00
Konstantin
bcd0899fac Translated using Weblate (Russian)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-03-11 14:21:10 +02:00
ThrRip
8bd286a66f Translated using Weblate (Chinese (Simplified))
Currently translated at 99.9% (1114 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-03-11 14:21:10 +02:00
master7
a6e92584f9 Translated using Weblate (Polish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-03-11 14:21:10 +02:00
jprusch
6f5116d8e6 Translated using Weblate (German)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-03-11 14:21:10 +02:00
Tom De Moor
99b70fb9ba Translated using Weblate (Dutch)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-03-11 14:21:10 +02:00
Angel Mendez Cano
b6abc8dee0 Translated using Weblate (Spanish)
Currently translated at 83.0% (926 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2024-03-11 14:21:10 +02:00
unified-ci-app[bot]
42e566394e
Bump app build number to 510 (#7846)
Co-authored-by: runner <runner@Mac-1708677847420.local>
2024-03-11 11:30:37 +01:00
Mario Vitale
ca6ee2eb10
CLD-7296 Fix watchman installation after dependency changes (#7856)
* Pre-install python3.12
2024-03-07 17:44:22 +01:00
Hosted Weblate
198c19bbee Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-03-04 13:21:10 +01:00
MArtin Johnson
46a4ee6958 Translated using Weblate (Swedish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-03-04 13:21:10 +01:00
Ladislav Urbánek
7c89f97308 Translated using Weblate (Czech)
Currently translated at 37.7% (421 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2024-03-04 13:21:10 +01:00
Tanmay Thole
7b6f00a828
[MM-55988]: alert message in DM of persistent notification changed (#7743)
* fix: alert message in DM of persistent notification changed

* fix: alert message of persistent notification

* fix: persistent notifications text

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-03-04 10:06:20 +01:00
Matthew Williams
cb0ca72cc7 Translated using Weblate (English (Australia))
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-02-26 12:46:48 +01:00
Christopher Speller
c6348ba63b
Add handling of posts with unsafe links. (#7815)
* Add handling of posts with unsafe links.

* Add more cases.
2024-02-22 12:55:01 -08:00
Mario Vitale
c0b2c957e1
CLD-7165 Bump MacOS runner version (#7828)
* CLD-7165 Bump MacOS runner version
* Bump Ruby version
* Adapt pipelines to utilize the ruby version in .ruby-version

---------

Co-authored-by: Daniel Espino <larkox@gmail.com>
2024-02-22 11:35:56 +01:00
Julio Vc
8b32bc73c4
MM-56391: fixed search bar moving up in ios (#7796)
* MM-56391: fixed search bar moving up in ios

* chore: solved merging conflicts

* chore: removed auto formating in package-lock.json

* Update package-lock.json

* chore: reverted changes in package-lock.json

* resetted pr and fixed linting

---------

Co-authored-by: Julio Villalvazo Carrera <j.carrera@cyberpuerta.mx>
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-22 10:44:47 +01:00
Daniel Espino García
c43656496e
Fix issue when opening a avatar image from a thread (#7824)
* Fix issue when opening a avatar image from a thread

* Remove unneeded casting

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-20 17:16:07 +01:00
Tom De Moor
9b7a1d38f2 Translated using Weblate (Dutch)
Currently translated at 99.9% (1114 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-02-19 14:22:25 +02:00
kaakaa
c2ec124055 Translated using Weblate (Japanese)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-02-19 14:22:25 +02:00
Tom De Moor
0da61b19d4 Translated using Weblate (Dutch)
Currently translated at 99.9% (1114 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-02-19 14:22:25 +02:00
Oskari Lavinto
09c0554fa2 Translated using Weblate (Finnish)
Currently translated at 19.1% (213 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fi/
2024-02-19 14:22:25 +02:00
Oskari Lavinto
3b53a5f625 Translated using Weblate (Finnish)
Currently translated at 15.0% (168 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fi/
2024-02-19 14:22:25 +02:00
Konstantin
f497e003d7 Translated using Weblate (Russian)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-02-19 14:22:25 +02:00
Trivikram Kamat
89ebfbdadf
chore: migrate AWS SDK for JavaScript v2 APIs to v3 (#7653)
* chore: convert s3.promise callback to async-await

* chore: run codemod on detox/utils/artifacts.js

* chore: format

* chore(deps): replace AWS SDK for JavaScript v2 to v3

* chore: eslint --fix
2024-02-19 18:29:29 +08:00
unified-ci-app[bot]
a1401faa53
Bump app build and version number (#7836)
* Bump app build number to 509

* Bump app version number to 2.14.0

---------

Co-authored-by: runner <runner@Mac-1708096715862.local>
2024-02-16 16:45:35 +01:00
unified-ci-app[bot]
7ee6109f34
Bump app build number to 508 (#7834)
Co-authored-by: runner <runner@Mac-1708074078937.local>
2024-02-16 13:01:10 +01:00
yasserfaraazkhan
0bdbb7ec96
Merge pull request #7826 from mattermost/m1-runners
MacOS-latest-xlarge for m1 github runners for faster iOS builds
2024-02-13 16:21:42 +05:30
yasserfaraazkhan
c1358371db Revert "test macos-13-xlarge and ruby 2.7.8"
This reverts commit 688f49a819.
2024-02-13 08:34:54 +05:30
yasserfaraazkhan
688f49a819 test macos-13-xlarge and ruby 2.7.8 2024-02-13 03:02:38 +05:30
yasserfaraazkhan
0ab129c18a make all 12-large 2024-02-13 02:17:05 +05:30
yasserfaraazkhan
2afd6bdc92 test macos-12-large 2024-02-13 01:58:02 +05:30
yasserfaraazkhan
dc4fb0eb50 test macos-13-xlarge 2024-02-13 01:56:02 +05:30
yasserfaraazkhan
d480876cb2 test macos-latest-xlarge 2024-02-13 01:31:40 +05:30
yasserfaraazkhan
0ecf4da6c6 test macos-latest-xlarge 2024-02-13 01:29:04 +05:30
Petr Chlíbek
db0c896a6b Translated using Weblate (Czech)
Currently translated at 37.7% (421 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2024-02-12 15:16:32 +01:00
ThrRip
560716189b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-02-12 15:16:32 +01:00
master7
9b51135fb9 Translated using Weblate (Polish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-02-12 15:16:32 +01:00
jprusch
39fd00a474 Translated using Weblate (German)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-02-12 15:16:32 +01:00
Hosted Weblate
244caea15c Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-02-12 15:16:32 +01:00
Tom De Moor
d195d54828 Translated using Weblate (English (Australia))
Currently translated at 97.4% (1113 of 1142 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-02-12 15:16:32 +01:00
ThrRip
7604309e75 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1142 of 1142 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-02-12 15:16:32 +01:00
Tom De Moor
7e8cd27772 Translated using Weblate (English (Australia))
Currently translated at 97.4% (1113 of 1142 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-02-12 15:16:32 +01:00
master7
be688401e8 Translated using Weblate (Polish)
Currently translated at 100.0% (1142 of 1142 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-02-12 15:16:32 +01:00
Konstantin
8ace5cab70 Translated using Weblate (Russian)
Currently translated at 100.0% (1142 of 1142 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-02-12 15:16:32 +01:00
Tom De Moor
eceb84e859 Translated using Weblate (Dutch)
Currently translated at 97.4% (1113 of 1142 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-02-12 15:16:32 +01:00
unified-ci-app[bot]
2ed556286e
Bump app build number (#7823)
* Bump app build number to 508

* Use build number 507 instead

---------

Co-authored-by: runner <runner@Mac-1707468657872.local>
Co-authored-by: Mario Vitale <mvitale1989@hotmail.com>
2024-02-09 16:44:15 +01:00
Elias Nahum
3653df354d
Revert "Channel Bookmarks (#7750)" (#7816)
* Revert "Channel Bookmarks (#7750)"

This reverts commit 2c5c878829.
2024-02-07 07:52:55 +08:00
Hosted Weblate
9d3823bb4b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2024-02-05 12:52:55 +01:00
jprusch
fdee0786af Translated using Weblate (German)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-02-05 12:52:55 +01:00
ThrRip
47b1344497 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-02-05 12:52:55 +01:00
Martin Joneš
3edf4f694d Translated using Weblate (Czech)
Currently translated at 37.7% (421 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2024-02-05 12:52:55 +01:00
Csaba Tóth
ff83448787 Translated using Weblate (Hungarian)
Currently translated at 48.9% (546 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hu/
2024-02-05 12:52:55 +01:00
Elias Nahum
2c5c878829
Channel Bookmarks (#7750) 2024-02-05 17:07:01 +08:00
unified-ci-app[bot]
302c273fa1
Bump app build number to 506 (#7808)
Co-authored-by: runner <runner@Mac-1706864534213.local>
2024-02-02 12:52:12 +01:00
Daniel Espino García
41113ce857
Update iOS permissions texts (#7805)
* Update iOS permissions texts

* Add missing changes
2024-02-01 13:23:58 -05:00
Elias Nahum
0897f54bf0
Fix multi-server icon mention badge (#7795) 2024-02-01 22:29:03 +08:00
Elias Nahum
f2842bdec7
revert change to allow arbitrary loads (#7801) 2024-02-01 20:36:25 +08:00
Tom De Moor
96d5aefa09 Loads the correct translation file 2024-01-31 08:23:26 +01:00
unified-ci-app[bot]
3a49b83bc3
Bump app build number to 505 (#7799)
Co-authored-by: runner <runner@Mac-1706625774368.local>
2024-01-30 16:18:22 +01:00
Cedric Ong
6daa77f0da
remove usages of isTimeZoneEnabled (#7769) 2024-01-30 13:22:55 +01:00
Tom De Moor
304d561fdd
Merge pull request #7792 from weblate/weblate-mattermost-mattermost-mobile-v2
Translations update from Mattermost Weblate
2024-01-30 09:16:31 +01:00
Daniel Espino García
780f623274
Remove motion reducer from critical animations (#7786)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-01-29 17:35:58 +01:00
unified-ci-app[bot]
5e3e66281a
Bump app build number to 504 (#7788)
Co-authored-by: runner <runner@Mac-1706259209788.local>
2024-01-29 14:51:10 +01:00
Cedric Ong
4287802ab2
[MM-53711] Set save button opacity for editing a post when disabled (#7763)
* set save button opacity when disabled

* change import

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-01-29 10:53:31 +01:00
Abdulaziz
8a1cc025b2 Translated using Weblate (Arabic)
Currently translated at 0.6% (7 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ar/
2024-01-29 09:51:04 +00:00
Martin Joneš
6deb3b2819 Translated using Weblate (Czech)
Currently translated at 37.4% (418 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2024-01-29 09:51:04 +00:00
Martin Joneš
25aaa0876e Translated using Weblate (Czech)
Currently translated at 37.3% (417 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2024-01-29 09:51:04 +00:00
Martin Joneš
099c1be7d8 Translated using Weblate (Czech)
Currently translated at 37.3% (417 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2024-01-29 09:51:04 +00:00
MArtin Johnson
2c5c150225 Translated using Weblate (Swedish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2024-01-29 09:51:04 +00:00
RyoKub
01b9a24a7a Translated using Weblate (Thai)
Currently translated at 3.4% (38 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/th/
2024-01-29 09:51:04 +00:00
Scott Bishel
67a226ea1e
Merge pull request #7785 from mattermost/MM-56592-plugin-deeplink
MM-56592: Remove deeplink for plugins
2024-01-26 09:16:56 -07:00
Daniel Espino García
05e7550305
Fix foldable device LHS size when changing modes (#7787)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-01-25 09:37:49 +01:00
Mattermost Build
7be7e5f0c4
Merge branch 'main' into MM-56592-plugin-deeplink 2024-01-25 08:51:41 +02:00
Scott Bishel
6e7df26150
Merge pull request #7784 from mattermost/MM-56085-page-preferences
MM-56085 - Add paging for preferences
2024-01-24 13:42:16 -07:00
Scott Bishel
1a2c8cb61d lint fixes 2024-01-23 14:20:49 -07:00
Scott Bishel
6169ee8e4f remove deeplink for plugins 2024-01-23 13:25:21 -07:00
Scott Bishel
ceb9d742c9 add paging for preferences to match new server limitation 2024-01-23 12:14:12 -07:00
unified-ci-app[bot]
f94e3688e3
Bump app build and version number (#7779)
* Bump app build number to 503

* Bump app version number to 2.13.0

---------

Co-authored-by: runner <runner@Mac-1705935432189.local>
2024-01-22 16:05:56 +01:00
Mario Vitale
45eadc07da
CLD-7006 Fix version bump script pt2 (#7775)
* Fix version bump script pt2

* Make shellcheck happy
2024-01-22 14:59:23 +01:00
Mario Vitale
efaa519c30
Fix version bump script (#7774) 2024-01-22 13:06:57 +01:00
jprusch
14b3dfc94f Translated using Weblate (German)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-01-22 12:22:43 +01:00
Matthew Williams
1dc5c1ceff Translated using Weblate (English (Australia))
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2024-01-22 12:22:43 +01:00
kaakaa
1b86c6dff7 Translated using Weblate (Japanese)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-01-22 12:22:43 +01:00
ThrRip
f1d16c1fa6 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-01-22 12:22:43 +01:00
Konstantin
2d2d8a083f Translated using Weblate (Russian)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-01-22 12:22:43 +01:00
master7
f2fea64ff5 Translated using Weblate (Polish)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-01-22 12:22:43 +01:00
Tom De Moor
1a1b1b0a58 Translated using Weblate (Dutch)
Currently translated at 100.0% (1115 of 1115 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2024-01-22 12:22:43 +01:00
unified-ci-app[bot]
73c9bf0589
Bump app build number to 502 (#7752)
Co-authored-by: runner <runner@Mac-1705050085350.local>
2024-01-22 11:44:02 +01:00
Elias Nahum
1584208536
Do not display deactivated users to add channel members (#7767) 2024-01-19 06:37:07 +08:00
Doug Lauder
f5988f0ddc
Merge pull request #7765 from mattermost/fix_shared_channels_DM
Fix channel switcher routing for DMs with remote users
2024-01-18 07:44:37 -05:00
JaeMin Kim
6a538e32af
Patch react-native-math-view for consistent inline LaTeX height on Android and iOS (#7742)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-01-18 12:30:31 +01:00
Elias Nahum
106324335c
MM-56542 fix custom theme selection (#7762) 2024-01-18 06:00:21 +08:00
wiggin77
e2aed87e9c Fix channel switcher routing for DMs with remote users 2024-01-17 12:00:24 -05:00
Claudio Costa
84858e4450
[MM-46339] Handle user leaving channel with active call (#7754)
* Handle user leaving channel with active call

* Remove debug log
2024-01-15 08:11:25 -06:00
jprusch
d32f7ef2e1 Translated using Weblate (German)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-01-15 12:58:55 +01:00
master7
4a05829e24 Translated using Weblate (Polish)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2024-01-15 12:58:55 +01:00
ThrRip
056e880918 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2024-01-15 12:58:55 +01:00
Konstantin
2368419c27 Translated using Weblate (Russian)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2024-01-15 12:58:55 +01:00
Daniel Espino García
9ea38cfb3f
Fix MM55258 (#7729)
* Fix MM55258

* Address feedback

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-01-15 10:19:33 +01:00
Daniel Espino García
8bd9cac9f5
Fix joining channels from the find channels screen (#7732)
* Fix joining channels from the find channels screen

* Fix lint

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-01-15 10:18:37 +01:00
M-ZubairAhmed
cc96982d24
MM-53479 : Improve design of keyword that trigger notification in mobile (#7458) 2024-01-13 06:56:22 +00:00
unified-ci-app[bot]
810f4b3d24
Bump app build number to 501 (#7733)
Co-authored-by: runner <runner@Mac-1703233954558.local>
2024-01-08 17:44:11 +01:00
Mario Vitale
0a8f3cebb8
Fix build script failure (#7740) 2024-01-08 15:06:06 +01:00
Tom De Moor
0a27479d87
Merge pull request #7744 from weblate/weblate-mattermost-mattermost-mobile-v2
Translations update from Mattermost Weblate
2024-01-08 12:13:16 +01:00
kaakaa
3733a07fd9 Translated using Weblate (Japanese)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2024-01-06 06:08:49 +00:00
jprusch
d0efda94ac Translated using Weblate (German)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2024-01-06 06:08:48 +00:00
Tom De Moor
85163eea7b
Merge pull request #7737 from weblate/weblate-mattermost-mattermost-mobile-v2
Translations update from Mattermost Weblate
2024-01-05 09:56:31 +01:00
Antonis Stamatiou
c575e5ed56
fix: Fix branch convention for beta android single build (#7730) 2024-01-03 01:14:24 +02:00
master7
9e9a6483b2 Translated using Weblate (Polish)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-12-30 06:59:55 +00:00
Tom De Moor
c4e9f1a999
Merge pull request #7735 from weblate/weblate-mattermost-mattermost-mobile-v2
Translations update from Mattermost Weblate
2023-12-26 11:44:05 +01:00
Sharuru
bc289a2212 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-12-25 11:02:34 +00:00
Miguel de la Cruz
4095212d86
Improves get roles by names requests to batch them following the new endpoint limit (#7650) 2023-12-22 10:29:49 +01:00
master7
78f3a511cc Translated using Weblate (Polish)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-12-22 09:29:13 +00:00
Tom De Moor
96789bae22 Translated using Weblate (Dutch)
Currently translated at 100.0% (1111 of 1111 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-12-22 09:29:13 +00:00
Ladislav Urbánek
746172ed7c Translated using Weblate (Czech)
Currently translated at 37.5% (416 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2023-12-22 09:29:13 +00:00
caotanduc99
7706a8466b Translated using Weblate (Vietnamese)
Currently translated at 97.7% (1082 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/vi/
2023-12-22 09:29:13 +00:00
CI-YU
14fc70fd46 Translated using Weblate (Chinese (Traditional))
Currently translated at 30.1% (334 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hant/
2023-12-22 09:29:13 +00:00
Ladislav Urbánek
5d99e1d987 Translated using Weblate (Czech)
Currently translated at 37.5% (416 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/cs/
2023-12-22 09:29:13 +00:00
Christopher Poile
d6566b591a
MM-54866 - Calls: Transcription notifications (#7704) 2023-12-21 17:19:28 -05:00
Christopher Poile
2c1f318868
MM-54866 - Calls: Transcription support (#7703)
* captions on videos from posts and searches

* add the patch for react-native-video which fixes subtitle downloading

* improve spacing

* fix patch file

* upgrade compass-icons; use cc icon

* revert patch overwrite

* fix patch

* use useMemo

* fix hitslops on pressables

* use new Caption format; refactor for clarity

* simplify tracks creation and use
2023-12-21 16:20:21 -05:00
Tom De Moor
9ac0069e5c
Merge pull request #7726 from weblate/weblate-mattermost-mattermost-mobile-v2
Translations update from Mattermost Weblate
2023-12-18 12:33:31 +01:00
Antonis Stamatiou
025aefb162
feat: Enable true labeled trigger and deprecate mattermod (#7718) 2023-12-18 09:26:32 +02:00
JaeMin Kim
5ee400c74f Translated using Weblate (Korean)
Currently translated at 98.3% (1089 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2023-12-18 07:26:08 +00:00
Mario Vitale
ff8ebb04a3
Fix typo: use correct base branch in PR creation (#7720) 2023-12-15 13:34:59 +01:00
unified-ci-app[bot]
b405b3a872
Bump app build number to 500 (#7717)
Co-authored-by: runner <runner@Mac-1702629622103.local>
2023-12-15 13:16:45 +01:00
Tom De Moor
87a133244e
Merge pull request #7707 from weblate/weblate-mattermost-mattermost-mobile-v2
Translations update from Mattermost Weblate
2023-12-13 16:50:40 +01:00
Tanmay Thole
15fb6363aa
fix: height for multiple line floating text input (#7688) 2023-12-13 09:50:18 +01:00
Mario Vitale
5db18889a1
CLD-6707 Followup fixes (#7711)
* Fix: rename VERSION to VERSION_NUMBER
* Fix: allow BUILD_NUMBER to be set from outside the script
2023-12-12 13:37:15 +01:00
Mario Vitale
36f242224b
CLD-6707 Automate weekly build (#7685)
* Add utility scripts for automating the build/version number bump PRs
2023-12-11 17:57:29 +01:00
ThrRip
e67ac47ce8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-12-08 14:34:08 +00:00
Mario Vitale
c90ed51981
Bump to version 2.12.0 build 499 (#7705) 2023-12-08 15:34:05 +01:00
Amy Blais
55e47508bf
Update NOTICE.txt (#7701)
* Update NOTICE.txt

* Update NOTICE.txt
2023-12-07 08:30:09 -05:00
Elias Nahum
bcf3dc61ab
MM-54575 fix server & user list tutorials (#7698) 2023-12-06 15:41:04 +08:00
Mario Vitale
21acf6b0e6
Bump build version to 498 (#7700) 2023-12-05 19:24:25 +01:00
Andrius Petrauskis
d50e645d65 Translated using Weblate (Lithuanian)
Currently translated at 40.5% (449 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/lt/
2023-12-05 10:58:16 +01:00
Matthew Williams
2d5b9bc856 Translated using Weblate (English (Australia))
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2023-12-05 10:58:16 +01:00
Kap Dev
b83aa831ca Translated using Weblate (Russian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2023-12-05 10:58:16 +01:00
ThrRip
27c9c8a4cf Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-12-05 10:58:16 +01:00
Arthur
eb31eabebe Translated using Weblate (French)
Currently translated at 96.4% (1068 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2023-12-05 10:58:16 +01:00
RyoKub
2117d4fd88 Translated using Weblate (Thai)
Currently translated at 1.0% (12 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/th/
2023-12-05 10:58:16 +01:00
MArtin Johnson
fc8bdbaac2 Translated using Weblate (Swedish)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2023-12-05 10:58:16 +01:00
Elias Nahum
de57c343f0
MM-55621 fix layout for tablets and foldables (#7697)
* MM-55621 fix layout for tablets and foldables

* feedback review
2023-12-05 11:08:43 +08:00
Daniel Espino García
d469470592
Make app init more idempotent (#7676)
* Make app init more idempotent

* Remove previous subscriptions
2023-12-04 17:01:08 +01:00
Alex Yetto
ab7da5f664
fix opening same modal twice (#7639)
Co-authored-by: Fokin Aleksandr Konstantinovich <aleksafokin@ozon.ru>
2023-12-01 10:48:40 +01:00
Erin A
7c747c28b6
[MM-54529] Prevent Persistent Notifications Error Message for DM Channel (#7648)
* Update index.ts persistentNotifications to include param and conditions for channelType

* Update message for "no recipients mentioned" to not occur for `DM_CHANNEL`.
* Update send message to either start with "Recipients" for DM channel or "@mentioned recipients"

* Include `channelType` in call to `persistentNotificationsConfirmation`

* Fix typo in persisten(t)NotificationsEnabled

* Remove ternary in translatable string

* Add channelType to callback's dependencies

* Make channelType optional
2023-11-30 09:49:20 +01:00
Mario Vitale
1fc0611f04
Bump build 497 (#7692) 2023-11-29 13:20:27 +01:00
Harshil Sharma
9ff24a8551
Merge pull request #7682 from mattermost/gm_conversion_on_reconnect_handler
[MM-55463] GM conversion reconnect handler
2023-11-29 09:25:02 +05:30
Caleb Roseland
ce343c8bf4
Merge pull request #7613 from mattermost/MM-53902-cont 2023-11-28 11:07:22 -06:00
unified-ci-app[bot]
bf4498251d
Bump app build number to 495 (#7687)
* Bump app build number to 495

---------

Co-authored-by: runner <runner@Mac-1701091359077.local>
Co-authored-by: Mario Vitale <mvitale1989@hotmail.com>
2023-11-28 15:49:53 +01:00
Caleb Roseland
79d7c628e4 Merge branch 'main' into MM-53902-cont 2023-11-27 15:09:55 -06:00
Csaba Tóth
8a097ba98f Translated using Weblate (Hungarian)
Currently translated at 36.4% (404 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hu/
2023-11-27 14:00:15 +02:00
Milo Ivir
ef8f3792da Translated using Weblate (Croatian)
Currently translated at 46.7% (518 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-27 14:00:15 +02:00
master7
87e6ec0745 Translated using Weblate (Polish)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-27 14:00:15 +02:00
Tom De Moor
5f94210a63 Translated using Weblate (Dutch)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-11-27 14:00:15 +02:00
jprusch
67d59c2c12 Translated using Weblate (German)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-27 14:00:15 +02:00
Konstantin
c4a77d41fc Translated using Weblate (Russian)
Currently translated at 99.8% (1105 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2023-11-27 14:00:15 +02:00
Tom De Moor
7d34dfa51a Translated using Weblate (Dutch)
Currently translated at 99.3% (1100 of 1107 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-11-27 14:00:15 +02:00
harshil Sharma
946ccf04bb Merge branch 'main' into gm_conversion_on_reconnect_handler 2023-11-27 15:27:55 +05:30
harshil Sharma
3c6638f474 Optimized the number of calls to fetchMyChannelsForTeam 2023-11-27 15:22:50 +05:30
Daniel Espino García
46125b201f
Fix issue when logout is called several times for the same server (#7666) 2023-11-27 10:50:40 +01:00
Harshil Sharma
59a69368bf
Added one important test (#7683)
* Added one important test

* Update app/actions/local/category.test.ts

---------

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2023-11-25 07:55:46 +08:00
Elias Nahum
edef4ec4a3
Update libraries and dependencies (#7678)
* update js dependencies

* update react-native libraries

* update watermelonDB

* update RN to 0.72.7

* update fastlane

* fix remove_markdown/at_mention import

* update mattermost libraries

* update fastlane deps

* remove haptic-feedback patch

* update okhttp to 4.12.0 and patch netinfo to accurately identify VPN connections

* create ImaegStyles intersection type
2023-11-25 07:46:13 +08:00
Caleb Roseland
4a422af3d6 refactor /:route param 2023-11-24 16:43:19 -06:00
Caleb Roseland
89fc14bb43 fix plugin path matching, add coverage 2023-11-24 13:15:26 -06:00
harshil Sharma
d31887bf77 Merge branch 'main' into gm_conversion_on_reconnect_handler 2023-11-24 11:35:07 +05:30
harshil Sharma
878ed5673c nit fix 2023-11-24 11:17:12 +05:30
M-ZubairAhmed
4b5489c7a7
[MM-53810] Add mobile markdown support for highlighting without notifications without configuration ability (#7663) 2023-11-23 17:11:06 +08:00
harshil Sharma
d49dfa50fb Restored podfile 2023-11-23 11:19:02 +05:30
harshil Sharma
28949d5605 Merge branch 'main' into gm_conversion_on_reconnect_handler 2023-11-23 11:17:30 +05:30
harshil Sharma
58fc869d70 Added onReconnect handling for converted GM 2023-11-23 10:40:49 +05:30
Caleb Roseland
5d35b4a995 remove unneeded decode 2023-11-22 22:59:59 -06:00
Caleb Roseland
e39736b4da parameter cleanup 2023-11-22 22:54:42 -06:00
Caleb Roseland
a3b811dcfb refactor 2023-11-22 17:49:35 -06:00
Christopher Poile
6baa850d36
MM-54277 - Calls: Add incoming banners to channel_list screen (#7673) 2023-11-22 16:56:27 -05:00
Tom De Moor
093d371833 resolve weblate merge conflicts 2023-11-22 15:42:53 -04:00
Konstantin
c3e831b361 Translated using Weblate (Russian)
Currently translated at 100.0% (1092 of 1092 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2023-11-22 19:30:14 +02:00
Tom De Moor
24ba082287 Translated using Weblate (Dutch)
Currently translated at 100.0% (1092 of 1092 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-11-22 19:30:14 +02:00
master7
209363416c Translated using Weblate (Polish)
Currently translated at 100.0% (1092 of 1092 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-22 19:30:14 +02:00
Csaba Tóth
7965f129b0 Translated using Weblate (Hungarian)
Currently translated at 43.4% (475 of 1092 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hu/
2023-11-22 19:30:14 +02:00
jprusch
fb57ec1132 Translated using Weblate (German)
Currently translated at 100.0% (1092 of 1092 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-22 19:30:14 +02:00
ThrRip
f603a4a61e Translated using Weblate (Chinese (Simplified))
Currently translated at 99.4% (1086 of 1092 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-11-22 19:30:14 +02:00
ThrRip
1ea59acd7b Translated using Weblate (Chinese (Simplified))
Currently translated at 99.5% (1086 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-11-22 19:30:14 +02:00
master7
3a016ea3c2 Translated using Weblate (Polish)
Currently translated at 100.0% (1091 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-22 19:30:14 +02:00
Csaba Tóth
14980a9a6f Translated using Weblate (Hungarian)
Currently translated at 43.4% (474 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hu/
2023-11-22 19:30:14 +02:00
jprusch
1c1542e6f1 Translated using Weblate (German)
Currently translated at 100.0% (1091 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-22 19:30:14 +02:00
Milo Ivir
1a75c53380 Translated using Weblate (Croatian)
Currently translated at 46.9% (512 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-22 19:30:14 +02:00
Csaba Tóth
5a6e8c1df1 Translated using Weblate (Hungarian)
Currently translated at 37.5% (410 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hu/
2023-11-22 19:30:14 +02:00
Milo Ivir
4d97b25f03 Translated using Weblate (Croatian)
Currently translated at 46.5% (507 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-22 19:30:14 +02:00
master7
72d2984f46 Translated using Weblate (Polish)
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-22 19:30:14 +02:00
kaakaa
a26f01158b Translated using Weblate (Japanese)
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2023-11-22 19:30:14 +02:00
KyeongSoo Kim
1a59bd9e0e
[MM-42586] Reaction toggle behavior (#7674) 2023-11-22 21:05:58 +08:00
Harshil Sharma
908e4c08d4
Merge pull request #7654 from mattermost/gm_to_channel
GM to channel conversion
2023-11-22 15:44:40 +05:30
Harshil Sharma
c037c3375a
Merge pull request #7667 from mattermost/show-conversion-error
Displayed channel related error with name field
2023-11-22 15:40:07 +05:30
harshil Sharma
55004c9773 Merge branch 'main' into gm_to_channel 2023-11-22 11:40:50 +05:30
Caleb Roseland
12a80c4f29 subpath tests, variations test 2023-11-21 22:05:35 -06:00
Christopher Poile
daa2b1a497
MM-54351 - Calls: Improve logging (#7671) 2023-11-20 20:28:38 -05:00
harshil Sharma
f58987ef68 Merge branch 'main' into gm_to_channel 2023-11-20 11:58:21 +05:30
Caleb Roseland
f8f4e9e474 review changes 2023-11-17 11:18:05 -08:00
Christopher Poile
d4f3590638
add ci checks to main and release branches (#7670) 2023-11-17 21:23:18 +08:00
Daniel Espino García
044cebc978
Show at mentions in RemoveMarkdown renderer (#7664) 2023-11-17 11:43:25 +01:00
harshil Sharma
c6967b701b text fix 2023-11-17 11:25:06 +05:30
Christopher Poile
c9fe72460b
MM-54865 - Calls: Multisession support (#7647)
* add multisession support for calls mobile

* ensure backwards compatibility

* remove extra line
2023-11-16 14:30:49 -05:00
Yoo Dongryul
63857a34d9 Translated using Weblate (Korean)
Currently translated at 99.7% (1087 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2023-11-16 13:19:11 -04:00
Kaya Zeren
323e112f00 Translated using Weblate (Turkish)
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2023-11-16 13:19:11 -04:00
Milo Ivir
8dcfdcb33e Translated using Weblate (Croatian)
Currently translated at 46.3% (505 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Milo Ivir
1d7857e67a Translated using Weblate (Croatian)
Currently translated at 45.6% (498 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Konstantin
5630658c02 Translated using Weblate (Russian)
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2023-11-16 13:19:11 -04:00
Matthew Williams
53959808a0 Translated using Weblate (English (Australia))
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2023-11-16 13:19:11 -04:00
Milo Ivir
64e28447f0 Translated using Weblate (Croatian)
Currently translated at 43.0% (469 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Milo Ivir
1390879b7b Translated using Weblate (Croatian)
Currently translated at 42.7% (466 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Csaba Tóth
a7d74e7da5 Translated using Weblate (Hungarian)
Currently translated at 36.9% (403 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hu/
2023-11-16 13:19:11 -04:00
Tom De Moor
0fd8430d19 Translated using Weblate (Dutch)
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-11-16 13:19:11 -04:00
Milo Ivir
6e8c2525c5 Translated using Weblate (Croatian)
Currently translated at 40.8% (445 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
MArtin Johnson
59f390248a Translated using Weblate (Swedish)
Currently translated at 100.0% (1090 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2023-11-16 13:19:11 -04:00
Milo Ivir
3c14f71344 Translated using Weblate (Croatian)
Currently translated at 28.8% (314 of 1090 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Hosted Weblate
6c0376b2d5 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2023-11-16 13:19:11 -04:00
Milo Ivir
af763b4350 Translated using Weblate (Croatian)
Currently translated at 25.5% (279 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
jprusch
8e8228e9af Translated using Weblate (German)
Currently translated at 100.0% (1091 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-16 13:19:11 -04:00
Milo Ivir
cd3ad6328e Translated using Weblate (Croatian)
Currently translated at 25.1% (274 of 1091 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Hosted Weblate
8a1023220c Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/
2023-11-16 13:19:11 -04:00
Milo Ivir
2382130dd6 Translated using Weblate (Croatian)
Currently translated at 24.5% (267 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Milo Ivir
37b88c2f4f Translated using Weblate (Croatian)
Currently translated at 23.1% (252 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Konstantin
e867656822 Translated using Weblate (Russian)
Currently translated at 100.0% (1089 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2023-11-16 13:19:11 -04:00
Milo Ivir
c50513d34e Translated using Weblate (Croatian)
Currently translated at 14.6% (160 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Kaya Zeren
7729f0385c Translated using Weblate (Turkish)
Currently translated at 100.0% (1089 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2023-11-16 13:19:11 -04:00
amigo7kr
b86816d119 Translated using Weblate (Korean)
Currently translated at 99.8% (1087 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2023-11-16 13:19:11 -04:00
master7
40cad2e9c7 Translated using Weblate (Polish)
Currently translated at 100.0% (1089 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-16 13:19:11 -04:00
jprusch
b3cbed501f Translated using Weblate (German)
Currently translated at 100.0% (1089 of 1089 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-16 13:19:11 -04:00
Maxime tremblay Godindustry@gmail.com
7bc4da695c Translated using Weblate (French)
Currently translated at 97.8% (1065 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2023-11-16 13:19:11 -04:00
Tomer Ben-Rachel
9760d2e992 Translated using Weblate (Hebrew)
Currently translated at 4.2% (46 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/he/
2023-11-16 13:19:11 -04:00
Tomer Ben-Rachel
0f5a2e1b04 Translated using Weblate (Hebrew)
Currently translated at 3.5% (39 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/he/
2023-11-16 13:19:11 -04:00
master7
3755a4a2c9 Translated using Weblate (Polish)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-16 13:19:11 -04:00
Nicolas
cee7c0d693 Translated using Weblate (French)
Currently translated at 97.6% (1062 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2023-11-16 13:19:11 -04:00
ThrRip
4b42ec78b6 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.9% (1087 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-11-16 13:19:11 -04:00
rubinaga
a155acd98c Translated using Weblate (Albanian)
Currently translated at 25.4% (277 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sq/
2023-11-16 13:19:11 -04:00
kaakaa
1dd79fd0c7 Translated using Weblate (Japanese)
Currently translated at 99.9% (1087 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2023-11-16 13:19:11 -04:00
Akbar Abdrakhmanov
e27d043e9e Translated using Weblate (Kazakh)
Currently translated at 0.9% (10 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/kk/
2023-11-16 13:19:11 -04:00
Akbar Abdrakhmanov
a2dd89370d Translated using Weblate (Kazakh)
Currently translated at 0.7% (8 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/kk/
2023-11-16 13:19:11 -04:00
jprusch
f4bbff81a2 Translated using Weblate (German)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-16 13:19:11 -04:00
Milo Ivir
a1bbfbf84e Translated using Weblate (Croatian)
Currently translated at 13.7% (150 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/hr/
2023-11-16 13:19:11 -04:00
Milo Ivir
7c77a7850f Translated using Weblate (German)
Currently translated at 99.9% (1087 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2023-11-16 13:19:11 -04:00
Nicolas
335ed51d98 Translated using Weblate (French)
Currently translated at 96.5% (1051 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2023-11-16 13:19:11 -04:00
Nicolas
c76ca6ebcc Translated using Weblate (French)
Currently translated at 92.2% (1004 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/fr/
2023-11-16 13:19:11 -04:00
MArtin Johnson
d458f8577b Translated using Weblate (Swedish)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2023-11-16 13:19:11 -04:00
MArtin Johnson
63e01472ab Translated using Weblate (Swedish)
Currently translated at 98.8% (1075 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2023-11-16 13:19:11 -04:00
Anne Schuth
b7fc52d07e Translated using Weblate (Dutch)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-11-16 13:19:11 -04:00
Tom De Moor
62e6da1b28 Translated using Weblate (Dutch)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2023-11-16 13:19:11 -04:00
yeongeun.seo
5ac25fdaf1 Translated using Weblate (Korean)
Currently translated at 99.1% (1079 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ko/
2023-11-16 13:19:11 -04:00
Sharuru
b52fef68df Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2023-11-16 13:19:11 -04:00
Kaya Zeren
509fd3895b Translated using Weblate (Turkish)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/tr/
2023-11-16 13:19:11 -04:00
Konstantin
1233af224a Translated using Weblate (Russian)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2023-11-16 13:19:11 -04:00
master7
bd36c9d067 Translated using Weblate (Polish)
Currently translated at 100.0% (1088 of 1088 strings)

Translation: Mattermost/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2023-11-16 13:19:11 -04:00
Mario Vitale
6477418e75
Merge pull request #7668 from larkox/bump-build-main-494
Bump build main 494 and v2.11.0
2023-11-16 17:24:55 +01:00
Daniel Espino
88240ae813 Bump app build number to 494 2023-11-16 17:19:19 +01:00
Daniel Espino
6c852fbc77 Bump app version number to 2.11.0 2023-11-16 17:19:18 +01:00
Christopher Poile
6fb5d85798
MM-55036 - Calls: Fix: Receiving in-app notifications for calls notifications while active (#7623)
* when active, do not show overlay if this is a calls-started notification

* add calls notification type; keep message test for backwards compat

* process calls notifications properly

* revert NOTIFICATION_TYPE.CALLS; use sub_type for backwards compatibility

* add ticket and comment for future refactoring of isCallsStartedMessage
2023-11-16 09:28:29 -05:00
harshil Sharma
cec7961d18 Displayed channel related error with name field 2023-11-16 17:06:39 +05:30
harshil Sharma
e7b3aede18 reverted podfile.lock 2023-11-16 13:23:48 +05:30
harshil Sharma
ba9a84e3e6 Merge branch 'main' into gm_to_channel 2023-11-16 13:23:27 +05:30
harshil Sharma
0ae42103db reverted podfile.lock 2023-11-16 13:21:36 +05:30
harshil Sharma
72d513987c fixes 2023-11-16 13:20:41 +05:30
Caleb Roseland
bf91340fd4 put back plugin case 2023-11-15 21:29:54 -06:00
Caleb Roseland
cd460e909c Merge branch 'main' into MM-53902-cont 2023-11-15 21:25:24 -06:00
Caleb Roseland
bf25f10c38 refactor parseDeepLink with path-to-regexp 2023-11-15 21:24:48 -06:00
Daniel Espino García
94e1334ebb
Maintenance fixes (#7665) 2023-11-15 15:07:00 +01:00
harshil Sharma
b0becb4cee Fixed menu icon 2023-11-15 16:29:04 +05:30
harshil Sharma
8f93b15c8c reverted podfile 2023-11-15 16:05:54 +05:30
harshil Sharma
316971f6d8 Reverted accidental change 2023-11-15 16:04:01 +05:30
harshil Sharma
e0239a0e76 Review fixes 2023-11-15 15:20:01 +05:30
harshil Sharma
4af2ad2f69 review fixes 2023-11-15 14:13:55 +05:30
Christopher Poile
f0334d8c0e
MM-54323 - Calls: Incoming call from different server (#7646)
* refactor; tried to clarify more_messages; new design

* adjust more_messages text spacing

* small fix for height with incoming call on current channel

* move calls-specific code in the calls product behind a hook

* show servername for notifications from other servers

* if >1 active servers, always show server name, otherwise don't

* add height of notification bar in measurements

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2023-11-14 17:03:55 -05:00
Elias Nahum
94a910303b
Allow connecting to a previous server if credentials are not in the keychain (#7661) 2023-11-14 19:14:46 +08:00
harshil Sharma
9c6ae712a9 Review fixes 2023-11-14 15:53:48 +05:30
harshil Sharma
0164c1b1f1 Review fixes 2023-11-14 15:33:19 +05:30
Tanmay Vardhaman Thole
805c794b3e
MM 45015 - auto follow threads (#7463)
* auto follow select option added

* unused code removed

* auto follow threads condition fixed on CRT enabled

* error handles

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2023-11-14 10:00:19 +01:00
harshil Sharma
77a1f79790 Review fixes 2023-11-14 13:57:25 +05:30
harshil Sharma
e3d67afcf4 Merge branch 'main' into gm_to_channel 2023-11-14 10:42:37 +05:30
harshil Sharma
270c25a2ad Added server version check 2023-11-13 15:58:17 +05:30
harshil Sharma
eebd48466f Review fixes 2023-11-13 15:31:29 +05:30
harshil Sharma
8fe529a4f5 WIP 2023-11-10 19:54:58 +05:30
Harshil Sharma
49272f0b72
Apply suggestions from code review
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2023-11-10 19:36:21 +05:30
harshil Sharma
7106c1807b Somre review fixes 2023-11-10 16:14:11 +05:30
harshil Sharma
799e78c784 Merge branch 'main' into gm_to_channel 2023-11-10 11:19:04 +05:30
harshil Sharma
f183c2f05c Restored xcode project file 2023-11-09 18:07:47 +05:30
harshil Sharma
34567cb74e Cleanup 2023-11-09 17:23:48 +05:30
harshil Sharma
742739fc0b Handled onreconnect sync 2023-11-09 10:00:25 +05:30
harshil Sharma
4138a202f2 removed debug logs 2023-11-07 13:10:22 +05:30
harshil Sharma
082b3c7f1e Handled websocket notification race condition 2023-11-07 11:39:16 +05:30
harshil Sharma
aff310471a Merge branch 'main' into gm_to_channel 2023-11-06 10:12:49 +05:30
Caleb Roseland
744d5c1120 include backslashes 2023-11-03 14:46:00 -05:00
harshil Sharma
ea34873d5f Handled category updates 2023-11-03 15:46:52 +05:30
Caleb Roseland
a8fe9794d0 Merge branch 'main' into MM-53902-cont 2023-11-02 16:36:28 -05:00
harshil Sharma
e171c82703 Disabled option for guest users 2023-11-02 12:00:19 +05:30
harshil Sharma
bf2fd6594d WIP 2023-11-01 18:15:05 +05:30
harshil Sharma
3555eb5d72 Merge branch 'main' into gm_to_channel 2023-11-01 10:48:02 +05:30
harshil Sharma
761fcc8ab5 WIP 2023-11-01 10:29:31 +05:30
harshil Sharma
8ae4c1b707 Merge branch 'main' into gm_to_channel 2023-10-31 11:45:28 +05:30
harshil Sharma
2a65fa7816 Merge branch 'main' into gm_to_channel 2023-10-31 07:44:04 +05:30
harshil Sharma
67f6740be4 Making conversion API call 2023-10-30 18:33:19 +05:30
harshil Sharma
978a13adc5 Set teammate display name 2023-10-30 09:26:58 +05:30
harshil Sharma
66dc8a4db6 Set teammate display name 2023-10-30 09:26:35 +05:30
harshil Sharma
7c008a9726 Merge branch 'main' into gm_to_channel 2023-10-30 07:52:55 +05:30
harshil Sharma
723f88cdcf Handled case of no common team 2023-10-27 17:14:24 +05:30
harshil Sharma
6752d84b21 Handled case of no common team 2023-10-27 16:32:20 +05:30
harshil Sharma
d3ba8439f2 Handled case of single common team 2023-10-26 17:17:13 +05:30
harshil Sharma
29c64c8100 Handled case of all members deactivated 2023-10-26 11:23:32 +05:30
harshil Sharma
bac0136dae WIP 2023-10-25 19:38:48 +05:30
harshil Sharma
2acd8730ad WIP 2023-10-24 19:38:31 +05:30
harshil Sharma
c59d7fee8e WIP 2023-10-24 15:43:08 +05:30
Caleb Roseland
03ccfda514 better support variations 2023-10-23 17:25:28 -05:00
harshil Sharma
2574c90754 WIP 2023-10-22 07:48:38 +05:30
harshil Sharma
3386966d39 WIP 2023-10-20 18:00:21 +05:30
harshil Sharma
91f87e0754 WIP 2023-10-20 17:18:14 +05:30
harshil Sharma
a717ea520f WIP 2023-10-20 15:57:00 +05:30
harshil Sharma
c70b50fefc WIP 2023-10-19 18:26:46 +05:30
harshil Sharma
ec7252ac4d Added team selector screen 2023-10-19 16:31:18 +05:30
Caleb Roseland
fc7d8a3d08 include encoded 2023-10-18 17:10:30 -05:00
harshil Sharma
9ae6db441f WIP 2023-10-18 16:42:23 +05:30
harshil Sharma
6b0de22824 Merge branch 'main' into gm_to_channel 2023-10-18 11:33:45 +05:30
harshil Sharma
cd3ff8be76 Added message box 2023-10-17 16:27:11 +05:30
harshil Sharma
65dc65df47 Used goToScreen instead of shoModal 2023-10-17 10:15:42 +05:30
harshil Sharma
a5039fccc8 Created screen 2023-10-16 16:05:59 +05:30
harshil Sharma
a6a2ea63a4 Added convert option to GM 2023-09-26 17:32:48 +05:30
2810 changed files with 310006 additions and 99862 deletions

View file

@ -1,115 +0,0 @@
{
"extends": [
"./eslint/eslint-mattermost",
"./eslint/eslint-react",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:react-hooks/recommended"
],
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint",
"import"
],
"settings": {
"react": {
"pragma": "React",
"version": "17.0"
}
},
"env": {
"jest": true
},
"globals": {
"__DEV__": true
},
"rules": {
"eol-last": ["error", "always"],
"global-require": 0,
"no-undefined": 0,
"no-shadow": "off",
"react/display-name": [2, { "ignoreTranspilerName": false }],
"react/jsx-filename-extension": 0,
"react-hooks/exhaustive-deps": 0,
"camelcase": [
0,
{
"properties": "never"
}
],
"@typescript-eslint/ban-types": 0,
"@typescript-eslint/no-non-null-assertion": 0,
"@typescript-eslint/no-unused-vars": [
2,
{
"vars": "all",
"args": "after-used"
}
],
"@typescript-eslint/no-shadow": ["error"],
"@typescript-eslint/no-explicit-any": "warn",
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": 0,
"@typescript-eslint/no-var-requires": 0,
"@typescript-eslint/explicit-function-return-type": 0,
"@typescript-eslint/explicit-module-boundary-types": "off",
"no-underscore-dangle": "off",
"indent": [2, 4, {"SwitchCase": 1}],
"key-spacing": [2, {
"singleLine": {
"beforeColon": false,
"afterColon": true
}}],
"@typescript-eslint/member-delimiter-style": 2,
"@typescript-eslint/no-unsafe-declaration-merging": "off",
"import/order": [
2,
{
"groups": ["builtin", "external", "parent", "sibling", "index", "type"],
"newlines-between": "always",
"pathGroups": [
{
"pattern": "{@(@actions|@app|@assets|@calls|@client|@components|@constants|@context|@database|@helpers|@hooks|@init|@managers|@queries|@screens|@selectors|@share|@store|@telemetry|@typings|@test|@utils)/**,@(@constants|@i18n|@notifications|@store|@websocket)}",
"group": "external",
"position": "after"
},
{
"pattern": "app/**",
"group": "parent",
"position": "before"
}
],
"alphabetize": {
"order": "asc",
"caseInsensitive": true
},
"pathGroupsExcludedImportTypes": ["type"]
}
]
},
"overrides": [
{
"files": ["*.test.js", "*.test.jsx"],
"env": {
"jest": true
}
},
{
"files": ["detox/e2e/**"],
"globals": {
"by": true,
"detox": true,
"device": true,
"element": true,
"waitFor": true
},
"rules": {
"func-names": 0,
"import/no-unresolved": 0,
"max-nested-callbacks": 0,
"no-process-env": 0,
"no-unused-expressions": 0
}
}
]
}

View file

@ -27,6 +27,7 @@ Place an '[x]' (no spaces) in all applicable fields. Please remove unrelated fie
- [ ] Has UI changes
- [ ] Includes text changes and localization file updates
- [ ] Have tested against the 5 core themes to ensure consistency between them.
- [ ] Have run E2E tests by adding label `E2E iOS tests for PR`.
#### Device Information
This PR was tested on: <!-- Device name(s), OS version(s) -->

View file

@ -0,0 +1,71 @@
name: bandwidth-throttling
description: Action to throttle the bandwidth on MacOS runner
inputs:
test_server_host:
description: The host of the test server, no protocol
required: true
download_speed:
description: The download speed limit (in Kbit/s)
required: false
default: "3300"
upload_speed:
description: The upload speed limit (in Kbit/s)
required: false
default: "3300"
latency:
description: The latency (in ms) each way
required: false
default: "500"
disable:
description: Disable throttling
required: false
default: "false"
runs:
using: composite
steps:
- name: disable first
if: ${{ inputs.disable == 'true' }}
shell: bash
continue-on-error: true
run: |
sudo pfctl -d
sleep 2;
- name: throttle bandwidth down
shell: bash
run: |
# reset pf and dnctl
sudo dnctl -q flush
sudo dnctl -q pipe flush
sudo pfctl -f /etc/pf.conf
sudo pfctl -E
sleep 2;
sudo pfctl -d
sudo dnctl -q flush
sudo dnctl -q pipe flush
echo "dummynet in from ${{ inputs.test_server_host }} to ! 127.0.0.1 pipe 1
dummynet out from ! 127.0.0.1 to ${{ inputs.test_server_host }} pipe 2" | sudo pfctl -f -
# pipe 1 is download
sudo dnctl pipe 1 config bw ${{ inputs.download_speed }}Kbit/s delay ${{ inputs.latency }}ms
# pipe 2 is upload
sudo dnctl pipe 2 config bw ${{ inputs.upload_speed }}Kbit/s delay ${{ inputs.latency }}ms
sleep 5;
sudo pfctl -E
sleep 5;
- name: test curl after throttling
shell: bash
run: |
curl -o /dev/null -m 20 --retry 2 -s -w 'Total: %{time_total}s\n' 'https://${{ inputs.test_server_host }}/api/v4/system/ping?get_server_status=true'

View file

@ -0,0 +1,39 @@
# Copyright 2024 Mattermost, Inc.
name: "generate-specs"
description: This action used to split Detox integration tests based on the parallelism provided
inputs:
search_path:
description: The path to look for from within the directory
required: true
parallelism:
description: The parallelism for the tests
required: true
device_name:
description: The name of Device used for the tests
required: false
default: "iPhone 15"
device_os_version:
description: The os of the device used for the tests
required: false
default: "iOS 17.1"
outputs:
specs:
description: The specs generated for the strategy
value: ${{ steps.generate-specs.outputs.specs }}
runs:
using: "composite"
steps:
- name: ci/generate-specs
id: generate-specs
env:
PARALLELISM: ${{ inputs.parallelism }}
SEARCH_PATH: ${{ inputs.search_path }}
DEVICE_NAME: ${{ inputs.device_name }}
DEVICE_OS_VERSION: ${{ inputs.device_os_version }}
run: |
set -e
node ${{ github.action_path }}/split-tests.js | tee output.json
echo "specs=$(cat output.json)" >> $GITHUB_OUTPUT
shell: bash

View file

@ -0,0 +1,96 @@
const fs = require('fs');
const path = require('path');
class DeviceInfo {
constructor(deviceName, deviceOsVersion) {
this.deviceName = deviceName;
this.deviceOsVersion = deviceOsVersion;
}
}
class SpecGroup {
constructor(runId, specs, deviceInfo) {
this.runId = runId;
this.specs = specs;
this.deviceName = deviceInfo.deviceName;
this.deviceOsVersion = deviceInfo.deviceOsVersion;
}
}
class Specs {
constructor(searchPath, parallelism, deviceInfo) {
this.searchPath = searchPath;
this.parallelism = parallelism;
this.rawFiles = [];
this.groupedFiles = [];
this.deviceInfo = deviceInfo;
}
findFiles() {
const dirPath = path.join(this.searchPath);
const fileRegex = /\.e2e\.ts$/;
const walkSync = (currentPath) => {
const files = fs.readdirSync(currentPath);
files.forEach((file) => {
const filePath = path.join(currentPath, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
walkSync(filePath);
} else if (fileRegex.test(filePath)) {
const relativeFilePath = filePath.replace(dirPath + '/', '');
const fullPath = path.join(this.searchPath, relativeFilePath);
this.rawFiles.push(fullPath);
}
});
};
walkSync(dirPath);
}
generateSplits() {
const chunkSize = Math.floor(this.rawFiles.length / this.parallelism);
let remainder = this.rawFiles.length % this.parallelism;
let runNo = 1;
let start = 0;
for (let i = 0; i < this.parallelism; i++) {
let end = start + chunkSize + (remainder > 0 ? 1 : 0);
const fileGroup = this.rawFiles.slice(start, end).join(' ');
const specFileGroup = new SpecGroup(runNo.toString(), fileGroup, this.deviceInfo);
this.groupedFiles.push(specFileGroup);
start = end;
runNo++;
if (remainder > 0) {
remainder--;
}
}
}
dumpSplits() {
const output = {
include: this.groupedFiles,
};
console.log(JSON.stringify(output));
}
}
function main() {
const searchPath = process.env.SEARCH_PATH;
const parallelism = parseInt(process.env.PARALLELISM, 10);
const deviceName = process.env.DEVICE_NAME;
const deviceOsVersion = process.env.DEVICE_OS_VERSION;
const deviceInfo = new DeviceInfo(deviceName, deviceOsVersion);
const specs = new Specs(searchPath, parallelism, deviceInfo);
specs.findFiles();
specs.generateSplits();
specs.dumpSplits();
}
main();

View file

@ -12,14 +12,18 @@ runs:
- name: ci/prepare-mobile-build
uses: ./.github/actions/prepare-mobile-build
# Disable this since we are not caching anything for now
# - name: ci/install-gradle-dependencies
# shell: bash
# working-directory: android
# run: |
# echo "::group::install-gradle-dependencies"
# ./gradlew dependencies
# echo "::endgroup::"
- name: ci/apply-16kb-pagesize-patch
shell: bash
run: |
echo "::group::Apply 16KB page size compatibility patch"
npm run apply-16kb-pagesize-patch
echo "::endgroup::"
- name: ci/setup-java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: ci/jetify-android-libraries
shell: bash
@ -30,7 +34,7 @@ runs:
- name: ci/checkout-private-repo
if: ${{ inputs.sign == 'true' }}
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
repository: mattermost/mattermost-mobile-private
token: ${{ env.MATTERMOST_BUILD_GH_TOKEN }}

View file

@ -1,25 +1,61 @@
name: prepare-ios-build
description: Action to prepare environment for ios build
inputs:
intune-enabled:
description: 'Enable Intune MAM features (requires Xcode 26.1+)'
required: false
default: 'false'
intune-ssh-private-key:
description: 'SSH private key for Intune submodule repository access (required if intune-enabled is true)'
required: false
runs:
using: composite
steps:
- name: ci/install-os-deps
env:
HOMEBREW_NO_AUTO_UPDATE: "1"
shell: bash
run: |
echo "::group::install-os-deps"
brew install watchman
echo "::endgroup::"
- name: ci/setup-xcode
uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
with:
xcode-version: '26.1'
- name: ci/prepare-mobile-build
uses: ./.github/actions/prepare-mobile-build
- name: ci/install-pods-dependencies
- name: ci/setup-intune
if: inputs.intune-enabled == 'true'
uses: ./.github/actions/setup-intune
with:
ssh-private-key: ${{ inputs.intune-ssh-private-key }}
- name: Get Intune submodule commit hash
if: inputs.intune-enabled == 'true'
id: intune-hash
shell: bash
run: |
echo "::group::install-pods-dependencies"
if [ -e "libraries/@mattermost/intune/.git" ]; then
INTUNE_HASH=$(cd libraries/@mattermost/intune && git rev-parse --short HEAD)
echo "hash=${INTUNE_HASH}" >> $GITHUB_OUTPUT
else
echo "hash=none" >> $GITHUB_OUTPUT
fi
- name: Cache Pods
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: |
ios/Pods
libraries/@mattermost/intune/ios/Frameworks
key: ${{ runner.os }}-pods-v4-intune-${{ inputs.intune-enabled }}-${{ steps.intune-hash.outputs.hash }}-${{ hashFiles('ios/Podfile.lock') }}-${{ github.ref_name }}
restore-keys: |
${{ runner.os }}-pods-v4-intune-${{ inputs.intune-enabled }}-${{ steps.intune-hash.outputs.hash }}-${{ hashFiles('ios/Podfile.lock') }}-
- name: ci/install-pods-dependencies
shell: bash
env:
INTUNE_ENABLED: ${{ inputs.intune-enabled }}
run: |
echo "::group::install-pods-dependencies"
echo "INTUNE_ENABLED=$INTUNE_ENABLED"
npm run ios-gems
npm run pod-install
echo "::endgroup::"

View file

@ -0,0 +1,106 @@
name: Prepare Low Bandwidth Environment (MacOS & iOS Simulators only)
description: prepare any workflow for low bandwidth testing
inputs:
test_server_url:
description: The URL of the test server
required: true
device_name:
description: The iOS simulator name
required: true
download_speed:
description: The download speed limit (in Kbit/s)
required: false
default: "3300"
upload_speed:
description: The upload speed limit (in Kbit/s)
required: false
default: "3300"
latency:
description: The latency (in ms) each way
required: false
default: "500"
runs:
using: composite
steps:
- name: delete the zip file and trash (to free up space)
shell: bash
run: |
rm -rf mobile-artifacts/*.zip
sudo rm -rf ~/.Trash/*
- name: check disk space
shell: bash
run: df -h
- name: remove protocol from SITE_1_URL
id: remove-protocol
shell: bash
run: |
echo "SITE_1_HOST=${{ inputs.test_server_url }}" | sed -e 's/http:\/\///g' -e 's/https:\/\///g' >> ${GITHUB_OUTPUT}
- name: Throttle Bandwidth 1
id: throttle-bandwidth-1
continue-on-error: true
uses: ./.github/actions/bandwidth-throttling
with:
test_server_host: ${{ steps.remove-protocol.outputs.SITE_1_HOST }}
download_speed: ${{ inputs.download_speed }}
upload_speed: ${{ inputs.upload_speed }}
latency: ${{ inputs.latency }}
- name: Throttle Bandwidth 2
if: steps.throttle-bandwidth-1.outcome != 'success'
id: throttle-bandwidth-2
uses: ./.github/actions/bandwidth-throttling
with:
test_server_host: ${{ steps.remove-protocol.outputs.SITE_1_HOST }}
download_speed: ${{ inputs.download_speed}}
upload_speed: ${{ inputs.upload_speed }}
latency: ${{ inputs.latency }}
disable: "true"
- name: Install mitmproxy & pm2 (process manager)
id: install-mitmproxy-pm2
shell: bash
run: |
brew install mitmproxy
npm i -g pm2
- name: Start mitmproxy via mitmdump and stop it (to get .mitmproxy folder)
shell: bash
run: |
pm2 start mitmdump --log /Users/runner/work/mattermost-mobile/mattermost-mobile/mitmdump.log -- --allow-hosts '${{ steps.remove-protocol.outputs.SITE_1_HOST }}' --ignore-hosts 'localhost' -s /Users/runner/work/mattermost-mobile/mattermost-mobile/scripts/mitmdump-flow-parsing.py
sleep 5;
pm2 stop mitmdump
# we need to wait for mitmdump to stop so it'll produce the .mitmproxy folder
sleep 5;
- name: Get simulator UDID
id: get-simulator-udid
shell: bash
run: |
simulator_udid=$(xcrun simctl list devices "${{ inputs.device_name }}" -j | jq '.devices' | jq '."com.apple.CoreSimulator.SimRuntime.iOS-17-4"[0]["udid"]')
echo "simulator_udid="$(echo $simulator_udid) >> ${GITHUB_OUTPUT}
- name: install certificate
shell: bash
run: |
sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem
# must boot first before adding root cert
xcrun simctl boot ${{ steps.get-simulator-udid.outputs.simulator_udid }}
xcrun simctl keychain booted add-root-cert ~/.mitmproxy/mitmproxy-ca-cert.pem
sleep 5;
- name: show me booted simulators
shell: bash
run: xcrun simctl list devices booted | grep Booted

View file

@ -4,9 +4,8 @@ description: Action to prepare environment for mobile build
runs:
using: composite
steps:
- uses: ruby/setup-ruby@9669f3ee51dc3f4eda8447ab696b3ab19a90d14b # v1.144.0
with:
ruby-version: "2.7.7"
# The required ruby version is mentioned in '.ruby-version'
- uses: ruby/setup-ruby@cb0fda56a307b8c78d38320cd40d9eb22a3bf04e # v1.242.0
- name: ci/setup-fastlane-dependencies
shell: bash
@ -16,5 +15,13 @@ runs:
echo "::endgroup::"
working-directory: ./fastlane
- name: Cache Ruby gems
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-gems-
- name: ci/prepare-node-deps
uses: ./.github/actions/prepare-node-deps

View file

@ -5,7 +5,7 @@ runs:
using: composite
steps:
- name: ci/setup-node
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: ".nvmrc"
cache: "npm"
@ -21,6 +21,14 @@ runs:
node node_modules/\@sentry/cli/scripts/install.js
echo "::endgroup::"
- name: Cache Node.js modules
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: ci/patch-npm-dependencies
shell: bash
run: |

View file

@ -0,0 +1,27 @@
# Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
# See LICENSE.txt for license information.
name: Setup Intune SSH Key
description: Configure SSH private key for accessing Intune submodule repository
inputs:
ssh-private-key:
description: 'SSH private key for Intune submodule repository access'
required: true
runs:
using: composite
steps:
- name: Configure Intune submodule SSH key
shell: bash
run: |
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Configure Intune submodule SSH key (separate from main repo key)
INTUNE_KEY_PATH="${HOME}/.ssh/intune_submodule_ed25519"
echo -e '${{ inputs.ssh-private-key }}' > ${INTUNE_KEY_PATH}
chmod 0600 ${INTUNE_KEY_PATH}
ssh-keygen -y -f ${INTUNE_KEY_PATH} > ${INTUNE_KEY_PATH}.pub
echo "✅ Intune submodule SSH key configured"

View file

@ -0,0 +1,60 @@
# Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
# See LICENSE.txt for license information.
name: Setup Intune
description: Initialize Intune submodule and link module for internal builds with MAM features
inputs:
ssh-private-key:
description: 'SSH private key for Intune submodule repository access'
required: true
runs:
using: composite
steps:
- name: Configure SSH for Intune submodule
uses: ./.github/actions/setup-intune-ssh-key
with:
ssh-private-key: ${{ inputs.ssh-private-key }}
- name: Initialize Intune submodule
shell: bash
env:
GIT_SSH_COMMAND: ssh -i $HOME/.ssh/intune_submodule_ed25519 -o IdentitiesOnly=yes -o StrictHostKeyChecking=no
run: |
echo "::group::Initialize Intune submodule"
# Check if submodule is already initialized
if [ -e "libraries/@mattermost/intune/.git" ]; then
echo " Intune submodule already initialized, updating..."
git submodule update --remote libraries/@mattermost/intune
else
echo "📥 Initializing Intune submodule..."
git submodule update --init --recursive libraries/@mattermost/intune
fi
# Display submodule info
cd libraries/@mattermost/intune
echo "📦 Intune submodule initialized:"
echo " Branch: $(git rev-parse --abbrev-ref HEAD)"
echo " Commit: $(git rev-parse --short HEAD)"
echo " Remote: $(git remote get-url origin)"
cd ../..
echo "✅ Intune submodule ready"
echo "::endgroup::"
- name: Link Intune module to node_modules
shell: bash
run: |
echo "::group::Link Intune module"
# Install the module without saving to package.json
npm install --install-links --no-save ./libraries/@mattermost/intune
# Verify symlink was created
if [ -L "node_modules/@mattermost/intune" ] || [ -d "node_modules/@mattermost/intune" ]; then
echo "✅ Intune module linked to node_modules/@mattermost/intune"
else
echo "❌ Failed to link Intune module"
exit 1
fi
echo "::endgroup::"

View file

@ -0,0 +1,23 @@
# Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
# See LICENSE.txt for license information.
name: Setup SSH Key
description: Configure SSH private key for accessing private repositories
inputs:
ssh-private-key:
description: 'SSH private key for repository access'
required: true
runs:
using: composite
steps:
- name: Configure SSH private key
shell: bash
run: |
SSH_KEY_PATH=~/.ssh/id_ed25519
mkdir -p ~/.ssh
echo -e '${{ inputs.ssh-private-key }}' > ${SSH_KEY_PATH}
chmod 0600 ${SSH_KEY_PATH}
ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub
echo "✅ SSH key configured"

36
.github/actions/start-proxy/action.yml vendored Normal file
View file

@ -0,0 +1,36 @@
name: Start Proxy
description: Action to throttle the bandwidth on MacOS runner
inputs:
test_server_url:
description: The host of the test server, no protocol
required: true
runs:
using: composite
steps:
- name: restart mitmdump
shell: bash
run: |
pm2 restart mitmdump
sleep 5;
- name: start proxy
shell: bash
run: |
networksetup -setwebproxy Ethernet "127.0.0.1" "8080"
networksetup -setsecurewebproxy Ethernet "127.0.0.1" "8080"
sleep 5;
networksetup -getwebproxy Ethernet
networksetup -getsecurewebproxy Ethernet
- name: test curl and direct it into proxy
shell: bash
run: |
curl -o /dev/null -m 20 -s -w 'Total: %{time_total}s\n' '${{ inputs.test_server_url }}/api/v4/system/ping?get_server_status=true'
curl --proxy "127.0.0.1:8080" -o /dev/null -m 20 -s -w 'Total: %{time_total}s\n' '${{ inputs.test_server_url }}/api/v4/system/ping?get_server_status=true'

146
.github/actions/test-coverage/action.yml vendored Normal file
View file

@ -0,0 +1,146 @@
# This action is used to test the coverage of the mobile repo
# It will download the coverage result from the main branch and compare it with the current branch
# If the coverage is lower than the main branch (1% or more), it will post a warning along with
# the coverage report to the PR.
# If this action is run on the main branch, it will upload the coverage result to the main branch
# It will also generate a run id and cache it, so that the next time the action is run in the PR,
# it will use the cached run id to download the coverage result from the main branch
name: test-coverage
description: Test coverage tracking for mobile repo
inputs:
run_id:
description: The run id to use to download the coverage result
required: true
runs:
using: composite
steps:
- name: ci/prepare-node-deps
uses: ./.github/actions/prepare-node-deps
- name: ci/get-last-run-id
if: github.event_name == 'pull_request'
id: get-last-run-id
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684
continue-on-error: true
with:
path: run-id.txt
key: last-run-id-${{ inputs.run_id }}
restore-keys: |
last-run-id-
- name: ci/set-pr-condition
if: github.event_name == 'pull_request'
shell: bash
run: |
echo "::group::set-pr-condition"
if [ -f "run-id.txt" ]; then
echo "HAS_MAIN_RUN_ID=true" >> $GITHUB_ENV
echo "LAST_RUN_ID=$(cat run-id.txt)" >> $GITHUB_ENV
fi
echo "::endgroup::"
- name: ci/download-main-coverage
if: env.HAS_MAIN_RUN_ID == 'true'
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: test-coverage-result-${{ env.LAST_RUN_ID }}
path: main-coverage/
github-token: ${{ github.token }}
run-id: ${{ env.LAST_RUN_ID }}
- name: ci/check-coverage-download
if: env.HAS_MAIN_RUN_ID == 'true'
shell: bash
run: |
echo "::group::check-coverage-download"
if [ -f "main-coverage/coverage-summary.json" ]; then
echo "HAS_COVERAGE_FROM_MAIN=true" >> $GITHUB_ENV
fi
echo "::endgroup::"
- name: ci/read-coverage
if: env.HAS_COVERAGE_FROM_MAIN == 'true'
shell: bash
run: |
echo "::group::read-coverage"
./scripts/read-coverage.sh ./main-coverage/coverage-summary.json
echo "::endgroup::"
- name: ci/run-tests-with-coverage
shell: bash
run: |
echo "::group::run-tests"
npm run test:ci:coverage
echo "::endgroup::"
- name: ci/compare-coverage
if: env.HAS_COVERAGE_FROM_MAIN == 'true'
id: compare-coverage
shell: bash
run: |
echo "::group::compare-coverage"
echo "IS_FORK=false" >> $GITHUB_ENV
output=$(./scripts/compare-coverage.sh \
./main-coverage \
./coverage \
${{ github.event.pull_request.number }})
echo "report<<EOF" >> $GITHUB_ENV
echo "$output" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
if [ "${{ github.event.pull_request.head.repo.fork }}" = "true" ]; then
echo "IS_FORK=true" >> $GITHUB_ENV
echo "::warning::PR is from a fork. Coverage report will be displayed in the workflow summary."
echo "### Coverage Report from Fork" >> $GITHUB_STEP_SUMMARY
echo "$output" >> $GITHUB_STEP_SUMMARY
fi
echo "::endgroup::"
- name: ci/post-coverage-report
if: env.HAS_COVERAGE_FROM_MAIN == 'true' && env.IS_FORK == 'false'
uses: thollander/actions-comment-pull-request@v3
with:
message: ${{ env.report }}
comment-tag: coverage-report
create-if-not-exists: true
- name: ci/exit-on-test-coverage-failure
if: env.HAS_COVERAGE_FROM_MAIN == 'true'
shell: bash
run: |
echo "::group::exit-on-test-coverage-failure"
exit ${{ steps.compare-coverage.outputs.status }}
echo "::endgroup::"
- name: ci/upload-coverage
if: github.ref_name == 'main'
id: upload-coverage
uses: actions/upload-artifact@v4
with:
name: test-coverage-result-${{ inputs.run_id }}
path: coverage/coverage-summary.json
overwrite: true
github-token: ${{ github.token }}
- name: ci/set-upload-success
if: github.ref_name == 'main' && steps.upload-coverage.outcome == 'success'
shell: bash
run: echo "UPLOAD_SUCCESS=true" >> $GITHUB_ENV
- name: ci/generate-run-id-file
if: env.UPLOAD_SUCCESS == 'true'
shell: bash
run: |
echo "::group::generate-last-run-id"
echo "${{ inputs.run_id }}" > run-id.txt
echo "::endgroup::"
- name: ci/cache-run-id-file
if: env.UPLOAD_SUCCESS == 'true'
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684
with:
path: run-id.txt
key: last-run-id-${{ inputs.run_id }}

View file

@ -13,12 +13,16 @@ runs:
echo "::group::check-styles"
npm run check
echo "::endgroup::"
- name: ci/run-tests
# main and PR will run test:coverage
if: startsWith(github.ref_name, 'release-')
shell: bash
run: |
echo "::group::run-tests"
npm test
npm run test:ci
echo "::endgroup::"
- name: ci/check-i18n
shell: bash
run: |

18
.github/dependabot.yaml vendored Normal file
View file

@ -0,0 +1,18 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directories:
- "/.github/workflows"
- "/.github/actions/**/*"
reviewers:
- "mattermost/core-build-engineers"
open-pull-requests-limit: 5
groups:
Github Actions updates:
applies-to: version-updates
dependency-type: production
schedule:
# Check for updates to GitHub Actions every week
day: "monday"
time: "09:00"
interval: "weekly"

View file

@ -5,11 +5,10 @@ on:
push:
branches:
- build-beta-[0-9]+
- build-android-[0-9]+
- build-android-beta-[0-9]+
- build-beta-android-[0-9]+
env:
NODE_VERSION: 18.7.0
NODE_VERSION: 22.14.0
TERM: xterm
jobs:
@ -17,7 +16,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
@ -25,9 +24,12 @@ jobs:
runs-on: ubuntu-22.04
needs:
- test
permissions:
id-token: write
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-android-build
uses: ./.github/actions/prepare-android-build
@ -55,7 +57,25 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-android-beta-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-beta-${{ github.run_id }}
path: "*.apk"
# New AWS bucket deployment steps
- name: Configure AWS credentials new bucket
id: configure-aws-credentials-new-bucket
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
aws-region: us-east-1
role-to-assume: ${{ secrets.MM_MOBILE_RELEASE_AWS_ROLE_TO_ASSUME }}
- name: ci/upload-android-beta-new-bucket
env:
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}"
run: |
echo "::group::Upload to new S3 bucket"
bundle exec fastlane android upload_artifacts_to_s3 --env android.beta
echo "::endgroup::"
working-directory: ./fastlane

View file

@ -8,7 +8,7 @@ on:
- build-release-android-[0-9]+
env:
NODE_VERSION: 18.7.0
NODE_VERSION: 22.14.0
TERM: xterm
jobs:
@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
@ -24,9 +24,12 @@ jobs:
runs-on: ubuntu-22.04
needs:
- test
permissions:
id-token: write
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-android-build
uses: ./.github/actions/prepare-android-build
@ -54,7 +57,23 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-android-release-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-release-${{ github.run_id }}
path: "*.apk"
- name: Configure AWS credentials new bucket
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
aws-region: us-east-1
role-to-assume: ${{ secrets.MM_MOBILE_RELEASE_AWS_ROLE_TO_ASSUME }}
- name: ci/upload-android-release-new-bucket
env:
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_RELEASE_MATTERMOST_WEBHOOK_URL }}"
run: |
echo "::group::Upload to new S3 bucket"
bundle exec fastlane android upload_artifacts_to_s3 --env android.release
echo "::endgroup::"
working-directory: ./fastlane

View file

@ -9,29 +9,36 @@ on:
- build-beta-sim-[0-9]+
env:
NODE_VERSION: 18.7.0
NODE_VERSION: 22.14.0
TERM: xterm
INTUNE_ENABLED: 'true'
jobs:
test:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
build-ios-simulator:
runs-on: macos-12
runs-on: macos-15-large
if: ${{ !contains(github.ref_name, 'beta-ios') }}
needs:
- test
permissions:
id-token: write
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-ios-build
uses: ./.github/actions/prepare-ios-build
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: ci/build-ios-simulator
env:
@ -44,31 +51,49 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-ios-pr-simulator
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip
# Logic for new bucket upload
- name: Configure AWS credentials new bucket
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
aws-region: us-east-1
role-to-assume: ${{ secrets.MM_MOBILE_RELEASE_AWS_ROLE_TO_ASSUME }}
- name: ci/upload-ios-simulator-new-bucket
env:
TAG: "${{ github.ref_name }}"
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane ios upload_artifacts_to_s3 --env ios.simulator output_file:"Mattermost-simulator-x86_64.app.zip"
working-directory: ./fastlane
build-and-deploy-ios-beta:
runs-on: macos-12
runs-on: macos-15-large
if: ${{ !contains(github.ref_name, 'beta-sim') }}
needs:
- test
permissions:
id-token: write
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/output-ssh-private-key
shell: bash
run: |
SSH_KEY_PATH=~/.ssh/id_ed25519
mkdir -p ~/.ssh
echo -e '${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}' > ${SSH_KEY_PATH}
chmod 0600 ${SSH_KEY_PATH}
ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub
- name: ci/setup-ssh-key
uses: ./.github/actions/setup-ssh-key
with:
ssh-private-key: ${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}
- name: ci/prepare-ios-build
uses: ./.github/actions/prepare-ios-build
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: ci/build-and-deploy-ios-beta
env:
@ -93,7 +118,24 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-ios-beta-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-beta-${{ github.run_id }}
path: "*.ipa"
# Logic for new bucket upload
- name: Configure AWS credentials new bucket
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
aws-region: us-east-1
role-to-assume: ${{ secrets.MM_MOBILE_RELEASE_AWS_ROLE_TO_ASSUME }}
- name: ci/upload-ios-beta-new-bucket
env:
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}"
run: |
echo "::group::Upload to new S3 bucket"
bundle exec fastlane ios upload_artifacts_to_s3 --env ios.beta
echo "::endgroup::"
working-directory: ./fastlane

View file

@ -9,43 +9,47 @@ on:
- build-release-sim-[0-9]+
env:
NODE_VERSION: 18.7.0
NODE_VERSION: 22.14.0
TERM: xterm
INTUNE_ENABLED: 'true'
jobs:
test:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
build-and-deploy-ios-release:
runs-on: macos-12
runs-on: macos-15-large
if: ${{ !contains(github.ref_name, 'release-sim') }}
needs:
- test
permissions:
id-token: write
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/setup-ssh-key
uses: ./.github/actions/setup-ssh-key
with:
ssh-private-key: ${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}
- name: ci/prepare-ios-build
uses: ./.github/actions/prepare-ios-build
- name: ci/output-ssh-private-key
shell: bash
run: |
SSH_KEY_PATH=~/.ssh/id_ed25519
mkdir -p ~/.ssh
echo -e '${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}' > ${SSH_KEY_PATH}
chmod 0600 ${SSH_KEY_PATH}
ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: ci/build-and-deploy-ios-release
env:
AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_RELEASE_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_RELEASE_AWS_SECRET_ACCESS_KEY }}"
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_RELEASE_MATTERMOST_WEBHOOK_URL }}"
FASTLANE_TEAM_ID: "${{ secrets.MM_MOBILE_FASTLANE_TEAM_ID }}"
IOS_API_ISSUER_ID: "${{ secrets.MM_MOBILE_IOS_API_ISSUER_ID }}"
@ -65,22 +69,45 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-ios-release-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-release-${{ github.run_id }}
path: "*.ipa"
# Upload artifacts to new bucket
- name: Configure AWS credentials new bucket
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
aws-region: us-east-1
role-to-assume: ${{ secrets.MM_MOBILE_RELEASE_AWS_ROLE_TO_ASSUME }}
- name: ci/upload-ios-release-to-new-bucket
env:
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_RELEASE_MATTERMOST_WEBHOOK_URL }}"
run: |
echo "::group::Build"
bundle exec fastlane ios upload_artifacts_to_s3 --env ios.release
echo "::endgroup::"
working-directory: ./fastlane
build-ios-simulator:
runs-on: macos-12
runs-on: macos-15-large
if: ${{ !contains(github.ref_name , 'release-ios') }}
needs:
- test
permissions:
id-token: write
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-ios-build
uses: ./.github/actions/prepare-ios-build
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: ci/build-ios-simulator
env:
@ -93,7 +120,22 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-ios-pr-simulator
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip
# Logic for new bucket upload
- name: Configure AWS credentials new bucket
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
aws-region: us-east-1
role-to-assume: ${{ secrets.MM_MOBILE_RELEASE_AWS_ROLE_TO_ASSUME }}
- name: ci/upload-ios-simulator-new-bucket
env:
TAG: "${{ github.ref_name }}"
AWS_NEW_BUCKET_NAME: "${{ secrets.MM_MOBILE_RELEASE_AWS_NEW_BUCKET_NAME }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}"
run: bundle exec fastlane ios simulator --env ios.simulator output_file:"Mattermost-simulator-x86_64.app.zip"
working-directory: ./fastlane

View file

@ -1,49 +1,52 @@
---
name: build-pr
on:
push:
branches:
- build-pr-*
- build-pr-android-*
- build-pr-ios-*
pull_request:
types:
- labeled
env:
NODE_VERSION: 18.7.0
NODE_VERSION: 22.14.0
TERM: xterm
INTUNE_ENABLED: 'true'
jobs:
test:
runs-on: ubuntu-22.04
if: ${{ github.event.label.name == 'Build Apps for PR' || github.event.label.name == 'Build App for iOS' || github.event.label.name == 'Build App for Android' }}
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: ci/test
uses: ./.github/actions/test
build-ios-pr:
runs-on: macos-12
if: ${{ !contains(github.ref_name, 'android') }}
runs-on: macos-15-large
if: ${{ github.event.label.name == 'Build Apps for PR' || github.event.label.name == 'Build App for iOS' }}
needs:
- test
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: ci/setup-ssh-key
uses: ./.github/actions/setup-ssh-key
with:
ssh-private-key: ${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}
- name: ci/prepare-ios-build
uses: ./.github/actions/prepare-ios-build
- name: ci/output-ssh-private-key
shell: bash
run: |
SSH_KEY_PATH=~/.ssh/id_ed25519
mkdir -p ~/.ssh
echo -e '${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}' > ${SSH_KEY_PATH}
chmod 0600 ${SSH_KEY_PATH}
ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: ci/build-ios-pr
env:
BRANCH_TO_BUILD: "${{ github.ref_name }}"
BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}"
AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}"
FASTLANE_TEAM_ID: "${{ secrets.MM_MOBILE_FASTLANE_TEAM_ID }}"
@ -57,19 +60,21 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-ios-pr-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-pr-${{ github.run_id }}
path: "*.ipa"
build-android-pr:
runs-on: ubuntu-22.04
if: ${{ !contains(github.ref_name, 'ios') }}
if: ${{ github.event.label.name == 'Build Apps for PR' || github.event.label.name == 'Build App for Android' }}
needs:
- test
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: ci/prepare-android-build
uses: ./.github/actions/prepare-android-build
@ -81,7 +86,7 @@ jobs:
- name: ci/build-android-pr
env:
BRANCH_TO_BUILD: "${{ github.ref_name }}"
BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}"
AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}"
MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}"
@ -89,7 +94,7 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-android-pr-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-pr-${{ github.run_id }}
path: "*.apk"

View file

@ -1,10 +1,17 @@
---
name: ci
on:
push:
branches:
- main
- 'release*'
pull_request:
permissions:
pull-requests: write
env:
NODE_VERSION: 18.7.0
NODE_VERSION: 22.14.0
TERM: xterm
jobs:
@ -12,6 +19,11 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
- name: ci/test-coverage
if: github.event_name == 'pull_request' || github.ref_name == 'main'
uses: ./.github/actions/test-coverage
with:
run_id: ${{ github.run_id }}

View file

@ -26,17 +26,17 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql/codeql-config.yml
# Autobuild attempts to build any compiled languages
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

View file

@ -0,0 +1,129 @@
name: Compatibility Matrix Testing
on:
workflow_dispatch:
inputs:
CMT_MATRIX:
description: "A JSON object representing the testing matrix"
required: true
type: string
MOBILE_VERSION:
description: "The mattermost mobile version to test"
required: true
jobs:
## This is picked up after the finish for cleanup
upload-cmt-server-detals:
runs-on: ubuntu-22.04
steps:
- name: cmt/generate-instance-details-file
run: echo '${{ inputs.CMT_MATRIX }}' > instance-details.json
- name: cmt/upload-instance-details
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: instance-details.json
path: instance-details.json
retention-days: 1
calculate-commit-hash:
runs-on: ubuntu-22.04
outputs:
MOBILE_SHA: ${{ steps.repo.outputs.MOBILE_SHA }}
steps:
- name: cmt/checkout-mobile
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: cmt/calculate-mattermost-sha
id: repo
run: echo "MOBILE_SHA=$(git rev-parse HEAD)" >> ${GITHUB_OUTPUT}
update-initial-status:
runs-on: ubuntu-22.04
needs:
- calculate-commit-hash
steps:
- uses: mattermost/actions/delivery/update-commit-status@d5174b860704729f4c14ef8489ae075742bfa08a
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ needs.calculate-commit-hash.outputs.MOBILE_SHA }}
context: e2e/compatibility-matrix-testing
description: "Compatibility Matrix Testing for ${{ inputs.MOBILE_VERSION }} version"
status: pending
# Input follows the below schema
# {
# "server": [
# {
# "version": "9.6.1",
# "url": "https://delivery-cmt-8467830017-9-6-1.test.mattermost.cloud/"
# },
# {
# "version": "9.5.2",
# "url": "https://delivery-cmt-8467830017-9-5-2.test.mattermost.cloud/"
# }
# ]
# }
build-ios-simulator:
runs-on: macos-14
needs:
- update-initial-status
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: Prepare iOS Build
uses: ./.github/actions/prepare-ios-build
- name: Build iOS Simulator
env:
TAG: "${{ inputs.MOBILE_VERSION }}"
AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane ios simulator --env ios.simulator
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip
detox-e2e:
name: mobile-cmt-${{ matrix.server.version }}
uses: ./.github/workflows/e2e-detox-template.yml
needs:
- build-ios-simulator
strategy:
fail-fast: false
matrix: ${{ fromJson(inputs.CMT_MATRIX) }}
secrets: inherit
with:
run-ios-tests: true
run-type: "RELEASE"
MM_TEST_SERVER_URL: ${{ matrix.server.url }}
MOBILE_VERSION: ${{ inputs.MOBILE_VERSION }}
update-final-status:
runs-on: ubuntu-22.04
needs:
- calculate-commit-hash
- detox-e2e
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ needs.calculate-commit-hash.outputs.MOBILE_SHA }}
context: e2e/compatibility-matrix-testing
description: Compatibility Matrix Testing for ${{ inputs.MOBILE_VERSION }} version
status: ${{ needs.detox-e2e.outputs.STATUS }}
target_url: ${{ needs.detox-e2e.outputs.TARGET_URL }}

View file

@ -0,0 +1,345 @@
name: Detox Android E2E Tests Template
on:
workflow_call:
inputs:
MM_TEST_SERVER_URL:
description: "The test server URL"
required: false
type: string
MM_TEST_USER_NAME:
description: "The admin username of the test instance"
required: false
type: string
MM_TEST_PASSWORD:
description: "The admin password of the test instance"
required: false
type: string
MOBILE_VERSION:
description: "The mobile version to test"
required: false
default: ${{ github.head_ref || github.ref }}
type: string
run-android-tests:
description: "Run Android tests"
required: true
type: boolean
run-type:
type: string
required: false
default: "PR"
testcase_failure_fatal:
description: "Should failures be considered fatal"
required: false
type: boolean
default: false
record_tests_in_zephyr:
description: "Record test results in Zephyr, typically for nightly and release runs"
required: false
type: string
default: 'false'
low_bandwidth_mode:
description: "Enable low bandwidth mode"
required: false
type: boolean
default: false
android_avd_name:
description: "Android Emulator name"
required: false
type: string
default: "detox_pixel_4_xl"
android_api_level:
description: "Android API level"
required: false
type: string
default: "34"
outputs:
STATUS:
value: ${{ jobs.generate-report.outputs.STATUS }}
TARGET_URL:
value: ${{ jobs.generate-report.outputs.TARGET_URL }}
FAILURES:
value: ${{ jobs.generate-report.outputs.FAILURES }}
env:
AWS_REGION: "us-east-1"
ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }}
ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }}
ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }}
BRANCH: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}
COMMIT_HASH: ${{ github.sha }}
DEVICE_NAME: ${{ inputs.android_avd_name }} # This is needed to split tests as same code is used in iOS job
DEVICE_OS_VERSION: ${{ inputs.android_api_level }}
DETOX_AWS_S3_BUCKET: "mattermost-detox-report"
HEADLESS: "true"
TYPE: ${{ inputs.run-type }}
PULL_REQUEST: "https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}"
SITE_1_URL: ${{ inputs.MM_TEST_SERVER_URL || 'https://mobile-e2e-site-1.test.mattermost.cloud' }}
SITE_2_URL: "https://mobile-e2e-site-2.test.mattermost.cloud"
SITE_3_URL: "https://mobile-e2e-site-3.test.mattermost.cloud"
ZEPHYR_ENABLE: ${{ inputs.record_tests_in_zephyr }}
JIRA_PROJECT_KEY: "MM"
ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }}
ZEPHYR_FOLDER_ID: "3233873"
TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }}
WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }}
FAILURE_MESSAGE: "Something has failed"
IOS: "false"
RUNNING_E2E: "true"
AVD_NAME: ${{ inputs.android_avd_name }}
SDK_VERSION: ${{ inputs.android_api_level }}
jobs:
generate-specs:
runs-on: ubuntu-22.04
outputs:
specs: ${{ steps.generate-specs.outputs.specs }}
build_id: ${{ steps.resolve-device.outputs.BUILD_ID }}
mobile_sha: ${{ steps.resolve-device.outputs.MOBILE_SHA }}
mobile_ref: ${{ steps.resolve-device.outputs.MOBILE_REF }}
workflow_hash: ${{ steps.resolve-device.outputs.WORKFLOW_HASH }}
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: Set Build ID
id: resolve-device
run: |
BUILD_ID="${{ github.run_id }}-${{ env.AVD_NAME }}-${{ env.SDK_VERSION}}"
WORKFLOW_HASH=$(tr -dc a-z0-9 </dev/urandom | head -c 10)
## We need that hash to separate the artifacts
echo "WORKFLOW_HASH=${WORKFLOW_HASH}" >> ${GITHUB_OUTPUT}
echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> ${GITHUB_OUTPUT}
echo "MOBILE_SHA=$(git rev-parse HEAD)" >> ${GITHUB_OUTPUT}
echo "MOBILE_REF=$(git rev-parse --abbrev-ref HEAD)" >> ${GITHUB_OUTPUT}
- name: Generate Test Specs
id: generate-specs
uses: ./.github/actions/generate-specs
with:
parallelism: 10
search_path: detox/e2e/test
device_name: ${{ env.AVD_NAME }}
device_os_version: ${{ env.SDK_VERSION }}
e2e-android:
name: machine-${{ matrix.runId }}-api-${{ matrix.deviceOsVersion }}
runs-on: ubuntu-latest-8-cores
continue-on-error: true
timeout-minutes: 240
env:
ANDROID_HOME: /usr/local/lib/android/sdk
ANDROID_SDK_ROOT: /usr/local/lib/android/sdk
needs:
- generate-specs
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }}
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y libpulse0
sudo apt-get install -y scrot ffmpeg xvfb
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Prepare Android Build
uses: ./.github/actions/prepare-android-build
env:
STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}"
STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}"
STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}"
MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}"
- name: Install Detox Dependencies
run: |
cd detox
npm install
- name: Set .env with RUNNING_E2E=true
run: |
cat > .env <<EOF
RUNNING_E2E=true
EOF
- name: Create destination path
run: mkdir -p android/app/build
- name: Download APK artifact
uses: actions/download-artifact@v4
with:
name: android-build-files-${{ github.run_id }}
path: android/app/build
- name: Set up Android SDK
run: |
export ANDROID_HOME=/usr/local/lib/android/sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH
echo "ANDROID_HOME=$ANDROID_HOME" >> $GITHUB_ENV
echo "PATH=$PATH" >> $GITHUB_ENV
- name: Start Xvfb
run: |
Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99
echo "DISPLAY=:99" >> $GITHUB_ENV
- name: Accept Android licenses
run: |
mkdir -p ~/.android
yes | sdkmanager --licenses > sdk_licenses_output.txt || true
# Check if "All SDK package licenses accepted" appears in output
if grep -q "All SDK package licenses accepted" sdk_licenses_output.txt; then
echo "✅ All licenses accepted successfully."
else
echo "❌ Licenses not fully accepted."
cat sdk_licenses_output.txt
exit 1
fi
- name: Install Android SDK components
run: |
yes | sdkmanager --install "platform-tools" "emulator" "platforms;android-34" "system-images;android-34;default;x86_64" "system-images;android-34;google_apis;x86_64"
env:
JAVA_HOME: ${{ env.JAVA_HOME_17_X64 }}
- name: Create and run Android Emulator
run: |
cd detox
chmod +x ./create_android_emulator.sh
CI=true ./create_android_emulator.sh ${{ env.SDK_VERSION }} ${{ env.AVD_NAME }} ${{ matrix.specs }}
continue-on-error: true # We want to run all the tests
- name: Upload Android Test Report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-results-${{ needs.generate-specs.outputs.workflow_hash }}-${{ matrix.runId }}
path: detox/artifacts/
generate-report:
runs-on: ubuntu-22.04
needs:
- generate-specs
- e2e-android
outputs:
TARGET_URL: ${{ steps.set-url.outputs.TARGET_URL }}
STATUS: ${{ steps.determine-status.outputs.STATUS }}
FAILURES: ${{ steps.summary.outputs.FAILURES }}
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: ci/prepare-node-deps
uses: ./.github/actions/prepare-node-deps
- name: Download Android Artifacts
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
path: detox/artifacts/
pattern: android-results-${{ needs.generate-specs.outputs.workflow_hash }}-*
continue-on-error: true
- name: Generate Report Path
id: s3
run: |
path="${{ needs.generate-specs.outputs.build_id }}-${{ needs.generate-specs.outputs.mobile_sha }}-${{ needs.generate-specs.outputs.mobile_ref }}"
echo "path=$(echo "${path}" | sed 's/\./-/g')" >> ${GITHUB_OUTPUT}
- name: Save report Detox Dependencies
id: report-link
run: |
cd detox
npm ci
npm run e2e:save-report
env:
DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }}
DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }}
BUILD_ID: ${{ needs.generate-specs.outputs.build_id }}
REPORT_PATH: ${{ steps.s3.outputs.path }}
## These are needed for the MM Webhook report
COMMIT_HASH: ${{ needs.generate-specs.outputs.mobile_sha }}
BRANCH: ${{ needs.generate-specs.outputs.mobile_ref }}
- name: Calculate failures
id: summary
run: |
echo "FAILURES=$(cat detox/artifacts/summary.json | jq .stats.failures)" >> ${GITHUB_OUTPUT}
echo "PASSES=$(cat detox/artifacts/summary.json | jq .stats.passes)" >> ${GITHUB_OUTPUT}
echo "SKIPPED=$(cat detox/artifacts/summary.json | jq .stats.skipped)" >> ${GITHUB_OUTPUT}
echo "TOTAL=$(cat detox/artifacts/summary.json | jq .stats.tests)" >> ${GITHUB_OUTPUT}
echo "ERRORS=$(cat detox/artifacts/summary.json | jq .stats.errors)" >> ${GITHUB_OUTPUT}
echo "PERCENTAGE=$(cat detox/artifacts/summary.json | jq .stats.passPercent)" >> ${GITHUB_OUTPUT}
- name: Set Target URL
id: set-url
run: |
echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${{ steps.s3.outputs.path }}/jest-stare/android-report.html" >> ${GITHUB_OUTPUT}
- name: Determine Status
id: determine-status
run: |
if [[ ${{ steps.summary.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then
echo "STATUS=failure" >> ${GITHUB_OUTPUT}
else
echo "STATUS=success" >> ${GITHUB_OUTPUT}
fi
- name: Generate Summary
run: |
echo "| Tests | Passed :white_check_mark: | Failed :x: | Skipped :fast_forward: | Errors :warning: | " >> ${GITHUB_STEP_SUMMARY}
echo "|:---:|:---:|:---:|:---:|:---:|" >> ${GITHUB_STEP_SUMMARY}
echo "| ${{ steps.summary.outputs.TOTAL }} | ${{ steps.summary.outputs.PASSES }} | ${{ steps.summary.outputs.FAILURES }} | ${{ steps.summary.outputs.SKIPPED }} | ${{ steps.summary.outputs.ERRORS }} |" >> ${GITHUB_STEP_SUMMARY}
echo "" >> ${GITHUB_STEP_SUMMARY}
echo "You can check the full report [here](${{ steps.set-url.outputs.TARGET_URL }})" >> ${GITHUB_STEP_SUMMARY}
echo "There was **${{ steps.summary.outputs.PERCENTAGE }}%** success rate." >> ${GITHUB_STEP_SUMMARY}
- name: Comment report on the PR
if: ${{ github.event_name == 'pull_request' }}
uses: actions/github-script@v7
with:
script: |
const prNumber = context.payload.pull_request.number;
const commentBody = `**Android E2E Test Report**: ${process.env.MOBILE_SHA} | ${process.env.PERCENTAGE}% (${process.env.PASSES}/${process.env.TOTAL}) | [full report](${process.env.TARGET_URL})
| Tests | Passed ✅ | Failed ❌ | Skipped ⏭️ | Errors ⚠️ |
|:---:|:---:|:---:|:---:|:---:|
| ${process.env.TOTAL} | ${process.env.PASSES} | ${process.env.FAILURES} | ${process.env.SKIPPED} | ${process.env.ERRORS} |
`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: commentBody,
});
env:
STATUS: ${{ steps.determine-status.outputs.STATUS }}
FAILURES: ${{ steps.summary.outputs.FAILURES }}
PASSES: ${{ steps.summary.outputs.PASSES }}
SKIPPED: ${{ steps.summary.outputs.SKIPPED }}
TOTAL: ${{ steps.summary.outputs.TOTAL }}
ERRORS: ${{ steps.summary.outputs.ERRORS }}
PERCENTAGE: ${{ steps.summary.outputs.PERCENTAGE }}
BUILD_ID: ${{ needs.generate-specs.outputs.build_id }}
RUN_TYPE: ${{ inputs.run-type }}
MOBILE_REF: ${{ needs.generate-specs.outputs.mobile_ref }}
MOBILE_SHA: ${{ needs.generate-specs.outputs.mobile_sha }}
TARGET_URL: ${{ steps.set-url.outputs.TARGET_URL }}

224
.github/workflows/e2e-detox-pr.yml vendored Normal file
View file

@ -0,0 +1,224 @@
# Can be used to run Detox E2E tests on pull requests for the Mattermost mobile app with low bandwidth
# by using 'E2E iOS tests for PR (LBW 1)' instead.
name: E2E
on:
pull_request:
branches:
- main
types:
- labeled
concurrency:
group: "${{ github.workflow }}-${{ github.event.pull_request.number }}-${{ github.event.label.name }}"
cancel-in-progress: true
env:
INTUNE_ENABLED: 'true'
jobs:
update-initial-status-ios:
if: contains(github.event.label.name, 'E2E iOS tests for PR')
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
if: contains(github.event.label.name, 'E2E iOS tests for PR')
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.event.pull_request.head.sha }}
context: e2e/detox-ios-tests
description: Detox iOS tests for mattermost mobile app have started ...
status: pending
update-initial-status-android:
runs-on: ubuntu-22.04
if: contains(github.event.label.name, 'E2E Android tests for PR')
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.event.pull_request.head.sha }}
context: e2e/detox-android-tests
description: Detox Android tests for mattermost mobile app have started ...
status: pending
build-ios-simulator:
if: contains(github.event.label.name, 'E2E iOS tests for PR')
runs-on: macos-26
needs:
- update-initial-status-ios
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Prepare iOS Build
uses: ./.github/actions/prepare-ios-build
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: Set .env with RUNNING_E2E=true
run: |
echo "RUNNING_E2E=true" > .env
- name: Build iOS Simulator
env:
TAG: "${{ github.event.pull_request.head.sha }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane ios simulator --env ios.simulator skip_upload_to_s3_bucket:true
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-*.app.zip
build-android-apk:
runs-on: ubuntu-latest-8-cores
if: contains(github.event.label.name, 'E2E Android tests for PR')
needs:
- update-initial-status-android
env:
ORG_GRADLE_PROJECT_jvmargs: -Xmx8g
steps:
- name: Prune Docker to free up space
run: docker system prune -af
- name: Remove npm Temporary Files
run: |
rm -rf ~/.npm/_cacache
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Prepare Android Build
uses: ./.github/actions/prepare-android-build
env:
STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}"
STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}"
STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}"
MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}"
- name: Install Dependencies
run: sudo apt-get clean && sudo apt-get update && sudo apt-get install -y default-jdk
- name: Detox build
run: |
cd detox
npm install
npm install -g detox-cli
npm run e2e:android-inject-settings
npm run e2e:android-build
- name: Upload Android Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-files-${{ github.run_id }}
path: "android/app/build/**/*"
run-ios-tests-on-pr:
if: contains(github.event.label.name, 'E2E iOS tests for PR')
name: iOS
uses: ./.github/workflows/e2e-ios-template.yml
needs:
- build-ios-simulator
with:
run-type: "PR"
MOBILE_VERSION: ${{ github.event.pull_request.head.sha }}
low_bandwidth_mode: ${{ contains(github.event.label.name,'LBW') && true || false }}
secrets: inherit
run-android-tests-on-pr:
if: contains(github.event.label.name, 'E2E Android tests for PR')
name: Android
uses: ./.github/workflows/e2e-android-template.yml
needs:
- build-android-apk
with:
run-android-tests: true
run-type: "PR"
MOBILE_VERSION: ${{ github.event.pull_request.head.sha }}
secrets: inherit
update-final-status-ios:
runs-on: ubuntu-22.04
if: contains(github.event.label.name, 'E2E iOS tests for PR')
needs:
- run-ios-tests-on-pr
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.event.pull_request.head.sha }}
context: e2e/detox-ios-tests
description: Completed with ${{ needs.run-ios-tests-on-pr.outputs.FAILURES }} failures
status: ${{ needs.run-ios-tests-on-pr.outputs.STATUS }}
target_url: ${{ needs.run-ios-tests-on-pr.outputs.TARGET_URL }}
update-final-status-android:
runs-on: ubuntu-22.04
if: contains(github.event.label.name, 'E2E Android tests for PR')
needs:
- run-android-tests-on-pr
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.event.pull_request.head.sha }}
context: e2e/detox-android-tests
description: Completed with ${{ needs.run-android-tests-on-pr.outputs.FAILURES }} failures
status: ${{ needs.run-android-tests-on-pr.outputs.STATUS }}
target_url: ${{ needs.run-android-tests-on-pr.outputs.TARGET_URL }}
e2e-remove-ios-label:
runs-on: ubuntu-22.04
needs:
- run-ios-tests-on-pr
steps:
- name: e2e/remove-label-from-pr
uses: actions/github-script@e7aeb8c663f696059ebb5f9ab1425ed2ef511bdb # v7.0.1
continue-on-error: true # Label might have been removed manually
with:
script: |
const iosLabel = 'E2E iOS tests for PR';
context.payload.pull_request.labels.forEach(label => {
if (label.name.includes(iosLabel)) {
github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
});
}
});
e2e-remove-android-label:
runs-on: ubuntu-22.04
needs:
- run-android-tests-on-pr
steps:
- name: e2e/remove-label-from-pr
uses: actions/github-script@e7aeb8c663f696059ebb5f9ab1425ed2ef511bdb # v7.0.1
continue-on-error: true # Label might have been removed manually
with:
script: |
const androidLabel = 'E2E Android tests for PR';
context.payload.pull_request.labels.forEach(label => {
if (label.name.includes(androidLabel)) {
github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
});
}
});

170
.github/workflows/e2e-detox-release.yml vendored Normal file
View file

@ -0,0 +1,170 @@
name: Detox E2E Tests Release
on:
push:
branches:
- release-*
env:
INTUNE_ENABLED: 'true'
jobs:
update-initial-status-ios:
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-ios-tests
description: Detox iOS tests for mattermost mobile app have started ...
status: pending
update-initial-status-android:
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-android-tests
description: Detox Android tests for mattermost mobile app have started ...
status: pending
build-ios-simulator:
runs-on: macos-15
needs:
- update-initial-status-ios
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Prepare iOS Build
uses: ./.github/actions/prepare-ios-build
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: Build iOS Simulator
env:
TAG: "${{ github.ref }}"
AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane ios simulator --env ios.simulator
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip
build-android-apk:
runs-on: ubuntu-latest-8-cores
needs:
- update-initial-status-android
env:
ORG_GRADLE_PROJECT_jvmargs: -Xmx8g
steps:
- name: Prune Docker to free up space
run: docker system prune -af
- name: Remove npm Temporary Files
run: |
rm -rf ~/.npm/_cacache
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: Prepare Android Build
uses: ./.github/actions/prepare-android-build
env:
STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}"
STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}"
STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}"
MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}"
- name: Install Dependencies
run: sudo apt-get clean && sudo apt-get update && sudo apt-get install -y default-jdk
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle/caches/modules-2/
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-
- name: Detox build
run: |
cd detox
npm install
npm install -g detox-cli
npm run e2e:android-build
- name: Upload Android Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-files-${{ github.run_id }}
path: "android/app/build/**/*"
run-ios-tests-on-release:
name: iOS Mobile Tests on Release
uses: ./.github/workflows/e2e-ios-template.yml
needs:
- build-ios-simulator
with:
run-type: "RELEASE"
record_tests_in_zephyr: 'true'
MOBILE_VERSION: ${{ github.ref }}
secrets: inherit
run-android-tests-on-release:
name: Android Mobile Tests on Release
uses: ./.github/workflows/e2e-android-template.yml
needs:
- build-android-apk
with:
run-android-tests: true
run-type: "RELEASE"
record_tests_in_zephyr: 'true'
MOBILE_VERSION: ${{ github.ref }}
secrets: inherit
update-final-status-ios:
runs-on: ubuntu-22.04
needs:
- run-ios-tests-on-release
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-ios-tests
description: Completed with ${{ needs.run-ios-tests-on-release.outputs.FAILURES }} failures
status: ${{ needs.run-ios-tests-on-release.outputs.STATUS }}
target_url: ${{ needs.run-ios-tests-on-release.outputs.TARGET_URL }}
update-final-status-android:
runs-on: ubuntu-22.04
needs:
- run-android-tests-on-release
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-android-tests
description: Completed with ${{ needs.run-android-tests-on-release.outputs.FAILURES }} failures
status: ${{ needs.run-android-tests-on-release.outputs.STATUS }}
target_url: ${{ needs.run-android-tests-on-release.outputs.TARGET_URL }}

View file

@ -0,0 +1,169 @@
name: Detox E2E Tests (Scheduled)
on:
schedule:
- cron: "0 0 * * 4,5" # Wednesday and Thursday midnight
env:
INTUNE_ENABLED: 'true'
jobs:
update-initial-status-ios:
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-ios-tests
description: Detox iOS tests for mattermost mobile app have started ...
status: pending
update-initial-status-android:
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-android-tests
description: Detox Android tests for mattermost mobile app have started ...
status: pending
build-ios-simulator:
runs-on: macos-15
needs:
- update-initial-status-ios
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Prepare iOS Build
uses: ./.github/actions/prepare-ios-build
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: Build iOS Simulator
env:
TAG: "${{ github.ref }}"
AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}"
AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane ios simulator --env ios.simulator
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip
build-android-apk:
runs-on: ubuntu-latest-8-cores
needs:
- update-initial-status-android
env:
ORG_GRADLE_PROJECT_jvmargs: -Xmx8g
steps:
- name: Prune Docker to free up space
run: docker system prune -af
- name: Remove npm Temporary Files
run: |
rm -rf ~/.npm/_cacache
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: Prepare Android Build
uses: ./.github/actions/prepare-android-build
env:
STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}"
STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}"
STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}"
MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}"
- name: Install Dependencies
run: sudo apt-get clean && sudo apt-get update && sudo apt-get install -y default-jdk
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle/caches/modules-2/
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-
- name: Detox build
run: |
cd detox
npm install
npm install -g detox-cli
npm run e2e:android-build
- name: Upload Android Build
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-files-${{ github.run_id }}
path: "android/app/build/**/*"
run-ios-tests-on-main-scheduled:
name: iOS Mobile Tests on Main (Scheduled)
uses: ./.github/workflows/e2e-ios-template.yml
needs:
- build-ios-simulator
with:
run-type: "MAIN"
record_tests_in_zephyr: 'true'
MOBILE_VERSION: ${{ github.ref }}
secrets: inherit
run-android-tests-on-main-scheduled:
name: Android Mobile Tests on Main (Scheduled)
uses: ./.github/workflows/e2e-android-template.yml
needs:
- build-android-apk
with:
run-android-tests: true
run-type: "MAIN"
record_tests_in_zephyr: 'true'
MOBILE_VERSION: ${{ github.ref }}
secrets: inherit
update-final-status-ios:
runs-on: ubuntu-22.04
needs:
- run-ios-tests-on-main-scheduled
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-ios-tests
description: Completed with ${{ needs.run-ios-tests-on-main-scheduled.outputs.FAILURES }} failures
status: ${{ needs.run-ios-tests-on-main-scheduled.outputs.STATUS }}
target_url: ${{ needs.run-ios-tests-on-main-scheduled.outputs.TARGET_URL }}
update-final-status-android:
runs-on: ubuntu-22.04
needs:
- run-android-tests-on-main-scheduled
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
env:
GITHUB_TOKEN: ${{ github.token }}
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-android-tests
description: Completed with ${{ needs.run-android-tests-on-main-scheduled.outputs.FAILURES }} failures
status: ${{ needs.run-android-tests-on-main-scheduled.outputs.STATUS }}
target_url: ${{ needs.run-android-tests-on-main-scheduled.outputs.TARGET_URL }}

494
.github/workflows/e2e-ios-template.yml vendored Normal file
View file

@ -0,0 +1,494 @@
name: Detox iOS E2E Tests Template
on:
workflow_call:
inputs:
MM_TEST_SERVER_URL:
description: "The test server URL"
required: false
type: string
MM_TEST_USER_NAME:
description: "The admin username of the test instance"
required: false
type: string
MM_TEST_PASSWORD:
description: "The admin password of the test instance"
required: false
type: string
MOBILE_VERSION:
description: "The mobile version to test"
required: false
default: ${{ github.head_ref || github.ref }}
type: string
run-type:
type: string
required: false
default: "PR"
testcase_failure_fatal:
description: "Should failures be considered fatal"
required: false
type: boolean
default: false
record_tests_in_zephyr:
description: "Record test results in Zephyr, typically for nightly and release runs"
required: false
type: string
default: 'false'
ios_device_name:
description: "iPhone simulator name"
required: false
type: string
default: "iPhone 17 Pro"
ios_device_os_name:
description: "iPhone simulator OS version"
required: false
type: string
default: "iOS 26.2"
low_bandwidth_mode:
description: "Enable low bandwidth mode"
required: false
type: boolean
default: false
outputs:
STATUS:
value: ${{ jobs.generate-report.outputs.STATUS }}
TARGET_URL:
value: ${{ jobs.generate-report.outputs.TARGET_URL }}
FAILURES:
value: ${{ jobs.generate-report.outputs.FAILURES }}
env:
AWS_REGION: "us-east-1"
ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }}
ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }}
ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }}
BRANCH: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}
COMMIT_HASH: ${{ github.sha }}
DEVICE_NAME: ${{ inputs.ios_device_name }}
DEVICE_OS_VERSION: ${{ inputs.ios_device_os_name }}
DETOX_AWS_S3_BUCKET: "mattermost-detox-report"
HEADLESS: "true"
TYPE: ${{ inputs.run-type }}
PULL_REQUEST: "https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}"
SITE_1_URL: ${{ inputs.MM_TEST_SERVER_URL || 'https://mobile-e2e-site-1.test.mattermost.cloud' }}
SITE_2_URL: "https://mobile-e2e-site-2.test.mattermost.cloud"
SITE_3_URL: "https://mobile-e2e-site-3.test.mattermost.cloud"
ZEPHYR_ENABLE: ${{ inputs.record_tests_in_zephyr }}
JIRA_PROJECT_KEY: "MM"
ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }}
ZEPHYR_FOLDER_ID: "3233873"
TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }}
WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }}
FAILURE_MESSAGE: "Something has failed"
IOS: "true"
RUNNING_E2E: "true"
jobs:
generate-specs:
runs-on: ubuntu-22.04
outputs:
specs: ${{ steps.generate-specs.outputs.specs }}
build_id: ${{ steps.resolve-device.outputs.BUILD_ID }}
mobile_sha: ${{ steps.resolve-device.outputs.MOBILE_SHA }}
mobile_ref: ${{ steps.resolve-device.outputs.MOBILE_REF }}
workflow_hash: ${{ steps.resolve-device.outputs.WORKFLOW_HASH }}
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: Set Build ID
id: resolve-device
run: |
BUILD_ID="${{ github.run_id }}-${{ env.DEVICE_NAME }}-${{ env.DEVICE_OS_VERSION}}"
WORKFLOW_HASH=$(tr -dc a-z0-9 </dev/urandom | head -c 10)
## We need that hash to separate the artifacts
echo "WORKFLOW_HASH=${WORKFLOW_HASH}" >> ${GITHUB_OUTPUT}
echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> ${GITHUB_OUTPUT}
echo "MOBILE_SHA=$(git rev-parse HEAD)" >> ${GITHUB_OUTPUT}
echo "MOBILE_REF=$(git rev-parse --abbrev-ref HEAD)" >> ${GITHUB_OUTPUT}
- name: Generate Test Specs
id: generate-specs
uses: ./.github/actions/generate-specs
with:
parallelism: 10
search_path: detox/e2e/test
device_name: ${{ env.DEVICE_NAME }}
device_os_version: ${{ env.DEVICE_OS_VERSION }}
e2e-ios:
name: machine-${{ matrix.runId }}-os-${{ matrix.deviceOsVersion }}
runs-on: macos-15
continue-on-error: true
timeout-minutes: ${{ inputs.low_bandwidth_mode && 240 || 180 }}
env:
IOS: true
needs:
- generate-specs
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }}
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: ci/prepare-node-deps
uses: ./.github/actions/prepare-node-deps
- name: Install Homebrew Dependencies
run: |
brew tap wix/brew
brew install applesimutils
- name: Download iOS Simulator Build
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
name: ios-build-simulator-${{ github.run_id }}
path: mobile-artifacts
- name: Unzip iOS Simulator Build
run: |
unzip -o mobile-artifacts/*.zip -d mobile-artifacts/
# delete zip file
rm -f mobile-artifacts/*.zip
- name: Prepare Low Bandwidth Environment
id: prepare-low-bandwidth
uses: ./.github/actions/prepare-low-bandwidth
if: ${{ inputs.low_bandwidth_mode }}
with:
test_server_url: ${{ env.SITE_1_URL }}
device_name: ${{ env.DEVICE_NAME }}
# all these value should be configurable
download_speed: "3300"
upload_speed: "3300"
latency: "500"
- name: Install Detox Dependencies
run: cd detox && npm i
- name: Pre-boot iOS Simulator
run: |
set -e
echo "Looking for simulator: ${{ env.DEVICE_NAME }} with ${{ env.DEVICE_OS_VERSION }}"
# Find or create the simulator
SIMULATOR_ID=$(xcrun simctl list devices | grep "${{ env.DEVICE_NAME }}" | grep "${{ env.DEVICE_OS_VERSION }}" | head -1 | grep -oE '([0-9A-F-]{36})' || true)
if [ -z "$SIMULATOR_ID" ]; then
echo "Simulator not found. Creating simulator ${{ env.DEVICE_NAME }} with ${{ env.DEVICE_OS_VERSION }}"
# Get device type (use exact match with parentheses to avoid partial matches)
DEVICE_TYPE=$(xcrun simctl list devicetypes | grep "${{ env.DEVICE_NAME }} (" | head -1 | awk -F'[()]' '{print $(NF-1)}')
if [ -z "$DEVICE_TYPE" ]; then
echo "Error: Could not find device type for ${{ env.DEVICE_NAME }}"
exit 1
fi
echo "Found device type: $DEVICE_TYPE"
# Get runtime (extract the identifier after the last " - ")
RUNTIME=$(xcrun simctl list runtimes | grep "${{ env.DEVICE_OS_VERSION }}" | head -1 | sed 's/.* - \(.*\)/\1/')
if [ -z "$RUNTIME" ]; then
echo "Error: Could not find runtime for ${{ env.DEVICE_OS_VERSION }}"
exit 1
fi
echo "Found runtime: $RUNTIME"
# Create simulator
SIMULATOR_ID=$(xcrun simctl create "CI-${{ env.DEVICE_NAME }}" "$DEVICE_TYPE" "$RUNTIME")
echo "Created simulator with ID: $SIMULATOR_ID"
else
echo "Found existing simulator: $SIMULATOR_ID"
fi
# Boot simulator first to initialize directory structure
echo "Initializing simulator directories (first boot)..."
xcrun simctl boot "$SIMULATOR_ID"
xcrun simctl bootstatus "$SIMULATOR_ID"
# Shut down to apply password autofill restrictions
echo "Shutting down to apply password autofill restrictions..."
xcrun simctl shutdown "$SIMULATOR_ID"
sleep 3
echo "Disabling password autofill (simulator is shut down)"
# Ensure the directory exists (should now exist after first boot)
SETTINGS_DIR="$HOME/Library/Developer/CoreSimulator/Devices/$SIMULATOR_ID/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles/Library/ConfigurationProfiles"
mkdir -p "$SETTINGS_DIR"
# Use the JavaScript utility to disable password autofill
cd detox
node utils/disable_ios_autofill.js --simulator-id "$SIMULATOR_ID"
if [ $? -ne 0 ]; then
echo "⚠️ Failed to disable password autofill"
exit 1
fi
cd ..
echo "Booting simulator with password autofill disabled..."
xcrun simctl boot "$SIMULATOR_ID"
# Wait for boot to complete
xcrun simctl bootstatus "$SIMULATOR_ID"
# Open Simulator.app in background to speed up UI rendering
open -a Simulator --args -CurrentDeviceUDID "$SIMULATOR_ID"
# Give Simulator.app time to fully initialize UI (iOS 26.2 needs more time)
sleep 5
echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV
- name: Start Proxy
if: ${{ inputs.low_bandwidth_mode }}
id: start-proxy
uses: ./.github/actions/start-proxy
with:
test_server_url: ${{ env.SITE_1_URL }}
- name: Set .env with RUNNING_E2E=true
run: |
echo "RUNNING_E2E=true" > .env
- name: Verify Simulator Health
run: |
echo "Verifying simulator health before running tests..."
# Check if simulator is still responsive
if ! xcrun simctl bootstatus "$SIMULATOR_ID" -b 2>/dev/null; then
echo "⚠️ Simulator not responsive, attempting recovery..."
# Try to shutdown and reboot
xcrun simctl shutdown "$SIMULATOR_ID" || true
sleep 3
xcrun simctl boot "$SIMULATOR_ID"
xcrun simctl bootstatus "$SIMULATOR_ID"
fi
echo "✅ Simulator is healthy and ready"
- name: Start Metro Bundler and Run Detox E2E Tests
continue-on-error: true # We want to run all the tests
run: |
# Start Metro bundler in background
npm run start > metro.log 2>&1 &
METRO_PID=$!
echo "Metro PID: $METRO_PID"
echo "METRO_PID=$METRO_PID" >> $GITHUB_ENV
# Wait for Metro to be ready with health check endpoint polling
timeout=120
elapsed=0
echo "Waiting for Metro bundler to be ready..."
while [ $elapsed -lt $timeout ]; do
# Try health check endpoint first (more reliable)
if curl -s http://localhost:8081/status 2>/dev/null | grep -q "packager-status:running"; then
echo "✅ Metro bundler is ready after ${elapsed}s (verified via health check)"
break
# Fallback to log checking
elif grep -q "Fast - Scalable - Integrated" metro.log 2>/dev/null; then
echo "✅ Metro bundler is ready after ${elapsed}s (verified via logs)"
break
fi
# Show progress every 10 seconds
if [ $((elapsed % 10)) -eq 0 ] && [ $elapsed -gt 0 ]; then
echo "Still waiting for Metro... (${elapsed}s elapsed)"
fi
sleep 2
elapsed=$((elapsed + 2))
done
if [ $elapsed -ge $timeout ]; then
echo "⚠️ Warning: Metro bundler may not be fully ready after ${timeout}s, proceeding anyway"
echo "Metro process status:"
ps aux | grep -E "metro|node.*start" | grep -v grep || echo "Metro process not found"
echo ""
echo "Last 30 lines of metro.log:"
tail -30 metro.log
else
echo "Metro is serving on http://localhost:8081"
# Give Metro extra time to fully initialize for iOS 26.2 (React Native bridge needs more time)
echo "Allowing Metro to fully stabilize..."
sleep 8
fi
cd detox
npm run detox:config-gen
npm run e2e:ios-test -- ${{ matrix.specs }}
env:
DETOX_DISABLE_HIERARCHY_DUMP: "YES"
DETOX_DISABLE_SCREENSHOT_TRACKING: "YES"
DETOX_LOGLEVEL: "debug"
DETOX_DEVICE_TYPE: ${{ env.DEVICE_NAME }}
DETOX_OS_VERSION: ${{ env.DEVICE_OS_VERSION }}
LOW_BANDWIDTH_MODE: ${{ inputs.low_bandwidth_mode }}
- name: Cleanup Simulator State
if: always()
run: |
echo "Cleaning up simulator state after tests..."
# Stop Metro bundler if still running
if [ ! -z "$METRO_PID" ]; then
echo "Stopping Metro bundler (PID: $METRO_PID)..."
kill -9 "$METRO_PID" 2>/dev/null || true
fi
# Terminate app gracefully
if [ ! -z "$SIMULATOR_ID" ]; then
echo "Terminating app on simulator..."
xcrun simctl terminate "$SIMULATOR_ID" com.tokilabs.mattermost 2>/dev/null || true
sleep 2
fi
echo "✅ Simulator cleanup complete"
- name: reset network settings
if: ${{ inputs.low_bandwidth_mode || failure() }}
run: |
networksetup -setwebproxystate Ethernet "off"
networksetup -setsecurewebproxystate Ethernet "off"
if (sudo pfctl -q -sa | grep 'Status: Enabled') then sudo pfctl -d; fi
if (command -v pm2 &> /dev/null) then pm2 stop mitmdump; fi
sleep 5;
- name: Upload mitmdump Flow Output
if: ${{ inputs.low_bandwidth_mode }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-mitmdump-flow-output-${{ needs.generate-specs.outputs.workflow_hash }}-${{ matrix.runId }}
path: |
/Users/runner/work/mattermost-mobile/mattermost-mobile/flow-output.csv
/Users/runner/work/mattermost-mobile/mattermost-mobile/mitmdump.log
- name: Upload iOS Test Report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-results-${{ needs.generate-specs.outputs.workflow_hash }}-${{ matrix.runId }}
path: detox/artifacts/
generate-report:
runs-on: ubuntu-22.04
needs:
- generate-specs
- e2e-ios
outputs:
TARGET_URL: ${{ steps.set-url.outputs.TARGET_URL }}
STATUS: ${{ steps.determine-status.outputs.STATUS }}
FAILURES: ${{ steps.summary.outputs.FAILURES }}
steps:
- name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
- name: ci/prepare-node-deps
uses: ./.github/actions/prepare-node-deps
- name: Download iOS Artifacts
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
path: detox/artifacts/
pattern: ios-results-${{ needs.generate-specs.outputs.workflow_hash }}-*
- name: Generate Report Path
id: s3
run: |
path="${{ needs.generate-specs.outputs.build_id }}-${{ needs.generate-specs.outputs.mobile_sha }}-${{ needs.generate-specs.outputs.mobile_ref }}"
echo "path=$(echo "${path}" | sed 's/\./-/g')" >> ${GITHUB_OUTPUT}
- name: Save report Detox Dependencies
id: report-link
run: |
cd detox
npm ci
npm run e2e:save-report
env:
DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }}
DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }}
BUILD_ID: ${{ needs.generate-specs.outputs.build_id }}
REPORT_PATH: ${{ steps.s3.outputs.path }}
## These are needed for the MM Webhook report
COMMIT_HASH: ${{ needs.generate-specs.outputs.mobile_sha }}
BRANCH: ${{ needs.generate-specs.outputs.mobile_ref }}
- name: Calculate failures
id: summary
run: |
echo "FAILURES=$(cat detox/artifacts/summary.json | jq .stats.failures)" >> ${GITHUB_OUTPUT}
echo "PASSES=$(cat detox/artifacts/summary.json | jq .stats.passes)" >> ${GITHUB_OUTPUT}
echo "SKIPPED=$(cat detox/artifacts/summary.json | jq .stats.skipped)" >> ${GITHUB_OUTPUT}
echo "TOTAL=$(cat detox/artifacts/summary.json | jq .stats.tests)" >> ${GITHUB_OUTPUT}
echo "ERRORS=$(cat detox/artifacts/summary.json | jq .stats.errors)" >> ${GITHUB_OUTPUT}
echo "PERCENTAGE=$(cat detox/artifacts/summary.json | jq .stats.passPercent)" >> ${GITHUB_OUTPUT}
- name: Set Target URL
id: set-url
run: |
echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${{ steps.s3.outputs.path }}/jest-stare/ios-report.html" >> ${GITHUB_OUTPUT}
- name: Determine Status
id: determine-status
run: |
if [[ ${{ steps.summary.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then
echo "STATUS=failure" >> ${GITHUB_OUTPUT}
else
echo "STATUS=success" >> ${GITHUB_OUTPUT}
fi
- name: Generate Summary
run: |
echo "| Tests | Passed :white_check_mark: | Failed :x: | Skipped :fast_forward: | Errors :warning: | " >> ${GITHUB_STEP_SUMMARY}
echo "|:---:|:---:|:---:|:---:|:---:|" >> ${GITHUB_STEP_SUMMARY}
echo "| ${{ steps.summary.outputs.TOTAL }} | ${{ steps.summary.outputs.PASSES }} | ${{ steps.summary.outputs.FAILURES }} | ${{ steps.summary.outputs.SKIPPED }} | ${{ steps.summary.outputs.ERRORS }} |" >> ${GITHUB_STEP_SUMMARY}
echo "" >> ${GITHUB_STEP_SUMMARY}
echo "You can check the full report [here](${{ steps.set-url.outputs.TARGET_URL }})" >> ${GITHUB_STEP_SUMMARY}
echo "There was **${{ steps.summary.outputs.PERCENTAGE }}%** success rate." >> ${GITHUB_STEP_SUMMARY}
- name: Comment report on the PR
if: ${{ github.event_name == 'pull_request' }}
uses: actions/github-script@v7
with:
script: |
const prNumber = context.payload.pull_request.number;
const commentBody = `**iOS E2E Test Report**: ${process.env.MOBILE_SHA} | ${process.env.PERCENTAGE}% (${process.env.PASSES}/${process.env.TOTAL}) | [full report](${process.env.TARGET_URL})
| Tests | Passed ✅ | Failed ❌ | Skipped ⏭️ | Errors ⚠️ |
|:---:|:---:|:---:|:---:|:---:|
| ${process.env.TOTAL} | ${process.env.PASSES} | ${process.env.FAILURES} | ${process.env.SKIPPED} | ${process.env.ERRORS} |
`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: commentBody,
});
env:
STATUS: ${{ steps.determine-status.outputs.STATUS }}
FAILURES: ${{ steps.summary.outputs.FAILURES }}
PASSES: ${{ steps.summary.outputs.PASSES }}
SKIPPED: ${{ steps.summary.outputs.SKIPPED }}
TOTAL: ${{ steps.summary.outputs.TOTAL }}
ERRORS: ${{ steps.summary.outputs.ERRORS }}
PERCENTAGE: ${{ steps.summary.outputs.PERCENTAGE }}
BUILD_ID: ${{ needs.generate-specs.outputs.build_id }}
RUN_TYPE: ${{ inputs.run-type }}
MOBILE_REF: ${{ needs.generate-specs.outputs.mobile_ref }}
MOBILE_SHA: ${{ needs.generate-specs.outputs.mobile_sha }}
TARGET_URL: ${{ steps.set-url.outputs.TARGET_URL }}

View file

@ -4,56 +4,84 @@ on:
push:
tags:
- v[0-9]+.[0-9]+.[0-9]+*
workflow_dispatch:
inputs:
tag:
description: "Release tag (e.g., v2.10.0)"
required: true
type: string
env:
RELEASE_TAG: ${{ inputs.tag || github.ref_name }}
SNYK_VERSION: "1.1297.2"
CYCLONEDX_VERSION: "v0.27.2"
INTUNE_ENABLED: 'true'
jobs:
test:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
build-ios-unsigned:
runs-on: macos-12
runs-on: macos-15-large
needs:
- test
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/setup-ssh-key
uses: ./.github/actions/setup-ssh-key
with:
ssh-private-key: ${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}
- name: ci/prepare-ios-build
uses: ./.github/actions/prepare-ios-build
- name: ci/output-ssh-private-key
shell: bash
run: |
SSH_KEY_PATH=~/.ssh/id_ed25519
mkdir -p ~/.ssh
echo -e '${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}' > ${SSH_KEY_PATH}
chmod 0600 ${SSH_KEY_PATH}
ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub
with:
intune-enabled: ${{ env.INTUNE_ENABLED }}
intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }}
- name: ci/build-ios-unsigned
env:
TAG: "${{ github.ref_name }}"
TAG: "${{ env.RELEASE_TAG }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane ios unsigned
working-directory: ./fastlane
- name: ci/upload-ios-unsigned
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
path: Mattermost-unsigned.ipa
name: Mattermost-unsigned.ipa
- name: ci/install-snyk
run: npm install -g snyk@${{ env.SNYK_VERSION }}
- name: ci/generate-ios-sbom
env:
SNYK_TOKEN: "${{ secrets.SNYK_TOKEN }}"
run: |
snyk sbom --format=cyclonedx1.6+json --json-file-output=../sbom-ios.json --all-projects
working-directory: ./ios
shell: bash
- name: ci/upload-ios-sbom
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
path: sbom-ios.json
name: sbom-ios.json
build-android-unsigned:
runs-on: ubuntu-22.04
needs:
- test
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-android-build
uses: ./.github/actions/prepare-android-build
@ -62,39 +90,145 @@ jobs:
- name: ci/build-android-beta
env:
TAG: "${{ github.ref_name }}"
TAG: "${{ env.RELEASE_TAG }}"
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane android unsigned
working-directory: ./fastlane
- name: ci/upload-android-unsigned-build
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
path: Mattermost-unsigned.apk
name: Mattermost-unsigned.apk
release:
- name: ci/install-snyk
run: npm install -g snyk@${{ env.SNYK_VERSION }}
- name: ci/generate-android-sbom
env:
SNYK_TOKEN: "${{ secrets.SNYK_TOKEN }}"
run: |
snyk sbom --format=cyclonedx1.6+json --all-projects --json-file-output=../sbom-android.json
working-directory: ./android
shell: bash
- name: ci/upload-android-sbom
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
path: sbom-android.json
name: sbom-android.json
generate-consolidated-sbom:
runs-on: ubuntu-22.04
needs:
- build-ios-unsigned
- build-android-unsigned
steps:
- name: ci/checkout-repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ruby/setup-ruby@9669f3ee51dc3f4eda8447ab696b3ab19a90d14b # v1.144.0
- name: ci/download-sboms
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
ruby-version: "2.7"
pattern: sbom-*.json
path: ${{ github.workspace }}
merge-multiple: true
- name: ci/install-snyk
run: npm install -g snyk@${{ env.SNYK_VERSION }}
- name: ci/setup-cyclonedx-cli
run: |
set -e
CYCLONEDX_BINARY="cyclonedx-linux-x64"
CYCLONEDX_URL="https://github.com/CycloneDX/cyclonedx-cli/releases/download/${{ env.CYCLONEDX_VERSION }}/${CYCLONEDX_BINARY}"
# Download with better error handling and retry
echo "Downloading CycloneDX CLI ${{ env.CYCLONEDX_VERSION }}..."
curl -sSfL --retry 3 --retry-delay 5 "${CYCLONEDX_URL}" -o cyclonedx
# Verify the binary is executable and not corrupted
if [ ! -s cyclonedx ]; then
echo "Error: Downloaded file is empty or corrupted"
exit 1
fi
# Make executable and move to PATH
chmod +x cyclonedx
sudo mv cyclonedx /usr/local/bin/
# Verify installation
cyclonedx --version
- name: ci/generate-consolidated-sbom
env:
SNYK_TOKEN: "${{ secrets.SNYK_TOKEN }}"
SBOM_FILENAME: "sbom-${{ github.event.repository.name }}-${{ env.RELEASE_TAG }}.json"
run: |
# Check if required SBOM files are available
if [ ! -f "sbom-android.json" ]; then
echo "Error: sbom-android.json not found. Android SBOM generation may have failed."
exit 1
fi
if [ ! -f "sbom-ios.json" ]; then
echo "Error: sbom-ios.json not found. iOS SBOM generation may have failed."
exit 1
fi
echo "All required SBOM files are available. Proceeding with consolidation..."
# Generate top-level SBOM
snyk sbom --format=cyclonedx1.6+json --json-file-output=sbom-top-level.json
# Consolidate SBOMs
cyclonedx merge \
--input-files "sbom-top-level.json" "sbom-android.json" "sbom-ios.json" \
--input-format=json \
--output-file="$SBOM_FILENAME" \
--output-format=json \
--output-version=v1_6
# Validate the consolidated SBOM
cyclonedx validate --input-file="$SBOM_FILENAME"
shell: bash
- name: ci/upload-consolidated-sbom
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
path: sbom-${{ github.event.repository.name }}-${{ env.RELEASE_TAG }}.json
name: sbom-${{ github.event.repository.name }}-${{ env.RELEASE_TAG }}.json
release:
runs-on: ubuntu-22.04
needs:
- build-ios-unsigned
- build-android-unsigned
- generate-consolidated-sbom
steps:
- name: ci/checkout-repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ruby/setup-ruby@cb0fda56a307b8c78d38320cd40d9eb22a3bf04e # v1.242.0
- name: release/setup-fastlane-dependencies
run: bundle install
working-directory: ./fastlane
- name: ci/download-artifacts
uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: ${{ github.workspace }}
merge-multiple: true
- name: release/create-github-release
env:
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: bundle exec fastlane github
working-directory: ./fastlane
- name: release/upload-sbom-to-release
env:
GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}"
run: |
gh release upload "${{ env.RELEASE_TAG }}" "sbom-${{ github.event.repository.name }}-${{ env.RELEASE_TAG }}.json"

View file

@ -0,0 +1,145 @@
---
name: Validate Intune Clean
on:
pull_request:
paths:
- 'ios/Podfile'
- 'ios/Podfile.lock'
- 'package.json'
- 'package-lock.json'
- 'ios/Mattermost/Info.plist'
- 'ios/Mattermost/Mattermost.entitlements'
- 'ios/Mattermost.xcodeproj/project.pbxproj'
jobs:
validate-podfile-lock:
name: Validate Podfile.lock is OSS-only
runs-on: ubuntu-latest
steps:
- name: ci/checkout-repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Check Podfile.lock for Intune references
run: |
if grep -q "mattermost-intune\|IntuneMAMSwift" ios/Podfile.lock; then
echo ""
echo "❌ ERROR: Podfile.lock contains Intune dependencies"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The committed Podfile.lock should only contain OSS dependencies."
echo "Please restore the OSS version:"
echo ""
echo " git checkout main -- ios/Podfile.lock"
echo ""
echo "Or run: npm run intune:disable"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
exit 1
fi
echo "✅ Podfile.lock is clean (OSS-only)"
- name: Check for package.json Intune reference
run: |
# Check only dependencies and devDependencies sections (not scripts)
if jq -e '.dependencies."@mattermost/intune" // .devDependencies."@mattermost/intune"' package.json > /dev/null 2>&1; then
echo ""
echo "❌ ERROR: package.json contains @mattermost/intune dependency"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The Intune library should NOT be in package.json dependencies."
echo "It is installed via --no-save flag during internal builds only."
echo ""
echo "The 'intune:link' script is OK - only dependencies are checked."
echo ""
echo "Please remove the @mattermost/intune entry from dependencies."
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
exit 1
fi
echo "✅ package.json is clean (no Intune in dependencies)"
- name: Check for package-lock.json Intune reference
run: |
if grep -q "@mattermost/intune" package-lock.json 2>/dev/null; then
echo ""
echo "❌ ERROR: package-lock.json contains @mattermost/intune"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The Intune library should NOT be in package-lock.json."
echo ""
echo "Please run: npm install (without INTUNE_ENABLED set)"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
exit 1
fi
echo "✅ package-lock.json is clean (no Intune reference)"
- name: Check Info.plist for Intune configuration
run: |
if grep -q "IntuneMAMSettings\|msauth\.com\.microsoft\.intunemam\|mattermost-intunemam\|mmauthbeta-intunemam\|intunemam-mtd\|msauthv2\|msauthv3" ios/Mattermost/Info.plist; then
echo ""
echo "❌ ERROR: Info.plist contains Intune configuration"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The Info.plist should NOT contain Intune-specific settings."
echo "Intune configuration is applied by Fastlane during internal builds only."
echo ""
echo "Please restore the OSS version:"
echo ""
echo " git checkout main -- ios/Mattermost/Info.plist"
echo ""
echo "Or run: npm run intune:disable"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
exit 1
fi
echo "✅ Info.plist is clean (no Intune configuration)"
- name: Check entitlements for Intune keychain groups
run: |
if grep -q "com\.microsoft\.adalcache\|com\.microsoft\.intune\.mam\|\.intunemam" ios/Mattermost/Mattermost.entitlements 2>/dev/null; then
echo ""
echo "❌ ERROR: Mattermost.entitlements contains Intune keychain groups"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The entitlements should NOT contain Intune-specific keychain groups."
echo "Intune keychain groups are added by Fastlane during internal builds only."
echo ""
echo "Please restore the OSS version:"
echo ""
echo " git checkout main -- ios/Mattermost/Mattermost.entitlements"
echo ""
echo "Or run: npm run intune:disable"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
exit 1
fi
echo "✅ Mattermost.entitlements is clean (no Intune keychain groups)"
- name: Check project.pbxproj for Intune frameworks
run: |
if grep -q "MSAL\|IntuneMAM\|IntuneMAMSwift" ios/Mattermost.xcodeproj/project.pbxproj 2>/dev/null; then
echo ""
echo "❌ ERROR: project.pbxproj contains Intune framework references"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "The project.pbxproj should NOT contain Intune framework references."
echo "Intune frameworks (MSAL, IntuneMAM, IntuneMAMSwift) are added by Fastlane during internal builds only."
echo ""
echo "Please restore the OSS version:"
echo ""
echo " git checkout main -- ios/Mattermost.xcodeproj/project.pbxproj"
echo ""
echo "Or run: npm run intune:disable"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
exit 1
fi
echo "✅ project.pbxproj is clean (no Intune framework references)"

298
.gitignore vendored
View file

@ -1,117 +1,199 @@
assets/override
dist
build-ios
*.zip
server.PID
mattermost.keystore
tmp/
.env
env.d.ts
*.apk
*.aab
*.ipa
# Sorted combined gitignore from .gitignore and .gitignore_my
*/**/compass-icons.ttf
# OSX
#
.DS_Store
# Xcode
#
ios/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.xcuserstate
project.xcworkspace
ios/Pods
.podinstall
ios/.xcode.env.local
# Android/IntelliJ
#
.idea
.gradle
local.properties
*.iml
*.hprof
.cxx/
*.keystore
!build/notice-file
!debug.keystore
android/app/bin
android/app/build
android/build
.settings
.project
.classpath
# node.js
#
node_modules/
npm-debug.log
.npminstall
yarn-error.log
.yarninstall
# Vim
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~
tags
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/
**/fastlane/report.xml
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
!gradle-wrapper.jar
!gradle-wrapper.properties
!libraries/@mattermost/intune/.gitkeep
!src/**/build/
**/build/
**/fastlane/.env
**/fastlane/Preview.html
**/fastlane/report.xml
**/fastlane/screenshots
**/fastlane/test_output
**/fastlane/.env
# Sentry
android/sentry.properties
ios/sentry.properties
# Testing
.nyc_output
coverage
.tmp
# E2E testing
mattermost-license.txt
*.aab
*.apk
*.hmap
*.hprof
*.iml
*.ipa
*.jks
*.jsbundle
*.keystore
*.lcov
*.log
*.mattermost-license
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
*.pid
*.pid.lock
*.seed
*.tgz
*.tsbuildinfo
*.un~
*.xccheckout
*.xcscmblueprint
*.xcuserstate
*.zip
*/**/compass-icons.ttf
*~
.AppleDB
.AppleDesktop
.AppleDouble
.DS_Store
.DocumentRevisions-V100
.LSOverride
.Spotlight-V100
.TemporaryItems
.Trash-*
.Trashes
.VolumeIcon.icns
._*
.aider*
.apdisk
.buckconfig.local
.buckd/
.buckversion
.bundle
.cache
.cache/
.classpath
.claude/settings.local.json
.com.apple.timemachine.donotpresent
.cxx/
.directory
.docusaurus
.dynamodb/
.env
.env.development.local
.env.local
.env.production.local
.env.test.local
.eslintcache
.expo
.externalNativeBuild/
.fakebuckversion
.fseventsd
.fuse_hidden*
.fusebox/
.gradle
.gradle/
.gradletasknamecache
.grunt
.idea
.idea/
.lock-wscript
.metro-health-check*
.netrwhist
.next
.nfs*
.node_repl_history
.npm
.npminstall
.nuxt
.nyc_output
.parcel-cache
.pnp.*
.pnpm-debug.log*
.podinstall
.project
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
.scannerwork
.serverless/
.settings
.stylelintcache
.temp
.tern-port
.tmp
.tsbuildinfo.precommit
.vscode/*
!.vscode/launch.json
!.vscode/settings.json
.vscode-test
.vuepress/dist
.yarn-integrity
.yarn/build-state.yml
.yarn/cache
.yarn/install-state.gz
.yarn/unplugged
.yarninstall
DerivedData
Icon
Network Trash Folder
Session.vim
Temporary Items
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
__generated__
android/app/bin
android/app/build
android/app/src/main/res/raw/*
android/build
android/sentry.properties
assets/override
bower_components
buck-out/
build-ios
build/Release
captures/
coverage
deploymentTargetDropDown.xml
detox/artifacts
detox/detox_pixel_*
dist
env.d.ts
google-services.json
gradle-app.setting
ios/.xcode.env.local
ios/Pods
ios/build/*
ios/sentry.properties
jspm_packages/
lerna-debug.log*
lib-cov
libraries/**/**/.build
libraries/**/**/build
libraries/@mattermost/intune/*
local.properties
logs
mattermost-license.txt
mattermost.keystore
misc.xml
node_modules/
node_modules/@mattermost/intune
npm-debug.log
npm-debug.log*
out
output.json
pids
project.xcworkspace
render.experimental.xml
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
server.PID
tags
tmp/
web_modules/
xcuserdata
xcuserdata/
yarn-debug.log*
yarn-error.log
yarn-error.log*
# Bundle artifact
*.jsbundle
.bundle
#editor-settings
.vscode
.scannerwork
launch.json
# Notice.txt generation
!build/notice-file
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
# 새로 적용된 .gitignore 규칙에 의해 무시되었으나, 기존 프로젝트에서 관리(Tracking)되고 있던 필수 파일들 예외 처리
!android/app/debug.keystore
!android/app/google-services.json
!build/notice-file/Readme.md
!build/notice-file/config.yaml
!env.d.ts
!fastlane/screenshots/README.txt

11
.gitmodules vendored Normal file
View file

@ -0,0 +1,11 @@
# Intune MAM library submodule (private repository - internal builds only)
# To pin to a specific tag/commit:
# cd libraries/@mattermost/intune
# git checkout <tag-or-commit>
# cd ../..
# git add libraries/@mattermost/intune
# git commit -m "Update Intune submodule to <version>"
[submodule "libraries/@mattermost/intune"]
path = libraries/@mattermost/intune
url = git@github.com:mattermost/mattermost-mobile-intune.git

View file

@ -1,4 +1 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
sh ./scripts/pre-commit.sh

3
.kilocode/rules/rules.md Normal file
View file

@ -0,0 +1,3 @@
# 필수 준수 사항
- agent-ops/rules/global.md 파일을 읽고 이에 대해 꼭 준수해서 진행해야한다.
- global.md 내용을 모르면 추정하지 말고 먼저 해당 파일을 확인한다.

View file

@ -0,0 +1 @@
-

View file

@ -0,0 +1 @@
-

View file

@ -0,0 +1 @@
-

View file

@ -0,0 +1 @@
-

View file

@ -0,0 +1 @@
-

View file

@ -0,0 +1 @@
-

View file

@ -1 +1 @@
18.17
22.14.0

2
.nvmrc
View file

@ -1 +1 @@
18.17
22.14.0

View file

@ -1 +1 @@
2.7.8
3.2.0

View file

@ -32,14 +32,14 @@
{
"rule": "cli",
"binary": "ruby",
"semver": ">=2.7.1 <3.0.0",
"semver": ">=3.2.0",
"error": "visit rvm install https://rvm.io/rvm/install",
"platform": "darwin"
},
{
"rule": "cli",
"binary": "pod",
"semver": "1.12.1",
"semver": "1.16.1",
"platform": "darwin"
}
],

31
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,31 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Metro: Start",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "bash",
"runtimeArgs": [
"-c",
"lsof -ti:8081 | xargs kill -9 2>/dev/null; npm start"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"name": "Android: Run App",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "bash",
"runtimeArgs": [
"-c",
"adb devices | grep -q emulator || (emulator -avd Pixel_7_Pro &); adb -e wait-for-device && npm run android -- --deviceId emulator-5554"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

17
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,17 @@
{
"react-native.packager.port": 8081,
"terminal.integrated.env.osx": {
"NVM_DIR": "${env:HOME}/.nvm",
"JAVA_HOME": "/opt/homebrew/opt/openjdk@17",
"ANDROID_HOME": "${env:HOME}/Library/Android/sdk",
"ANDROID_SDK_ROOT": "${env:HOME}/Library/Android/sdk"
},
"terminal.integrated.profiles.osx": {
"zsh": {
"path": "/bin/zsh",
"args": ["-l"]
}
},
"terminal.integrated.defaultProfile.osx": "zsh",
"npm.scriptExplorerAction": "run"
}

3
AGENTS.md Normal file
View file

@ -0,0 +1,3 @@
# 필수 준수 사항
- agent-ops/rules/global.md 파일을 읽고 이에 대해 꼭 준수해서 진행해야한다.
- global.md 내용을 모르면 추정하지 말고 먼저 해당 파일을 확인한다.

209
Agent-Ops-SKILL.md Normal file
View file

@ -0,0 +1,209 @@
---
name: scaffold-agent-ops
description: 프로젝트 상태를 판별하고 에이전트 진입 파일과 agent-ops 기본 스캐폴드를 생성하기 위한 초기 규칙
version: 1.0.0
---
# 목적
이 스킬은 프로젝트에 Agent-Ops 구조가 없거나 불완전할 때,
현재 프로젝트 상태를 분석하여 다음을 세팅한다.
1. 에이전트 진입 파일
2. agent-ops 기본 폴더 구조
3. global rule
4. domain rule 템플릿
5. skill router
6. skill 템플릿
7. 초기 domain / skill 세팅
이 스킬은 과도한 초기 생성보다
"현재 프로젝트에 맞는 최소 스캐폴드" 생성을 우선한다.
# 핵심 원칙
- 기존 구조를 우선한다.
- 새 파일 생성은 꼭 필요한 최소 범위로 제한한다.
- 에이전트별 md는 얇은 진입점으로 둔다.
- 실제 규칙은 agent-ops 아래로 모은다.
- 도메인은 발명하지 말고 현재 구조에서 발견한다.
- 처음에는 핵심 도메인만 생성한다.
- 반복되는 작업만 초기 skill로 만든다.
- 불확실한 내용은 후보로 제시한다.
# 상태 판별
## 신규 프로젝트
다음 조건이 많으면 신규 프로젝트로 본다.
- 코드/폴더 구조가 단순하다
- 도메인 경계가 아직 약하다
- Agent-Ops 관련 파일이 없다
- 반복 작업 패턴이 아직 적다
## 운영중 프로젝트
다음 조건이 많으면 운영중 프로젝트로 본다.
- 모듈/폴더/패키지 경계가 보인다
- 반복 작업이 드러난다
- 기존 규칙/문서/관례의 흔적이 있다
- 핵심 책임 경계가 식별된다
# 생성 대상
이 스킬은 아래 구조를 기준으로 scaffold를 제안하거나 생성한다.
- CLAUDE.md
- GEMINI.md
- .cursorrules
- agent-ops/rules/global.md
- agent-ops/rules/_templates/domain-rule-template.md
- agent-ops/rules/domain/<domain>/rules.md
- agent-ops/skills/router.md
- agent-ops/skills/_templates/skill-template.md
필요 시 아래 초기 skill도 함께 제안한다.
- agent-ops/skills/find-domain/SKILL.md
- agent-ops/skills/code-change/SKILL.md
# 에이전트 진입 파일 원칙
CLAUDE.md, GEMINI.md, .cursorrules 는 공통적으로 얇게 유지한다.
각 파일에는 아래만 둔다.
- 응답 언어
- 기존 구조 우선
- 새 파일 생성보다 기존 수정 우선
- 작업 전 agent-ops/skills/router.md 참조
- 관련 rule / skill 만 최소 로드
- 세부 규칙은 agent-ops 아래 파일을 따른다
각 에이전트 진입 파일에 프로젝트별 상세 규칙을 중복 작성하지 않는다.
# Rule 구조 원칙
## global.md
전 프로젝트 공통 규칙만 둔다.
포함 항목:
- 응답 언어
- 기존 구조 우선
- 새 파일 생성보다 기존 수정 우선
- 코드 변경 전 관련 domain rule 확인
- 요청 범위를 넘는 변경 금지
- 불확실하면 단정하지 말고 후보 제시
- 플랫폼 특화 규칙은 global에 두지 않음
## domain rule
각 도메인 rules.md 는 아래만 둔다.
- 목적 / 책임
- 포함 경로
- 제외 경로
- 주요 구성 요소
- 유지할 패턴
- 다른 도메인과의 경계
- 금지 사항
# DDD 기준
도메인은 아래 기준으로 분류한다.
## Core Domain
핵심 가치와 주요 유즈케이스를 담당하는 영역
## Supporting Domain
핵심 도메인을 지원하는 영역
## Generic / Common
여러 도메인이 공통으로 사용하는 범용 영역
도메인은 반드시 실제 폴더, 모듈, 패키지, 네임스페이스, 책임 경계와 연결되어야 한다.
# Skill 구조 원칙
## router.md
router.md 는 작업 유형에 따라 필요한 skill 또는 domain rule만 로드하게 한다.
최소 라우팅 축:
- 구조 분석 / 스캐폴드
- 도메인 판별
- 코드 변경
- 흐름 추적
- 문서/릴리즈 정리
처음부터 너무 많은 분기를 만들지 않는다.
## skill-template.md
각 skill 은 아래 형식을 따른다.
- 목적
- 언제 호출할지
- 입력
- 먼저 확인할 것
- 실행 절차
- 출력 형식
- 금지 사항
# 신규 프로젝트 처리
신규 프로젝트일 때는 템플릿 중심으로 세팅한다.
1. 언어/구조를 확인한다.
2. 에이전트 진입 파일 3개를 얇게 생성한다.
3. agent-ops/rules/global.md 생성
4. domain-rule-template.md 생성
5. skills/router.md 생성
6. skill-template.md 생성
7. 핵심 domain placeholder 2~4개만 제안
8. 초기 skill 은 최소 2개만 제안한다.
신규 프로젝트에서는 domain rules 를 과도하게 채우지 않는다.
# 운영중 프로젝트 처리
운영중 프로젝트일 때는 현재 구조 기반으로 자동 채움한다.
1. 구조를 분석한다.
2. Core / Supporting / Generic 도메인 후보를 식별한다.
3. 실제 경로를 반영한 domain rules 초안을 제안한다.
4. 반복 작업 기반으로 필요한 초기 skill 을 제안한다.
5. router.md 에 기본 라우팅을 채운다.
6. 신규 프로젝트보다 한 단계 더 구체적으로 scaffold 한다.
운영중 프로젝트에서는 실제 코드 구조에 맞는 domain / skill 을 일부 채워 넣는다.
# 출력 형식
## 상태 판별
- Agent-Ops 상태: 없음 / 부분 적용 / 운영중
- 프로젝트 상태: 신규 / 운영중
- 근거: 짧게 요약
## 스캐폴드 계획
- 생성할 파일
- 바로 채울 파일
- placeholder 로 둘 파일
## 도메인 제안
- Core Domain
- Supporting Domain
- Generic / Common
## 초기 skill 제안
- skill 이름
- 필요한 이유
## 주의사항
- 지금 만들지 말아야 할 것
- 아직 확정하면 안 되는 것
# 금지
- 플랫폼 전용 규칙을 기본 scaffold 에 넣지 않는다.
- agent 별 md 에 상세 규칙을 중복 작성하지 않는다.
- 실제 구조보다 앞선 추상 구조를 강요하지 않는다.
- 처음부터 많은 domain / skill 을 만들지 않는다.
- scaffold 단계에서 불필요한 세부 구현까지 생성하지 않는다.

172
CLAUDE-IOS-SIMULATOR.md Normal file
View file

@ -0,0 +1,172 @@
# iOS Simulator Setup Guide for AI Agents
This guide documents the process for setting up and running the Mattermost Mobile app on an iOS simulator.
## Prerequisites Check
Before starting, verify these are installed:
```bash
# Check Xcode
xcodebuild -version
# Check CocoaPods
pod --version
# Check Node.js
node --version
# Check npm dependencies
test -d node_modules && echo "node_modules exists" || echo "Run: npm install"
```
## Step 1: iOS Simulator Runtime
Check if iOS simulators are available:
```bash
xcrun simctl list devices available
```
If no devices are listed or you see "Install Started", you need to download the iOS platform:
```bash
xcodebuild -downloadPlatform iOS
```
**Note:** This downloads ~8GB and takes several minutes. The command runs in the foreground and shows progress.
## Step 2: CocoaPods Installation
### Critical: Set UTF-8 Encoding
CocoaPods requires UTF-8 encoding. Always set this before running pod commands:
```bash
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
```
### Install Pods (Apple Silicon Mac)
```bash
cd ios
RCT_NEW_ARCH_ENABLED=0 arch -x86_64 pod install
```
### Common CocoaPods Issues
#### Issue: "Unicode Normalization not appropriate for ASCII-8BIT"
**Solution:** Set UTF-8 encoding as shown above.
#### Issue: Podfile.lock version conflicts
**Solution:** Clean install:
```bash
cd ios
rm -rf Pods Podfile.lock build
export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8
RCT_NEW_ARCH_ENABLED=0 arch -x86_64 pod install
```
#### Issue: GitHub SSH timeouts during pod install
**Symptom:** Errors like "Connection to github.com port 22: Operation timed out"
**Solution:** Temporarily configure git to use HTTPS instead of SSH:
```bash
git config --global url."https://github.com/".insteadOf git@github.com:
```
**IMPORTANT:** Revert this after pod install completes, or the user won't be able to push:
```bash
git config --global --unset url.https://github.com/.insteadof
```
**Warning:** Never leave git URL rewrites in place without informing the user!
## Step 3: Start Metro Bundler (if not already running)
```bash
npm start
```
Wait for "Dev server ready" message before proceeding.
## Step 4: Run iOS App (if not already built)
### Using npm script
```bash
npm run ios -- --simulator="iPhone 17 Pro"
```
### Or specify a different simulator
List available simulators first:
```bash
xcrun simctl list devices available | grep -E "iPhone|iPad"
```
Then run with your chosen device:
```bash
npm run ios -- --simulator="iPhone 16e"
```
## Build Times
- **First build:** 10-30 minutes (compiles all native code)
- **Subsequent builds:** Much faster (incremental)
- **JS/TS changes:** ~3 seconds hot reload (no native rebuild needed)
## Troubleshooting Build Failures
### Getting Better Error Messages
If `npm run ios` fails, run xcodebuild directly for clearer errors:
```bash
xcodebuild -workspace ios/Mattermost.xcworkspace \
-configuration Debug \
-scheme Mattermost \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
2>&1 | grep -E "error:|fatal error"
```
### Clean Build
If builds fail mysteriously, try a clean build:
```bash
# Clean Xcode derived data
rm -rf ~/Library/Developer/Xcode/DerivedData/Mattermost-*
# Clean and reinstall pods
cd ios
rm -rf Pods build
export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8
RCT_NEW_ARCH_ENABLED=0 arch -x86_64 pod install
```
### Opening in Xcode
For complex build issues, open in Xcode for better debugging:
```bash
open ios/Mattermost.xcworkspace
```
Then select your simulator target and press Cmd+B to build.
## Quick Reference
```bash
# Full setup sequence (Apple Silicon)
export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8
cd ios && RCT_NEW_ARCH_ENABLED=0 arch -x86_64 pod install && cd ..
npm start &
sleep 10
npm run ios -- --simulator="iPhone 17 Pro"
```
## Do NOT Modify
- **Git configuration:** Never permanently change git URL rewrites without reverting
- **Podfile:** Don't add modular_headers to pods unless you understand the implications
- **New Architecture:** Keep `RCT_NEW_ARCH_ENABLED=0` as the project uses the old architecture

3
CLAUDE.md Normal file
View file

@ -0,0 +1,3 @@
# 필수 준수 사항
- agent-ops/rules/global.md 파일을 읽고 이에 대해 꼭 준수해서 진행해야한다.
- global.md 내용을 모르면 추정하지 말고 먼저 해당 파일을 확인한다.

3
GEMINI.md Normal file
View file

@ -0,0 +1,3 @@
# 필수 준수 사항
- agent-ops/rules/global.md 파일을 읽고 이에 대해 꼭 준수해서 진행해야한다.
- global.md 내용을 모르면 추정하지 말고 먼저 해당 파일을 확인한다.

4
Gemfile Normal file
View file

@ -0,0 +1,4 @@
source "https://rubygems.org"
gem "cocoapods", "1.16.1"
gem "rexml", ">= 3.4.2"

View file

@ -1,30 +1,41 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.5)
CFPropertyList (3.0.7)
base64
nkf
rexml
activesupport (6.1.7.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
activesupport (7.2.2.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
atomos (0.1.3)
base64 (0.2.0)
benchmark (0.4.0)
bigdecimal (3.1.8)
claide (1.1.0)
cocoapods (1.11.3)
cocoapods (1.16.1)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.11.3)
cocoapods-core (= 1.16.1)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 1.4.0, < 2.0)
cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.4.0, < 2.0)
cocoapods-trunk (>= 1.6.0, < 2.0)
cocoapods-try (>= 1.1.0, < 2.0)
colored2 (~> 3.1)
escape (~> 0.0.4)
@ -32,10 +43,10 @@ GEM
gh_inspector (~> 1.0)
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 1.0, < 3.0)
xcodeproj (>= 1.21.0, < 2.0)
cocoapods-core (1.11.3)
activesupport (>= 5.0, < 7)
ruby-macho (>= 2.3.0, < 3.0)
xcodeproj (>= 1.26.0, < 2.0)
cocoapods-core (1.16.1)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
concurrent-ruby (~> 1.1)
@ -45,7 +56,7 @@ GEM
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.6.3)
cocoapods-downloader (2.1)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
@ -54,44 +65,49 @@ GEM
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored2 (3.1.2)
concurrent-ruby (1.1.10)
concurrent-ruby (1.3.4)
connection_pool (2.4.1)
drb (2.2.1)
escape (0.0.4)
ethon (0.16.0)
ffi (>= 1.15.0)
ffi (1.15.5)
ffi (1.17.0)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
httpclient (2.8.3)
i18n (1.12.0)
i18n (1.14.6)
concurrent-ruby (~> 1.0)
json (2.6.3)
minitest (5.17.0)
json (2.9.0)
logger (1.6.3)
minitest (5.25.4)
molinillo (0.8.0)
nanaimo (0.3.0)
nanaimo (0.4.0)
nap (1.1.0)
netrc (0.11.0)
nkf (0.2.0)
public_suffix (4.0.7)
rexml (3.2.5)
rexml (3.4.4)
ruby-macho (2.5.1)
typhoeus (1.4.0)
securerandom (0.4.0)
typhoeus (1.4.1)
ethon (>= 0.9.0)
tzinfo (2.0.5)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
xcodeproj (1.22.0)
xcodeproj (1.27.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.3.0)
rexml (~> 3.2.4)
zeitwerk (2.6.6)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
PLATFORMS
ruby
DEPENDENCIES
cocoapods (= 1.11.3)
cocoapods (= 1.16.1)
rexml (>= 3.4.2)
BUNDLED WITH
2.3.26
2.5.11

1437
NOTICE.txt

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
# Mattermost Mobile v2
- **Minimum Server versions:** Current ESR version (8.1.0+)
- **Supported iOS versions:** 12.4+
- **Minimum Server versions:** Current ESR version (10.11.0+)
- **Supported iOS versions:** 16.0+
- **Supported Android versions:** 7.0+
Mattermost is an open source Slack-alternative used by thousands of companies around the world in 21 languages. Learn more at [https://mattermost.com](https://mattermost.com).
@ -12,6 +12,34 @@ We plan on releasing monthly updates with new features - check the [changelog](h
**Important:** If you self-compile the Mattermost Mobile apps you also need to deploy your own [Mattermost Push Notification Service](https://github.com/mattermost/mattermost-push-proxy/releases).
# Android 16KB Page Size Support
**Temporary Requirement:** To comply with Google Play's 16KB page size requirement for Android devices, this project includes a compatibility patch that must be applied before building for Android.
### When to Apply the Patch
- **CI/CD Builds:** The patch is automatically applied in GitHub Actions for Android builds
- **Local Development:** If you're building Android locally and encounter 16KB page size related issues, run:
```bash
npm run apply-16kb-pagesize-patch
```
This script will:
1. Update package dependencies to compatible versions
2. Apply necessary code changes for 16KB page size support
3. Update patch files for modified dependencies
4. Regenerate `package-lock.json`
### ⚠️ Important Warnings
- **DO NOT commit the changes** applied by this patch to the repository
- **These changes will break iOS builds** if committed
- The patch is designed to be applied only during Android CI builds
- For local development, revert all changes after building Android
**Note:** This is a temporary solution until all dependencies natively support 16KB page sizes.
# How to Contribute
### Testing
@ -19,7 +47,7 @@ We plan on releasing monthly updates with new features - check the [changelog](h
To help with testing app updates before they're released, you can:
1. Sign up to be a beta tester
- [Android](https://play.google.com/apps/testing/com.mattermost.rnbeta)
- [Android](https://play.google.com/apps/testing/com.tokilabs.mattermost)
- [iOS](https://testflight.apple.com/join/Q7Rx7K9P) - Open this link from your iOS device
2. Install the `Mattermost Beta` app. New updates in the Beta app are released periodically. You will receive a notification when the new updates are available.
3. File any bugs you find by filing a [GitHub issue](https://github.com/mattermost/mattermost-mobile/issues) with:
@ -31,7 +59,7 @@ To help with testing app updates before they're released, you can:
- Join the [Native Mobile Apps channel](https://community.mattermost.com/core/channels/native-mobile-apps) to see what's new and discuss feedback with other contributors and the core team
You can leave the Beta testing program at any time:
- On Android, [click this link](https://play.google.com/apps/testing/com.mattermost.rnbeta) while logged in with your Google Play email address used to opt-in for the Beta program, then click **Leave the program**.
- On Android, [click this link](https://play.google.com/apps/testing/com.tokilabs.mattermost) while logged in with your Google Play email address used to opt-in for the Beta program, then click **Leave the program**.
- On iOS, access the `Mattermost Beta` app page in TestFlight and click **Stop Testing**.
### Contribute Code

View file

@ -0,0 +1,32 @@
---
name: <domain-name>
description: <도메인 설명>
type: core | supporting | generic
---
# <Domain Name>
## 목적 / 책임
< 도메인이 담당하는 핵심 책임>
## 포함 경로
- `app/<path>/`
- `app/actions/local/<file>.ts`
- `app/actions/remote/<file>.ts`
## 제외 경로
- < 도메인에 속하지 않는 경로>
## 주요 구성 요소
- **<component>**: <역할>
- **<component>**: <역할>
## 유지할 패턴
- < 도메인에서 따라야 패턴>
## 다른 도메인과의 경계
- **database 도메인**: DB 조작은 database 도메인 패턴을 따른다
- **network 도메인**: API 호출은 ClientMix 패턴을 따른다
## 금지 사항
- < 도메인에서 하면 되는 >

View file

@ -0,0 +1,46 @@
---
name: database
description: WatermelonDB 이중 DB 시스템 - 앱 DB와 서버별 DB
type: supporting
---
# Database Domain
## 목적 / 책임
WatermelonDB 기반 이중 데이터베이스를 관리한다. DatabaseManager 싱글톤, operator, 스키마, 모델을 담당한다.
## 포함 경로
- `app/database/` (전체)
- `app/database/manager/` - DatabaseManager 싱글톤
- `app/database/models/app/` - 앱 전역 모델 (서버 목록 등)
- `app/database/models/server/` - 서버별 모델 (채널, 유저, 포스트 등)
- `app/database/operator/` - 데이터 쓰기 operator
- `app/database/schema/` - DB 스키마 정의
- `docs/database/` - DB 스키마 문서
## 제외 경로
- `app/queries/` (Query Layer는 별도 - 여기서 DB를 읽는다)
## 주요 구성 요소
- **DatabaseManager**: 모든 DB 인스턴스 관리 싱글톤 (`app/database/manager/index.ts`)
- **App Database**: 서버 목록 등 전역 앱 상태 (하나만 존재)
- **Server Database**: 서버별 채널/유저/포스트 데이터 (서버당 하나)
- **Operators**: transformer/handler/comparator 패턴으로 데이터 쓰기
- **Schema**: 테이블 정의 및 마이그레이션
## 유지할 패턴
- DB 경로: iOS는 App Group, Android는 `${documentDirectory}/databases/`
- Operator를 통해 batch 작업으로 데이터 쓰기
- Sync handler는 create/update/delete 전체 라이프사이클 처리 필수
- 스키마 변경 시 반드시 버전 번호 증가 + 문서(`docs/database/`) 업데이트
- Query Layer(`app/queries/`)는 `query*`, `observe*`, `get*`, `prepare*` 패턴
## 다른 도메인과의 경계
- **모든 도메인**: DB 직접 접근보다 Query Layer(`app/queries/`) 사용 권장
- **network 도메인**: remote action이 API 응답을 operator에 전달
## 금지 사항
- 스키마 변경 후 `docs/database/` 문서 미업데이트
- Sync handler에서 stale 레코드 삭제 누락 (`prepareDestroyPermanently()` 필수)
- 테스트에서 `extraLokiOptions: {autosave: false}` 누락 (메모리 누수)
- 테스트 후 `DatabaseManager.destroyServerDatabase()` cleanup 누락

View file

@ -0,0 +1,45 @@
---
name: messaging
description: 채널, 포스트, 스레드, 드래프트 등 핵심 메시징 기능
type: core
---
# Messaging Domain
## 목적 / 책임
Mattermost의 핵심 메시징 기능: 채널, 포스트, 스레드, 리액션, 드래프트, 예약 포스트를 담당한다.
## 포함 경로
- `app/actions/local/channel.ts`, `post.ts`, `thread.ts`, `draft.ts`, `reactions.ts`, `scheduled_post.ts`
- `app/actions/remote/channel.ts`, `post.ts`, `thread.ts`, `reactions.ts`, `search.ts`
- `app/queries/servers/channel.ts`, `post.ts`, `thread.ts`, `drafts.ts`, `scheduled_post.ts`, `reaction.ts`
- `app/database/models/server/channel*.ts`, `post.ts`, `thread*.ts`, `draft.ts`, `reaction.ts`, `scheduled_post.ts`
- `app/screens/channel/`, `app/screens/thread/`, `app/screens/edit_post/`
- `app/components/post_list/`, `app/components/post_draft/`
## 제외 경로
- `app/products/` (products는 각 product 도메인)
- `app/actions/remote/user.ts` (user 도메인)
## 주요 구성 요소
- **Channel**: 채널 CRUD, 멤버십, 카테고리 관리
- **Post**: 포스트 생성/수정/삭제, 파일 첨부, 리액션
- **Thread**: 스레드 팔로우, 언급, 참여자 관리
- **Draft**: 임시저장, 예약 포스트
- **Search**: 채널/포스트 검색
## 유지할 패턴
- Remote action: `fetchXxx()` → API 호출 → operator로 DB 저장 → `{error}` 반환
- Local action: DB 조작만 수행
- Sync handler는 create/update/delete 전체 라이프사이클을 처리한다
- `fetchMissingProfilesByIds()` 사용 - 직접 `client.getProfilesByIds()` 호출 금지
## 다른 도메인과의 경계
- **database 도메인**: WatermelonDB 스키마 변경 시 `docs/database/server/server.md` 업데이트 필요
- **network 도메인**: API 호출은 `client/rest.ts`의 ClientMix 패턴 사용
- **ui 도메인**: 화면 렌더링은 ui 도메인, 데이터 로직은 이 도메인
## 금지 사항
- `console.error()` / `console.log()` 직접 사용 (→ `logError()`, `logDebug()` 사용)
- `TouchableOpacity` 사용 (→ `Pressable` 사용)
- DB sync handler에서 삭제 누락 (stale 레코드는 `prepareDestroyPermanently()` 처리)

View file

@ -0,0 +1,49 @@
---
name: products-agents
description: AI 에이전트 기능 - WebSocket 스트리밍, AI 봇, 툴 호출
type: core
---
# Products/Agents Domain
## 목적 / 책임
AI 에이전트 기능을 담당한다. WebSocket 스트리밍, AI 봇 관리, 툴 호출/승인, 어노테이션을 처리한다.
## 포함 경로
- `app/products/agents/` (전체)
- `app/products/agents/actions/`
- `app/products/agents/client/rest.ts`
- `app/products/agents/components/`
- `app/products/agents/constants.ts`
- `app/products/agents/hooks/`
- `app/products/agents/screens/`
- `app/products/agents/store/`
- `app/products/agents/types/`
- `app/products/agents/websocket/`
## 제외 경로
- `app/actions/remote/` (messaging 도메인)
- `app/products/calls/` (calls 도메인)
## 주요 구성 요소
- **WebSocket Handler**: `custom_mattermost-ai_postupdate` 이벤트 처리 (start, message, reasoning, tool_call, annotation, end)
- **Streaming Store**: 스트리밍 중 ephemeral 상태 관리
- **AI Bot**: AI 봇 목록 조회 및 DB 동기화 (`handleAIBots`)
- **Tool Call**: 툴 호출 승인/거절 처리
- **Client (ClientMix)**: `app/products/agents/client/rest.ts`
## 유지할 패턴
- **WebSocket 스트리밍**: `ENDED` 이벤트에서 로컬 스트리밍 상태를 반드시 초기화 (stale state 방지)
- **ClientMix 패턴**: API 호출은 `client/rest.ts` 내에서만 수행, action에서 직접 `doFetch()` 금지
- **PostType 추가 시**: `types/api/posts.d.ts``PostType` union에 타입 추가
- **Sync handler**: create/update/delete 모두 처리 (`prepareDestroyPermanently()` 필수)
## 다른 도메인과의 경계
- **messaging 도메인**: 포스트 데이터는 `POST_EDITED` WebSocket 이벤트로 수신
- **database 도메인**: Agents 전용 DB 모델 사용
- **network 도메인**: ClientMix를 통해 NetworkManager와 연결
## 금지 사항
- 툴 호출 상태 변경을 별도 WebSocket 이벤트로 처리 (→ `POST_EDITED`로 수신)
- `ENDED` 이벤트 후 스트리밍 상태 미초기화
- action 파일에서 직접 `client.doFetch()` 호출

View file

@ -0,0 +1,41 @@
---
name: products-calls
description: 음성/화상 통화 기능
type: core
---
# Products/Calls Domain
## 목적 / 책임
음성/화상 통화 기능을 담당한다. 통화 연결, 상태 관리, UI를 처리한다.
## 포함 경로
- `app/products/calls/` (전체)
- `app/products/calls/actions/`
- `app/products/calls/client/rest.ts`
- `app/products/calls/components/`
- `app/products/calls/constants.ts`
- `app/products/calls/hooks/`
- `app/products/calls/screens/`
- `app/products/calls/store/`
- `app/products/calls/types/`
## 제외 경로
- `app/products/agents/` (agents 도메인)
- `app/products/playbooks/` (playbooks 도메인)
## 주요 구성 요소
- **Call Connection**: WebRTC 기반 통화 연결 관리
- **Call State**: Ephemeral store로 통화 상태 관리
- **Client (ClientMix)**: `app/products/calls/client/rest.ts`
## 유지할 패턴
- **ClientMix 패턴**: API 호출은 `client/rest.ts` 내에서만 수행
- **Ephemeral Store**: 통화 상태는 ephemeral store로 관리 (DB 아님)
## 다른 도메인과의 경계
- **messaging 도메인**: 채널 정보는 messaging 도메인 쿼리 사용
- **network 도메인**: ClientMix를 통해 NetworkManager와 연결
## 금지 사항
- action 파일에서 직접 `client.doFetch()` 호출

View file

@ -0,0 +1,53 @@
---
name: ui
description: 컴포넌트, 스크린, 네비게이션, 스타일링
type: generic
---
# UI Domain
## 목적 / 책임
React Native UI 컴포넌트, 스크린, 네비게이션, 스타일링을 담당한다.
## 포함 경로
- `app/components/` - 재사용 컴포넌트
- `app/screens/` - 화면 단위 컴포넌트
- `app/hooks/` - 공통 React hooks
- `app/utils/` - UI 유틸리티
- `share_extension/` - Android 공유 확장 (React Navigation 사용)
## 제외 경로
- `app/products/*/components/` (각 product 도메인)
- `app/actions/` (비즈니스 로직은 messaging/product 도메인)
## 주요 구성 요소
- **Navigation**: `react-native-navigation` v7 (메인 앱), `React Navigation` (share extension)
- **Components**: 60+ 재사용 컴포넌트
- **Screens**: 63+ 화면 컴포넌트 (각각 독립 등록)
- **Themes**: `PREFERENCES.THEMES` 상수 사용
## 유지할 패턴
- `Pressable` 사용 (→ `TouchableOpacity` 금지), 항상 pressed 피드백 추가
- `typography()` 사용 (→ raw `fontSize`/`fontWeight`/`fontFamily` 금지)
- `makeStyleSheetFromTheme` 사용 시 `StyleSheet.create` 불필요
- `getStyleSheet` 는 파일 상단(imports 이후)에 위치
- 정적 객체(hitSlop 등)는 모듈 레벨 상수로 추출
- `FormattedText` 사용 (→ `<Text>{intl.formatMessage(...)}</Text>` 지양)
- `useServerUrl()` hook 사용 (→ `serverUrl` prop 전달 지양)
- `usePreventDoubleTap` hook 사용 (버튼 중복 클릭 방지)
- 리스트 렌더링: 인라인 화살표 함수 금지, 자식 컴포넌트에서 ID 받아 처리
- `useDidMount` (→ `useEffect(cb, [])` 대신), `useInitialValue` (→ `useMemo(f, [])` 대신)
## 다른 도메인과의 경계
- **messaging/product 도메인**: UI는 데이터 표시만, 비즈니스 로직은 해당 도메인
- **database 도메인**: `observe*` 쿼리를 통해 반응형 데이터 구독
## 금지 사항
- `TouchableOpacity` 사용
- raw `fontSize`, `fontWeight`, `fontFamily` 스타일 직접 사용
- `Object.hasOwn()` 사용 (ES2022+, RN 미지원 → `'key' in obj` 사용)
- `Animated` API 사용 (→ `react-native-reanimated` 사용)
- `new URL()` 사용 (→ `urlParse` 사용)
- `Linking.openURL()` 직접 사용 (→ `tryOpenURL()` 사용)
- `ActivityIndicator` 직접 사용 (→ `<Loading>` 컴포넌트 사용)
- 커스텀 React 컴포넌트를 Markdown 컴포넌트 내부에 인라인 삽입

23
agent-ops/rules/global.md Normal file
View file

@ -0,0 +1,23 @@
---
name: global
description: 전 프로젝트 공통 규칙
version: 1.0.0
---
# Global Rules
## 응답 언어
- 한국어로 응답한다.
## 기존 구조 우선
- 새 파일 생성보다 기존 파일 수정을 우선한다.
- 기존 패턴과 컨벤션을 따른다.
## 코드 변경 원칙
- 코드 변경 전 관련 domain rule을 확인한다.
- 요청 범위를 넘는 변경을 금지한다.
- 불확실하면 단정하지 말고 후보로 제시한다.
## 작업 전 확인
- `agent-ops/skills/router.md` 를 먼저 참조하여 필요한 skill 또는 domain rule만 로드한다.
- 관련 rule / skill 만 최소로 로드한다.

View file

@ -0,0 +1,35 @@
---
name: <skill-name>
description: <skill 설명>
version: 1.0.0
---
# <Skill Name>
## 목적
< skill이 해결하는 문제>
## 언제 호출할지
- < skill을 사용해야 하는 상황>
- < skill을 사용해야 하는 상황>
## 입력
- `<param>`: <설명> (필수/선택)
## 먼저 확인할 것
- [ ] <사전 확인 항목>
- [ ] <사전 확인 항목>
## 실행 절차
1. <단계>
2. <단계>
3. <단계>
## 출력 형식
```
<출력 예시>
```
## 금지 사항
- <하면 되는 >
- <하면 되는 >

View file

@ -0,0 +1,48 @@
---
name: code-change
description: 코드 변경 절차 - 읽기 → 도메인 rule 확인 → 변경 → 검증
version: 1.0.0
---
# Code Change
## 목적
코드 변경 시 도메인 규칙을 준수하고 기존 패턴을 따른다.
## 언제 호출할지
- 새 기능을 추가할 때
- 버그를 수정할 때
- 기존 코드를 수정할 때
## 입력
- `변경 대상`: 파일 경로 또는 기능 설명 (필수)
- `변경 내용`: 무엇을 어떻게 변경할지 (필수)
## 먼저 확인할 것
- [ ] `find-domain` skill로 대상 도메인 판별
- [ ] 해당 domain rule 로드 (`agent-ops/rules/domain/<domain>/rules.md`)
- [ ] 변경할 파일을 Read tool로 먼저 읽기
- [ ] 기존 패턴과 컨벤션 파악
## 실행 절차
1. 대상 파일 읽기 (Read tool 사용)
2. 도메인 rule의 "유지할 패턴"과 "금지 사항" 확인
3. 변경 범위를 요청 범위로 제한 (추가 리팩터링 금지)
4. 변경 적용 (Edit tool 우선, 전면 재작성은 Write tool)
5. TypeScript 타입 확인 (`npm run tsc`)
6. 린팅 확인 (`npm run fix`)
## 출력 형식
변경 후:
```
변경 파일: <path>
변경 내용: <요약>
확인 필요: <있으면 명시>
```
## 금지 사항
- 파일을 읽기 전에 변경하지 않는다
- 요청 범위를 넘는 리팩터링, 주석 추가, 타입 어노테이션 추가
- 도메인 rule의 금지 사항 위반
- `console.log()` / `console.error()` 직접 사용
- 다른 언어 파일 수정 (`en.json` 외 i18n 파일 수정 금지)

View file

@ -0,0 +1,96 @@
---
name: create-domain-rule
description: 새로운 도메인 rules.md 파일을 생성하기 위한 범용 스킬
version: 1.0.0
---
# Create Domain Rule
## 목적
`agent-ops/rules/domain/<domain-name>/rules.md` 파일을 올바른 형식으로 생성한다.
실제 프로젝트 폴더 구조를 분석하여 경로와 구성 요소를 자동으로 채운다.
생성 후 router.md 의 코드 변경 라우팅 테이블에 항목을 추가한다.
## 언제 호출할지
- 새로운 도메인 영역의 코드를 처음 변경하기 전에
- 기존 domain rule이 없는 경로에 대해 규칙이 필요할 때
- 사용자가 특정 도메인의 rule 파일을 만들어 달라고 요청할 때
- agent-ops 초기 scaffold 이후 도메인을 추가 확장할 때
## 입력
- `domain-name`: 생성할 도메인 이름, kebab-case (필수)
- `domain-type`: `core` / `supporting` / `generic` 중 하나 (필수)
- `path-hints`: 이 도메인에 해당하는 경로 힌트 목록 (선택, 없으면 자동 탐색)
## 먼저 확인할 것
- [ ] `agent-ops/rules/domain/<domain-name>/rules.md` 가 이미 존재하는지 확인
- [ ] `agent-ops/rules/_templates/domain-rule-template.md` 를 읽어 최신 템플릿 형식 파악
- [ ] `agent-ops/rules/domain/` 하위 기존 domain rule 목록을 확인하여 중복·유사 도메인 여부 판단
## 실행 절차
1. **중복 확인**
- `agent-ops/rules/domain/<domain-name>/` 폴더 존재 여부 확인
- 책임이 겹치는 기존 domain rule 이 있으면 사용자에게 알리고 중단한다
2. **경로 탐색**
- `path-hints` 가 제공된 경우: 해당 경로를 기준으로 폴더 구조 확인
- `path-hints` 가 없는 경우: `domain-name` 과 연관된 폴더명·파일명으로 프로젝트를 탐색
- 실제로 존재하는 경로만 포함 경로에 기재한다
- 존재하지 않는 경로는 기재하지 않는다
3. **도메인 분석**
- 탐색된 경로의 주요 파일·모듈을 읽어 아래를 도출한다
- 도메인의 목적 / 책임 한 줄 요약
- 포함 경로 목록
- 제외 경로 (인접 도메인과 겹칠 수 있는 경로)
- 주요 구성 요소 (파일, 모듈, 클래스, 함수 등)
- 유지할 패턴 (네이밍 규칙, 아키텍처 패턴 등)
- 다른 도메인과의 경계
- 금지 사항
4. **rules.md 생성**
- 경로: `agent-ops/rules/domain/<domain-name>/rules.md`
- `domain-rule-template.md` 형식을 따른다
- 실제 코드에서 확인된 내용만 기재한다
- 불확실한 항목은 `<!-- TODO: 확인 필요 -->` 주석으로 남긴다
5. **router.md 업데이트**
- `agent-ops/skills/router.md` 를 읽는다
- 코드 변경 섹션의 경로-도메인 라우팅 테이블에 아래 형식으로 추가한다
```
| `<path-pattern>` | `agent-ops/rules/domain/<domain-name>/rules.md` |
```
- 경로 패턴은 실제 포함 경로를 기준으로 작성한다
- 기존 테이블 항목을 삭제하거나 재정렬하지 않는다
6. **결과 보고**
- 생성한 파일 경로
- router.md 에 추가한 항목
- 불확실하여 TODO로 남긴 항목 (해당 시)
## 출력 형식
```
## 생성 완료
- Domain Rule 경로: agent-ops/rules/domain/<domain-name>/rules.md
- 도메인 유형: <core | supporting | generic>
- router.md 추가 경로 패턴: <path-pattern>
## TODO 항목 (확인 필요)
- <불확실하여 직접 확인이 필요한 항목> (해당 시)
```
## 금지 사항
- 이미 존재하는 rules.md 를 덮어쓰지 않는다
- 실제 존재하지 않는 경로를 포함 경로에 넣지 않는다
- 추측으로 패턴이나 금지 사항을 채우지 않는다 — 확인된 내용만 기재한다
- router.md 의 기존 항목을 삭제하거나 재정렬하지 않는다
- 하나의 domain rule 에 여러 독립 도메인의 책임을 묶지 않는다
- 코드 변경을 수행하지 않는다 — 이 skill 은 rule 파일 생성만 담당한다

View file

@ -0,0 +1,83 @@
---
name: create-skill
description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬
version: 1.0.0
---
# Create Skill
## 목적
`agent-ops/skills/<skill-name>/SKILL.md` 파일을 올바른 형식으로 생성한다.
기존 skill-template.md 를 기반으로, 요청 목적에 맞는 내용을 채워 넣는다.
생성 후 router.md 에 라우팅 항목을 추가한다.
## 언제 호출할지
- 새로운 반복 작업 패턴이 생겨 skill로 정의해야 할 때
- 기존 skill이 없는 작업 유형을 처음 수행하기 전에
- 사용자가 특정 작업을 skill로 만들어 달라고 요청할 때
## 입력
- `skill-name`: 생성할 skill 이름, kebab-case (필수)
- `purpose`: 이 skill이 해결하는 문제 한 줄 요약 (필수)
- `trigger-cases`: 이 skill을 호출해야 하는 상황 목록 (선택)
## 먼저 확인할 것
- [ ] `agent-ops/skills/` 하위에 동일 이름의 디렉터리가 이미 존재하는지 확인
- [ ] `agent-ops/skills/router.md` 에 이미 유사한 라우팅 항목이 있는지 확인
- [ ] `agent-ops/skills/_templates/skill-template.md` 를 읽어 최신 템플릿 형식 파악
## 실행 절차
1. **중복 확인**
- `agent-ops/skills/<skill-name>/` 폴더 존재 여부 확인
- 기능이 겹치는 기존 skill이 있으면 사용자에게 알리고 중단한다
2. **목적 분석**
- `purpose``trigger-cases` 를 바탕으로 아래 항목을 도출한다
- 언제 호출할지 (2~4개)
- 필요한 입력 파라미터
- 사전 확인 항목
- 실행 절차 (3~7단계)
- 출력 형식
- 금지 사항
3. **SKILL.md 생성**
- 경로: `agent-ops/skills/<skill-name>/SKILL.md`
- `skill-template.md` 형식을 따른다
- 프로젝트 특화 내용보다 범용 절차를 우선한다
- 절차는 구체적이되 지나치게 세부 구현을 기술하지 않는다
4. **router.md 업데이트**
- `agent-ops/skills/router.md` 를 읽는다
- 이 skill이 속할 라우팅 축(구조 분석/코드 변경/흐름 추적 등)을 판단한다
- 해당 축에 `→ agent-ops/skills/<skill-name>/SKILL.md` 항목을 추가한다
- 기존 라우팅 구조를 깨지 않는다
5. **결과 보고**
- 생성한 파일 경로
- router.md 에 추가한 항목
- 이 skill이 다루지 않는 범위(필요 시)
## 출력 형식
```
## 생성 완료
- SKILL 경로: agent-ops/skills/<skill-name>/SKILL.md
- router.md 추가 항목: <라우팅 ><skill-name>
## 주의사항 (해당 시)
- < skill이 다루지 않는 범위 또는 주의할 >
```
## 금지 사항
- 이미 존재하는 skill 을 덮어쓰지 않는다
- 프로젝트 특화 경로(예: `app/screens/`)를 skill 본문에 하드코딩하지 않는다
- skill 생성과 무관한 코드 파일을 수정하지 않는다
- router.md 의 기존 항목을 삭제하거나 재정렬하지 않는다
- 하나의 skill 에 여러 독립적인 책임을 묶지 않는다

View file

@ -0,0 +1,40 @@
---
name: find-domain
description: 파일 경로 또는 기능으로 해당 도메인을 판별한다
version: 1.0.0
---
# Find Domain
## 목적
변경하거나 분석할 코드가 어느 도메인에 속하는지 판별한다.
## 언제 호출할지
- 어떤 파일을 수정해야 하는지 불분명할 때
- 기능이 어느 도메인에 속하는지 모를 때
- 여러 도메인에 걸친 변경이 필요한지 파악할 때
## 입력
- `경로 또는 기능 설명`: 파일 경로, 컴포넌트 이름, 또는 기능 설명 (필수)
## 먼저 확인할 것
- [ ] `agent-ops/skills/router.md`의 경로 패턴 테이블 확인
- [ ] CLAUDE.md의 TypeScript Path Aliases 섹션 확인
## 실행 절차
1. 입력이 파일 경로면 → router.md 테이블과 매칭
2. 입력이 기능 설명이면 → 관련 파일을 Glob/Grep으로 탐색
3. 도메인 후보를 식별하고 해당 domain rule 로드
4. 여러 도메인에 걸친 경우 → 주 도메인 + 영향 도메인 명시
## 출력 형식
```
도메인: <domain-name>
근거: <판별 근거>
관련 rule: agent-ops/rules/domain/<domain>/rules.md
영향 도메인: <있으면 명시>
```
## 금지 사항
- 도메인을 단정하지 않고 불확실하면 후보를 제시한다
- 관련 없는 domain rule까지 로드하지 않는다

View file

@ -0,0 +1,48 @@
---
name: router
description: 작업 유형별 skill / domain rule 라우팅
version: 1.0.0
---
# Skill Router
작업 유형에 따라 필요한 skill 또는 domain rule만 로드한다.
## 라우팅 축
### 구조 분석 / 스캐폴드
`agent-ops/skills/find-domain/SKILL.md`
`agent-ops/rules/global.md`
### 새 Skill 생성
`agent-ops/skills/create-skill/SKILL.md`
### 새 Domain Rule 생성
`agent-ops/skills/create-domain-rule/SKILL.md`
### 도메인 판별
`agent-ops/skills/find-domain/SKILL.md`
### 코드 변경
`agent-ops/skills/code-change/SKILL.md`
→ 변경 대상 경로에 해당하는 domain rule 로드
| 경로 패턴 | Domain Rule |
|---|---|
| `app/products/agents/` | `agent-ops/rules/domain/products-agents/rules.md` |
| `app/products/calls/` | `agent-ops/rules/domain/products-calls/rules.md` |
| `app/database/`, `app/queries/` | `agent-ops/rules/domain/database/rules.md` |
| `app/components/`, `app/screens/`, `app/hooks/` | `agent-ops/rules/domain/ui/rules.md` |
| `app/actions/`, 채널/포스트/스레드 관련 | `agent-ops/rules/domain/messaging/rules.md` |
### 흐름 추적
→ 흐름에 관련된 domain rule 로드
`agent-ops/skills/find-domain/SKILL.md`로 경로 판별 후 진행
### 문서 / 릴리즈 정리
`agent-ops/rules/global.md`
`docs/` 폴더 직접 확인
## 원칙
- 필요한 rule만 로드한다. 전체를 로드하지 않는다.
- 불확실한 도메인은 `find-domain` skill로 먼저 판별한다.

View file

@ -1,6 +1,6 @@
apply plugin: "com.android.application"
apply plugin: "org.jetbrains.kotlin.android"
apply plugin: "com.facebook.react"
apply plugin: 'kotlin-android'
/**
* This is the configuration block to customize your React Native Android app.
@ -9,14 +9,14 @@ apply plugin: 'kotlin-android'
react {
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '..'
// root = file("../")
// The folder where the react-native NPM package is. Default is ../node_modules/react-native
// reactNativeDir = file("../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen
// codegenDir = file("../node_modules/react-native-codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
// cliFile = file("../node_modules/react-native/cli.js")
// The root of your project, i.e. where "package.json" lives. Default is '../..'
// root = file("../../")
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
// reactNativeDir = file("../../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
// codegenDir = file("../../node_modules/@react-native/codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
// cliFile = file("../../node_modules/react-native/cli.js")
/* Variants */
// The list of variants to that are debuggable. For those we're going to
// skip the bundling of the JS bundle and the assets. By default is just 'debug'.
@ -47,6 +47,9 @@ apply plugin: 'kotlin-android'
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
// hermesFlags = ["-O", "-output-source-map"]
/* Autolinking */
autolinkLibrariesWithApp()
}
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
@ -67,6 +70,7 @@ if (System.getenv("SENTRY_ENABLED") == "true") {
* and want to have separate APKs to upload to the Play Store
*/
def enableSeparateBuildPerCPUArchitecture = project.hasProperty('separateApk') ? project.property('separateApk').toBoolean() : false
def enableUniversalBuild = project.hasProperty('universalApk') ? project.property('universalApk').toBoolean() : false
/**
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
@ -98,8 +102,9 @@ def reactNativeArchitectures() {
android {
ndkVersion rootProject.ext.ndkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdkVersion rootProject.ext.compileSdkVersion
namespace "com.mattermost.rnbeta"
namespace "com.tokilabs.mattermost"
lintOptions {
checkReleaseBuilds false
@ -107,11 +112,11 @@ android {
}
defaultConfig {
applicationId "com.mattermost.rnbeta"
applicationId "com.tokilabs.mattermost"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 493
versionName "2.10.0"
versionCode 730
versionName "2.38.0"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
@ -136,7 +141,7 @@ android {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk enableSeparateBuildPerCPUArchitecture // If true, also generate a universal APK
universalApk enableUniversalBuild // If true, also generate a universal APK
include (*reactNativeArchitectures())
}
}
@ -165,6 +170,7 @@ android {
matchingFallbacks = ['release']
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
@ -184,65 +190,67 @@ repositories {
maven {
url 'https://maven.google.com'
}
maven { url 'https://jitpack.io' }
}
dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
} else {
implementation jscFlavor
}
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
implementation 'io.reactivex.rxjava3:rxjava:3.1.6'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
implementation 'androidx.window:window-rxjava3:1.0.0'
implementation 'androidx.window:window:1.0.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation "com.google.firebase:firebase-messaging:$firebaseVersion"
androidTestImplementation('com.wix:detox:+')
androidTestImplementation 'androidx.test:core:1.6.1'
androidTestImplementation 'androidx.test:runner:1.6.2'
androidTestImplementation 'com.wix:detox:20.26.2'
// For animated GIF support
implementation 'com.facebook.fresco:animated-gif:3.6.0'
// For WebP support, including animated WebP
implementation 'com.facebook.fresco:animated-webp:3.6.0'
implementation 'com.facebook.fresco:webpsupport:3.6.0'
implementation project(':reactnativenotifications')
implementation project(':watermelondb')
implementation project(':watermelondb-jsi')
api('io.jsonwebtoken:jjwt-api:0.12.5')
runtimeOnly('io.jsonwebtoken:jjwt-impl:0.12.5')
runtimeOnly('io.jsonwebtoken:jjwt-orgjson:0.12.5') {
exclude(group: 'org.json', module: 'json') //provided by Android natively
}
}
configurations.all {
resolutionStrategy {
force 'androidx.test:core:1.6.1'
eachDependency { DependencyResolveDetails details ->
if (details.requested.name == 'play-services-base') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '18.1.0'
details.useTarget group: details.requested.group, name: details.requested.name, version: '18.5.0'
}
if (details.requested.name == 'play-services-tasks') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '18.0.2'
}
if (details.requested.name == 'play-services-stats') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '17.0.3'
details.useTarget group: details.requested.group, name: details.requested.name, version: '18.2.0'
}
if (details.requested.name == 'play-services-basement') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '18.1.0'
details.useTarget group: details.requested.group, name: details.requested.name, version: '18.5.0'
}
if (details.requested.name == 'okhttp') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '4.10.0'
details.useTarget group: details.requested.group, name: details.requested.name, version: '4.12.0'
}
if (details.requested.name == 'okhttp-tls') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '4.10.0'
details.useTarget group: details.requested.group, name: details.requested.name, version: '4.12.0'
}
if (details.requested.name == 'okhttp-urlconnection') {
details.useTarget group: details.requested.group, name: details.requested.name, version: '4.10.0'
details.useTarget group: details.requested.group, name: details.requested.name, version: '4.12.0'
}
}
}
@ -250,10 +258,9 @@ configurations.all {
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
tasks.register('copyDownloadableDepsToLibs', Copy) {
from configurations.implementation
into 'libs'
}
apply plugin: 'com.google.gms.google-services'
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)

View file

@ -1,104 +1,29 @@
{
"project_info": {
"project_number": "184930218130",
"firebase_url": "https://api-7231322553409637977-752355.firebaseio.com",
"project_id": "api-7231322553409637977-752355",
"storage_bucket": "api-7231322553409637977-752355.appspot.com"
"project_number": "1047648748539",
"project_id": "mattermost-6ac08",
"storage_bucket": "mattermost-6ac08.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:184930218130:android:a0e553d1a1f043b5",
"mobilesdk_app_id": "1:1047648748539:android:818bf70bfbb3f9d070415e",
"android_client_info": {
"package_name": "com.mattermost.react.native"
"package_name": "com.tokilabs.mattermost"
}
},
"oauth_client": [
{
"client_id": "184930218130-8nahrspll1opff0uogtkh2qsv8coqngo.apps.googleusercontent.com",
"client_type": 3
}
],
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyCkZkU2ECVg-mmdCG5OoHHQXtKiENuvWPE"
"current_key": "AIzaSyAW6j_oPl9MVcm93qS3JgaEPD5ywp-TzZ0"
}
],
"services": {
"analytics_service": {
"status": 2
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:184930218130:android:c7debfa7ea3f75a7",
"android_client_info": {
"package_name": "com.mattermost.rnbeta"
}
},
"oauth_client": [
{
"client_id": "184930218130-8nahrspll1opff0uogtkh2qsv8coqngo.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCkZkU2ECVg-mmdCG5OoHHQXtKiENuvWPE"
}
],
"services": {
"analytics_service": {
"status": 2
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:184930218130:android:2db4058a5b5d6506",
"android_client_info": {
"package_name": "com.mattermost.rn"
}
},
"oauth_client": [
{
"client_id": "184930218130-8nahrspll1opff0uogtkh2qsv8coqngo.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCkZkU2ECVg-mmdCG5OoHHQXtKiENuvWPE"
}
],
"services": {
"analytics_service": {
"status": 2
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
}
],
"configuration_version": "1"
}
}

View file

@ -8,3 +8,8 @@
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
-keepattributes InnerClasses
-keep class io.jsonwebtoken.** { *; }
-keepnames class io.jsonwebtoken.* { *; }
-keepnames interface io.jsonwebtoken.* { *; }

View file

@ -1,4 +1,4 @@
package com.mattermost.rnbeta;
package com.tokilabs.mattermost;
import com.wix.detox.Detox;
import com.wix.detox.config.DetoxConfig;

View file

@ -2,15 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
<activity
android:name="com.facebook.react.devsupport.DevSettingsActivity"
android:exported="false"
/>
</application>
tools:ignore="GoogleAppIndexingWarning"/>
</manifest>

View file

@ -1,63 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package com.mattermost.flipper;
import android.content.Context;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.android.utils.FlipperUtils;
import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
import com.facebook.react.ReactInstanceEventListener;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.network.NetworkingModule;
import com.mattermost.networkclient.RCTOkHttpClientFactory;
/**
* Class responsible of loading Flipper inside your React Native application. This is the debug
* flavor of it. Here you can add your own plugins and customize the Flipper setup.
*/
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
if (FlipperUtils.shouldEnableFlipper(context)) {
final FlipperClient client = AndroidFlipperClient.getInstance(context);
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
client.addPlugin(new DatabasesFlipperPlugin(context));
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
client.addPlugin(CrashReporterPlugin.getInstance());
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
RCTOkHttpClientFactory.Companion.setFlipperPlugin(networkFlipperPlugin);
NetworkingModule.setCustomClientBuilder(
builder -> builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)));
client.addPlugin(networkFlipperPlugin);
client.start();
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
// Hence we run if after all native modules have been initialized
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext == null) {
reactInstanceManager.addReactInstanceEventListener(
new ReactInstanceEventListener() {
@Override
public void onReactContextInitialized(ReactContext reactContext) {
reactInstanceManager.removeReactInstanceEventListener(this);
reactContext.runOnNativeModulesQueueThread(
() -> client.addPlugin(new FrescoFlipperPlugin()));
}
});
} else {
client.addPlugin(new FrescoFlipperPlugin());
}
}
}
}

View file

@ -1,19 +1,25 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission-sdk-23 android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" tools:ignore="SelectedPhotoAccess" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
@ -33,6 +39,8 @@
<application
android:name=".MainApplication"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="false"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
@ -48,7 +56,6 @@
android:resource="@xml/app_restrictions" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:windowSoftInputMode="adjustResize"
android:launchMode="singleTask"
@ -70,7 +77,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mmauthbeta" />
<data android:scheme="mmauth_tokilabs" />
</intent-filter>
</activity>
<service android:name=".NotificationDismissService"
@ -83,14 +90,12 @@
android:name="com.reactnativenavigation.controllers.NavigationActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:resizeableActivity="true"
android:exported="true"
android:exported="false"
/>
<activity
android:name="com.mattermost.share.ShareActivity"
android:name="com.mattermost.rnshare.ShareActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:windowSoftInputMode="adjustResize"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
android:taskAffinity="com.mattermost.share"
android:exported="true"
@ -105,6 +110,20 @@
</activity>
<!-- For Calls microphone to work in the background -->
<service android:name="com.voximplant.foregroundservice.VIForegroundService"/>
<service
android:name="com.voximplant.foregroundservice.VIForegroundService"
android:foregroundServiceType="microphone"
android:exported="false"
/>
<!-- Android 14 requires the correct Foreground Service (FGS) type for RNShare -->
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
android:exported="false"
android:stopWithTask="false"
tools:node="merge"
/>
</application>
</manifest>

View file

@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

View file

@ -1,48 +0,0 @@
package com.mattermost.helpers;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap;
import com.oblador.keychain.KeychainModule;
public class Credentials {
public static void getCredentialsForServer(ReactApplicationContext context, String serverUrl, ResolvePromise promise) {
final KeychainModule keychainModule = new KeychainModule(context);
final WritableMap options = Arguments.createMap();
// KeyChain module fails if `authenticationPrompt` is not set
final WritableMap authPrompt = Arguments.createMap();
authPrompt.putString("title", "Authenticate to retrieve secret");
authPrompt.putString("cancel", "Cancel");
options.putMap("authenticationPrompt", authPrompt);
options.putString("service", serverUrl);
keychainModule.getGenericPasswordForOptions(options, promise);
}
public static String getCredentialsForServerSync(ReactApplicationContext context, String serverUrl) {
final String[] token = new String[1];
Credentials.getCredentialsForServer(context, serverUrl, new ResolvePromise() {
@Override
public void resolve(@Nullable Object value) {
WritableMap map = (WritableMap) value;
if (map != null) {
token[0] = map.getString("password");
String service = map.getString("service");
assert service != null;
if (service.isEmpty()) {
String[] credentials = token[0].split(", *");
if (credentials.length == 2) {
token[0] = credentials[0];
}
}
}
}
});
return token[0];
}
}

View file

@ -19,7 +19,7 @@ import android.graphics.RectF;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Base64;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
@ -28,25 +28,36 @@ import androidx.core.app.Person;
import androidx.core.app.RemoteInput;
import androidx.core.graphics.drawable.IconCompat;
import com.mattermost.rnbeta.*;
import com.nozbe.watermelondb.Database;
import com.tokilabs.mattermost.*;
import com.mattermost.rnutils.helpers.NotificationHelper;
import com.nozbe.watermelondb.WMDatabase;
import com.mattermost.turbolog.TurboLog;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Date;
import java.util.Objects;
import io.jsonwebtoken.IncorrectClaimException;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MissingClaimException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import static com.mattermost.helpers.database_extension.GeneralKt.getDatabaseForServer;
import static com.mattermost.helpers.database_extension.GeneralKt.getDeviceToken;
import static com.mattermost.helpers.database_extension.SystemKt.queryConfigServerVersion;
import static com.mattermost.helpers.database_extension.SystemKt.queryConfigSigningKey;
import static com.mattermost.helpers.database_extension.UserKt.getLastPictureUpdate;
public class CustomPushNotificationHelper {
public static final String CHANNEL_HIGH_IMPORTANCE_ID = "channel_01";
public static final String CHANNEL_MIN_IMPORTANCE_ID = "channel_02";
public static final String KEY_TEXT_REPLY = "CAN_REPLY";
public static final int MESSAGE_NOTIFICATION_ID = 435345;
public static final String NOTIFICATION_ID = "notificationId";
public static final String NOTIFICATION = "notification";
public static final String PUSH_TYPE_MESSAGE = "message";
@ -81,7 +92,7 @@ public class CustomPushNotificationHelper {
.setKey(senderId)
.setName(senderName);
if (serverUrl != null && !type.equals(CustomPushNotificationHelper.PUSH_TYPE_SESSION)) {
if (serverUrl != null && type != null && !type.equals(CustomPushNotificationHelper.PUSH_TYPE_SESSION)) {
try {
Bitmap avatar = userAvatar(context, serverUrl, senderId, urlOverride);
if (avatar != null) {
@ -133,7 +144,7 @@ public class CustomPushNotificationHelper {
private static void addNotificationReplyAction(Context context, NotificationCompat.Builder notification, Bundle bundle, int notificationId) {
String postId = bundle.getString("post_id");
String serverUrl = bundle.getString("server_url");
boolean canReply = bundle.containsKey("category") && bundle.getString("category").equals(CATEGORY_CAN_REPLY);
boolean canReply = bundle.containsKey("category") && Objects.equals(bundle.getString("category"), CATEGORY_CAN_REPLY);
if (android.text.TextUtils.isEmpty(postId) || serverUrl == null || !canReply) {
return;
@ -181,9 +192,9 @@ public class CustomPushNotificationHelper {
String channelId = bundle.getString("channel_id");
String postId = bundle.getString("post_id");
String rootId = bundle.getString("root_id");
int notificationId = postId != null ? postId.hashCode() : MESSAGE_NOTIFICATION_ID;
int notificationId = postId != null ? postId.hashCode() : NotificationHelper.INSTANCE.MESSAGE_NOTIFICATION_ID;
boolean is_crt_enabled = bundle.containsKey("is_crt_enabled") && bundle.getString("is_crt_enabled").equals("true");
boolean is_crt_enabled = bundle.containsKey("is_crt_enabled") && Objects.equals(bundle.getString("is_crt_enabled"), "true");
String groupId = is_crt_enabled && !android.text.TextUtils.isEmpty(rootId) ? rootId : channelId;
addNotificationExtras(notification, bundle);
@ -227,6 +238,154 @@ public class CustomPushNotificationHelper {
}
}
public static boolean verifySignature(final Context context, String signature, String serverUrl, String ackId) {
if (signature == null) {
// Backward compatibility with old push proxies
TurboLog.Companion.i("Mattermost Notifications Signature verification", "No signature in the notification");
return true;
}
if (serverUrl == null) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "No server_url for server_id");
return false;
}
DatabaseHelper dbHelper = DatabaseHelper.Companion.getInstance();
if (dbHelper == null) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "Cannot access the database");
return false;
}
WMDatabase db = getDatabaseForServer(dbHelper, context, serverUrl);
if (db == null) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "Cannot access the server database");
return false;
}
if (signature.equals("NO_SIGNATURE")) {
String version = queryConfigServerVersion(db);
if (version == null) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "No server version");
return false;
}
if (!version.matches("[0-9]+(\\.[0-9]+)*")) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "Invalid server version");
return false;
}
String[] parts = version.split("\\.");
int major = parts.length > 0 ? Integer.parseInt(parts[0]) : 0;
int minor = parts.length > 1 ? Integer.parseInt(parts[1]) : 0;
int patch = parts.length > 2 ? Integer.parseInt(parts[2]) : 0;
int[][] targets = {{9,8,0},{9,7,3},{9,6,3},{9,5,5},{8,1,14}};
boolean rejected = false;
for (int i = 0; i < targets.length; i++) {
boolean first = i == 0;
int[] targetVersion = targets[i];
int majorTarget = targetVersion[0];
int minorTarget = targetVersion[1];
int patchTarget = targetVersion[2];
if (major > majorTarget) {
// Only reject if we are considering the first (highest) version.
// Any version in between should be acceptable.
rejected = first;
break;
}
if (major < majorTarget) {
// Continue to see if it complies with a smaller target
continue;
}
// Same major
if (minor > minorTarget) {
// Only reject if we are considering the first (highest) version.
// Any version in between should be acceptable.
rejected = first;
break;
}
if (minor < minorTarget) {
// Continue to see if it complies with a smaller target
continue;
}
// Same major and same minor
if (patch >= patchTarget) {
rejected = true;
break;
}
// Patch is lower than target
return true;
}
if (rejected) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "Server version should send signature");
return false;
}
// Version number is below any of the targets, so it should not send the signature
return true;
}
String signingKey = queryConfigSigningKey(db);
if (signingKey == null) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "No signing key");
return false;
}
try {
byte[] encoded = Base64.decode(signingKey, 0);
KeyFactory kf = KeyFactory.getInstance("EC");
PublicKey pubKey = (PublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
String storedDeviceToken = getDeviceToken(dbHelper);
if (storedDeviceToken == null) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "No device token stored");
return false;
}
String[] tokenParts = storedDeviceToken.split(":", 2);
if (tokenParts.length != 2) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "Wrong stored device token format");
return false;
}
String deviceToken = tokenParts[1].substring(0, tokenParts[1].length() -1 );
if (deviceToken.isEmpty()) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", "Empty stored device token");
return false;
}
Jwts.parser()
.require("ack_id", ackId)
.require("device_id", deviceToken)
.verifyWith((PublicKey) pubKey)
.build()
.parseSignedClaims(signature);
} catch (MissingClaimException e) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", String.format("Missing claim: %s", e.getMessage()));
e.printStackTrace();
return false;
} catch (IncorrectClaimException e) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", String.format("Incorrect claim: %s", e.getMessage()));
e.printStackTrace();
return false;
} catch (JwtException e) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", String.format("Cannot verify JWT: %s", e.getMessage()));
e.printStackTrace();
return false;
} catch (Exception e) {
TurboLog.Companion.i("Mattermost Notifications Signature verification", String.format("Exception while parsing JWT: %s", e.getMessage()));
e.printStackTrace();
return false;
}
return true;
}
private static Bitmap getCircleBitmap(Bitmap bitmap) {
final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Bitmap.Config.ARGB_8888);
@ -275,7 +434,7 @@ public class CustomPushNotificationHelper {
.setKey(senderId)
.setName("Me");
if (serverUrl != null && !type.equals(CustomPushNotificationHelper.PUSH_TYPE_SESSION)) {
if (serverUrl != null && type != null && !type.equals(CustomPushNotificationHelper.PUSH_TYPE_SESSION)) {
try {
Bitmap avatar = userAvatar(context, serverUrl, "me", urlOverride);
if (avatar != null) {
@ -413,12 +572,12 @@ public class CustomPushNotificationHelper {
Double lastUpdateAt = 0.0;
if (!TextUtils.isEmpty(urlOverride)) {
Request request = new Request.Builder().url(urlOverride).build();
Log.i("ReactNative", String.format("Fetch override profile image %s", urlOverride));
TurboLog.Companion.i("ReactNative", String.format("Fetch override profile image %s", urlOverride));
response = client.newCall(request).execute();
} else {
DatabaseHelper dbHelper = DatabaseHelper.Companion.getInstance();
if (dbHelper != null) {
Database db = getDatabaseForServer(dbHelper, context, serverUrl);
WMDatabase db = getDatabaseForServer(dbHelper, context, serverUrl);
if (db != null) {
lastUpdateAt = getLastPictureUpdate(db, userId);
if (lastUpdateAt == null) {
@ -435,7 +594,7 @@ public class CustomPushNotificationHelper {
bitmapCache.removeBitmap(userId, serverUrl);
String url = String.format("api/v4/users/%s/image", userId);
Log.i("ReactNative", String.format("Fetch profile image %s", url));
TurboLog.Companion.i("ReactNative", String.format("Fetch profile image %s", url));
response = Network.getSync(serverUrl, url, null);
}

View file

@ -1,17 +1,21 @@
package com.mattermost.helpers
import android.content.Context
import android.database.Cursor
import android.net.Uri
import com.facebook.react.bridge.WritableMap
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import java.lang.Exception
import org.json.JSONArray
import org.json.JSONObject
typealias QueryArgs = Array<Any?>
class DatabaseHelper {
var defaultDatabase: Database? = null
var defaultDatabase: WMDatabase? = null
val onlyServerUrl: String?
get() {
@ -39,7 +43,7 @@ class DatabaseHelper {
private fun setDefaultDatabase(context: Context) {
val databaseName = "app.db"
val databasePath = Uri.fromFile(context.filesDir).toString() + "/" + databaseName
defaultDatabase = Database.getInstance(databasePath, context)
defaultDatabase = WMDatabase.getInstance(databasePath, context)
}
internal fun JSONObject.toMap(): Map<String, Any?> = keys().asSequence().associateWith { it ->
@ -73,3 +77,15 @@ class DatabaseHelper {
private set
}
}
fun WritableMap.mapCursor(cursor: Cursor) {
for (i in 0 until cursor.columnCount) {
when (cursor.getType(i)) {
Cursor.FIELD_TYPE_NULL -> putNull(cursor.getColumnName(i))
Cursor.FIELD_TYPE_INTEGER -> putDouble(cursor.getColumnName(i), cursor.getDouble(i))
Cursor.FIELD_TYPE_FLOAT -> putDouble(cursor.getColumnName(i), cursor.getDouble(i))
Cursor.FIELD_TYPE_STRING -> putString(cursor.getColumnName(i), cursor.getString(i))
else -> putString(cursor.getColumnName(i), "")
}
}
}

View file

@ -8,22 +8,26 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.ReadableMap;
import com.mattermost.networkclient.APIClientModule;
import com.mattermost.networkclient.ApiClientModuleImpl;
import com.mattermost.networkclient.enums.RetryTypes;
import com.mattermost.turbolog.TurboLog;
import okhttp3.HttpUrl;
import okhttp3.Response;
public class Network {
private static APIClientModule clientModule;
private static ApiClientModuleImpl clientModule;
private static final WritableMap clientOptions = Arguments.createMap();
private static final Promise emptyPromise = new ResolvePromise();
public static void init(Context context) {
final ReactApplicationContext reactContext = (APIClientModule.context == null) ? new ReactApplicationContext(context) : APIClientModule.context;
clientModule = new APIClientModule(reactContext);
createClientOptions();
if (clientModule == null) {
clientModule = new ApiClientModuleImpl(context);
createClientOptions();
} else {
TurboLog.Companion.i("ReactNative", "Network already initialized");
}
}
public static void get(String baseUrl, String endpoint, ReadableMap options, Promise promise) {

View file

@ -1,312 +0,0 @@
package com.mattermost.helpers;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
import androidx.core.app.NotificationManagerCompat;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
public class NotificationHelper {
public static final String PUSH_NOTIFICATIONS = "PUSH_NOTIFICATIONS";
public static final String NOTIFICATIONS_IN_GROUP = "notificationsInGroup";
private static final String VERSION_PREFERENCE = "VERSION_PREFERENCE";
public static void cleanNotificationPreferencesIfNeeded(Context context) {
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
String version = String.valueOf(pInfo.versionCode);
String storedVersion = null;
SharedPreferences pSharedPref = context.getSharedPreferences(VERSION_PREFERENCE, Context.MODE_PRIVATE);
if (pSharedPref != null) {
storedVersion = pSharedPref.getString("Version", "");
}
if (!version.equals(storedVersion)) {
if (pSharedPref != null) {
SharedPreferences.Editor editor = pSharedPref.edit();
editor.putString("Version", version);
editor.apply();
}
Map<String, JSONObject> inputMap = new HashMap<>();
saveMap(context, inputMap);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static int getNotificationId(Bundle notification) {
final String postId = notification.getString("post_id");
final String channelId = notification.getString("channel_id");
int notificationId = CustomPushNotificationHelper.MESSAGE_NOTIFICATION_ID;
if (postId != null) {
notificationId = postId.hashCode();
} else if (channelId != null) {
notificationId = channelId.hashCode();
}
return notificationId;
}
public static StatusBarNotification[] getDeliveredNotifications(Context context) {
final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
return notificationManager.getActiveNotifications();
}
public static boolean addNotificationToPreferences(Context context, int notificationId, Bundle notification) {
try {
boolean createSummary = true;
final String serverUrl = notification.getString("server_url");
final String channelId = notification.getString("channel_id");
final String rootId = notification.getString("root_id");
final boolean isCRTEnabled = notification.containsKey("is_crt_enabled") && notification.getString("is_crt_enabled").equals("true");
final boolean isThreadNotification = isCRTEnabled && !android.text.TextUtils.isEmpty(rootId);
final String groupId = isThreadNotification ? rootId : channelId;
Map<String, JSONObject> notificationsPerServer = loadMap(context);
JSONObject notificationsInServer = notificationsPerServer.get(serverUrl);
if (notificationsInServer == null) {
notificationsInServer = new JSONObject();
}
JSONObject notificationsInGroup = notificationsInServer.optJSONObject(groupId);
if (notificationsInGroup == null) {
notificationsInGroup = new JSONObject();
}
if (notificationsInGroup.length() > 0) {
createSummary = false;
}
notificationsInGroup.put(String.valueOf(notificationId), false);
if (createSummary) {
// Add the summary notification id as well
notificationsInGroup.put(String.valueOf(notificationId + 1), true);
}
notificationsInServer.put(groupId, notificationsInGroup);
notificationsPerServer.put(serverUrl, notificationsInServer);
saveMap(context, notificationsPerServer);
return createSummary;
} catch(Exception e) {
e.printStackTrace();
return false;
}
}
public static void dismissNotification(Context context, Bundle notification) {
final boolean isCRTEnabled = notification.containsKey("is_crt_enabled") && notification.getString("is_crt_enabled").equals("true");
final String serverUrl = notification.getString("server_url");
final String channelId = notification.getString("channel_id");
final String rootId = notification.getString("root_id");
int notificationId = getNotificationId(notification);
if (!android.text.TextUtils.isEmpty(serverUrl) && !android.text.TextUtils.isEmpty(channelId)) {
boolean isThreadNotification = isCRTEnabled && !android.text.TextUtils.isEmpty(rootId);
String notificationIdStr = String.valueOf(notificationId);
String groupId = isThreadNotification ? rootId : channelId;
Map<String, JSONObject> notificationsPerServer = loadMap(context);
JSONObject notificationsInServer = notificationsPerServer.get(serverUrl);
if (notificationsInServer == null) {
return;
}
JSONObject notificationsInGroup = notificationsInServer.optJSONObject(groupId);
if (notificationsInGroup == null) {
return;
}
boolean isSummary = notificationsInGroup.optBoolean(notificationIdStr);
notificationsInGroup.remove(notificationIdStr);
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.cancel(notificationId);
StatusBarNotification[] statusNotifications = getDeliveredNotifications(context);
boolean hasMore = false;
for (final StatusBarNotification status : statusNotifications) {
Bundle bundle = status.getNotification().extras;
if (isThreadNotification) {
hasMore = bundle.containsKey("root_id") && bundle.getString("root_id").equals(rootId);
} else {
hasMore = bundle.containsKey("channel_id") && bundle.getString("channel_id").equals(channelId);
}
if (hasMore) break;
}
if (!hasMore || isSummary) {
notificationsInServer.remove(groupId);
} else {
try {
notificationsInServer.put(groupId, notificationsInGroup);
} catch (JSONException e) {
e.printStackTrace();
}
}
notificationsPerServer.put(serverUrl, notificationsInServer);
saveMap(context, notificationsPerServer);
}
}
public static void removeChannelNotifications(Context context, String serverUrl, String channelId) {
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
Map<String, JSONObject> notificationsPerServer = loadMap(context);
JSONObject notificationsInServer = notificationsPerServer.get(serverUrl);
if (notificationsInServer != null) {
notificationsInServer.remove(channelId);
notificationsPerServer.put(serverUrl, notificationsInServer);
saveMap(context, notificationsPerServer);
}
StatusBarNotification[] notifications = getDeliveredNotifications(context);
for (StatusBarNotification sbn:notifications) {
Notification n = sbn.getNotification();
Bundle bundle = n.extras;
String cId = bundle.getString("channel_id");
String rootId = bundle.getString("root_id");
boolean isCRTEnabled = bundle.containsKey("is_crt_enabled") && bundle.getString("is_crt_enabled").equals("true");
boolean skipThreadNotification = isCRTEnabled && !android.text.TextUtils.isEmpty(rootId);
if (Objects.equals(cId, channelId) && !skipThreadNotification) {
notificationManager.cancel(sbn.getId());
}
}
}
public static void removeThreadNotifications(Context context, String serverUrl, String threadId) {
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
Map<String, JSONObject> notificationsPerServer = loadMap(context);
JSONObject notificationsInServer = notificationsPerServer.get(serverUrl);
StatusBarNotification[] notifications = getDeliveredNotifications(context);
for (StatusBarNotification sbn:notifications) {
Notification n = sbn.getNotification();
Bundle bundle = n.extras;
String rootId = bundle.getString("root_id");
String postId = bundle.getString("post_id");
if (Objects.equals(rootId, threadId)) {
notificationManager.cancel(sbn.getId());
}
if (Objects.equals(postId, threadId)) {
String channelId = bundle.getString("channel_id");
int id = sbn.getId();
if (notificationsInServer != null && channelId != null) {
JSONObject notificationsInChannel = notificationsInServer.optJSONObject(channelId);
if (notificationsInChannel != null) {
notificationsInChannel.remove(String.valueOf(id));
try {
notificationsInServer.put(channelId, notificationsInChannel);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
notificationManager.cancel(id);
}
}
if (notificationsInServer != null) {
notificationsInServer.remove(threadId);
notificationsPerServer.put(serverUrl, notificationsInServer);
saveMap(context, notificationsPerServer);
}
}
public static void removeServerNotifications(Context context, String serverUrl) {
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
Map<String, JSONObject> notificationsPerServer = loadMap(context);
notificationsPerServer.remove(serverUrl);
saveMap(context, notificationsPerServer);
StatusBarNotification[] notifications = getDeliveredNotifications(context);
for (StatusBarNotification sbn:notifications) {
Notification n = sbn.getNotification();
Bundle bundle = n.extras;
String url = bundle.getString("server_url");
if (Objects.equals(url, serverUrl)) {
notificationManager.cancel(sbn.getId());
}
}
}
public static void clearChannelOrThreadNotifications(Context context, Bundle notification) {
final String serverUrl = notification.getString("server_url");
final String channelId = notification.getString("channel_id");
final String rootId = notification.getString("root_id");
if (channelId != null) {
final boolean isCRTEnabled = notification.containsKey("is_crt_enabled") && notification.getString("is_crt_enabled").equals("true");
// rootId is available only when CRT is enabled & clearing the thread
final boolean isClearThread = isCRTEnabled && !android.text.TextUtils.isEmpty(rootId);
if (isClearThread) {
removeThreadNotifications(context, serverUrl, rootId);
} else {
removeChannelNotifications(context, serverUrl, channelId);
}
}
}
/**
* Map Structure
*
* { serverUrl: { groupId: { notification1: true, notification2: false } } }
* summary notification has a value of true
*
*/
private static void saveMap(Context context, Map<String, JSONObject> inputMap) {
SharedPreferences pSharedPref = context.getSharedPreferences(PUSH_NOTIFICATIONS, Context.MODE_PRIVATE);
if (pSharedPref != null) {
JSONObject json = new JSONObject(inputMap);
String jsonString = json.toString();
SharedPreferences.Editor editor = pSharedPref.edit();
editor.remove(NOTIFICATIONS_IN_GROUP).apply();
editor.putString(NOTIFICATIONS_IN_GROUP, jsonString);
editor.apply();
}
}
private static Map<String, JSONObject> loadMap(Context context) {
Map<String, JSONObject> outputMap = new HashMap<>();
if (context != null) {
SharedPreferences pSharedPref = context.getSharedPreferences(PUSH_NOTIFICATIONS, Context.MODE_PRIVATE);
try {
if (pSharedPref != null) {
String jsonString = pSharedPref.getString(NOTIFICATIONS_IN_GROUP, (new JSONObject()).toString());
JSONObject json = new JSONObject(jsonString);
Iterator<String> servers = json.keys();
while (servers.hasNext()) {
String serverUrl = servers.next();
JSONObject notificationGroup = json.getJSONObject(serverUrl);
outputMap.put(serverUrl, notificationGroup);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return outputMap;
}
}

View file

@ -2,31 +2,29 @@ package com.mattermost.helpers
import android.content.Context
import android.os.Bundle
import android.util.Log
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.mattermost.helpers.database_extension.*
import com.mattermost.helpers.push_notification.*
import kotlinx.coroutines.*
import com.mattermost.helpers.database_extension.getDatabaseForServer
import com.mattermost.helpers.database_extension.saveToDatabase
import com.mattermost.helpers.push_notification.addToDefaultCategoryIfNeeded
import com.mattermost.helpers.push_notification.fetchMyChannel
import com.mattermost.helpers.push_notification.fetchMyTeamCategories
import com.mattermost.helpers.push_notification.fetchNeededUsers
import com.mattermost.helpers.push_notification.fetchPosts
import com.mattermost.helpers.push_notification.fetchTeamIfNeeded
import com.mattermost.helpers.push_notification.fetchThread
import com.mattermost.turbolog.TurboLog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
class PushNotificationDataHelper(private val context: Context) {
private var coroutineScope = CoroutineScope(Dispatchers.Default)
fun fetchAndStoreDataForPushNotification(initialData: Bundle, isReactInit: Boolean): Bundle? {
var result: Bundle? = null
val job = coroutineScope.launch(Dispatchers.Default) {
result = PushNotificationDataRunnable.start(context, initialData, isReactInit)
suspend fun fetchAndStoreDataForPushNotification(initialData: Bundle, isReactInit: Boolean): Bundle? {
return withContext(Dispatchers.Default) {
PushNotificationDataRunnable.start(context, initialData, isReactInit)
}
runBlocking {
job.join()
}
return result
}
}
@ -37,8 +35,8 @@ class PushNotificationDataRunnable {
private val mutex = Mutex()
suspend fun start(context: Context, initialData: Bundle, isReactInit: Boolean): Bundle? {
// for more info see: https://blog.danlew.net/2020/01/28/coroutines-and-java-synchronization-dont-mix/
mutex.withLock {
// for more info see: https://blog.danlew.net/2020/01/28/coroutines-and-java-synchronization-dont-mix/
val serverUrl: String = initialData.getString("server_url") ?: return null
val db = dbHelper.getDatabaseForServer(context, serverUrl)
var result: Bundle? = null
@ -50,32 +48,40 @@ class PushNotificationDataRunnable {
val postId = initialData.getString("post_id")
val rootId = initialData.getString("root_id")
val isCRTEnabled = initialData.getString("is_crt_enabled") == "true"
val ackId = initialData.getString("ack_id")
Log.i("ReactNative", "Start fetching notification data in server=$serverUrl for channel=$channelId")
TurboLog.i("ReactNative", "Start fetching notification data in server=$serverUrl for channel=$channelId and ack=$ackId")
val receivingThreads = isCRTEnabled && !rootId.isNullOrEmpty()
val notificationData = Arguments.createMap()
var channel: ReadableMap? = null
var myTeam: ReadableMap? = null
if (!teamId.isNullOrEmpty()) {
val res = fetchTeamIfNeeded(db, serverUrl, teamId)
res.first?.let { notificationData.putMap("team", it) }
res.second?.let { notificationData.putMap("myTeam", it) }
myTeam = res.second
myTeam?.let { notificationData.putMap("myTeam", it) }
}
if (channelId != null && postId != null) {
val channelRes = fetchMyChannel(db, serverUrl, channelId, isCRTEnabled)
channelRes.first?.let { notificationData.putMap("channel", it) }
channel = channelRes.first
channel?.let { notificationData.putMap("channel", it) }
channelRes.second?.let { notificationData.putMap("myChannel", it) }
val loadedProfiles = channelRes.third
// Fetch categories if needed
if (!teamId.isNullOrEmpty() && notificationData.getMap("myTeam") != null) {
if (!teamId.isNullOrEmpty() && myTeam != null) {
// should load all categories
val res = fetchMyTeamCategories(db, serverUrl, teamId)
res?.let { notificationData.putMap("categories", it) }
} else if (notificationData.getMap("channel") != null) {
} else if (channel != null) {
// check if the channel is in the category for the team
val res = addToDefaultCategoryIfNeeded(db, notificationData.getMap("channel")!!)
val res = addToDefaultCategoryIfNeeded(db, channel)
res?.let { notificationData.putArray("categoryChannels", it) }
}
@ -89,7 +95,7 @@ class PushNotificationDataRunnable {
getThreadList(notificationThread, postData?.getArray("threads"))?.let {
val threadsArray = Arguments.createArray()
for(item in it) {
for (item in it) {
threadsArray.pushMap(item)
}
notificationData.putArray("threads", threadsArray)
@ -105,13 +111,15 @@ class PushNotificationDataRunnable {
dbHelper.saveToDatabase(db, notificationData, teamId, channelId, receivingThreads)
}
Log.i("ReactNative", "Done processing push notification=$serverUrl for channel=$channelId")
TurboLog.i("ReactNative", "Done processing push notification=$serverUrl for channel=$channelId and ack=$ackId")
}
} catch (e: Exception) {
e.printStackTrace()
val eMessage = e.message ?: "Error with no message"
TurboLog.e("ReactNative", "Error processing push notification error=$eMessage")
} finally {
db?.close()
Log.i("ReactNative", "DONE fetching notification data")
TurboLog.i("ReactNative", "DONE fetching notification data")
}
return result
@ -127,21 +135,22 @@ class PushNotificationDataRunnable {
threadsArray.add(thread)
}
for(i in 0 until it.size()) {
val thread = it.getMap(i)
val threadId = thread.getString("id")
if (threadId != null) {
if (threadIds.contains(threadId)) {
// replace the values for participants and is_following
val index = threadsArray.indexOfFirst { el -> el.getString("id") == threadId }
val prev = threadsArray[index]
val merge = Arguments.createMap()
merge.merge(prev)
merge.putBoolean("is_following", thread.getBoolean("is_following"))
merge.putArray("participants", thread.getArray("participants"))
threadsArray[index] = merge
} else {
threadsArray.add(thread)
threadIds.add(threadId)
it.getMap(i)?.let { thread ->
val threadId = thread.getString("id")
if (threadId != null) {
if (threadIds.contains(threadId)) {
// replace the values for participants and is_following
val index = threadsArray.indexOfFirst { el -> el.getString("id") == threadId }
val prev = threadsArray[index]
val merge = Arguments.createMap()
merge.merge(prev)
merge.putBoolean("is_following", thread.getBoolean("is_following"))
merge.putArray("participants", thread.getArray("participants"))
threadsArray[index] = merge
} else {
threadsArray.add(thread)
threadIds.add(threadId)
}
}
}
}

View file

@ -1,22 +1,11 @@
package com.mattermost.helpers
import kotlin.math.floor
import java.util.UUID
class RandomId {
companion object {
private const val alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"
private const val alphabetLength = alphabet.length
private const val idLength = 16
fun generate(): String {
var id = ""
for (i in 1.rangeTo((idLength / 2))) {
val random = floor(Math.random() * alphabetLength * alphabetLength)
id += alphabet[floor(random / alphabetLength).toInt()]
id += alphabet[(random % alphabetLength).toInt()]
}
return id
return UUID.randomUUID().toString()
}
}
}

View file

@ -1,274 +0,0 @@
package com.mattermost.helpers;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.content.ContentResolver;
import android.os.Environment;
import android.webkit.MimeTypeMap;
import android.util.Log;
import android.text.TextUtils;
import android.os.ParcelFileDescriptor;
import java.io.*;
import java.nio.channels.FileChannel;
// Class based on DocumentHelper https://gist.github.com/steveevers/a5af24c226f44bb8fdc3
public class RealPathUtil {
public static final String CACHE_DIR_NAME = "mmShare";
public static String getRealPathFromURI(final Context context, final Uri uri) {
// DocumentProvider
if (DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
// DownloadsProvider
final String id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:", "");
}
try {
return getPathFromSavingTempFile(context, uri);
} catch (NumberFormatException e) {
Log.e("ReactNative", "DownloadsProvider unexpected uri " + uri);
return null;
}
}
} else if (isMediaDocument(uri)) {
// MediaProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
String name = getDataColumn(context, contentUri, selection, selectionArgs);
if (!TextUtils.isEmpty(name)) {
return name;
}
return getPathFromSavingTempFile(context, uri);
}
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
// MediaStore (and general)
if (isGooglePhotosUri(uri)) {
return uri.getLastPathSegment();
}
// Try save to tmp file, and return tmp file path
return getPathFromSavingTempFile(context, uri);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
public static String getPathFromSavingTempFile(Context context, final Uri uri) {
File tmpFile;
String fileName = "";
if (uri == null || uri.isRelative()) {
return null;
}
// Try and get the filename from the Uri
try {
Cursor returnCursor =
context.getContentResolver().query(uri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
returnCursor.moveToFirst();
fileName = sanitizeFilename(returnCursor.getString(nameIndex));
returnCursor.close();
} catch (Exception e) {
// just continue to get the filename with the last segment of the path
}
try {
if (TextUtils.isEmpty(fileName)) {
fileName = sanitizeFilename(uri.getLastPathSegment().trim());
}
File cacheDir = new File(context.getCacheDir(), CACHE_DIR_NAME);
boolean cacheDirExists = cacheDir.exists();
if (!cacheDirExists) {
cacheDirExists = cacheDir.mkdirs();
}
if (cacheDirExists) {
tmpFile = new File(cacheDir, fileName);
boolean fileCreated = tmpFile.createNewFile();
if (fileCreated) {
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
try (FileInputStream inputSrc = new FileInputStream(pfd.getFileDescriptor())) {
FileChannel src = inputSrc.getChannel();
try (FileOutputStream outputDst = new FileOutputStream(tmpFile)) {
FileChannel dst = outputDst.getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
pfd.close();
}
return tmpFile.getAbsolutePath();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
public static String getExtension(String uri) {
String extension = "";
if (uri == null) {
return extension;
}
extension = MimeTypeMap.getFileExtensionFromUrl(uri);
if (!extension.equals("")) {
return extension;
}
int dot = uri.lastIndexOf(".");
if (dot >= 0) {
return uri.substring(dot);
} else {
// No extension.
return "";
}
}
public static String getMimeType(File file) {
String extension = getExtension(file.getName());
if (extension.length() > 0)
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.substring(1));
return "application/octet-stream";
}
public static String getMimeType(String filePath) {
File file = new File(filePath);
return getMimeType(file);
}
public static String getMimeTypeFromUri(final Context context, final Uri uri) {
try {
ContentResolver cR = context.getContentResolver();
return cR.getType(uri);
} catch (Exception e) {
return "application/octet-stream";
}
}
public static void deleteTempFiles(final File dir) {
try {
if (dir.isDirectory()) {
deleteRecursive(dir);
}
} catch (Exception e) {
// do nothing
}
}
private static void deleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory()) {
File[] files = fileOrDirectory.listFiles();
if (files != null) {
for (File child : files)
deleteRecursive(child);
}
}
if (!fileOrDirectory.delete()) {
Log.i("ReactNative", "Couldn't delete file " + fileOrDirectory.getName());
}
}
private static String sanitizeFilename(String filename) {
if (filename == null) {
return null;
}
File f = new File(filename);
return f.getName();
}
}

View file

@ -1,6 +1,7 @@
package com.mattermost.helpers;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.WritableMap;
@ -9,58 +10,59 @@ import com.facebook.react.bridge.WritableMap;
* ResolvePromise: Helper class that abstracts boilerplate
*/
public class ResolvePromise implements Promise {
@Override
public void resolve(@javax.annotation.Nullable Object value) {
public void reject(@NonNull String s) {
}
@Override
public void reject(String code, String message) {
public void resolve(@Nullable Object o) {
}
@Override
public void reject(String code, @NonNull WritableMap map) {
public void reject(@NonNull String s, @Nullable String s1) {
}
@Override
public void reject(String code, Throwable e) {
public void reject(@NonNull String s, @Nullable Throwable throwable) {
}
@Override
public void reject(Throwable e, WritableMap map) {
public void reject(@NonNull String s, @Nullable String s1, @Nullable Throwable throwable) {
}
@Override
public void reject(String code, Throwable e, WritableMap map) {
public void reject(@NonNull Throwable throwable) {
}
@Override
public void reject(String code, String message, Throwable e, WritableMap map) {
public void reject(@NonNull Throwable throwable, @NonNull WritableMap writableMap) {
}
@Override
public void reject(String code, String message, Throwable e) {
public void reject(@NonNull String s, @NonNull WritableMap writableMap) {
}
@Override
public void reject(String code, String message, @NonNull WritableMap map) {
public void reject(@NonNull String s, @Nullable Throwable throwable, @NonNull WritableMap writableMap) {
}
@Override
public void reject(String message) {
public void reject(@NonNull String s, @Nullable String s1, @NonNull WritableMap writableMap) {
}
@Override
public void reject(Throwable reason) {
public void reject(@Nullable String s, @Nullable String s1, @Nullable Throwable throwable, @Nullable WritableMap writableMap) {
}
}

View file

@ -2,9 +2,9 @@ package com.mattermost.helpers.database_extension
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
fun insertCategory(db: Database, category: ReadableMap) {
fun insertCategory(db: WMDatabase, category: ReadableMap) {
try {
val id = category.getString("id") ?: return
val collapsed = false
@ -31,7 +31,7 @@ fun insertCategory(db: Database, category: ReadableMap) {
}
}
fun insertCategoryChannels(db: Database, categoryId: String, teamId: String, channelIds: ReadableArray) {
fun insertCategoryChannels(db: WMDatabase, categoryId: String, teamId: String, channelIds: ReadableArray) {
try {
for (i in 0 until channelIds.size()) {
val channelId = channelIds.getString(i)
@ -50,36 +50,41 @@ fun insertCategoryChannels(db: Database, categoryId: String, teamId: String, cha
}
}
fun insertCategoriesWithChannels(db: Database, orderCategories: ReadableMap) {
fun insertCategoriesWithChannels(db: WMDatabase, orderCategories: ReadableMap) {
val categories = orderCategories.getArray("categories") ?: return
for (i in 0 until categories.size()) {
val category = categories.getMap(i)
val id = category.getString("id")
val teamId = category.getString("team_id")
val channelIds = category.getArray("channel_ids")
insertCategory(db, category)
if (id != null && teamId != null) {
channelIds?.let { insertCategoryChannels(db, id, teamId, it) }
category?.let { cat ->
val id = cat.getString("id")
val teamId = cat.getString("team_id")
val channelIds = cat.getArray("channel_ids")
insertCategory(db, cat)
if (id != null && teamId != null) {
channelIds?.let { insertCategoryChannels(db, id, teamId, it) }
}
}
}
}
fun insertChannelToDefaultCategory(db: Database, categoryChannels: ReadableArray) {
fun insertChannelToDefaultCategory(db: WMDatabase, categoryChannels: ReadableArray) {
try {
for (i in 0 until categoryChannels.size()) {
val cc = categoryChannels.getMap(i)
val id = cc.getString("id")
val categoryId = cc.getString("category_id")
val channelId = cc.getString("channel_id")
val count = countByColumn(db, "CategoryChannel", "category_id", categoryId)
db.execute(
"""
INSERT INTO CategoryChannel
(id, category_id, channel_id, sort_order, _changed, _status)
VALUES (?, ?, ?, ?, '', 'created')
""".trimIndent(),
arrayOf(id, categoryId, channelId, if (count > 0) count + 1 else count)
)
categoryChannels.getMap(i)?.let { cc ->
val id = cc.getString("id")
val categoryId = cc.getString("category_id")
val channelId = cc.getString("channel_id")
if (id != null && categoryId != null && channelId != null) {
val count = countByColumn(db, "CategoryChannel", "category_id", categoryId)
db.execute(
"""
INSERT INTO CategoryChannel
(id, category_id, channel_id, sort_order, _changed, _status)
VALUES (?, ?, ?, ?, '', 'created')
""".trimIndent(),
arrayOf(id, categoryId, channelId, if (count > 0) count + 1 else count)
)
}
}
}
} catch (e: Exception) {
e.printStackTrace()

View file

@ -3,11 +3,11 @@ package com.mattermost.helpers.database_extension
import com.facebook.react.bridge.ReadableMap
import com.mattermost.helpers.DatabaseHelper
import com.mattermost.helpers.ReadableMapUtils
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONException
import org.json.JSONObject
fun findChannel(db: Database?, channelId: String): Boolean {
fun findChannel(db: WMDatabase?, channelId: String): Boolean {
if (db != null) {
val team = find(db, "Channel", channelId)
return team != null
@ -15,7 +15,7 @@ fun findChannel(db: Database?, channelId: String): Boolean {
return false
}
fun findMyChannel(db: Database?, channelId: String): Boolean {
fun findMyChannel(db: WMDatabase?, channelId: String): Boolean {
if (db != null) {
val team = find(db, "MyChannel", channelId)
return team != null
@ -23,7 +23,7 @@ fun findMyChannel(db: Database?, channelId: String): Boolean {
return false
}
internal fun handleChannel(db: Database, channel: ReadableMap) {
internal fun handleChannel(db: WMDatabase, channel: ReadableMap) {
try {
val exists = channel.getString("id")?.let { findChannel(db, it) } ?: false
if (!exists) {
@ -37,7 +37,7 @@ internal fun handleChannel(db: Database, channel: ReadableMap) {
}
}
internal fun DatabaseHelper.handleMyChannel(db: Database, myChannel: ReadableMap, postsData: ReadableMap?, receivingThreads: Boolean) {
internal fun DatabaseHelper.handleMyChannel(db: WMDatabase, myChannel: ReadableMap, postsData: ReadableMap?, receivingThreads: Boolean) {
try {
val json = ReadableMapUtils.toJSONObject(myChannel)
val exists = myChannel.getString("id")?.let { findMyChannel(db, it) } ?: false
@ -71,7 +71,7 @@ internal fun DatabaseHelper.handleMyChannel(db: Database, myChannel: ReadableMap
}
}
fun insertChannel(db: Database, channel: JSONObject): Boolean {
fun insertChannel(db: WMDatabase, channel: JSONObject): Boolean {
val id = try { channel.getString("id") } catch (e: JSONException) { return false }
val createAt = try { channel.getDouble("create_at") } catch (e: JSONException) { 0 }
val deleteAt = try { channel.getDouble("delete_at") } catch (e: JSONException) { 0 }
@ -104,7 +104,7 @@ fun insertChannel(db: Database, channel: JSONObject): Boolean {
}
}
fun insertChannelInfo(db: Database, channel: JSONObject) {
fun insertChannelInfo(db: WMDatabase, channel: JSONObject) {
val id = try { channel.getString("id") } catch (e: JSONException) { return }
val header = try { channel.getString("header") } catch (e: JSONException) { "" }
val purpose = try { channel.getString("purpose") } catch (e: JSONException) { "" }
@ -123,7 +123,7 @@ fun insertChannelInfo(db: Database, channel: JSONObject) {
}
}
fun insertMyChannel(db: Database, myChanel: JSONObject): Boolean {
fun insertMyChannel(db: WMDatabase, myChanel: JSONObject): Boolean {
return try {
val id = try { myChanel.getString("id") } catch (e: JSONException) { return false }
val roles = try { myChanel.getString("roles") } catch (e: JSONException) { "" }
@ -156,7 +156,7 @@ fun insertMyChannel(db: Database, myChanel: JSONObject): Boolean {
}
}
fun insertMyChannelSettings(db: Database, myChanel: JSONObject) {
fun insertMyChannelSettings(db: WMDatabase, myChanel: JSONObject) {
try {
val id = try { myChanel.getString("id") } catch (e: JSONException) { return }
val notifyProps = try { myChanel.getString("notify_props") } catch (e: JSONException) { return }
@ -173,7 +173,7 @@ fun insertMyChannelSettings(db: Database, myChanel: JSONObject) {
}
}
fun insertChannelMember(db: Database, myChanel: JSONObject) {
fun insertChannelMember(db: WMDatabase, myChanel: JSONObject) {
try {
val userId = queryCurrentUserId(db) ?: return
val channelId = try { myChanel.getString("id") } catch (e: JSONException) { return }
@ -193,7 +193,7 @@ fun insertChannelMember(db: Database, myChanel: JSONObject) {
}
}
fun updateMyChannel(db: Database, myChanel: JSONObject) {
fun updateMyChannel(db: WMDatabase, myChanel: JSONObject) {
try {
val id = try { myChanel.getString("id") } catch (e: JSONException) { return }
val msgCount = try { myChanel.getInt("message_count") } catch (e: JSONException) { 0 }

View file

@ -1,9 +1,9 @@
package com.mattermost.helpers.database_extension
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONArray
internal fun insertCustomEmojis(db: Database, customEmojis: JSONArray) {
internal fun insertCustomEmojis(db: WMDatabase, customEmojis: JSONArray) {
for (i in 0 until customEmojis.length()) {
try {
val emoji = customEmojis.getJSONObject(i)

View file

@ -1,10 +1,10 @@
package com.mattermost.helpers.database_extension
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONArray
import org.json.JSONException
internal fun insertFiles(db: Database, files: JSONArray) {
internal fun insertFiles(db: WMDatabase, files: JSONArray) {
try {
for (i in 0 until files.length()) {
val file = files.getJSONObject(i)

View file

@ -1,17 +1,17 @@
package com.mattermost.helpers.database_extension
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.text.TextUtils
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReadableMap
import com.mattermost.helpers.DatabaseHelper
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.QueryArgs
import com.nozbe.watermelondb.mapCursor
import java.util.*
import kotlin.Exception
import com.mattermost.helpers.QueryArgs
import com.mattermost.helpers.mapCursor
import com.nozbe.watermelondb.WMDatabase
import java.util.Arrays
internal fun DatabaseHelper.saveToDatabase(db: Database, data: ReadableMap, teamId: String?, channelId: String?, receivingThreads: Boolean) {
internal fun DatabaseHelper.saveToDatabase(db: WMDatabase, data: ReadableMap, teamId: String?, channelId: String?, receivingThreads: Boolean) {
db.transaction {
val posts = data.getMap("posts")
data.getMap("team")?.let { insertTeam(db, it) }
@ -26,7 +26,7 @@ internal fun DatabaseHelper.saveToDatabase(db: Database, data: ReadableMap, team
data.getArray("threads")?.let {
val threadsArray = ArrayList<ReadableMap>()
for (i in 0 until it.size()) {
threadsArray.add(it.getMap(i))
it.getMap(i)?.let { map -> threadsArray.add(map) }
}
handleThreads(db, threadsArray, teamId)
}
@ -50,14 +50,14 @@ fun DatabaseHelper.getServerUrlForIdentifier(identifier: String): String? {
return null
}
fun DatabaseHelper.getDatabaseForServer(context: Context?, serverUrl: String): Database? {
fun DatabaseHelper.getDatabaseForServer(context: Context?, serverUrl: String): WMDatabase? {
try {
val query = "SELECT db_path FROM Servers WHERE url=?"
defaultDatabase!!.rawQuery(query, arrayOf(serverUrl)).use { cursor ->
if (cursor.count == 1) {
cursor.moveToFirst()
val databasePath = cursor.getString(0)
return Database.getInstance(databasePath, context!!)
val databasePath = String.format("file://%s", cursor.getString(0))
return WMDatabase.buildDatabase(databasePath, context!!, SQLiteDatabase.CREATE_IF_NECESSARY)
}
}
} catch (e: Exception) {
@ -67,7 +67,23 @@ fun DatabaseHelper.getDatabaseForServer(context: Context?, serverUrl: String): D
return null
}
fun find(db: Database, tableName: String, id: String?): ReadableMap? {
fun DatabaseHelper.getDeviceToken(): String? {
try {
val query = "SELECT value FROM Global WHERE id=?"
defaultDatabase!!.rawQuery(query, arrayOf("deviceToken")).use { cursor ->
if (cursor.count == 1) {
cursor.moveToFirst()
return cursor.getString(0)
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
fun find(db: WMDatabase, tableName: String, id: String?): ReadableMap? {
try {
db.rawQuery(
"SELECT * FROM $tableName WHERE id == ? LIMIT 1",
@ -87,7 +103,7 @@ fun find(db: Database, tableName: String, id: String?): ReadableMap? {
}
}
fun findByColumns(db: Database, tableName: String, columnNames: Array<String>, values: QueryArgs): ReadableMap? {
fun findByColumns(db: WMDatabase, tableName: String, columnNames: Array<String>, values: QueryArgs): ReadableMap? {
try {
val whereString = columnNames.joinToString(" AND ") { "$it = ?" }
db.rawQuery(
@ -108,7 +124,7 @@ fun findByColumns(db: Database, tableName: String, columnNames: Array<String>, v
}
}
fun queryIds(db: Database, tableName: String, ids: Array<String>): List<String> {
fun queryIds(db: WMDatabase, tableName: String, ids: Array<String>): List<String> {
val list: MutableList<String> = ArrayList()
val args = TextUtils.join(",", Arrays.stream(ids).map { "?" }.toArray())
try {
@ -129,7 +145,7 @@ fun queryIds(db: Database, tableName: String, ids: Array<String>): List<String>
return list
}
fun queryByColumn(db: Database, tableName: String, columnName: String, values: Array<Any?>): List<String> {
fun queryByColumn(db: WMDatabase, tableName: String, columnName: String, values: Array<Any?>): List<String> {
val list: MutableList<String> = ArrayList()
val args = TextUtils.join(",", Arrays.stream(values).map { "?" }.toArray())
try {
@ -149,7 +165,7 @@ fun queryByColumn(db: Database, tableName: String, columnName: String, values: A
return list
}
fun countByColumn(db: Database, tableName: String, columnName: String, value: Any?): Int {
fun countByColumn(db: WMDatabase, tableName: String, columnName: String, value: Any?): Int {
try {
db.rawQuery(
"SELECT COUNT(*) FROM $tableName WHERE $columnName == ? LIMIT 1",

View file

@ -3,13 +3,13 @@ package com.mattermost.helpers.database_extension
import com.facebook.react.bridge.ReadableMap
import com.mattermost.helpers.DatabaseHelper
import com.mattermost.helpers.ReadableMapUtils
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import kotlin.Exception
internal fun queryLastPostCreateAt(db: Database?, channelId: String): Double? {
internal fun queryLastPostCreateAt(db: WMDatabase?, channelId: String): Double? {
try {
if (db != null) {
val postsInChannelQuery = "SELECT earliest, latest FROM PostsInChannel WHERE channel_id=? ORDER BY latest DESC LIMIT 1"
@ -35,7 +35,7 @@ internal fun queryLastPostCreateAt(db: Database?, channelId: String): Double? {
return null
}
fun queryPostSinceForChannel(db: Database?, channelId: String): Double? {
fun queryPostSinceForChannel(db: WMDatabase?, channelId: String): Double? {
try {
if (db != null) {
val postsInChannelQuery = "SELECT last_fetched_at FROM MyChannel WHERE id=? LIMIT 1"
@ -57,7 +57,7 @@ fun queryPostSinceForChannel(db: Database?, channelId: String): Double? {
return null
}
fun queryLastPostInThread(db: Database?, rootId: String): Double? {
fun queryLastPostInThread(db: WMDatabase?, rootId: String): Double? {
try {
if (db != null) {
val query = "SELECT create_at FROM Post WHERE root_id=? AND delete_at=0 ORDER BY create_at DESC LIMIT 1"
@ -75,7 +75,7 @@ fun queryLastPostInThread(db: Database?, rootId: String): Double? {
return null
}
internal fun insertPost(db: Database, post: JSONObject) {
internal fun insertPost(db: WMDatabase, post: JSONObject) {
try {
val id = try { post.getString("id") } catch (e: JSONException) { return }
val channelId = try { post.getString("channel_id") } catch (e: JSONException) { return }
@ -129,7 +129,7 @@ internal fun insertPost(db: Database, post: JSONObject) {
}
}
internal fun updatePost(db: Database, post: JSONObject) {
internal fun updatePost(db: WMDatabase, post: JSONObject) {
try {
val id = try { post.getString("id") } catch (e: JSONException) { return }
val channelId = try { post.getString("channel_id") } catch (e: JSONException) { return }
@ -182,7 +182,7 @@ internal fun updatePost(db: Database, post: JSONObject) {
}
}
fun DatabaseHelper.handlePosts(db: Database, postsData: ReadableMap?, channelId: String, receivingThreads: Boolean) {
fun DatabaseHelper.handlePosts(db: WMDatabase, postsData: ReadableMap?, channelId: String, receivingThreads: Boolean) {
// Posts, PostInChannel, PostInThread, Reactions, Files, CustomEmojis, Users
try {
if (postsData != null) {

View file

@ -4,21 +4,23 @@ import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.mattermost.helpers.RandomId
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.mapCursor
import com.mattermost.helpers.mapCursor
import com.nozbe.watermelondb.WMDatabase
internal fun findPostInChannel(chunks: ReadableArray, earliest: Double, latest: Double): ReadableMap? {
for (i in 0 until chunks.size()) {
val chunk = chunks.getMap(i)
if (earliest >= chunk.getDouble("earliest") || latest <= chunk.getDouble("latest")) {
return chunk
chunk?.let {
if (earliest >= it.getDouble("earliest") || latest <= it.getDouble("latest")) {
return it
}
}
}
return null
}
internal fun insertPostInChannel(db: Database, channelId: String, earliest: Double, latest: Double): ReadableMap? {
internal fun insertPostInChannel(db: WMDatabase, channelId: String, earliest: Double, latest: Double): ReadableMap? {
return try {
val id = RandomId.generate()
db.execute(
@ -41,14 +43,16 @@ internal fun insertPostInChannel(db: Database, channelId: String, earliest: Doub
}
}
internal fun mergePostsInChannel(db: Database, existingChunks: ReadableArray, newChunk: ReadableMap) {
internal fun mergePostsInChannel(db: WMDatabase, existingChunks: ReadableArray, newChunk: ReadableMap) {
for (i in 0 until existingChunks.size()) {
try {
val chunk = existingChunks.getMap(i)
if (newChunk.getDouble("earliest") <= chunk.getDouble("earliest") &&
newChunk.getDouble("latest") >= chunk.getDouble("latest")) {
db.execute("DELETE FROM PostsInChannel WHERE id = ?", arrayOf(chunk.getString("id")))
break
chunk?.let {
if (newChunk.getDouble("earliest") <= it.getDouble("earliest") &&
newChunk.getDouble("latest") >= it.getDouble("latest")) {
db.execute("DELETE FROM PostsInChannel WHERE id = ?", arrayOf(it.getString("id")))
return
}
}
} catch (e: Exception) {
e.printStackTrace()
@ -56,7 +60,7 @@ internal fun mergePostsInChannel(db: Database, existingChunks: ReadableArray, ne
}
}
internal fun handlePostsInChannel(db: Database, channelId: String, earliest: Double, latest: Double) {
internal fun handlePostsInChannel(db: WMDatabase, channelId: String, earliest: Double, latest: Double) {
try {
db.rawQuery(
"SELECT id, channel_id, earliest, latest FROM PostsInChannel WHERE channel_id = ?",

View file

@ -1,10 +1,10 @@
package com.mattermost.helpers.database_extension
import com.facebook.react.bridge.Arguments
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.mapCursor
import com.mattermost.helpers.mapCursor
import com.nozbe.watermelondb.WMDatabase
fun getTeammateDisplayNameSetting(db: Database): String {
fun getTeammateDisplayNameSetting(db: WMDatabase): String {
val configSetting = queryConfigDisplayNameSetting(db)
if (configSetting != null) {
return configSetting

View file

@ -1,10 +1,10 @@
package com.mattermost.helpers.database_extension
import com.mattermost.helpers.RandomId
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONArray
internal fun insertReactions(db: Database, reactions: JSONArray) {
internal fun insertReactions(db: WMDatabase, reactions: JSONArray) {
for (i in 0 until reactions.length()) {
try {
val reaction = reactions.getJSONObject(i)

View file

@ -1,19 +1,19 @@
package com.mattermost.helpers.database_extension
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONObject
fun queryCurrentUserId(db: Database): String? {
fun queryCurrentUserId(db: WMDatabase): String? {
val result = find(db, "System", "currentUserId")
return result?.getString("value")?.removeSurrounding("\"")
}
fun queryCurrentTeamId(db: Database): String? {
fun queryCurrentTeamId(db: WMDatabase): String? {
val result = find(db, "System", "currentTeamId")
return result?.getString("value")?.removeSurrounding("\"")
}
fun queryConfigDisplayNameSetting(db: Database): String? {
fun queryConfigDisplayNameSetting(db: WMDatabase): String? {
val license = find(db, "System", "license")
val lockDisplayName = find(db, "Config", "LockTeammateNameDisplay")
val displayName = find(db, "Config", "TeammateNameDisplay")
@ -30,3 +30,11 @@ fun queryConfigDisplayNameSetting(db: Database): String? {
return null
}
fun queryConfigSigningKey(db: WMDatabase): String? {
return find(db, "Config", "AsymmetricSigningPublicKey")?.getString("value")
}
fun queryConfigServerVersion(db: WMDatabase): String? {
return find(db, "Config", "Version")?.getString("value")
}

View file

@ -3,10 +3,10 @@ package com.mattermost.helpers.database_extension
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.NoSuchKeyException
import com.facebook.react.bridge.ReadableMap
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.mapCursor
import com.mattermost.helpers.mapCursor
import com.nozbe.watermelondb.WMDatabase
fun findTeam(db: Database?, teamId: String): Boolean {
fun findTeam(db: WMDatabase?, teamId: String): Boolean {
if (db != null) {
val team = find(db, "Team", teamId)
return team != null
@ -14,7 +14,7 @@ fun findTeam(db: Database?, teamId: String): Boolean {
return false
}
fun findMyTeam(db: Database?, teamId: String): Boolean {
fun findMyTeam(db: WMDatabase?, teamId: String): Boolean {
if (db != null) {
val team = find(db, "MyTeam", teamId)
return team != null
@ -22,7 +22,7 @@ fun findMyTeam(db: Database?, teamId: String): Boolean {
return false
}
fun queryMyTeams(db: Database?): ArrayList<ReadableMap>? {
fun queryMyTeams(db: WMDatabase?): ArrayList<ReadableMap>? {
db?.rawQuery("SELECT * FROM MyTeam")?.use { cursor ->
val results = ArrayList<ReadableMap>()
if (cursor.count > 0) {
@ -38,7 +38,7 @@ fun queryMyTeams(db: Database?): ArrayList<ReadableMap>? {
return null
}
fun insertTeam(db: Database, team: ReadableMap): Boolean {
fun insertTeam(db: WMDatabase, team: ReadableMap): Boolean {
val id = try { team.getString("id") } catch (e: Exception) { return false }
val deleteAt = try {team.getDouble("delete_at") } catch (e: Exception) { 0 }
if (deleteAt.toInt() > 0) {
@ -78,7 +78,7 @@ fun insertTeam(db: Database, team: ReadableMap): Boolean {
}
}
fun insertMyTeam(db: Database, myTeam: ReadableMap): Boolean {
fun insertMyTeam(db: WMDatabase, myTeam: ReadableMap): Boolean {
val currentUserId = queryCurrentUserId(db) ?: return false
val id = try { myTeam.getString("id") } catch (e: NoSuchKeyException) { return false }
val roles = try { myTeam.getString("roles") } catch (e: NoSuchKeyException) { "" }

View file

@ -1,15 +1,31 @@
package com.mattermost.helpers.database_extension
import android.util.Log
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.NoSuchKeyException
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.mattermost.helpers.RandomId
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.mapCursor
import com.mattermost.helpers.mapCursor
import com.nozbe.watermelondb.WMDatabase
import org.json.JSONObject
internal fun insertThread(db: Database, thread: ReadableMap) {
private fun getLastReplyAt(thread: ReadableMap): Double {
try {
var v = thread.getDouble("last_reply_at")
if (v == 0.0) {
val post = thread.getMap("post")
if (post != null) {
v = post.getDouble("create_at")
}
}
return v
} catch (e: NoSuchKeyException) {
return 0.0
}
}
internal fun insertThread(db: WMDatabase, thread: ReadableMap) {
// These fields are not present when we extract threads from posts
try {
val id = try { thread.getString("id") } catch (e: NoSuchKeyException) { return }
@ -17,7 +33,7 @@ internal fun insertThread(db: Database, thread: ReadableMap) {
val lastViewedAt = try { thread.getDouble("last_viewed_at") } catch (e: NoSuchKeyException) { 0 }
val unreadReplies = try { thread.getInt("unread_replies") } catch (e: NoSuchKeyException) { 0 }
val unreadMentions = try { thread.getInt("unread_mentions") } catch (e: NoSuchKeyException) { 0 }
val lastReplyAt = try { thread.getDouble("last_reply_at") } catch (e: NoSuchKeyException) { 0 }
val lastReplyAt = getLastReplyAt(thread)
val replyCount = try { thread.getInt("reply_count") } catch (e: NoSuchKeyException) { 0 }
db.execute(
@ -36,7 +52,7 @@ internal fun insertThread(db: Database, thread: ReadableMap) {
}
}
internal fun updateThread(db: Database, thread: ReadableMap, existingRecord: ReadableMap) {
internal fun updateThread(db: WMDatabase, thread: ReadableMap, existingRecord: ReadableMap) {
try {
// These fields are not present when we extract threads from posts
val id = try { thread.getString("id") } catch (e: NoSuchKeyException) { return }
@ -44,7 +60,7 @@ internal fun updateThread(db: Database, thread: ReadableMap, existingRecord: Rea
val lastViewedAt = try { thread.getDouble("last_viewed_at") } catch (e: NoSuchKeyException) { existingRecord.getDouble("last_viewed_at") }
val unreadReplies = try { thread.getInt("unread_replies") } catch (e: NoSuchKeyException) { existingRecord.getInt("unread_replies") }
val unreadMentions = try { thread.getInt("unread_mentions") } catch (e: NoSuchKeyException) { existingRecord.getInt("unread_mentions") }
val lastReplyAt = try { thread.getDouble("last_reply_at") } catch (e: NoSuchKeyException) { 0 }
val lastReplyAt = getLastReplyAt(thread)
val replyCount = try { thread.getInt("reply_count") } catch (e: NoSuchKeyException) { 0 }
db.execute(
@ -63,26 +79,28 @@ internal fun updateThread(db: Database, thread: ReadableMap, existingRecord: Rea
}
}
internal fun insertThreadParticipants(db: Database, threadId: String, participants: ReadableArray) {
internal fun insertThreadParticipants(db: WMDatabase, threadId: String, participants: ReadableArray) {
for (i in 0 until participants.size()) {
try {
val participant = participants.getMap(i)
val id = RandomId.generate()
db.execute(
"""
INSERT INTO ThreadParticipant
(id, thread_id, user_id, _changed, _status)
VALUES (?, ?, ?, '', 'created')
""".trimIndent(),
arrayOf(id, threadId, participant.getString("id"))
)
participant?.let {
val id = RandomId.generate()
db.execute(
"""
INSERT INTO ThreadParticipant
(id, thread_id, user_id, _changed, _status)
VALUES (?, ?, ?, '', 'created')
""".trimIndent(),
arrayOf(id, threadId, it.getString("id"))
)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
fun insertTeamThreadsSync(db: Database, teamId: String, earliest: Double, latest: Double) {
fun insertTeamThreadsSync(db: WMDatabase, teamId: String, earliest: Double, latest: Double) {
try {
val query = """
INSERT INTO TeamThreadsSync (id, _changed, _status, earliest, latest)
@ -94,7 +112,7 @@ fun insertTeamThreadsSync(db: Database, teamId: String, earliest: Double, latest
}
}
fun updateTeamThreadsSync(db: Database, teamId: String, earliest: Double, latest: Double, existingRecord: ReadableMap) {
fun updateTeamThreadsSync(db: WMDatabase, teamId: String, earliest: Double, latest: Double, existingRecord: ReadableMap) {
try {
val storeEarliest = minOf(earliest, existingRecord.getDouble("earliest"))
val storeLatest = maxOf(latest, existingRecord.getDouble("latest"))
@ -105,7 +123,7 @@ fun updateTeamThreadsSync(db: Database, teamId: String, earliest: Double, latest
}
}
fun syncParticipants(db: Database, thread: ReadableMap) {
fun syncParticipants(db: WMDatabase, thread: ReadableMap) {
try {
val threadId = thread.getString("id")
val participants = thread.getArray("participants")
@ -121,7 +139,7 @@ fun syncParticipants(db: Database, thread: ReadableMap) {
}
}
internal fun handlePostsInThread(db: Database, postsInThread: Map<String, List<JSONObject>>) {
internal fun handlePostsInThread(db: WMDatabase, postsInThread: Map<String, List<JSONObject>>) {
postsInThread.forEach { (key, list) ->
try {
val sorted = list.sortedBy { it.getDouble("create_at") }
@ -161,7 +179,7 @@ internal fun handlePostsInThread(db: Database, postsInThread: Map<String, List<J
}
}
fun handleThreads(db: Database, threads: ArrayList<ReadableMap>, teamId: String?) {
fun handleThreads(db: WMDatabase, threads: ArrayList<ReadableMap>, teamId: String?) {
val teamIds = ArrayList<String>()
if (teamId.isNullOrEmpty()) {
val myTeams = queryMyTeams(db)
@ -186,7 +204,7 @@ fun handleThreads(db: Database, threads: ArrayList<ReadableMap>, teamId: String?
handleTeamThreadsSync(db, threads, teamIds)
}
fun handleThread(db: Database, thread: ReadableMap, teamIds: ArrayList<String>) {
fun handleThread(db: WMDatabase, thread: ReadableMap, teamIds: ArrayList<String>) {
// Insert/Update the thread
val threadId = thread.getString("id")
val isFollowing = thread.getBoolean("is_following")
@ -207,7 +225,7 @@ fun handleThread(db: Database, thread: ReadableMap, teamIds: ArrayList<String>)
}
}
fun handleThreadInTeam(db: Database, thread: ReadableMap, teamId: String) {
fun handleThreadInTeam(db: WMDatabase, thread: ReadableMap, teamId: String) {
val threadId = thread.getString("id") ?: return
val existingRecord = findByColumns(
db,
@ -229,10 +247,21 @@ fun handleThreadInTeam(db: Database, thread: ReadableMap, teamId: String) {
}
}
fun handleTeamThreadsSync(db: Database, threadList: ArrayList<ReadableMap>, teamIds: ArrayList<String>) {
fun handleTeamThreadsSync(db: WMDatabase, threadList: ArrayList<ReadableMap>, teamIds: ArrayList<String>) {
val sortedList = threadList.filter{ it.getBoolean("is_following") }
.sortedBy { it.getDouble("last_reply_at") }
.map { it.getDouble("last_reply_at") }
.sortedBy {
var v = getLastReplyAt(it)
if (v == 0.0) {
Log.d("Database", "Trying to add a thread with no replies and no post")
}
v
}
.map {
getLastReplyAt(it)
}
if (sortedList.isEmpty()) {
return;
}
val earliest = sortedList.first()
val latest = sortedList.last()

View file

@ -4,9 +4,9 @@ import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.NoSuchKeyException
import com.facebook.react.bridge.ReadableArray
import com.mattermost.helpers.ReadableMapUtils
import com.nozbe.watermelondb.Database
import com.nozbe.watermelondb.WMDatabase
fun getLastPictureUpdate(db: Database?, userId: String): Double? {
fun getLastPictureUpdate(db: WMDatabase?, userId: String): Double? {
try {
if (db != null) {
var id = userId
@ -28,7 +28,7 @@ fun getLastPictureUpdate(db: Database?, userId: String): Double? {
return null
}
fun getCurrentUserLocale(db: Database): String {
fun getCurrentUserLocale(db: WMDatabase): String {
try {
val currentUserId = queryCurrentUserId(db) ?: return "en"
val userQuery = "SELECT locale FROM User WHERE id=?"
@ -45,41 +45,43 @@ fun getCurrentUserLocale(db: Database): String {
return "en"
}
fun handleUsers(db: Database, users: ReadableArray) {
fun handleUsers(db: WMDatabase, users: ReadableArray) {
for (i in 0 until users.size()) {
val user = users.getMap(i)
val roles = user.getString("roles") ?: ""
val isBot = try {
user.getBoolean("is_bot")
} catch (e: NoSuchKeyException) {
false
}
user?.let { u ->
val roles = u.getString("roles") ?: ""
val isBot = try {
u.getBoolean("is_bot")
} catch (e: NoSuchKeyException) {
false
}
val lastPictureUpdate = try { user.getDouble("last_picture_update") } catch (e: NoSuchKeyException) { 0 }
val lastPictureUpdate = try { u.getDouble("last_picture_update") } catch (e: NoSuchKeyException) { 0 }
try {
db.execute(
"""
INSERT INTO User (id, auth_service, update_at, delete_at, email, first_name, is_bot, is_guest,
last_name, last_picture_update, locale, nickname, position, roles, status, username, notify_props,
props, timezone, _changed, _status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '', 'created')
""".trimIndent(),
arrayOf(
user.getString("id"),
user.getString("auth_service"), user.getDouble("update_at"), user.getDouble("delete_at"),
user.getString("email"), user.getString("first_name"), isBot,
roles.contains("system_guest"), user.getString("last_name"), lastPictureUpdate,
user.getString("locale"), user.getString("nickname"), user.getString("position"),
roles, "", user.getString("username"), "{}",
ReadableMapUtils.toJSONObject(user.getMap("props")
?: Arguments.createMap()).toString(),
ReadableMapUtils.toJSONObject(user.getMap("timezone")
?: Arguments.createMap()).toString(),
)
)
} catch (e: Exception) {
e.printStackTrace()
try {
db.execute(
"""
INSERT INTO User (id, auth_service, update_at, delete_at, email, first_name, is_bot, is_guest,
last_name, last_picture_update, locale, nickname, position, roles, status, username, notify_props,
props, timezone, _changed, _status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '', 'created')
""".trimIndent(),
arrayOf(
u.getString("id"),
u.getString("auth_service"), u.getDouble("update_at"), u.getDouble("delete_at"),
u.getString("email"), u.getString("first_name"), isBot,
roles.contains("system_guest"), u.getString("last_name"), lastPictureUpdate,
u.getString("locale"), u.getString("nickname"), u.getString("position"),
roles, "", u.getString("username"), "{}",
ReadableMapUtils.toJSONObject(u.getMap("props")
?: Arguments.createMap()).toString(),
ReadableMapUtils.toJSONObject(u.getMap("timezone")
?: Arguments.createMap()).toString(),
)
)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}

Some files were not shown because too many files have changed in this diff Show more