Compare commits

...

611 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
2271 changed files with 189048 additions and 30876 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": "warn",
"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|@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

@ -52,20 +52,22 @@ class Specs {
}
generateSplits() {
const chunkSize = Math.ceil(this.rawFiles.length / this.parallelism);
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.rawFiles.length; i += chunkSize) {
const end = Math.min(i + chunkSize, this.rawFiles.length);
const fileGroup = this.rawFiles.slice(i, end).join(' ');
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);
if (end === this.rawFiles.length) {
break;
}
start = end;
runNo++;
if (remainder > 0) {
remainder--;
}
}
}

View file

@ -12,6 +12,13 @@ runs:
- name: ci/prepare-mobile-build
uses: ./.github/actions/prepare-mobile-build
- 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:
@ -27,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,24 +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/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: |
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::"
- name: Cache Pods
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: Pods
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-

View file

@ -5,7 +5,7 @@ runs:
using: composite
steps:
# The required ruby version is mentioned in '.ruby-version'
- uses: ruby/setup-ruby@ff740bc00a01b3a50fffc55a1071b1060eeae9dc # v1.180.0
- uses: ruby/setup-ruby@cb0fda56a307b8c78d38320cd40d9eb22a3bf04e # v1.242.0
- name: ci/setup-fastlane-dependencies
shell: bash
@ -16,7 +16,7 @@ runs:
working-directory: ./fastlane
- name: Cache Ruby gems
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}

View file

@ -5,7 +5,7 @@ runs:
using: composite
steps:
- name: ci/setup-node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: ".nvmrc"
cache: "npm"
@ -22,7 +22,7 @@ runs:
echo "::endgroup::"
- name: Cache Node.js modules
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

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"

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

@ -8,7 +8,7 @@ on:
- build-beta-android-[0-9]+
env:
NODE_VERSION: 20.13.1
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-android-build
uses: ./.github/actions/prepare-android-build
@ -54,7 +57,25 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-android-beta-build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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: 20.13.1
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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: 20.13.1
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
build-ios-simulator:
runs-on: macos-14-large
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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-14-large
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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: 20.13.1
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
build-and-deploy-ios-release:
runs-on: macos-14-large
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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-14-large
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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

@ -6,8 +6,9 @@ on:
- labeled
env:
NODE_VERSION: 20.13.1
NODE_VERSION: 22.14.0
TERM: xterm
INTUNE_ENABLED: 'true'
jobs:
test:
@ -15,34 +16,33 @@ jobs:
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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-14-large
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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:
@ -60,7 +60,7 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-ios-pr-build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-pr-${{ github.run_id }}
path: "*.ipa"
@ -72,7 +72,7 @@ jobs:
- test
steps:
- name: ci/checkout-repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
@ -94,7 +94,7 @@ jobs:
working-directory: ./fastlane
- name: ci/upload-android-pr-build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-build-pr-${{ github.run_id }}
path: "*.apk"

View file

@ -7,8 +7,11 @@ on:
- 'release*'
pull_request:
permissions:
pull-requests: write
env:
NODE_VERSION: 20.13.1
NODE_VERSION: 22.14.0
TERM: xterm
jobs:
@ -16,6 +19,11 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: ci/checkout-repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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

@ -20,7 +20,7 @@ jobs:
run: echo '${{ inputs.CMT_MATRIX }}' > instance-details.json
- name: cmt/upload-instance-details
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: instance-details.json
path: instance-details.json
@ -32,7 +32,7 @@ jobs:
MOBILE_SHA: ${{ steps.repo.outputs.MOBILE_SHA }}
steps:
- name: cmt/checkout-mobile
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
@ -45,7 +45,7 @@ jobs:
needs:
- calculate-commit-hash
steps:
- uses: mattermost/actions/delivery/update-commit-status@746563b58e737a17a8ceb00b84a813b9e6e1b236
- uses: mattermost/actions/delivery/update-commit-status@d5174b860704729f4c14ef8489ae075742bfa08a
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
@ -74,7 +74,7 @@ jobs:
- update-initial-status
steps:
- name: Checkout Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ inputs.MOBILE_VERSION }}
@ -91,7 +91,7 @@ jobs:
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip

