diff --git a/packages/marko-web-identity-x/browser/download.vue b/packages/marko-web-identity-x/browser/download.vue index bfb3fca8e..c5b80032b 100644 --- a/packages/marko-web-identity-x/browser/download.vue +++ b/packages/marko-web-identity-x/browser/download.vue @@ -4,8 +4,8 @@
{{ title }}
-

-

+

+

{ + // Handle setting of contentAccessState Object + const { surveyType, surveyId } = getAsObject(content, 'gating'); + const cookieName = `${cookieNamePrefix}_${surveyId}_${content.id}`; + + const setFormDisplay = ({ req }) => { + res.locals.contentAccessState.displayForm = !get(req, `cookies.${cookieName}`); + }; + res.locals.contentAccessState = { + displayForm: false, + setFormDisplay, + }; + + if (surveyType === 'idx') { + const cookie = { name: cookieName, maxAge }; + res.locals.contentAccessState.formId = surveyId; + res.locals.contentAccessState.cookie = cookie; + } +}; + +module.exports = { + contentAccessState, +}; diff --git a/packages/marko-web-identity-x/middleware/content-download-state.js b/packages/marko-web-identity-x/middleware/content-download-state.js new file mode 100644 index 000000000..cc1fa56fd --- /dev/null +++ b/packages/marko-web-identity-x/middleware/content-download-state.js @@ -0,0 +1,27 @@ +const { get } = require('@parameter1/base-cms-object-path'); + +const cookieNamePrefix = '__idx_form'; +const maxAge = process.env.IDX_CONTENT_DOWNLOAD_MAXAGE + ? Number(process.env.IDX_CONTENT_DOWNLOAD_MAXAGE) + : 0; + +const contentDownloadState = ({ res, content }) => { + // Handle setting of contentDownloadState Object + const surveyId = 'content-download'; + const cookieName = `${cookieNamePrefix}_${surveyId}_${content.id}`; + + const setFormDisplay = ({ req }) => { + res.locals.contentDownloadState.displayForm = !get(req, `cookies.${cookieName}`); + }; + res.locals.contentDownloadState = { + displayForm: false, + setFormDisplay, + }; + const cookie = { name: cookieName, maxAge }; + res.locals.contentDownloadState.formId = surveyId; + res.locals.contentDownloadState.cookie = cookie; +}; + +module.exports = { + contentDownloadState, +}; diff --git a/packages/marko-web-identity-x/routes/download.js b/packages/marko-web-identity-x/routes/download.js index f5d66c48c..8dda116c4 100644 --- a/packages/marko-web-identity-x/routes/download.js +++ b/packages/marko-web-identity-x/routes/download.js @@ -12,13 +12,15 @@ const mutation = gql` module.exports = asyncRoute(async (req, res) => { /** @type {import('../middleware').IdentityXRequest} */ const { body, apollo, identityX } = req; - const { contentId, payload } = body; + const { contentId, payload, cookie } = body; const input = { contentId, payload, ipAddress: req.ip, }; + const { name: COOKIE_NAME, maxAge } = cookie; await apollo.mutate({ mutation, variables: { input } }); + res.cookie(COOKIE_NAME, true, { maxAge, httpOnly: false }); const entity = await identityX.generateEntityId(); res.json({ ok: true, diff --git a/packages/marko-web-theme-monorail/components/content/download/identity-x.marko b/packages/marko-web-theme-monorail/components/content/download/identity-x.marko index 60dada4d9..16f977951 100644 --- a/packages/marko-web-theme-monorail/components/content/download/identity-x.marko +++ b/packages/marko-web-theme-monorail/components/content/download/identity-x.marko @@ -1,14 +1,18 @@ import defaultValue from "@parameter1/base-cms-marko-core/utils/default-value"; -import { get } from "@parameter1/base-cms-object-path"; +import { get, getAsObject } from "@parameter1/base-cms-object-path"; -$ const { req: { identityX } } = out.global; +$ const { req } = out.global; +$ const { identityX } = req; $ const { content, formId } = input; $ const form = identityX.config.getAsObject(`forms.${formId}`); $ const additionalEventData = defaultValue(input.additionalEventData, {}); $ const ctaPrefix = `To download "${content.name}"`; $ const callToAction = defaultValue(input.callToAction, `${ctaPrefix}, please fill out the form below.`); $ const callToActionLoggedOut = defaultValue(input.callToAction, `${ctaPrefix}, please enter your email address below. You will receive an email containing a verification link.`); +$ const contentDownloadState = getAsObject(out, "global.contentDownloadState"); +$ contentDownloadState.setFormDisplay({ req }); +$ const { cookie, displayForm } = contentDownloadState; $ const buttonLabel = defaultValue(input.buttonLabel, "Submit & Download"); $ const title = defaultValue(input.title, "Complete the form to download this content"); @@ -22,6 +26,8 @@ $ const title = defaultValue(input.title, "Complete the form to download this co fieldRows: form.fieldRows, loginSource: "contentDownload", title: title, + cookie, + displayForm, callToAction: callToAction, callToActionLoggedOut: callToActionLoggedOut,