Files
plane/web/ee/hooks/use-issue-embed.tsx
Nikhil 4e8bfe0024 dev: feature flagging implementation (#443)
* dev: initialize feature flagging

* dev: feature flagging workspace active cycles

* dev: update feature flag implementation

* dev: add `FEATURE_FLAG_SERVER_AUTH_TOKEN` env

* dev: add feature flagging for backend apis

* dev: setup feature flags store and hooks. (#558)

* dev: setup feature flags store and hooks.

* minor improvements for swr key and flags enum.

* dev: workspace active cycles feature flag. (#562)

* dev: add task for cancelling the workspace subscription when the workspace is deleted

* dev: rename feaure flagging component

* dev: update feature flagging function for spaces

* dev: add feature flags for bulk ops, issue embeds and page publish. (#589)

* dev: add logging for member sync task

* dev: restrict workspace from deleting if the subscription is active

* dev: workspace delete check endpoint

* dev: subscription endpoint check

* dev: update subscriptions

* chore: plane pro billing and plans page updates.

* dev: update pro pill display logic.

* dev: fix feature flagging

* chore: minor improvement in cloud-badge to avoid API calls to `products` endpoint if user has PRO subscription.

---------

Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
2024-07-11 15:14:18 +05:30

91 lines
2.9 KiB
TypeScript

// editor
import { TEmbedConfig, TEmbedItem, TIssueEmbedConfig, TReadOnlyEmbedConfig } from "@plane/editor";
// types
import { TPageEmbedResponse, TPageEmbedType } from "@plane/types";
// ui
import { PriorityIcon } from "@plane/ui";
// plane web components
import { IssueEmbedCard, IssueEmbedUpgradeCard } from "@/plane-web/components/pages";
// plane web hooks
import { useFlag } from "@/plane-web/hooks/store/use-flag";
// services
import { ProjectPageService } from "@/services/page";
const pageService = new ProjectPageService();
export const useIssueEmbed = (workspaceSlug: string, projectId: string, queryType: TPageEmbedType = "issue") => {
// store hooks
const isIssueEmbedEnabled = useFlag("PAGE_ISSUE_EMBEDS");
const fetchIssues = async (searchQuery: string): Promise<TEmbedItem[]> => {
const response = await pageService.searchEmbed<TPageEmbedResponse[]>(workspaceSlug, projectId, {
query_type: queryType,
query: searchQuery,
count: 10,
});
const structuredIssues: TEmbedItem[] = (response ?? []).map((issue) => ({
id: issue.id,
subTitle: `${issue.project__identifier}-${issue.sequence_id}`,
title: issue.name,
icon: <PriorityIcon priority={issue.priority} />,
projectId: projectId,
workspaceSlug: workspaceSlug,
}));
return structuredIssues;
};
const searchCallback: TIssueEmbedConfig["searchCallback"] = async (query: string): Promise<TEmbedItem[]> =>
new Promise((resolve) => {
setTimeout(async () => {
const response = await fetchIssues(query);
const issueItemsWithIdentifiers = response?.map((issue) => ({
...issue,
projectId: projectId.toString(),
workspaceSlug: workspaceSlug.toString(),
}));
resolve(issueItemsWithIdentifiers);
}, 300);
});
const widgetCallback: TIssueEmbedConfig["widgetCallback"] = ({
issueId,
projectId: projectIdFromEmbed,
workspaceSlug: workspaceSlugFromEmbed,
}) => {
const resolvedProjectId = projectIdFromEmbed ?? projectId?.toString() ?? "";
const resolvedWorkspaceSlug = workspaceSlugFromEmbed ?? workspaceSlug?.toString() ?? "";
return <IssueEmbedCard issueId={issueId} projectId={resolvedProjectId} workspaceSlug={resolvedWorkspaceSlug} />;
};
const upgradeCallback = () => <IssueEmbedUpgradeCard />;
const issueEmbedProps: TEmbedConfig["issue"] = {
searchCallback,
widgetCallback,
};
const issueEmbedReadOnlyProps: TReadOnlyEmbedConfig["issue"] = {
widgetCallback,
};
const issueEmbedUpgradeProps: TEmbedConfig["issue"] = {
widgetCallback: upgradeCallback,
};
const issueEmbedReadOnlyUpgradeProps: TReadOnlyEmbedConfig["issue"] = {
widgetCallback: upgradeCallback,
};
if (isIssueEmbedEnabled) {
return {
issueEmbedProps,
issueEmbedReadOnlyProps,
};
}
return {
issueEmbedProps: issueEmbedUpgradeProps,
issueEmbedReadOnlyProps: issueEmbedReadOnlyUpgradeProps,
};
};