Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ export function FrameworkDetailContent({
const pathname = usePathname();
const searchParams = useSearchParams();
const { hasPermission, permissions } = usePermissions();
const versioningEnabled = useFeatureFlag('is-framework-versioning-enabled');
const complianceTimelineEnabled = useFeatureFlag('is-timeline-enabled');
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [dropdownOpen, setDropdownOpen] = useState(false);
Expand Down Expand Up @@ -82,7 +81,7 @@ export function FrameworkDetailContent({
const validTabsList: string[] = [];
if (complianceTimelineEnabled) validTabsList.push('progress');
validTabsList.push('requirements');
if (versioningEnabled) validTabsList.push('history');
validTabsList.push('history');
const validTabs = new Set(validTabsList);
const activeTab = tabParam && validTabs.has(tabParam) ? tabParam : DEFAULT_TAB;

Expand Down Expand Up @@ -158,7 +157,7 @@ export function FrameworkDetailContent({
<TabsTrigger value="requirements">
Requirements <TabBadge>{requirementsCount}</TabBadge>
</TabsTrigger>
{versioningEnabled && <TabsTrigger value="history">History</TabsTrigger>}
<TabsTrigger value="history">History</TabsTrigger>
</TabsList>
}
>
Expand Down Expand Up @@ -197,14 +196,12 @@ export function FrameworkDetailContent({
/>
</TabsContent>

{versioningEnabled && (
<TabsContent value="history">
<SyncHistorySection
frameworkInstanceId={frameworkInstanceId}
permissions={permissions}
/>
</TabsContent>
)}
<TabsContent value="history">
<SyncHistorySection
frameworkInstanceId={frameworkInstanceId}
permissions={permissions}
/>
</TabsContent>
</PageLayout>

<FrameworkDeleteDialog
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
'use client';

import { useFeatureFlag } from '@trycompai/analytics';
import { useParams, useRouter } from 'next/navigation';
import { useFrameworkUpdateStatus } from '@/hooks/use-framework-update-status';
import { usePermissions } from '@/hooks/use-permissions';
Expand All @@ -18,20 +17,13 @@ export function FrameworkVersioningSection({
initialStatus,
hasActiveAudit,
}: FrameworkVersioningSectionProps) {
const enabled = useFeatureFlag('is-framework-versioning-enabled');
// Thread the flag into SWR so the update-status request doesn't fire for
// orgs that don't have versioning enabled. Without this the request runs
// every mount and we just throw the response away.
const { data } = useFrameworkUpdateStatus(frameworkInstanceId, {
fallbackData: initialStatus,
enabled,
});
const { hasPermission } = usePermissions();
const router = useRouter();
const { orgId } = useParams<{ orgId: string }>();

if (!enabled) return null;

const canUpdate = hasPermission('framework', 'update');

return (
Expand Down
15 changes: 6 additions & 9 deletions apps/app/src/hooks/use-framework-update-status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,15 @@ import type { FrameworkUpdateStatus } from '@/types/framework-versioning';

interface UseFrameworkUpdateStatusOptions {
fallbackData?: FrameworkUpdateStatus;
enabled?: boolean;
}

export function useFrameworkUpdateStatus(
frameworkInstanceId: string,
options?: UseFrameworkUpdateStatusOptions,
) {
const key =
frameworkInstanceId && options?.enabled !== false
? `/v1/frameworks/${frameworkInstanceId}/update-status`
: null;
const key = frameworkInstanceId
? `/v1/frameworks/${frameworkInstanceId}/update-status`
: null;

return useSWR<FrameworkUpdateStatus>(
key,
Expand All @@ -30,10 +28,9 @@ export function useFrameworkUpdateStatus(
// Always revalidate on mount, even when fallbackData is provided.
// fallbackData is only a fast first paint — without this, SWR treats
// the server-rendered snapshot as authoritative forever and skips the
// client fetch, so users don't see newly-available upgrades after the
// feature flag is flipped, after a sync on a sibling framework, or
// whenever the Next.js router cache serves a stale RSC. Short of
// signing out and back in.
// client fetch, so users don't see newly-available upgrades after a
// sync on a sibling framework or whenever the Next.js router cache
// serves a stale RSC.
revalidateOnMount: true,
revalidateOnFocus: true,
},
Expand Down
Loading