Skip to content

Commit

Permalink
Add test contact list (#78)
Browse files Browse the repository at this point in the history
Co-authored-by: Julia Wegmayr <julia.wegmayr@vivid-planet.com>
  • Loading branch information
juliawegmayr and juliawegmayr authored Dec 2, 2024
1 parent 68aa6f4 commit f07d79a
Show file tree
Hide file tree
Showing 24 changed files with 900 additions and 32 deletions.
8 changes: 8 additions & 0 deletions .changeset/chilly-dogs-draw.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@comet/brevo-admin": minor
"@comet/brevo-api": minor
---

Adds `createBrevoTestContactsPage` for creating a test contacts page, that is indepent from the main list.

Remove `email` and `redirectionUrl` from `brevoContactsPageAttributesConfig`
11 changes: 10 additions & 1 deletion demo/admin/src/Routes.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { MasterLayout, RouteWithErrorBoundary } from "@comet/admin";
import { Domain } from "@comet/admin-icons";
import { createBrevoContactsPage, createEmailCampaignsPage, createTargetGroupsPage } from "@comet/brevo-admin";
import { createBrevoContactsPage, createBrevoTestContactsPage, createEmailCampaignsPage, createTargetGroupsPage } from "@comet/brevo-admin";
import { ContentScopeIndicator, createRedirectsPage, DamPage, PagesPage, PublisherPage, SitePreview } from "@comet/cms-admin";
import { getBrevoContactConfig } from "@src/common/brevoModuleConfig/brevoContactsPageAttributesConfig";
import { pageTreeCategories, urlParamToCategory } from "@src/pageTree/pageTreeCategories";
Expand Down Expand Up @@ -33,6 +33,14 @@ export const Routes: React.FC = () => {
input2State: brevoContactConfig.input2State,
});

const BrevoTestContactsPage = createBrevoTestContactsPage({
scopeParts: ["domain", "language"],
additionalAttributesFragment: brevoContactConfig.additionalAttributesFragment,
additionalGridFields: brevoContactConfig.additionalGridFields,
additionalFormFields: brevoContactConfig.additionalFormFields,
input2State: brevoContactConfig.input2State,
});