View file

@ -1,73 +0,0 @@
name: Detox E2E Android Tests PR
on:
pull_request:
branches:
- main
types:
- labeled
concurrency:
group: "${{ github.workflow }}-${{ github.event.pull_request.number }}-${{ github.event.label.name }}"
cancel-in-progress: true
jobs:
build-android-apk:
if: github.event.label.name == 'E2E Android tests for PR'
runs-on: ubuntu-latest-8-cores
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: ci/checkout-repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: ci/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: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@v3
- name: Inject Detox settings
run: cd detox && npm run e2e:android-inject-settings
- name: Update minSdkVersion for react-native-image-picker
run: |
sed -i 's/minSdkVersion 21/minSdkVersion 23/' ./node_modules/react-native-image-picker/android/build.gradle
cat ./node_modules/react-native-image-picker/android/build.gradle | grep minSdkVersion
- name: Detox build
run: |
cd detox
npm install
npm install -g detox-cli
npm run e2e:android-build
- name: ci/upload-android-pr-build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: android-build-apk-${{ github.run_id }}
path: "android/app/build/outputs/apk/**/app-*.apk"

View file

@ -1,4 +1,4 @@
name: Detox E2E Tests Template
name: Detox Android E2E Tests Template
on:
workflow_call:
@ -20,8 +20,8 @@ on:
required: false
default: ${{ github.head_ref || github.ref }}
type: string
run-ios-tests:
description: "Run iOS tests"
run-android-tests:
description: "Run Android tests"
required: true
type: boolean
run-type:
@ -38,21 +38,21 @@ on:
required: false
type: string
default: 'false'
ios_device_name:
description: "iPhone simulator name"
required: false
type: string
default: "iPhone 15 Pro"
ios_device_os_name:
description: "iPhone simulator OS version"
required: false
type: string
default: "iOS 17.4"
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 }}
@ -68,8 +68,8 @@ env:
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 }}
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 }}
@ -84,11 +84,14 @@ env:
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
if: ${{ inputs.run-ios-tests }}
outputs:
specs: ${{ steps.generate-specs.outputs.specs }}
build_id: ${{ steps.resolve-device.outputs.BUILD_ID }}
@ -97,14 +100,14 @@ jobs:
workflow_hash: ${{ steps.resolve-device.outputs.WORKFLOW_HASH }}
steps:
- name: Checkout Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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}}"
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
@ -120,17 +123,17 @@ jobs:
with:
parallelism: 10
search_path: detox/e2e/test
device_name: ${{ env.DEVICE_NAME }}
device_os_version: ${{ env.DEVICE_OS_VERSION }}
device_name: ${{ env.AVD_NAME }}
device_os_version: ${{ env.SDK_VERSION }}
e2e-ios:
name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }}
if: ${{ inputs.run-ios-tests }}
runs-on: macos-14
e2e-android:
name: machine-${{ matrix.runId }}-api-${{ matrix.deviceOsVersion }}
runs-on: ubuntu-latest-8-cores
continue-on-error: true
timeout-minutes: ${{ inputs.low_bandwidth_mode && 80 || 40 }}
timeout-minutes: 240
env:
IOS: true
ANDROID_HOME: /usr/local/lib/android/sdk
ANDROID_SDK_ROOT: /usr/local/lib/android/sdk
needs:
- generate-specs
strategy:
@ -138,114 +141,121 @@ jobs:
matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }}
steps:
- name: Checkout Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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
- name: Install Dependencies
run: |
brew tap wix/brew
brew install applesimutils
sudo apt-get update
sudo apt-get install -y libpulse0
sudo apt-get install -y scrot ffmpeg xvfb
- 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: 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: Unzip iOS Simulator Build
run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/
- 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: Start React Native Metro Server
run: npm run start &
- 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 i
- 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: Run Detox E2E Tests
continue-on-error: true # Label might have been removed manually
run: |
cd detox
npm run detox:config-gen
npm run e2e:ios-test -- ${{ matrix.specs }}
env:
DETOX_DEVICE_TYPE: ${{ env.DEVICE_NAME }}
DETOX_OS_VERSION: ${{ env.DEVICE_OS_VERSION }}
LOW_BANDWIDTH_MODE: ${{ inputs.low_bandwidth_mode }}
npm install
- name: reset network settings
if: ${{ inputs.low_bandwidth_mode || failure() }}
- name: Set .env with RUNNING_E2E=true
run: |
networksetup -setwebproxystate Ethernet "off"
networksetup -setsecurewebproxystate Ethernet "off"
cat > .env <<EOF
RUNNING_E2E=true
EOF
- name: Create destination path
run: mkdir -p android/app/build
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
- name: Download APK artifact
uses: actions/download-artifact@v4
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: android-build-files-${{ github.run_id }}
path: android/app/build
- name: Upload iOS Test Report
- 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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-results-${{ needs.generate-specs.outputs.workflow_hash }}-${{ matrix.runId }}
name: android-results-${{ needs.generate-specs.outputs.workflow_hash }}-${{ matrix.runId }}
path: detox/artifacts/
generate-report:
runs-on: ubuntu-22.04
if: ${{ inputs.run-ios-tests}}
needs:
- generate-specs
- e2e-ios
- 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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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 All Artifacts
- name: Download Android Artifacts
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
path: detox/artifacts/
pattern: ios-results-${{ needs.generate-specs.outputs.workflow_hash }}-*
pattern: android-results-${{ needs.generate-specs.outputs.workflow_hash }}-*
continue-on-error: true
- name: Generate Report Path
id: s3
@ -262,7 +272,6 @@ jobs:
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 }}
IOS: ${{ inputs.run-ios-tests }}
BUILD_ID: ${{ needs.generate-specs.outputs.build_id }}
REPORT_PATH: ${{ steps.s3.outputs.path }}
## These are needed for the MM Webhook report
@ -282,7 +291,7 @@ jobs:
- 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}
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
@ -301,3 +310,36 @@ jobs:
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 }}

