tududi/frontend/utils/featureFlags.ts
Chris 57a6e558f3
fix: use CALDAV_ENABLED for calendar feature flag (#1070)
* fix: add FF_ENABLE_CALDAV feature flag for CalDAV functionality

Introduces a new dedicated feature flag for CalDAV sync that checks
both FF_ENABLE_CALDAV and CALDAV_ENABLED environment variables. This
allows the CalDAV tab to appear in profile settings when users set
CALDAV_ENABLED=true as documented.

The existing FF_ENABLE_CALENDAR remains unchanged as it's for a
separate (hidden) calendar feature.

Changes:
- Added 'caldav' feature flag to backend service (checks FF_ENABLE_CALDAV
  or CALDAV_ENABLED)
- Updated frontend FeatureFlags interface to include 'caldav'
- Changed CalDAV tab to use 'caldav' feature flag instead of 'calendar'
- Added FF_ENABLE_CALDAV to .env.example, .env.test, Dockerfile, and CI

Fixes #1048

* fix: add caldav property to all FeatureFlags initializations

Fixes TypeScript errors where FeatureFlags objects were missing the
new caldav property in:
- frontend/utils/featureFlags.ts (defaultFlags and error return)
- frontend/components/Navbar.tsx
- frontend/components/Sidebar.tsx
- frontend/components/Sidebar/SidebarNav.tsx
2026-04-25 18:21:53 +03:00

61 lines
1.5 KiB
TypeScript

import { getApiPath } from '../config/paths';
export interface FeatureFlags {
backups: boolean;
calendar: boolean;
caldav: boolean;
habits: boolean;
mcp: boolean;
}
let cachedFeatureFlags: FeatureFlags | null = null;
export const getFeatureFlags = async (): Promise<FeatureFlags> => {
if (cachedFeatureFlags) {
return cachedFeatureFlags;
}
try {
const response = await fetch(getApiPath('feature-flags'), {
credentials: 'include',
});
if (!response.ok) {
console.error('Failed to fetch feature flags');
return {
backups: false,
calendar: false,
caldav: false,
habits: false,
mcp: false,
};
}
const data = await response.json();
const defaultFlags: FeatureFlags = {
backups: false,
calendar: false,
caldav: false,
habits: false,
mcp: false,
};
cachedFeatureFlags = {
...defaultFlags,
...data.featureFlags,
};
return cachedFeatureFlags;
} catch (error) {
console.error('Error fetching feature flags:', error);
return {
backups: false,
calendar: false,
caldav: false,
habits: false,
mcp: false,
};
}
};
export const clearFeatureFlagsCache = () => {
cachedFeatureFlags = null;
};