const TargetGroupsPage = createTargetGroupsPage({
scopeParts: ["domain", "language"],
additionalFormFields: additionalFormConfig.additionalFormFields,
Expand Down Expand Up @@ -94,6 +102,7 @@ export const Routes: React.FC = () => {
/>

<RouteWithErrorBoundary path={`${match.path}/newsletter/contacts`} component={BrevoContactsPage} />
<RouteWithErrorBoundary path={`${match.path}/newsletter/test-contacts`} component={BrevoTestContactsPage} />
<RouteWithErrorBoundary path={`${match.path}/newsletter/target-groups`} component={TargetGroupsPage} />
<RouteWithErrorBoundary path={`${match.path}/newsletter/email-campaigns`} component={EmailCampaignsPage} />

Expand Down
4 changes: 4 additions & 0 deletions demo/admin/src/common/MasterMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ export const MasterMenu: React.FC = () => {
primary={intl.formatMessage({ id: "menu.newsletter.contacts", defaultMessage: "Contacts" })}
to={`${match.url}/newsletter/contacts`}
/>
<MenuItemRouterLink
primary={intl.formatMessage({ id: "menu.newsletter.testContacts", defaultMessage: "Test contacts" })}
to={`${match.url}/newsletter/test-contacts`}
/>
<MenuItemRouterLink
primary={intl.formatMessage({ id: "menu.newsletter.targetGroups", defaultMessage: "Target groups" })}
to={`${match.url}/newsletter/target-groups`}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@ export const getBrevoContactConfig = (
name: string;
};
input2State: (values?: AdditionalFormConfigInputProps) => {
email: string;
redirectionUrl: string;
attributes: { BRANCH?: Array<GQLBrevoContactBranch>; SALUTATION?: GQLBrevoContactSalutation; FIRSTNAME?: string; LASTNAME?: string };
};
exportFields: {
Expand Down Expand Up @@ -140,8 +138,6 @@ export const getBrevoContactConfig = (
),
input2State: (values?: AdditionalFormConfigInputProps) => {
return {
email: values?.email ?? "",
redirectionUrl: values?.redirectionUrl ?? "",
attributes: {
BRANCH: values?.attributes?.BRANCH ?? [],
SALUTATION: values?.attributes?.SALUTATION,
Expand Down
11 changes: 11 additions & 0 deletions demo/api/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ type TargetGroup implements DocumentInterface {
createdAt: DateTime!
title: String!
isMainList: Boolean!
isTestList: Boolean!
brevoId: Int!
totalSubscribers: Int!
scope: EmailCampaignContentScope!
Expand Down Expand Up @@ -527,6 +528,7 @@ type Query {
mainMenu(scope: PageTreeNodeScopeInput!): [PageTreeNode!]!
brevoContact(id: Int!, scope: EmailCampaignContentScopeInput!): BrevoContact!
brevoContacts(targetGroupId: ID, email: String, scope: EmailCampaignContentScopeInput!, offset: Int! = 0, limit: Int! = 25): PaginatedBrevoContacts!
brevoTestContacts(targetGroupId: ID, email: String, scope: EmailCampaignContentScopeInput!, offset: Int! = 0, limit: Int! = 25): PaginatedBrevoContacts!
manuallyAssignedBrevoContacts(offset: Int! = 0, limit: Int! = 25, targetGroupId: ID!, email: String): PaginatedBrevoContacts!
emailCampaign(id: ID!): EmailCampaign!
emailCampaigns(scope: EmailCampaignContentScopeInput!, search: String, filter: EmailCampaignFilter, sort: [EmailCampaignSort!], offset: Int! = 0, limit: Int! = 25): PaginatedEmailCampaigns!
Expand Down Expand Up @@ -686,6 +688,7 @@ input TargetGroupFilter {
createdAt: DateFilter
updatedAt: DateFilter
title: StringFilter
isTestList: BooleanFilter
and: [TargetGroupFilter!]
or: [TargetGroupFilter!]
}
Expand Down Expand Up @@ -738,7 +741,9 @@ type Mutation {
deleteDamFolder(id: ID!): Boolean!
updateBrevoContact(id: Int!, scope: EmailCampaignContentScopeInput!, input: BrevoContactUpdateInput!): BrevoContact!
createBrevoContact(scope: EmailCampaignContentScopeInput!, input: BrevoContactInput!): SubscribeResponse!
createBrevoTestContact(scope: EmailCampaignContentScopeInput!, input: BrevoTestContactInput!): SubscribeResponse!
deleteBrevoContact(id: Int!, scope: EmailCampaignContentScopeInput!): Boolean!
deleteBrevoTestContact(id: Int!, scope: EmailCampaignContentScopeInput!): Boolean!
subscribeBrevoContact(input: SubscribeInput!, scope: EmailCampaignContentScopeInput!): SubscribeResponse!
createEmailCampaign(scope: EmailCampaignContentScopeInput!, input: EmailCampaignInput!): EmailCampaign!
updateEmailCampaign(id: ID!, input: EmailCampaignUpdateInput!, lastUpdatedAt: DateTime): EmailCampaign!
Expand Down Expand Up @@ -895,6 +900,12 @@ input BrevoContactInput {
attributes: BrevoContactAttributesInput
}

input BrevoTestContactInput {
email: String!
blocked: Boolean!
attributes: BrevoContactAttributesInput
}

input SubscribeInput {
email: String!
redirectionUrl: String!
Expand Down
38 changes: 22 additions & 16 deletions packages/admin/src/brevoContacts/form/BrevoContactForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,12 @@ import {
} from "./BrevoContactForm.gql.generated";

export type EditBrevoContactFormValues = {
[key: string]: unknown;
};

type EditBrevoContactFormValuesWithAttributes = EditBrevoContactFormValues & {
email: string;
redirectionUrl: string;
[key: string]: unknown;
};

interface FormProps {
Expand All @@ -59,14 +62,11 @@ export function BrevoContactForm({ id, scope, input2State, additionalFormFields,
const stackApi = useStackApi();
const client = useApolloClient();
const mode = id ? "edit" : "add";
const formApiRef = useFormApiRef<EditBrevoContactFormValues>();
const formApiRef = useFormApiRef<EditBrevoContactFormValuesWithAttributes>();

const brevoContactFormFragment = gql`
fragment BrevoContactForm on BrevoContact {
email
createdAt
emailBlacklisted
smsBlacklisted
${additionalAttributesFragment ? "...".concat(additionalAttributesFragment?.name) : ""}
}
${additionalAttributesFragment?.fragment ?? ""}
Expand All @@ -76,18 +76,20 @@ export function BrevoContactForm({ id, scope, input2State, additionalFormFields,
id ? { variables: { id, scope } } : { skip: true },
);

const initialValues = React.useMemo<Partial<EditBrevoContactFormValues>>(() => {
let additionalInitialValues = {};
const initialValues = React.useMemo<Partial<EditBrevoContactFormValuesWithAttributes>>(() => {
let baseInitialValues = {
email: "",
redirectionUrl: "",
};

if (input2State) {
additionalInitialValues = input2State({ email: "", redirectionUrl: "", ...data?.brevoContact });
baseInitialValues = {
...baseInitialValues,
...input2State(data?.brevoContact),
};
}
return data?.brevoContact
? {
email: data.brevoContact.email,
...additionalInitialValues,
}
: additionalInitialValues;

return data?.brevoContact?.email ? { ...baseInitialValues, email: data.brevoContact.email } : baseInitialValues;
}, [data?.brevoContact, input2State]);

const saveConflict = useFormSaveConflict({
Expand All @@ -112,7 +114,11 @@ export function BrevoContactForm({ id, scope, input2State, additionalFormFields,
},
});

const handleSubmit = async (state: EditBrevoContactFormValues, form: FormApi<EditBrevoContactFormValues>, event: FinalFormSubmitEvent) => {
const handleSubmit = async (
state: EditBrevoContactFormValuesWithAttributes,
form: FormApi<EditBrevoContactFormValuesWithAttributes>,
event: FinalFormSubmitEvent,
) => {
if (await saveConflict.checkForConflicts()) {
throw new Error("Conflicts detected");
}
Expand Down Expand Up @@ -159,7 +165,7 @@ export function BrevoContactForm({ id, scope, input2State, additionalFormFields,
}

return (
<FinalForm<EditBrevoContactFormValues> apiRef={formApiRef} onSubmit={handleSubmit} mode={mode} initialValues={initialValues}>
<FinalForm<EditBrevoContactFormValuesWithAttributes> apiRef={formApiRef} onSubmit={handleSubmit} mode={mode} initialValues={initialValues}>
{({ values }) => (
<EditPageLayout>
{saveConflict.dialogs}
Expand Down
Loading

0 comments on commit f07d79a

Please sign in to comment.