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
6 changes: 5 additions & 1 deletion apps/admin/src/layout/app-sidebar/nav-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import React from "react"
import {SidebarGroup, SidebarGroupContent, SidebarMenu, SidebarMenuBadge} from "@tryghost/shade/components"
import {formatNumber, LucideIcon} from "@tryghost/shade/utils"
import { useCurrentUser } from "@tryghost/admin-x-framework/api/current-user";
import {getSettingValue, useBrowseSettings} from "@tryghost/admin-x-framework/api/settings";
import { canManageMembers, canManageTags } from "@tryghost/admin-x-framework/api/users";
import { NavMenuItem } from "./nav-menu-item";
import { useMemberCount } from "./hooks/use-member-count";
Expand Down Expand Up @@ -69,6 +70,7 @@ function MembersNavItemContent({

function NavContent({ ...props }: React.ComponentProps<typeof SidebarGroup>) {
const { data: currentUser } = useCurrentUser();
const {data: settingsData} = useBrowseSettings();
const [savedPostsExpanded, setPostsExpanded] = useNavigationExpanded('posts');
const [savedMembersExpanded, setMembersExpanded] = useNavigationExpanded('members');
const postCustomViews = useCustomSidebarViews('posts');
Expand All @@ -82,6 +84,8 @@ function NavContent({ ...props }: React.ComponentProps<typeof SidebarGroup>) {

const showTags = currentUser && canManageTags(currentUser);
const showMembers = currentUser && canManageMembers(currentUser);
const commentsEnabled = getSettingValue<string>(settingsData?.settings, 'comments_enabled');
const showComments = !!showMembers && commentModerationEnabled && commentsEnabled !== 'off';
const isDraftPostsRouteActive = routing.isRouteActive('posts', {type: 'draft'});
const isScheduledPostsRouteActive = routing.isRouteActive('posts', {type: 'scheduled'});
const isPublishedPostsRouteActive = routing.isRouteActive('posts', {type: 'published'});
Expand Down Expand Up @@ -202,7 +206,7 @@ function NavContent({ ...props }: React.ComponentProps<typeof SidebarGroup>) {
</>
)}

{showMembers && commentModerationEnabled && (
{showComments && (
<NavMenuItem>
<NavMenuItem.Link
to="comments"
Expand Down
10 changes: 8 additions & 2 deletions e2e/tests/portal/member-actions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {APIRequestContext, Page} from '@playwright/test';
import {HomePage, MemberDetailsPage, MembersPage} from '@/helpers/pages';
import {MemberFactory, createMemberFactory} from '@/data-factory';
import {PortalAccountHomePage, PortalNewsletterManagementPage} from '@/portal-pages';
import {SettingsService} from '@/helpers/services/settings/settings-service';
import {expect, test} from '@/helpers/playwright';
import {usePerTestIsolation} from '@/helpers/playwright/isolation';

Expand Down Expand Up @@ -78,6 +79,9 @@ test.describe('Portal - Member Actions', () => {
});

test('can unsubscribe from newsletter', async ({page}) => {
const settingsService = new SettingsService(page.request);
await settingsService.setCommentsEnabled('off');

const member = await createSubscribedMember(page.request, memberFactory);

await impersonateMember(page, member.name!);
Expand Down Expand Up @@ -120,7 +124,9 @@ test.describe('Portal - Member Actions', () => {
await expect(newsletterManagement.newsletterToggleCheckbox(0)).not.toBeChecked();
await expect(newsletterManagement.newsletterToggleCheckbox(1)).not.toBeChecked();

const memberNewsletters = await getMemberNewsletters(page.request, member.id);
expect(memberNewsletters).toHaveLength(0);
await expect(async () => {
const memberNewsletters = await getMemberNewsletters(page.request, member.id);
expect(memberNewsletters).toHaveLength(0);
}).toPass();
});
});
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {APIRequestContext, Page} from '@playwright/test';
import {HomePage, MemberDetailsPage, MembersPage, PortalAccountPage} from '@/helpers/pages';
import {MembersService} from '@/helpers/services/members';
import {SettingsService} from '@/helpers/services/settings/settings-service';
import {expect, test} from '@/helpers/playwright';

async function waitForMemberStatus(request: APIRequestContext, email: string, status: string) {
Expand Down Expand Up @@ -84,6 +85,9 @@ test.describe('Portal - Stripe Subscription Lifecycle via Webhooks', () => {
});

test('subscription-deleted webhook - shows free membership in portal', async ({page, stripe}) => {
const settingsService = new SettingsService(page.request);
await settingsService.setCommentsEnabled('off');

const email = `portal-free-${Date.now()}@example.com`;
const {subscription} = await stripe!.createPaidMemberViaWebhooks({email, name: 'Portal Free Member'});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@
"comments": {
"comments_enabled": {
"type": "string",
"defaultValue": "off",
"defaultValue": "all",
"validations": {
"isEmpty": false,
"isIn": [[
Expand Down
Loading
Loading