View file

@ -1,6 +1,6 @@
# 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: Detox E2E Tests PR
name: E2E
on:
pull_request:
@ -13,10 +13,28 @@ 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:
runs-on: ubuntu-22.04
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:
@ -24,50 +42,112 @@ jobs:
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.event.pull_request.head.sha }}
context: e2e/detox-tests
description: Detox tests for mattermost mobile app have started ...
context: e2e/detox-android-tests
description: Detox Android tests for mattermost mobile app have started ...
status: pending
build-ios-simulator:
runs-on: macos-14
if: contains(github.event.label.name, 'E2E iOS tests for PR')
runs-on: macos-26
needs:
- update-initial-status
- update-initial-status-ios
steps:
- name: Checkout Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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 }}"
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
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@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ios-build-simulator-${{ github.run_id }}
path: Mattermost-simulator-x86_64.app.zip
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:
name: iOS Mobile Tests on PR
uses: ./.github/workflows/e2e-detox-template.yml
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-ios-tests: true
run-type: "PR"
MOBILE_VERSION: ${{ github.event.pull_request.head.sha }}
low_bandwidth_mode: ${{ contains(github.event.label.name,'LBW') && true || false }}
secrets: inherit
update-final-status:
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:
@ -77,23 +157,39 @@ jobs:
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.event.pull_request.head.sha }}
context: e2e/detox-tests
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 }}
e2e-remove-label:
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@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
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';
const androidLabel = 'E2E Android tests for PR';
context.payload.pull_request.labels.forEach(label => {
if (label.name.includes(iosLabel)) {
github.rest.issues.removeLabel({
@ -104,3 +200,25 @@ jobs:
});
}
});
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,
});
}
});

View file

