mattermost-mobile/app/utils/permalink_sync.ts
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

65 lines
2.1 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {logWarning} from '@utils/log';
import type PostModel from '@typings/database/models/servers/post';
/**
* Update permalink metadata with fresh post data
*/
export function updatePermalinkMetadata(
referencingPost: PostModel,
referencedPostId: string,
freshPostData: Post,
): PostModel | null {
try {
const metadata = referencingPost.metadata;
if (!metadata?.embeds?.length) {
return null;
}
let updated = false;
const updatedEmbeds = metadata.embeds.map((embed) => {
if (embed.type === 'permalink' && embed.data?.post_id === referencedPostId) {
const currentEditAt = embed.data.post?.edit_at || 0;
const freshEditAt = freshPostData.edit_at || 0;
if (freshEditAt > currentEditAt) {
updated = true;
return {
...embed,
data: {
...embed.data,
post: {
...embed.data.post,
id: freshPostData.id,
message: freshPostData.message,
edit_at: freshPostData.edit_at,
update_at: freshPostData.update_at,
user_id: freshPostData.user_id,
create_at: freshPostData.create_at,
},
},
};
}
}
return embed;
});
if (updated) {
const updatedPost = referencingPost.prepareUpdate((post) => {
post.metadata = {
...metadata,
embeds: updatedEmbeds,
};
});
return updatedPost;
}
return null;
} catch (error) {
logWarning('Error updating permalink metadata:', error);
return null;
}
}