* captions on videos from posts and searches
* add the patch for react-native-video which fixes subtitle downloading
* improve spacing
* fix patch file
* upgrade compass-icons; use cc icon
* revert patch overwrite
* fix patch
* use useMemo
* fix hitslops on pressables
* use new Caption format; refactor for clarity
* simplify tracks creation and use
* Update index.ts persistentNotifications to include param and conditions for channelType
* Update message for "no recipients mentioned" to not occur for `DM_CHANNEL`.
* Update send message to either start with "Recipients" for DM channel or "@mentioned recipients"
* Include `channelType` in call to `persistentNotificationsConfirmation`
* Fix typo in persisten(t)NotificationsEnabled
* Remove ternary in translatable string
* Add channelType to callback's dependencies
* Make channelType optional
* when active, do not show overlay if this is a calls-started notification
* add calls notification type; keep message test for backwards compat
* process calls notifications properly
* revert NOTIFICATION_TYPE.CALLS; use sub_type for backwards compatibility
* add ticket and comment for future refactoring of isCallsStartedMessage
* refactor; tried to clarify more_messages; new design
* adjust more_messages text spacing
* small fix for height with incoming call on current channel
* move calls-specific code in the calls product behind a hook
* show servername for notifications from other servers
* if >1 active servers, always show server name, otherwise don't
* add height of notification bar in measurements
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
* refactor; tried to clarify more_messages; new design
* adjust more_messages text spacing
* small fix for height with incoming call on current channel
* move calls-specific code in the calls product behind a hook
* join call banner
* same style of voice-on indicator; avatar & emoji sizing spacing polish
* refactor all calls bars; new calls bars UI designs
* i18n changes
* fix for warning bar's close icon color
* refactor banners to normalize UI; new 'noone is talking' design
* fix for avatar in current call bar
* change design for incoming call on calls screen
* remove commented out code
* Add foreground service for Android; add voip UIBackgroundMode for iOS
* remove iOS change for this PR
* create foreground notification channel once at startup
* Fix can not reconnect websocket after turn off then turn on wifi. This bug happen on some Samsung device (s10+, s20fe,...)
* Fix can not reconnect websocket after turn off then turn on wifi. This bug happen on some Samsung device (s10+, s20fe,...)
* Fix can not reconnect websocket after turn off then turn on wifi. This bug happen on some Samsung device (s10+, s20fe,...)
* MM-53107 Add limit to Markdown nodes
* Update commonmark to published version
* Rename field to camel case for consistency
* Update Markdown tests for removed children
* added last viewed feature
* added constants
* storing data in global table and added server col
* fixed stack screen"
* fixed values for crt
* fixed threadid store logic
* added status on profile in bottom tabs
* fixed error for profile edit
* refactored and removed rule from eslint
* fixed variable in username field
* fixed screen blur focus issue
* keyboard show issue
* added last viewed feature
* added constants
* storing data in global table and added server col
* fixed stack screen"
* fixed values for crt
* fixed threadid store logic
* added status on profile in bottom tabs
* fixed error for profile edit
* refactored and removed rule from eslint
* fixed variable in username field
* - Update AT_METION_SEARCH_REGEX to allow to search user name with space, similar to mentioning user.
- Convert search term to lowercase.
* Update CHANNEL_MENTION_SEARCH_REGEX to allow to search channel name when typing space
* Fix app crash when searching in channel only
---------
Co-authored-by: Huỳnh Phương Khanh <phuongkhanh@evolgroup.vn>
* Fix cannot scroll acknowledgement bottom sheet of user list when there are many users
* - Updated showing user list for Tablet
- Added GestureHandlerRootView to avoid bug not show the list
* Wrap BottomSheet inside withGestures function
* Remove GestureHandlerRootView for BottomSheet component since it's been wrapped inside withGesture function
* feat: adding the scheme_admin info on the channel members user_list sections
* feat: adding the scheme_admin info on channel members when there is a search in the textbox
* Fix keyboard overlap recent search item in search tab
* Set the behavior of KeyboardAvoidingView on Android to 'undefined' to avoid losing some content at the bottom
* feat: add copy to clip board button in about page
* add intl format text
* make suggested changes.
- fix: wrap copyToClipBoard function in useCallBack
- remove annonymous function onPress, provide function pointer
- make code readable in copyToClipBoard function
* formatting
* small fix
* change copy to clipboard position
- created a custom button eith icon and text
- usd button theme color
* button styling
* divider color
* use predefined btn element
* Add e2e test for copy info button
* feat: refactor the styles for thin lines
- fix: change touchable opacity to view
- add margin top to footer text
* change icon size to 15
* remove unnecessary view
* add config to dependency of callback
* suggeste changes on onClick func
* modified en.json file after running i18-extract
* Improve translations
* Address feedback
* Fix non updated default messages
---------
Co-authored-by: Daniel Espino García <larkox@gmail.com>
* added last viewed feature
* added constants
* storing data in global table and added server col
* fixed stack screen"
* fixed values for crt
* fixed threadid store logic
* added status on profile in bottom tabs
* feat: reducing the padding/margins of tabs and filter icons on the Search Page
* feat: adds the results text inside the post_results and file_results
* feat: changes search results to use translation
* feat: updates text on search results to use FormattedText
* feat: removing text wrapper
* feat: removing margins and using an ItemSeparator to separate the rows of the file results
* feat: refactor spacing on post results and unnecessary top
* review: externalizing Separator on the file_results
* feat: add marginTop in all File components used inside the <Files> component
* added last viewed feature
* added constants
* storing data in global table and added server col
* fixed stack screen"
* fixed values for crt
* fixed threadid store logic
* [MM-53249] Allow server to hide or customize the Forgot Password link
* Update app/screens/login/form.tsx
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Fix issue for older servers
* Sort imports
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* center align channel name in intro
* align custom status in channel header
* wrap long custom status on profile bottom sheet
* Fix LaTex render clipped on Android
* Add margin for users displayed in a list
* show user profile when tapping on self on channel members
* Fix Thread screen when rootId prop is undefined
* update snapshots
* fix server / login screen on small devices
* use mean opinion score detection; add call quality alert bar; tests
* rename MessageBar's file to message_bar
* i18n
* use mosThreshold from calls-common; upgrade calls-common
* use callsBg for text and icon
* ask for bluetooth permissions on Android
* new "switch audio device button" for Android
* i18n strings
* split audio_device_button into platform-specific files; PR comments
* earpiece -> phone
* add comments to clarify speakerphone logic
* update snapshots
* add new compass-icons; use tablet and bluetooth icons; add tablet mode
* fix lint
* follow threads on call join
* treat custom_calls posts as the start of threads
* make thread follow logic robust to race conditions; tests
* only follow thread when CRT is enabled
* Revert "only follow thread when CRT is enabled"
This reverts commit 4e52a2619b35db3d2104f0b6ba5ad8be23f7b224.
* Fix channel and user list items
* Fixes on members and create a dm lists
* Fix tutorial and ipad
* Fix test
* Address feedback
* Several fixes on Android
* Fix tests
* Address feedback
* Add more non breaking strings
---------
Co-authored-by: Daniel Espino <danielespino@MacBook-Pro-de-Daniel.local>
* MM-49540: drafts migration adding metadata
Adds a drafts table migration adding the column "metadata".
This column is going to be primarily used to store the draft's
metadata priority field.
* Addresses review comments
* Tapping on a custom status in the message list opens the users profile card
* Tapping on a custom status in the message list opens the users profile card
* code refactored and reuse functions in headerDisplayName
* fix import
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* use calls/common rtcpeer; @calls -> @mmcalls
* gitpkg -> standalone github calls-common package
* use new mattermost/calls-common repo; add types to WebSocketMessages
* mmcalls/common -> mattermost/calls; use a version tag
* ADD: channel name tappable in post with channel name fields
* touchable feedback added to the channel name
* rippple effect added in toucable
* Text color of channel name changes as its presses
* ui colors and borderRadius fixed in channelinfo
* comments resolved: dependency added, function name changed
* comment resolved: condition added onChannelNamePressed
* Save message draft when post input is unmounted
* Fix switch CRT on/off
* Handle iPad on Stage Manager
* iOS Share Extension to use LRU cache instead of file cache
* Support building android as aab
* use handleReconnect instead of appEntry on handleCRTToggled
* show skin tone selector tutorial after running all interactions
* Update app/actions/remote/preference.ts
Co-authored-by: Daniel Espino García <larkox@gmail.com>
* fix lint
---------
Co-authored-by: Daniel Espino García <larkox@gmail.com>
* Only call app entry on websocket reconnect
* Handle notification on its own entry and run app entry on websocket initialization
* Fix notification entry issues
* Fix login entry and add retry on entry failure
* feedback review
* Put back handleEntryAfterLoadNavigation before the batching
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Fix Group Message member count on GraphQL scenario
* Fix lint
* Use fetchProfilesInGroupChannels instead of fetchMissingDirectChannelsInfo
* Use reduce instead of filter map
* Simplify using set in the reduce
* Remove watermelondb limitation on updating an already updated model
* Add logic to handle different prepare states and improve logging
* fix tests
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* move user_list to component
* start the modal from create_direct_message
* initial commit
* Add managing options to user profile
* s/showManage/showManageMode/
* simplify
* use helper functions
* add dependency
* fix togglling manage/done button
* remove close button in navbar
* remove close button. The only exit from this screen is the back button
* utilize LeaveChannelLabel component actions
* nit
* nit
* slight refactor
* return earlier if not showManageMode
* use defineMessages
* don't modify leave channel component
* add manage_members_label component
* rename variables to imply manage actions
* remove user from channel on server and locally in channel membership
* prevent managing yourself. In V1, this is done by not allowing you to
select yourself for channel removal
* remove useReducer
* - fix typography
- fix icon size
- don't allow tapping on yourself in manage mode
* sort props
* sort props
* sort props
* - combine try blocks
- use getServerDatabaseAndOperator function to get the operator
* fetchChannelStats after removing users from a channel
* currently, the UI does not provide a need to remove multiple members
from a channel, only one member. modify the function to only accept and
remove one user
* no need to pass the entire channel object. only need the channelId which
is already passed into the screen
* do not pass the entire user model, only the userid and if user canManage
(is sysadmin or channel admin)
* move members constants to its own file and out of general.ts file
* pass channel displayName instead of the entire channel object
* not need to store the user as it is already in the store from the
fetchProfilesInChannel call
* implement device emitter to notify the parent to remove to the user from
the user list
* rename constant in reveal removing a member from a channel. Might need for another team removal later.
* add snackbar after user is removed
* remove unnessary filter
* remove paging. Server response is not paginated
deconstruct intl
* create EMPTY const
* simplify getProfiles function
* move constants to top of file
* add function to remove the user from the server
* clean up dependencies
* remove @app/ prefix from imports
* add comment describing reason for switch / case
* rename varaible to be more intention revealing
* calculate isDefaultChannel and pass in as prop so don't need to
query for each user
* if user cannot manage, do not show the manage nav button
* move options const into function that uses it
* have the caller of handeRemoveMemberFromChannel fetch channel stats, not
the action
* nit formatting
* s/canManage/canManageMembers/
* use existing observeCanManageChannelMembers function
function only requires channel id
* move userInfo and manage user options to their own components
* calculate bottom sheet snap points when in manage mode
* implement correct permissions for managing users. For now, only channel
admins can manage users (including deleting members)
* working on section creation
* use map instead of arrays
* - handle user profile sections differently when in members are provided (manage mode)
- emit event when user role is changed
- modify the channelMembers in manage members modal after changing
user role
* remove commented code
* deconstruct options
* sort dependencies and add loading dependency
* - when removing a user, remove them from channelMembers state also
- don't add empty sections to the user list results
* user profile coming from ManageChannelMembers is UserProfile joined with
their ChannelMembership. Can now check for scheme_admin to see if the
user is a channel admin
* deconstruct locale from intl and remove intl const
* Add SearchUserOptions type to provide type checking when creating options for searchProfile
action and searchUsers client api
* correct comment
* deconstruct MANAGE_OPTIONS
* Remove unused event constant
* nits
* Push header title in to the UserProfileTitle component
* Put constants back so Diff of file is smaller
* Combine switch statements
Remove isOptionItem. These are always action items
* Wrap onAction in a usecallback
* Add help comments
* Add i18n to section titles
* Create RenderItemType for renderItem callback
* update testID
update snapshots
* CanManageMembers is deterimined by observeCanManageChannelMembers
* Add members chanenl option
* Update after merge
* Sort in order of options shown
* nit refactor
* Modify client getProfilesInChannel allow passing more options than sort.
- sort the profiles by admin
- do not show deactivated users in the manage members modal
* Profiles are now sorted by admin. We can maintain the alphabetical sort
also by iterating over the profiles instead of members which are not alphabetical
* Type the get users Api object
* Add type.
Active option is a boolean, not a string
* only initialize if needed. Moved inside the check for members
* Create type for Manage Member Options
* Remove one liners and call directly in the switch block
* Keys to the map do not need to be translated. Only translate the title
Place the Admins section always on top
* Add removeFromChannel as a dependency
* Remove manageMode option from the title component
- add imageSize prop
- add headerText prop
* Do not show deactivated users in search
* When users are showing and not in manage mode, allow the user to tap and
open the profile for the user (in non-manage mode)
* Add fetchOnly to getMemberInChannel function
Add fetchOnly to updateChannelMembersSchemeRoles function
Remove getMemberInChannel from handleUserChangeRole in manage_channel_members because it is already called via updateChannelMembersSchemeRoles
* Remove todo from comment
* Don't use state for defining action text, icon, and isDestructive. just
set them based on the prop value manageOption
* Added correct permission check for can user manage member roles
* Add can manage member roles prop
* Calculate snap points based on manageMemberRoles prop
* Calculate snap point based on if user can remove other users
* Do not show options if you cannot remove or manage members
* Fix post merge issues
* No need to batch because only manipulating a single model
* Remove comment
* Rename variable
* Split and sort props into multiple lines for readability
* Nit
* Make dependency more specific
* Remove comment. Doing this requires writing a custom search function in
the app that would need to guarantee the same results as a server call
* Add logError to functions with catch
* Add ticket reference
* Remove await from functions that are updating the database. Components
that observe models these modify will get the update based from the
observable change.
* Keep track of which section is first so that the tutorial highlight
selects the first user profile of the first section
* Add a second user that creates a new section for testing tutorial
* Remove unused prop
* Update snapshot to include second user
* Use getServerDatabaseAndOperator
* remove testID change. Added a ticket to fix later
* Revert tests to only one user to test if previous tests worked
* Add new test that has 2 users
* Add ticket context as comment
* Add channelId as dependency
* Use useCallback for updateChannelMemberSchemeRole
* Remove async
* mounted.current should only be used in an effect that executes on the
first render
when user has permission to manage members changed, there is no need to
get the profiles again
* Add await for function
* Always reset loading to false after getting profiles
* use !text instead of const value using Boolean()
* add dependency
* Add manage members ids back
* When fetching users for the channel, always store them in the database.
Otherwise tapping a user might not be in the database and tapping on
them will cause a crash
* Fetch the user profile from the server when opening the user profile
* Checking management permissions should be based on the current user, not
the user of the profile being opened
---------
Co-authored-by: Avinash Lingaloo <avinashlng1080@gmail.com>
* move to latest react-native-webrtc release
* make this version of rtcpeer as close as possible to Call's version
* remove need for destroyCb
* upgrade webrtc
* continue merge
* upgrade webrtc
* new linting rules
* Fetch & Save granular data retention policies through REST
* Init Data cleanup
* Run the clean up
* Deleting posts in patches and running across other servers
* fetch on graphql & refactor
* Feedback changes
* Added try catch for deletePosts function
* Feedback changes
* Changed to 'for of' loop
* Misc
* app/actions
* Date cutoff fox
* Prevent showing loading bar when request fails
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
* Fix several issues around team join
* Open in modal and fix channel list
* Add joining states and fix issues
* i18n-extract
* add specific message for group related failures on joining teams
* Address feedback
* Address feedback
* Use error from server response
* updated styles for reaction bar and made pick reaction pressable
* removed unused style import
* removed unused style import
* updated user avatars, user presence, thread options bottom sheets to new style also
* updated status bottom sheet, thread options, and some tweaks to the bottom sheet main file
* fixed a few minor styling issues
* used proper bottom inset in user presence bottom sheet
* various updates to bottom sheets
* used negative top position instead of negative margin
* updated camera type bottom sheet
* further refinements to bottom sheets
* updates to emoji bar and profile image picker
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
We have changed how priority gets saved in the server, so now instead of
post.props we are using post.metadata.priority.
This commit adds the relevant changes for posts' priority to work in the
mobile app.
* Restyle video playback error
* video not shown when attached with multiple files and thumb fails
* update local path when saving and sharing a file
* feedback review
* new GA cloud limits
* Update assets/base/i18n/en.json
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Add connection banner
* Switch icon depending on whether it is connected or not
* Clean timeout and change text
* Handle optimistic approach
* Piggyback server item fix
* Use toMilliseconds util function
* Set the websocket as disconnected when we are manually closing it
* Do not hide banner when app state changes
Co-authored-by: Daniel Espino <danielespino@MacBook-Pro-de-Daniel.local>
* WIP New User List for int selector
* user selection
* searchusers by term
* Remove old user list related code on selector
* Fix linting issues
* Submitting user list selection
* currentUserId
* multiselect showing after the bar
* useState instead of reducer
* Remoce empty line
* add callbacks
* Fix lint
* Init
* Test fix
* New sync implementation
* misc
* Includes migration and other servers sync
* Misc
* Migration fix
* Migration is done version 7
* Update app/queries/servers/thread.ts
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Update app/database/operator/server_data_operator/handlers/team_threads_sync.ts
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Feedback changes
* Fixes when old thread gets a reply
* Fix
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* placement of 'report a problem'
* installed react-native-mail
* settings/report_problem
- Opens on Email App on Android
- Crashes on iOS if no account signed in the mail app
* new wiring
* new wiring
* tried first strategy for attachment
* tried second strategy for attachment
* Update report_problem.tsx
* revert changes to package.json
* removes unused supportEmail
* install @mattermost/react-native-turbo-mailer
* update import
* Update Podfile.lock
* implement recording permissions and UI
* fix bug when refusing recording while in call thread from call screen
* host controls and UI for recording
* button tweak, and fixing a i18n string issue
* PR comment
* backwards compat & don't show rec controls if not enabled
* add emoji reactions in mobile
* use StyleSheet.create
* PR comment
* prefer no inline functions
* Revert "prefer no inline functions"
This reverts commit b3c4627daca631e50bccf41b4a9e538f902c82ee.
* Threads item in channel switcher
* Misc
* Updated test & renamed type
* Reverted unwanted changes
* Changed thread text to i18n
* feedback fix
* Merge conflict steps
* Merge fix
* test fix
* Added onPress to the dependencies
* Moved the term matching logic to the useMemo block
* Misc
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
* Add terms of service
* Add i18n
* Fix test
* Address feedback
* Address ux feedback
* Update texts
* Avoid Review to show on top of ToS
Co-authored-by: Daniel Espino <danielespino@MacBook-Pro-de-Daniel.local>
* Activating screens
* Registering the screen
* Adding default themes for components
* Porting items rows, WIP
* WIP Custom List
* Pasting old code to integration_selector, WIP
* No TS errors on components
* Adding selector options
* fix types
* Adding state with hooks
* Page loading with no results
* fix search timeout
* Getting channels, not painting them yet
* searching for profiles
* tuning user and channel remote calls
* Fix radioButton error
* channels being loaded
* rendering options
* Rendering users
* Preparing search results
* Added onPress events for everybody!
* single select working for all selectors
* Remove dirty empty data fix
* remove unused data on custom list row
* fic touchableOpacity styling
* Adding extra info to userlistRow
* Search results (channels and users)
* filter options!
* Adding i18n
* Adding username as name
* move code to effects
* fix typing onRow
* multiselect selection working, missing a "Done" button
* commenting out the selector icons, moving selected options to func
* Added button for multiselect submit
* Fixing data types on selector
* 💄 data sources check
* cleaning custom_list_row
* Fix onLoadMore bug
* ordering setLoading
* eslinting all the things
* more eslint
* multiselect
* fix autocomplete format
* FIx eslint
* fix renderIcon
* fix section type
* actions not being used
* now we have user avatars
* Fix icon checks on multiselect
* handling select for multiple selections
* Moving to its respective folders
* components should render
* Added some test cases
* Multiple fixes from @mickmister feedback
* changing lock icon to padlock on channel row
* Fix children lint errors
* fix useEffect function eslint error
* Adding useCallback to profiles, channels and multiselections
* Fixing @larkox suggestions
* type checking fixes
* Fix onLoadMore
* Multiple hook and functionality fixes
* 🔥 extraData and setting loading channels better
* fix teammate display
* Fix multiselect button selection
* Fix returning selection to autocomplete selector
* Using typography
* Updating snapshots due to typography changes
* removing UserListRow, modifying the existing one
* Extract key for data sources
* Multiselect selection refactor
* fix setNext loop
* refactoring searchprofiles and channels
* Using refs for next and page
* Callback and other fixes
* Multiple fixes
* Add callback to multiselect selected items
* integration selector fixes
* Filter option search
* fix useCallback, timeout
* Remove initial page, fix selection data type
Co-authored-by: Michael Kochell <6913320+mickmister@users.noreply.github.com>
* Add announcement banner
* Move config to its own table
* Add new config behaviour to iOS share extensions
* Fix test
* Add style changes
* Minor style fixes
* Address design feedback
* Address feedback
* Only render the announcement banner if container if licensed
Co-authored-by: Daniel Espino <danielespino@MacBook-Pro-de-Daniel.local>
* Sentry - Clean Install
* Update config.yml
* update CI to install Sentry CLI
* update CI to install Sentry CLI
* Squashed commit of the following:
commit e1996e59de8e135b19957dc9b0a0677f8b851c8b
Merge: 87cc8d6f2 2e8352f3e
Author: Avinash Lingaloo <avinashlng1080@gmail.com>
Date: Fri Nov 4 20:59:29 2022 +0400
Merge branch 'android-pr-sentry-clean' of https://github.com/mattermost/mattermost-mobile into android-pr-sentry-clean
commit 2e8352f3e15527c73ec3a634eae32b29aa6a9faf
Author: Elias Nahum <nahumhbl@gmail.com>
Date: Fri Nov 4 15:48:24 2022 +0200
update CI to install Sentry CLI
commit 87cc8d6f2b06945a4d0a2d4373836fd261b62c15
Author: Elias Nahum <nahumhbl@gmail.com>
Date: Fri Nov 4 15:48:24 2022 +0200
update CI to install Sentry CLI
commit 8dca885a0204c894bfcf544807976bac766b3b99
Author: Avinash Lingaloo <avinashlng1080@gmail.com>
Date: Fri Nov 4 16:48:47 2022 +0400
Update config.yml
commit 684bbb4aef
Author: Mylon Suren <23694620+mylonsuren@users.noreply.github.com>
Date: Thu Nov 3 11:37:58 2022 -0400
Remove down arrow next to team name and make team name unclickable (#6715)
commit 88ff8fac30
Author: Jason Frerich <jason.frerich@mattermost.com>
Date: Wed Nov 2 19:35:23 2022 -0500
[Bug] Emit boolean with "of" operator (#6729)
commit debcc99480
Author: Jason Frerich <jason.frerich@mattermost.com>
Date: Wed Nov 2 12:15:54 2022 -0500
[Gekidou MM-48006] Show keyboard when select a modifier (#6714)
* Delete @sentry+react-native+4.6.1.patch
* correction from PR review
* Add logError to DatabaseManager
* removes sentry context from android build job
* removes team+channel data
* shift active server listener to home/index
* Revert "shift active server listener to home/index"
This reverts commit 75e26faadd8c4359dd4d02c30375c03fadcc91bd.
* refactor after PR Review
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>