@ -5,8 +5,11 @@ on:
branches:
- release-*
env:
INTUNE_ENABLED: 'true'
jobs:
update-initial-status:
update-initial-status-ios:
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
@ -15,20 +18,36 @@ jobs:
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-tests
description: Detox tests for mattermost mobile app have started ...
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-14
runs-on: macos-15
needs:
- update-initial-status
- update-initial-status-ios
steps:
- name: Checkout Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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:
@ -40,24 +59,85 @@ jobs:
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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-detox-template.yml
uses: ./.github/workflows/e2e-ios-template.yml
needs:
- build-ios-simulator
with:
run-ios-tests: true
run-type: "RELEASE"
record_tests_in_zephyr: 'true'
MOBILE_VERSION: ${{ github.ref }}
secrets: inherit
update-final-status:
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
@ -68,7 +148,23 @@ jobs:
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-tests
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

@ -4,8 +4,11 @@ on:
schedule:
- cron: "0 0 * * 4,5" # Wednesday and Thursday midnight
env:
INTUNE_ENABLED: 'true'
jobs:
update-initial-status:
update-initial-status-ios:
runs-on: ubuntu-22.04
steps:
- uses: mattermost/actions/delivery/update-commit-status@main
@ -14,20 +17,36 @@ jobs:
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-tests
description: Detox tests for mattermost mobile app have started ...
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-14
runs-on: macos-15
needs:
- update-initial-status
- update-initial-status-ios
steps:
- name: Checkout Repository
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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:
@ -39,24 +58,85 @@ jobs:
working-directory: ./fastlane
- name: Upload iOS Simulator Build
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
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-detox-template.yml
uses: ./.github/workflows/e2e-ios-template.yml
needs:
- build-ios-simulator
with:
run-ios-tests: true
run-type: "MAIN"
record_tests_in_zephyr: 'true'
MOBILE_VERSION: ${{ github.ref }}
secrets: inherit
update-final-status:
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
@ -67,7 +147,23 @@ jobs:
with:
repository_full_name: ${{ github.repository }}
commit_sha: ${{ github.sha }}
context: e2e/detox-tests
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/test
uses: ./.github/actions/test
build-ios-unsigned:
runs-on: macos-14-large
runs-on: macos-15-large
needs:
- test
steps:
- name: ci/checkout-repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
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@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: ci/prepare-android-build
uses: ./.github/actions/prepare-android-build
@ -62,34 +90,133 @@ 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@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ruby/setup-ruby@ff740bc00a01b3a50fffc55a1071b1060eeae9dc # v1.180.0
- name: ci/download-sboms
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
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@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
path: ${{ github.workspace }}
merge-multiple: true
@ -99,3 +226,9 @@ jobs:
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)"

303
.gitignore vendored
View file

