@proca/widget
Version:
Proca is an open-source campaign toolkit designed to empower activists and organisations in their digital advocacy efforts. It provides a flexible and customisable platform for creating and managing online petitions, email campaigns, and other forms of di
171 lines (160 loc) • 4.5 kB
JSX
import React, { useEffect } from "react";
import TextField from "@components/TextField";
import Country from "@components/field/Country";
import { useTranslation } from "react-i18next";
import { useCampaignConfig } from "@hooks/useConfig";
import { useForm } from "react-hook-form";
import { Button, SvgIcon } from "@material-ui/core";
import useData from "@hooks/useData";
import { addActionContact } from "@lib/server";
import { slugify } from "@lib/text";
import ProcaIcon from "@images/Proca";
import uuid from "@lib/uuid";
const GeneratePaper = props => {
const config = useCampaignConfig();
const { t } = useTranslation();
const [data, setData] = useData();
const onSubmit = async data => {
data.privacy = "opt-in";
if (data.other) {
data.partner = slugify(data.other.toLowerCase(), "-");
}
data.email = `${data.partner}@paper.eci.invalid`;
data.firstname = data.partner;
data.lastname = data.country;
const result = await addActionContact(
"generatePDF",
config.actionPage,
data,
config.test
);
if (result.errors) {
let handled = false;
if (result.errors.fields) {
result.errors.fields.forEach(field => {
if (field.name in data) {
setError(field.name, { type: "server", message: field.message });
handled = true;
} else if (field.name.toLowerCase() in data) {
setError(field.name.toLowerCase(), {
type: "server",
message: field.message,
});
handled = true;
}
});
if (!handled) {
console.error(result.errors);
}
}
return;
}
setData(data);
uuid(result.contactRef); // set the global uuid as signature's fingerprint
props.done &&
props.done({
errors: result.errors,
uuid: uuid(),
firstname: data.firstname,
country: data.country,
privacy: data.privacy,
});
};
const form = useForm({
// mode: "onBlur",
// nativeValidation: true,
defaultValues: Object.assign({}, data),
});
const { watch, formState, handleSubmit, setError } = form;
const partner = watch("partner");
const country = watch("country");
const extraLang = {
BE: ["FR", "NL"],
LU: ["FR", "DE"],
};
const lang = extraLang[country];
useEffect(() => {
const inputs = document.querySelectorAll("input, select, textarea");
// todo: workaround until the feature is native react-form ?
inputs.forEach(input => {
input.oninvalid = e => {
setError(e.target.attributes.name.nodeValue, {
type: e.type,
message: e.target.validationMessage,
});
};
});
}, [setError]);
return (
<form
id="proca-register"
onSubmit={handleSubmit(onSubmit)}
method="post"
action="http://localhost"
>
<TextField
select
name="partner"
label="Partner"
form={form}
required
SelectProps={{
native: true,
}}
>
<option key="" value="" />
{Object.entries(config.component.paper.partners).map(([key, value]) => (
<option key={key} value={key}>
{value}
</option>
))}
<option key="N/A" value="N/A">
None of the above
</option>
</TextField>
{partner === "N/A" && (
<TextField form={form} name="other" label="Group/Organisation name" />
)}
<Country form={form} required />
{lang && (
<TextField
select
name="extra_language"
label="Language"
form={form}
required
SelectProps={{
native: true,
}}
>
<option key="" value="" />
{lang.map(lang => (
<option key={lang} value={lang}>
{lang}
</option>
))}
</TextField>
)}
<Button
color="primary"
variant="contained"
type="submit"
fullWidth
size="large"
disabled={formState.isSubmitting}
endIcon={
<SvgIcon>
<ProcaIcon />
</SvgIcon>
}
>
{" "}
{
/* i18next-extract-disable-next-line */ props.buttonText ||
t(config.component.register?.button || "register")
}
</Button>
</form>
);
};
export default GeneratePaper;