feat: show articles in the list only if feature is enabled (#11607)

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
This commit is contained in:
Shivam Mishra
2025-05-29 14:19:35 +05:30
committed by GitHub
parent fdd35ff549
commit a0cc27faaf
2 changed files with 50 additions and 33 deletions

View File

@@ -129,6 +129,7 @@ export function usePolicy() {
return { return {
checkPermissions, checkPermissions,
shouldShowPaywall, shouldShowPaywall,
isFeatureFlagEnabled,
shouldShow, shouldShow,
}; };
} }

View File

@@ -10,10 +10,8 @@ import {
CONTACT_PERMISSIONS, CONTACT_PERMISSIONS,
PORTAL_PERMISSIONS, PORTAL_PERMISSIONS,
} from 'dashboard/constants/permissions.js'; } from 'dashboard/constants/permissions.js';
import { import { usePolicy } from 'dashboard/composables/usePolicy';
getUserPermissions, import { FEATURE_FLAGS } from 'dashboard/featureFlags';
filterItemsByPermission,
} from 'dashboard/helper/permissionsHelper.js';
import { CONVERSATION_EVENTS } from '../../../helper/AnalyticsHelper/events'; import { CONVERSATION_EVENTS } from '../../../helper/AnalyticsHelper/events';
import Policy from 'dashboard/components/policy.vue'; import Policy from 'dashboard/components/policy.vue';
@@ -39,8 +37,6 @@ const pages = ref({
articles: 1, articles: 1,
}); });
const currentUser = useMapGetter('getCurrentUser');
const currentAccountId = useMapGetter('getCurrentAccountId');
const contactRecords = useMapGetter('conversationSearch/getContactRecords'); const contactRecords = useMapGetter('conversationSearch/getContactRecords');
const conversationRecords = useMapGetter( const conversationRecords = useMapGetter(
'conversationSearch/getConversationRecords' 'conversationSearch/getConversationRecords'
@@ -83,9 +79,7 @@ const filterConversations = filterByTab('conversations');
const filterMessages = filterByTab('messages'); const filterMessages = filterByTab('messages');
const filterArticles = filterByTab('articles'); const filterArticles = filterByTab('articles');
const userPermissions = computed(() => const { shouldShow, isFeatureFlagEnabled } = usePolicy();
getUserPermissions(currentUser.value, currentAccountId.value)
);
const TABS_CONFIG = { const TABS_CONFIG = {
all: { all: {
@@ -111,47 +105,67 @@ const TABS_CONFIG = {
}, },
articles: { articles: {
permissions: [...ROLES, PORTAL_PERMISSIONS], permissions: [...ROLES, PORTAL_PERMISSIONS],
featureFlag: FEATURE_FLAGS.HELP_CENTER,
count: () => mappedArticles.value.length, count: () => mappedArticles.value.length,
}, },
}; };
const tabs = computed(() => { const tabs = computed(() => {
const configs = Object.entries(TABS_CONFIG).map(([key, config]) => ({ return Object.entries(TABS_CONFIG)
.map(([key, config]) => ({
key, key,
name: t(`SEARCH.TABS.${key.toUpperCase()}`), name: t(`SEARCH.TABS.${key.toUpperCase()}`),
count: config.count(), count: config.count(),
showBadge: key !== 'all', showBadge: key !== 'all',
permissions: config.permissions, permissions: config.permissions,
})); featureFlag: config.featureFlag,
}))
return filterItemsByPermission( .filter(config => {
configs, // why the double check, glad you asked.
userPermissions.value, // Some features are marked as premium features, that means
item => item.permissions // the feature will be visible, but a Paywall will be shown instead
// this works for pages and routes, but fails for UI elements like search here
// so we explicitly check if the feature is enabled
return (
shouldShow(config.featureFlag, config.permissions, null) &&
isFeatureFlagEnabled(config.featureFlag)
); );
});
}); });
const totalSearchResultsCount = computed(() => { const totalSearchResultsCount = computed(() => {
const permissionCounts = { const permissionCounts = [
contacts: { {
permissions: [...ROLES, CONTACT_PERMISSIONS], permissions: [...ROLES, CONTACT_PERMISSIONS],
count: () => contacts.value.length, count: () => contacts.value.length,
}, },
conversations: { {
permissions: [...ROLES, ...CONVERSATION_PERMISSIONS], permissions: [...ROLES, ...CONVERSATION_PERMISSIONS],
count: () => conversations.value.length + messages.value.length, count: () => conversations.value.length + messages.value.length,
}, },
articles: { {
permissions: [...ROLES, PORTAL_PERMISSIONS], permissions: [...ROLES, PORTAL_PERMISSIONS],
featureFlag: FEATURE_FLAGS.HELP_CENTER,
count: () => articles.value.length, count: () => articles.value.length,
}, },
}; ];
return filterItemsByPermission(
permissionCounts, return permissionCounts
userPermissions.value, .filter(config => {
item => item.permissions, // why the double check, glad you asked.
(_, item) => item.count // Some features are marked as premium features, that means
).reduce((total, count) => total + count(), 0); // the feature will be visible, but a Paywall will be shown instead
// this works for pages and routes, but fails for UI elements like search here
// so we explicitly check if the feature is enabled
return (
shouldShow(config.featureFlag, config.permissions, null) &&
isFeatureFlagEnabled(config.featureFlag)
);
})
.map(config => {
return config.count();
})
.reduce((sum, count) => sum + count, 0);
}); });
const activeTabIndex = computed(() => { const activeTabIndex = computed(() => {
@@ -355,7 +369,9 @@ onUnmounted(() => {
</Policy> </Policy>
<Policy <Policy
v-if="isFeatureFlagEnabled(FEATURE_FLAGS.HELP_CENTER)"
:permissions="[...ROLES, PORTAL_PERMISSIONS]" :permissions="[...ROLES, PORTAL_PERMISSIONS]"
:feature-flag="FEATURE_FLAGS.HELP_CENTER"
class="flex flex-col justify-center" class="flex flex-col justify-center"
> >
<SearchResultArticlesList <SearchResultArticlesList