mirror of
https://github.com/makeplane/plane.git
synced 2025-12-29 00:24:56 +01:00
* 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>
91 lines
2.9 KiB
TypeScript
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,
|
|
};
|
|
};
|