base
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* Copyright (c) 2023-present Plane Software, Inc. and contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
* See the LICENSE file for details.
|
||||
*/
|
||||
|
||||
import { useCallback } from "react";
|
||||
// helpers
|
||||
import type { TCustomComponentsMetaData } from "@plane/utils";
|
||||
// helpers
|
||||
import { getEditorAssetSrc } from "@/helpers/editor.helper";
|
||||
// hooks
|
||||
import { useMember } from "@/hooks/store/use-member";
|
||||
|
||||
type TArgs = {
|
||||
anchor: string;
|
||||
};
|
||||
|
||||
export const useParseEditorContent = (args: TArgs) => {
|
||||
const { anchor } = args;
|
||||
// store hooks
|
||||
const { getMemberById } = useMember();
|
||||
|
||||
const getEditorMetaData = useCallback(
|
||||
(htmlContent: string): TCustomComponentsMetaData => {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(htmlContent, "text/html");
|
||||
const imageMetaData: TCustomComponentsMetaData["file_assets"] = [];
|
||||
// process image components
|
||||
const imageComponents = doc.querySelectorAll("image-component");
|
||||
imageComponents.forEach((element) => {
|
||||
const src = element.getAttribute("src");
|
||||
if (src) {
|
||||
const assetSrc = src.startsWith("http") ? src : getEditorAssetSrc(anchor, src);
|
||||
if (assetSrc) {
|
||||
imageMetaData.push({
|
||||
id: src,
|
||||
name: src,
|
||||
url: assetSrc,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
// process user mentions
|
||||
const userMentions: TCustomComponentsMetaData["user_mentions"] = [];
|
||||
const mentionComponents = doc.querySelectorAll("mention-component");
|
||||
mentionComponents.forEach((element) => {
|
||||
const id = element.getAttribute("entity_identifier");
|
||||
if (id) {
|
||||
const userDetails = getMemberById(id);
|
||||
const originUrl = typeof window !== "undefined" && (window.location.origin ?? "");
|
||||
const path = `profile/${id}`;
|
||||
const url = `${originUrl}/${path}`;
|
||||
if (userDetails) {
|
||||
userMentions.push({
|
||||
id,
|
||||
display_name: userDetails.member__display_name,
|
||||
url,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
file_assets: imageMetaData,
|
||||
user_mentions: userMentions,
|
||||
};
|
||||
},
|
||||
[anchor, getMemberById]
|
||||
);
|
||||
|
||||
return {
|
||||
getEditorMetaData,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user