Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
4702ee7
merge feat.voip-lib
diegolmello Jan 12, 2026
e532171
feat(voip): enhance call handling with UUID mapping and event listeners
diegolmello Jan 12, 2026
1299b0e
Base call UI
diegolmello Jan 12, 2026
d2cef3d
feat(voip): integrate Zustand for call state management and enhance C…
diegolmello Jan 13, 2026
b0b78cd
feat(voip): add simulateCall function for mock call handling in UI de…
diegolmello Jan 13, 2026
0d18314
refactor(CallView): update button handlers and improve UI responsiveness
diegolmello Jan 13, 2026
4b33a79
Add pause-shape-unfilled icon
diegolmello Jan 13, 2026
ece7e27
Base CallHeader
diegolmello Jan 14, 2026
c3dd2ae
toggleFocus
diegolmello Jan 14, 2026
1df1b29
collapse buttons
diegolmello Jan 14, 2026
8f9129e
Header components
diegolmello Jan 14, 2026
8a5de04
Hide header when no call
diegolmello Jan 14, 2026
a9ec70d
Timer
diegolmello Jan 14, 2026
d6229d9
Add use memo
diegolmello Jan 14, 2026
e718561
Add voice call item on sidebar
diegolmello Jan 14, 2026
26502cb
cleanup
diegolmello Jan 14, 2026
db29a47
Temp use @rocket.chat/media-signaling from .tgz
diegolmello Jan 14, 2026
2b16f4b
cleanup
diegolmello Jan 15, 2026
eae9137
Check module and permissions to enable voip
diegolmello Jan 15, 2026
bb2a8bb
Refactor stop method to use optional chaining for media signal listeners
diegolmello Jan 15, 2026
10593d6
voip push first test
diegolmello Jan 16, 2026
b6766f3
Add VoIP call handling with pending call management
diegolmello Jan 16, 2026
ac85af8
Remove pending store and create getInitialEvents on app/index
diegolmello Jan 20, 2026
9b28770
Attempt to make iOS calls work from cold state
diegolmello Jan 20, 2026
5c5e2be
lint and format
diegolmello Jan 20, 2026
01e42e2
Patch callkeep ios
diegolmello Jan 20, 2026
aa3ca88
Temp send iOS voip push token on gcm
diegolmello Jan 20, 2026
548e855
Temp fix require cycle
diegolmello Jan 20, 2026
abbb072
chore: format code and fix lint issues [skip ci]
diegolmello Jan 20, 2026
77cb36e
CallIDUUID module on android and voip push
diegolmello Jan 21, 2026
59f25eb
Add setCallUUID on useCallStore to persist calls accepted on native A…
diegolmello Jan 22, 2026
cd74d43
remove callkeep from notification
diegolmello Jan 23, 2026
9b71cf9
Android Incoming Call UI POC
diegolmello Jan 27, 2026
b1f81f4
Refactor VoIP handling: Migrate VoIP-related classes to a new package…
diegolmello Jan 28, 2026
089f91b
Remove VoipForegroundService
diegolmello Jan 28, 2026
6ac2f76
cleanup and use caller instead of callerName
diegolmello Jan 28, 2026
d81e67e
Cleanup and make iOS build again
diegolmello Jan 28, 2026
2b3e96a
Refactor VoIP handling: Remove unused event emissions for call answer…
diegolmello Jan 29, 2026
ad89658
Refactor VoIP handling: Introduce a new VoipPayload class to encapsul…
diegolmello Jan 29, 2026
c936ae9
Migrate react-native-voip-push-notifications to VoipModule
diegolmello Jan 30, 2026
3914562
Refactor VoIP module: Update package structure by moving VoipTurboPac…
diegolmello Feb 4, 2026
7986af4
Unify emitters
diegolmello Feb 10, 2026
7467381
Move CallKeep listeners from MediaSessionInstance to getInitialEvents
diegolmello Feb 10, 2026
e72c0f9
Clear callkeep on endcall
diegolmello Feb 10, 2026
0b87d35
Unify getInitialEvents logic
diegolmello Feb 10, 2026
2cbd7ec
getInitialEvents -> MediaCallEvents
diegolmello Feb 10, 2026
0d40944
chore: format code and fix lint issues [skip ci]
diegolmello Feb 10, 2026
18b0b0a
feat(Android): Add full screen incoming call (#6977)
diegolmello Feb 17, 2026
fc9aca6
feat: Update call UI (#6990)
diegolmello Feb 18, 2026
7f5efb1
feat: Handle audio routing, e.g., Bluetooth headset vs. internal spea…
diegolmello Feb 18, 2026
9abbdd5
fix: empty space when not on call (#6993)
diegolmello Feb 18, 2026
11809f1
feat: Dialpad (#7000)
diegolmello Feb 23, 2026
104471c
action: organized translations
diegolmello Feb 23, 2026
10a8b19
feat: start call (#7024)
diegolmello Mar 3, 2026
b1e1a80
chore: format code and fix lint issues
diegolmello Mar 3, 2026
6fcf804
feat: Pre flight (#7038)
diegolmello Mar 9, 2026
0715e89
action: organized translations
diegolmello Mar 9, 2026
8274083
feat: Receive voip push notifications from backend (#7045)
diegolmello Mar 13, 2026
306f8cc
feat: Refactor media session handling and improve disconnect logic (#…
diegolmello Mar 24, 2026
106cbd7
feat: Control incoming call from native (#7066)
diegolmello Mar 25, 2026
e3a7a78
feat: Voice message blocks (#7057)
diegolmello Mar 24, 2026
81dba28
feat: native accept success event (#7068)
diegolmello Mar 27, 2026
d43faa0
feat(voip): call waiting, busy detection, and videoconf blocking (#7077)
diegolmello Apr 6, 2026
fc805ac
action: organized translations
diegolmello Apr 6, 2026
2637261
feat(voip): tap-to-hide call controls with animations (#7078)
diegolmello Apr 6, 2026
58e91f1
feat(voip): navigate to call DM from message button and header (#7082)
diegolmello Apr 6, 2026
e05a7aa
feat(voip): tablet and landscape layout (#7110)
diegolmello Apr 8, 2026
c6089b1
chore: develop into feat.voip-lib-new (RN 81 + Expo 54 + reanimated 4…
diegolmello Apr 9, 2026
a311b19
chore: format code and fix lint issues
diegolmello Apr 9, 2026
d126fea
feat(voip): android landscape layout for IncomingCallActivity (#7116)
diegolmello Apr 9, 2026
b5e1f59
Update agents files
diegolmello Apr 9, 2026
3191b15
Merge branch 'feat.voip-lib-new' of github.com:RocketChat/Rocket.Chat…
diegolmello Apr 9, 2026
1110468
feat(voip): Support a11y (#7106)
diegolmello Apr 10, 2026
02bd212
Fix content cutting on iOS on some edge cases
diegolmello Apr 10, 2026
2e901f0
pods
diegolmello Apr 10, 2026
7b7866d
Ignore .worktrees on jest
diegolmello Apr 10, 2026
2e9831c
chore: Merge develop into feat.voip-lib-new (#7129)
diegolmello Apr 10, 2026
2a098f7
fix(voip): show CallKit UI when call is active in background (#7128)
diegolmello Apr 13, 2026
bb47935
chore: Update media-signaling to 0.2.0 (#7153)
diegolmello Apr 14, 2026
db9ea02
feat(voip): migrate iOS accept/reject from DDP to REST (#7124)
diegolmello Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .cursor/skills/agent-skills
Submodule agent-skills added at a4f602
1 change: 0 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,3 @@ coverage
e2e/docker
android
ios
.eslintrc.js
255 changes: 65 additions & 190 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,53 +5,33 @@ module.exports = {
extensions: ['.ts', '.tsx', '.js', '.ios.js', '.android.js', '.native.js', '.ios.tsx', '.android.tsx']
},
typescript: {
alwaysTryTypes: true,
project: './tsconfig.json'
}
},
'import/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx']
// plugins: ['@typescript-eslint'],
// rules: {
// '@typescript-eslint/consistent-type-imports': [
// 'error',
// {
// prefer: 'type-imports', // enforce `import type`
// disallowTypeAnnotations: true // disallow `import { type Foo }`
// // fixStyle: 'inline-type-imports' // keeps type imports inline rather than grouped
// }
// ]
// }
},
react: {
version: 'detect'
}
},
parser: '@babel/eslint-parser',
extends: ['plugin:jest/recommended', '@rocket.chat/eslint-config', 'prettier', 'plugin:react-hooks/recommended'],
extends: [
'@rocket.chat/eslint-config',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:prettier/recommended',
'prettier'
],
parserOptions: {
sourceType: 'module',
ecmaVersion: 2017,
ecmaFeatures: {
experimentalObjectRestSpread: true,
jsx: true,
legacyDecorators: true
}
ecmaVersion: 2024
},
plugins: ['react', 'jsx-a11y', 'import', 'react-native', '@babel', 'react-hooks', 'jest'],
plugins: ['import', 'react-native', '@babel'],
env: {
browser: true,
commonjs: true,
es6: true,
node: true,
jquery: true,
mocha: true,
jest: true,
'jest/globals': true
es6: true
},
rules: {
'react-hooks/set-state-in-effect': 1,
'react-hooks/immutability': 1,
'react-hooks/refs': 1,
'import/named': 'error',
'import/no-unresolved': 'error',
'import/extensions': [
'error',
'ignorePackages',
Expand All @@ -62,122 +42,34 @@ module.exports = {
tsx: 'warning'
}
],
'react/jsx-filename-extension': [
1,
{
extensions: ['.js', '.jsx', '.ts', '.tsx']
}
],
'react/require-default-props': [0],
'ordered-imports': [0],
'react/no-did-mount-set-state': 0,
'react/no-multi-comp': [0],
'react/jsx-indent-props': [2, 'tab'],
'jsx-quotes': [2, 'prefer-single'],
'jsx-a11y/href-no-hash': 0,
'jsx-a11y/aria-role': 0,
'import/prefer-default-export': 0,
'import/no-cycle': 2,
'import/named': 'error',
'import/no-cycle': 'error',
'import/no-unresolved': 'error',
'import/order': [
'error',
{
'newlines-between': 'ignore'
}
],
camelcase: 0,
'no-underscore-dangle': 0,
'no-return-assign': 0,
'no-param-reassign': 0,
'no-tabs': 0,
'no-multi-spaces': 2,
'no-eval': 2,
'no-extend-native': 2,
'no-multi-str': 2,
'no-use-before-define': 2,
'no-const-assign': 2,
'no-cond-assign': 2,
'no-constant-condition': 2,
'no-control-regex': 2,
'no-debugger': 2,
'no-delete-var': 2,
'no-dupe-keys': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-duplicate-case': 2,
'no-else-return': [0, { allowElseIf: true }],
'no-empty': 2,
'no-empty-character-class': 2,
'no-ex-assign': 2,
'no-extra-boolean-cast': 2,
'no-extra-semi': 2,
'no-fallthrough': 2,
'no-func-assign': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-mixed-spaces-and-tabs': 1,
'no-sparse-arrays': 2,
'no-negated-in-lhs': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-undef': 2,
'no-unreachable': 2,
'no-unused-expressions': 0,
'react/display-name': 'off',
'react/jsx-fragments': ['error', 'syntax'],
'react/jsx-key': 'off',
'react/no-direct-mutation-state': 'off',
'react/prop-types': 'off',
'react/react-in-jsx-scope': 'off',
'react-hooks/set-state-in-effect': 'warn',
'react-hooks/immutability': 'warn',
'react-hooks/refs': 'warn',
'react-native/no-color-literals': 'off',
'react-native/no-inline-styles': 'off',
'react-native/no-raw-text': 'off',
'react-native/no-single-element-style-arrays': 'error',
'react-native/no-unused-styles': 'error',
'react-native/split-platform-components': 'off',
'no-unused-vars': 'off',
'max-len': 0,
'react/jsx-uses-vars': 2,
'no-void': 2,
'no-var': 2,
'one-var': [2, 'never'],
'no-lonely-if': 2,
'no-trailing-spaces': 2,
complexity: [1, 31],
'space-in-parens': [2, 'never'],
'space-before-blocks': [2, 'always'],
indent: 'off',
'eol-last': [2, 'always'],
'comma-dangle': [2, 'never'],
'keyword-spacing': 2,
'block-spacing': 2,
'brace-style': [2, '1tbs', { allowSingleLine: true }],
'computed-property-spacing': 2,
'comma-spacing': 2,
'comma-style': 2,
'guard-for-in': 2,
'wrap-iife': 2,
'block-scoped-var': 2,
curly: [2, 'all'],
eqeqeq: [2, 'allow-null'],
'new-cap': 'off',
'use-isnan': 2,
'valid-typeof': 2,
'linebreak-style': 0,
'prefer-template': 2,
quotes: [1, 'single'],
semi: [2, 'always'],
'prefer-const': 2,
'object-shorthand': 2,
'consistent-return': 0,
'global-require': 'off',
'react-native/no-unused-styles': 2,
'react/jsx-one-expression-per-line': 0,
'require-await': 2,
'func-names': 0,
'react/static-property-placement': [0],
'arrow-parens': ['warn', 'as-needed', { requireForBlockBody: true }],
'react/jsx-curly-newline': [0],
'react/state-in-constructor': [0],
'no-async-promise-executor': [0],
'max-classes-per-file': [0],
'no-multiple-empty-lines': [0],
'no-sequences': 'off',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn'
},
globals: {
__DEV__: true
'no-void': 'error',
'new-cap': 'error',
'require-await': 'error'
},
overrides: [
{
Expand All @@ -186,50 +78,13 @@ module.exports = {
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/eslint-recommended',
'@rocket.chat/eslint-config',
'plugin:prettier/recommended',
'prettier'
],
parser: '@typescript-eslint/parser',
parserOptions: {
sourceType: 'module',
ecmaVersion: 2018,
warnOnUnsupportedTypeScriptVersion: false,
ecmaFeatures: {
experimentalObjectRestSpread: true,
legacyDecorators: true
}
},
plugins: ['react', '@typescript-eslint'],
rules: {
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-empty-function': [0],
'@typescript-eslint/ban-types': [0],
'func-call-spacing': 'off',
'jsx-quotes': ['error', 'prefer-single'],
indent: 'off',
'comma-dangle': [2, 'never'],
'no-return-assign': 0,
'no-dupe-class-members': 'off',
'no-extra-parens': 'off',
'no-spaced-func': 'off',
'no-unused-vars': 'off',
'no-useless-constructor': 'off',
'no-use-before-define': 'off',
'react/jsx-uses-react': 'error',
'react/jsx-uses-vars': 'error',
'react/jsx-no-undef': 'error',
'react/jsx-fragments': ['error', 'syntax'],
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/indent': 'off',
'@typescript-eslint/no-extra-parens': 'off',
'@typescript-eslint/no-dupe-class-members': 'error',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
ignoreRestSiblings: true
}
],
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/consistent-type-imports': [
'error',
{
Expand All @@ -238,14 +93,31 @@ module.exports = {
fixStyle: 'inline-type-imports'
}
],
'@typescript-eslint/indent': 'off',
'@typescript-eslint/no-dupe-class-members': 'error',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-extra-parens': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
{
args: 'all',
argsIgnorePattern: '^_'
}
],
'@typescript-eslint/no-var-requires': 'off',
'no-return-assign': 'off',
'no-dupe-class-members': 'off',
'no-extra-parens': 'off',
'no-spaced-func': 'off',
'no-unused-vars': 'off',
'no-useless-constructor': 'off',
'no-use-before-define': 'off',
'new-cap': 'off',
'lines-between-class-members': 'off',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
'jest/no-conditional-expect': 'off'
'lines-between-class-members': 'off'
},
globals: {
JSX: true
JSX: 'readonly'
},
settings: {
'import/resolver': {
Expand All @@ -256,10 +128,13 @@ module.exports = {
}
},
{
files: ['e2e/**'],
rules: {
'no-await-in-loop': 0,
'jest/expect-expect': 'off'
files: ['jest.setup.js', '__mocks__/**/*.js', '**/*.test.{js,ts,tsx}'],
extends: ['plugin:jest/recommended']
},
{
files: ['index.js', 'app/**/*.{js,ts,tsx}'],
env: {
'react-native/react-native': true
}
}
]
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/build-ios/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ runs:
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.4'
xcode-version: '26.2.0'

- name: Set up Ruby
uses: ruby/setup-ruby@v1
Expand Down
21 changes: 20 additions & 1 deletion .github/actions/upload-android/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ runs:
echo "${{ inputs.FASTLANE_GOOGLE_SERVICE_ACCOUNT }}" | base64 --decode > service_account.json
shell: bash

- uses: actions/download-artifact@v4
if: ${{ inputs.trigger == 'develop' }}
with:
name: release-changelog
path: .

- name: Prepare Play Store changelog metadata
if: ${{ inputs.trigger == 'develop' }}
run: |
mkdir -p android/fastlane/metadata/android/en-US/changelogs

if [ -f changelog.txt ]; then
node .github/scripts/prepare-changelog.js
else
printf "Internal improvements and bug fixes" > "android/fastlane/metadata/android/en-US/changelogs/${BUILD_VERSION}.txt"
fi
shell: bash
env:
BUILD_VERSION: ${{ inputs.BUILD_VERSION }}

- name: Fastlane Play Store Upload
working-directory: android
run: |
Expand All @@ -65,7 +85,6 @@ runs:
if [[ ${{ inputs.trigger }} == "develop" ]] && [[ ${{ inputs.type }} == 'official' ]]; then
bundle exec fastlane android official_open_testing
fi

shell: bash

- name: Leave a comment on PR
Expand Down
10 changes: 8 additions & 2 deletions .github/actions/upload-ios/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ runs:
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.2'
xcode-version: '26.2.0'

- name: Set up Ruby
uses: ruby/setup-ruby@v1
Expand All @@ -109,6 +109,12 @@ runs:
yarn pod-install
shell: bash

- uses: actions/download-artifact@v4
if: ${{ inputs.type == 'official' && inputs.trigger == 'develop' }}
with:
name: release-changelog
path: .

- name: Fastlane Submit to TestFlight
working-directory: ios
run: |
Expand Down Expand Up @@ -157,4 +163,4 @@ runs:
message="**iOS Build Available**"$'\n\n'"$app_name $VERSION_NAME.$BUILD_VERSION"

gh pr comment "$PR_NUMBER" --body "$message"
shell: bash
shell: bash
Loading
Loading