@ -1,124 +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_*
# 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*
libraries/**/**/build
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*
# Android sounds
android/app/src/main/res/raw/*
.aider*
# 새로 적용된 .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

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 @@
20.13.1
22.14.0

2
.nvmrc
View file

@ -1 +1 @@
20.13.1
22.14.0

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 내용을 모르면 추정하지 말고 먼저 해당 파일을 확인한다.

View file

@ -1,3 +1,4 @@
source "https://rubygems.org"
gem "cocoapods", "1.16.1"
gem "rexml", ">= 3.4.2"

View file

@ -87,7 +87,7 @@ GEM
netrc (0.11.0)
nkf (0.2.0)
public_suffix (4.0.7)
rexml (3.3.9)
rexml (3.4.4)
ruby-macho (2.5.1)
securerandom (0.4.0)
typhoeus (1.4.1)
@ -107,6 +107,7 @@ PLATFORMS
DEPENDENCIES
cocoapods (= 1.16.1)
rexml (>= 3.4.2)
BUNDLED WITH
2.5.11

View file

@ -20,6 +20,21 @@ A spec-compliant polyfill for Intl.DateTimeFormat fully tested by the official E
* LICENSE: MIT
---
## @formatjs/intl-displaynames
This product contains '@formatjs/intl-displaynames' by Linjie Ding.
Polyfill for: https://tc39.es/proposal-intl-displaynames
* HOMEPAGE:
* https://github.com/formatjs/formatjs
* LICENSE: MIT
---
## @formatjs/intl-getcanonicallocales
@ -87,6 +102,21 @@ A spec-compliant polyfill for Intl.PluralRules fully tested by the official ECMA
* LICENSE: MIT
---
## @formatjs/intl-relativetimeformat
This product contains '@formatjs/intl-relativetimeformat' by Long Ho.
Formats JavaScript dates to relative time strings.
* HOMEPAGE:
* https://github.com/formatjs/formatjs
* LICENSE: MIT
---
## @gorhom/bottom-sheet
@ -120,6 +150,42 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## @gorhom/portal
This product contains '@gorhom/portal' by Mo Gorhom.
A simplified portal implementation for ⭕️ React Native ⭕️
* HOMEPAGE:
* https://github.com/gorhom/react-native-portal#readme
* LICENSE: MIT
MIT License
Copyright (c) 2020 Mo Gorhom
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## @mattermost/calls
@ -243,6 +309,39 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## @mattermost/secure-pdf-viewer
This product contains '@mattermost/secure-pdf-viewer' by Mattermost.
Securely view PDF documents without allowing them to be downloaded to their devices.
* HOMEPAGE:
* https://github.com/mattermost/secure-pdf-viewer
* LICENSE: MIT
MIT License
Copyright (c) 2022 Mattermost, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
@ -697,6 +796,28 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## @shopify/flash-list
This product contains '@shopify/flash-list' by shopify.
FlashList is a more performant FlatList replacement
* HOMEPAGE:
* https://shopify.github.io/flash-list/
* LICENSE: MIT
Copyright 2022-present, Shopify Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
## @stream-io/flat-list-mvcp
@ -1632,6 +1753,43 @@ Lightweight fuzzy-search
limitations under the License.
---
## grapheme-splitter
This product contains 'grapheme-splitter' by Orlin Georgiev.
A JavaScript library that breaks strings into their individual user-perceived characters. It supports emojis!
* HOMEPAGE:
* https://github.com/orling/grapheme-splitter
* LICENSE: MIT
The MIT License (MIT)
Copyright (c) 2015 Orlin Georgiev
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## html-entities
@ -1666,6 +1824,43 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
## js-sha256
This product contains 'js-sha256' by Chen, Yi-Cyuan.
A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.
* HOMEPAGE:
* https://github.com/emn178/js-sha256
* LICENSE: MIT
Copyright (c) 2014-2025 Chen, Yi-Cyuan
MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
## mime-db
@ -1793,6 +1988,42 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
## prismjs
This product contains 'prismjs' by Lea Verou.
Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.
* HOMEPAGE:
* https://github.com/PrismJS/prism#readme
* LICENSE: MIT
MIT LICENSE
Copyright (c) 2012 Lea Verou
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
## react
@ -2294,6 +2525,42 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## react-native-keyboard-controller
This product contains 'react-native-keyboard-controller' by Kiryl Ziusko.
Keyboard manager which works in identical way on both iOS and Android
* HOMEPAGE:
* https://kirillzyusko.github.io/react-native-keyboard-controller/
* LICENSE: MIT
MIT License
Copyright (c) 2021 Kiryl Ziusko
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## react-native-keychain
@ -3079,3 +3346,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,7 +1,7 @@
# Mattermost Mobile v2
- **Minimum Server versions:** Current ESR version (9.11.0+)
- **Supported iOS versions:** 13.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

@ -70,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.
@ -103,7 +104,7 @@ android {
ndkVersion rootProject.ext.ndkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdkVersion rootProject.ext.compileSdkVersion
namespace "com.mattermost.rnbeta"
namespace "com.tokilabs.mattermost"
lintOptions {
checkReleaseBuilds false
@ -111,11 +112,11 @@ android {
}
defaultConfig {
applicationId "com.mattermost.rnbeta"
applicationId "com.tokilabs.mattermost"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 602
versionName "2.25.0"
versionCode 730
versionName "2.38.0"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
@ -140,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())
}
}
@ -202,16 +203,23 @@ dependencies {
implementation jscFlavor
}
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
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.1.4'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation "com.google.firebase:firebase-messaging:$firebaseVersion"
androidTestImplementation('com.wix:detox:+')
androidTestImplementation 'androidx.test:core:1.6.0'
androidTestImplementation 'androidx.test:runner:1.5.2'
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-jsi')
@ -224,16 +232,16 @@ dependencies {
configurations.all {
resolutionStrategy {
force 'androidx.test:core:1.6.0'
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.2.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'
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.2.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.12.0'

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

@ -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

@ -77,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"

View file

@ -28,7 +28,7 @@ import androidx.core.app.Person;
import androidx.core.app.RemoteInput;
import androidx.core.graphics.drawable.IconCompat;
import com.mattermost.rnbeta.*;
import com.tokilabs.mattermost.*;
import com.mattermost.rnutils.helpers.NotificationHelper;
import com.nozbe.watermelondb.WMDatabase;
import com.mattermost.turbolog.TurboLog;

View file

@ -135,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

@ -4,10 +4,6 @@ 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 {
return UUID.randomUUID().toString()
}

View file

@ -54,12 +54,14 @@ 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) }
}
}
}
}
@ -67,19 +69,22 @@ fun insertCategoriesWithChannels(db: WMDatabase, orderCategories: ReadableMap) {
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

@ -26,7 +26,7 @@ internal fun DatabaseHelper.saveToDatabase(db: WMDatabase, data: ReadableMap, te
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)
}

View file

@ -10,8 +10,10 @@ 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
}
}
}
@ -45,10 +47,12 @@ internal fun mergePostsInChannel(db: WMDatabase, existingChunks: ReadableArray,
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()

View file

@ -83,15 +83,17 @@ internal fun insertThreadParticipants(db: WMDatabase, threadId: String, particip
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()
}

View file

@ -48,38 +48,40 @@ fun getCurrentUserLocale(db: WMDatabase): String {
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()
}
}
}
}

View file

@ -26,11 +26,13 @@ suspend fun PushNotificationDataRunnable.Companion.fetchMyChannel(db: WMDatabase
"D" -> {
profilesArray = fetchProfileInChannel(db, serverUrl, channelId)
if ((profilesArray?.size() ?: 0) > 0) {
val displayName = displayUsername(profilesArray!!.getMap(0), displayNameSetting)
val data = Arguments.createMap()
data.merge(channelData)
data.putString("display_name", displayName)
channelData = data
profilesArray?.getMap(0)?.let { profile ->
val displayName = displayUsername(profile, displayNameSetting)
val data = Arguments.createMap()
data.merge(channelData)
data.putString("display_name", displayName)
channelData = data
}
}
}
"G" -> {
@ -117,8 +119,10 @@ private suspend fun PushNotificationDataRunnable.Companion.fetchProfileInChannel
if (profilesArray != null) {
for (i in 0 until profilesArray.size()) {
val profile = profilesArray.getMap(i)
if (profile.getString("id") != currentUserId) {
result.pushMap(profile)
profile?.let {
if (it.getString("id") != currentUserId) {
result.pushMap(it)
}
}
}
}
@ -152,7 +156,9 @@ private fun PushNotificationDataRunnable.Companion.displayGroupMessageName(profi
val names = ArrayList<String>()
for (i in 0 until profilesArray.size()) {
val profile = profilesArray.getMap(i)
names.add(displayUsername(profile, displayNameSetting))
profile?.let {
names.add(displayUsername(it, displayNameSetting))
}
}
return names.sortedWith { s1, s2 ->

View file

@ -62,7 +62,7 @@ internal suspend fun PushNotificationDataRunnable.Companion.fetchPosts(
val userIdsAlreadyLoaded = mutableListOf<String>()
if (loadedProfiles != null) {
for (i in 0 until loadedProfiles.size()) {
loadedProfiles.getMap(i).getString("id")?.let { userIdsAlreadyLoaded.add(it) }
loadedProfiles.getMap(i)?.getString("id")?.let { userIdsAlreadyLoaded.add(it) }
}
}
@ -95,10 +95,12 @@ internal suspend fun PushNotificationDataRunnable.Companion.fetchPosts(
if (attachments != null) {
for (i in 0 until attachments.size()) {
val attachment = attachments.getMap(i)
val pretext = attachment.getString("pretext")
val text = attachment.getString("text")
findNeededUsernames(pretext)
findNeededUsernames(text)
attachment?.let {
val pretext = it.getString("pretext")
val text = it.getString("text")
findNeededUsernames(pretext)
findNeededUsernames(text)
}
}
}
@ -132,22 +134,23 @@ internal suspend fun PushNotificationDataRunnable.Companion.fetchPosts(
participants?.let {
for (i in 0 until it.size()) {
val participant = it.getMap(i)
participant?.let { p ->
val participantId = p.getString("id")
if (participantId != currentUserId && participantId != null) {
if (!threadParticipantUserIds.contains(participantId) && !userIdsAlreadyLoaded.contains(participantId)) {
threadParticipantUserIds.add(participantId)
}
val participantId = participant.getString("id")
if (participantId != currentUserId && participantId != null) {
if (!threadParticipantUserIds.contains(participantId) && !userIdsAlreadyLoaded.contains(participantId)) {
threadParticipantUserIds.add(participantId)
if (!threadParticipantUsers.containsKey(participantId)) {
threadParticipantUsers[participantId] = p
}
}
if (!threadParticipantUsers.containsKey(participantId)) {
threadParticipantUsers[participantId] = participant
val username = p.getString("username")
if (username != null && username != currentUsername && !threadParticipantUsernames.contains(username)) {
threadParticipantUsernames.add(username)
}
}
val username = participant.getString("username")
if (username != null && username != currentUsername && !threadParticipantUsernames.contains(username)) {
threadParticipantUsernames.add(username)
}
}
}
}

View file

@ -56,6 +56,6 @@ internal suspend fun PushNotificationDataRunnable.Companion.fetchNeededUsers(ser
internal fun PushNotificationDataRunnable.Companion.addUsersToList(users: ReadableArray, list: ArrayList<Any>) {
for (i in 0 until users.size()) {
list.add(users.getMap(i))
users.getMap(i)?.let { list.add(it) }
}
}

View file

@ -1,4 +1,4 @@
package com.mattermost.rnbeta
package com.tokilabs.mattermost
import android.app.PendingIntent
import android.content.Context
@ -105,7 +105,7 @@ class CustomPushNotification(
CustomPushNotificationHelper.PUSH_TYPE_MESSAGE, CustomPushNotificationHelper.PUSH_TYPE_SESSION -> {
val currentActivityName = mAppLifecycleFacade.runningReactContext?.currentActivity?.componentName?.className ?: ""
TurboLog.i("ReactNative", currentActivityName)
if (!mAppLifecycleFacade.isAppVisible() || currentActivityName != "MainActivity") {
if (!mAppLifecycleFacade.isAppVisible() || !currentActivityName.contains("MainActivity")) {
var createSummary = type == CustomPushNotificationHelper.PUSH_TYPE_MESSAGE
if (type == CustomPushNotificationHelper.PUSH_TYPE_MESSAGE) {
channelId?.let {

View file

@ -1,8 +1,9 @@
package com.mattermost.rnbeta
package com.tokilabs.mattermost
import android.content.res.Configuration
import android.os.Bundle
import android.view.KeyEvent
import androidx.core.view.WindowCompat
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint
import com.facebook.react.defaults.DefaultReactActivityDelegate
@ -14,6 +15,7 @@ import expo.modules.ReactActivityDelegateWrapper
class MainActivity : NavigationActivity() {
private var HWKeyboardConnected = false
private val foldableObserver = FoldableObserver.getInstance(this)
private var lastOrientation: Int = Configuration.ORIENTATION_UNDEFINED
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
@ -34,7 +36,9 @@ class MainActivity : NavigationActivity() {
super.onCreate(null)
setContentView(R.layout.launch_screen)
setHWKeyboardConnected()
lastOrientation = this.resources.configuration.orientation
foldableObserver.onCreate()
WindowCompat.setDecorFitsSystemWindows(window, false)
}
override fun onStart() {
@ -54,6 +58,11 @@ class MainActivity : NavigationActivity() {
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
val newOrientation = newConfig.orientation
if (newOrientation != lastOrientation) {
lastOrientation = newOrientation
foldableObserver.handleWindowLayoutInfo()
}
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
HWKeyboardConnected = true
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {

View file

@ -1,4 +1,4 @@
package com.mattermost.rnbeta
package com.tokilabs.mattermost
import android.annotation.SuppressLint

View file

@ -1,4 +1,4 @@
package com.mattermost.rnbeta;
package com.tokilabs.mattermost;
import android.content.Context;
import android.content.Intent;

View file

@ -1,4 +1,4 @@
package com.mattermost.rnbeta;
package com.tokilabs.mattermost;
import android.app.Notification;
import android.app.NotificationManager;
@ -9,20 +9,18 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.Person;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.mattermost.helpers.*;
import com.mattermost.turbolog.TurboLog;
import com.wix.reactnativenotifications.core.NotificationIntentAdapter;
import com.wix.reactnativenotifications.core.notification.INotificationsApplication;
import com.wix.reactnativenotifications.core.notification.PushNotificationProps;
public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
@ -30,15 +28,6 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
private Bundle bundle;
private NotificationManager notificationManager;
private ReactApplicationContext getReactContext(Context context) {
if (context instanceof ReactApplication) {
ReactNativeHost host = ((ReactApplication) context).getReactNativeHost();
return (ReactApplicationContext) host.getReactInstanceManager().getCurrentReactContext();
}
return null;
}
@Override
public void onReceive(Context context, Intent intent) {
try {
@ -80,7 +69,6 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
WritableMap headers = Arguments.createMap();
headers.putString("Content-Type", "application/json");
WritableMap body = Arguments.createMap();
body.putString("channel_id", channelId);
body.putString("message", message.toString());
@ -92,9 +80,19 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
String postsEndpoint = "/api/v4/posts?set_online=false";
Network.post(serverUrl, postsEndpoint, options, new ResolvePromise() {
private boolean isSuccessful(int statusCode) {
return statusCode >= 200 && statusCode < 300;
}
@Override
public void resolve(@Nullable Object value) {
if (value != null) {
ReadableMap response = (ReadableMap)value;
ReadableMap data = response.getMap("data");
if (data != null && data.hasKey("status_code") && !isSuccessful(data.getInt("status_code"))) {
TurboLog.Companion.i("ReactNative", String.format("Reply FAILED exception %s", data.getString("message")));
onReplyFailed(notificationId);
return;
}
onReplySuccess(notificationId, message);
TurboLog.Companion.i("ReactNative", "Reply SUCCESS");
} else {
@ -104,13 +102,13 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
}
@Override
public void reject(Throwable reason) {
public void reject(@NonNull Throwable reason) {
TurboLog.Companion.i("ReactNative", String.format("Reply FAILED exception %s", reason.getMessage()));
onReplyFailed(notificationId);
}
@Override
public void reject(String code, String message) {
public void reject(@NonNull String code, String message) {
TurboLog.Companion.i("ReactNative",
String.format("Reply FAILED status %s BODY %s", code, message)
);

View file

@ -1,4 +1,4 @@
package com.mattermost.rnbeta;
package com.tokilabs.mattermost;
import android.os.Bundle;
@ -38,6 +38,7 @@ public class ReceiptDelivery {
JSONObject jsonResponse = new JSONObject(responseBody);
return parseAckResponse(jsonResponse);
} catch (Exception e) {
TurboLog.Companion.e("ReactNative", "Send receipt delivery failed " + e.getMessage());
e.printStackTrace();
return null;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 787 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 KiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 KiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 KiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Some files were not shown because too many files have changed in this diff Show more