\n\t\t\t\t)\n\t\t\t) : (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nexport default OccasionsBoard;\n","import React from \"react\";\n\ninterface ShareButtonProps {\n\toccasionsId: number;\n}\n\nconst ShareButton = (props: ShareButtonProps) => {\n\treturn (\n\t\t\n\t);\n};\n\nexport default ShareButton;\n","import React, { useState, useEffect } from \"react\";\nimport { Button, Modal, Form, InputGroup, Col, Alert } from \"react-bootstrap\";\nimport AprannCardElementWrapper from \"components/UIComponents/PaymentComponents/AprannCardElementWrapper\";\n\nimport PartnerModel from \"models/PartnerModel\";\nimport UserModel from \"models/UserModel\";\nimport PaymentLegal from \"components/Checkout/PaymentLegal\";\n\nimport { formatMoney } from \"helpers\";\n\nimport styles from \"./styles.module.css\";\nimport OccasionsInterface from \"interfaces/OccasionsInterface\";\nimport AprannButton from \"components/UIComponents/AprannButton\";\nimport SponsoredsInterface from \"interfaces/SponsoredsInterface\";\nimport SponsoredModel from \"models/SponsoredModel\";\nimport ShareButton from \"./ShareButton\";\nimport ToolTip from \"components/UIComponents/ToolTip\";\nimport OneTimeFeeSelectionWrapper from \"components/UIComponents/PaymentComponents/FeeComponents/OneTimeFeeSelectionWrapper\";\nimport { OccasionPaymentInterface } from \"interfaces/PaymentsInterface\";\nimport { processOccasionPayment } from \"services/payments.service\";\n\ninterface OccasionsPaymentModalProps {\n\toccasion: OccasionsInterface;\n\tcontextPartner: PartnerModel;\n\tuser: UserModel;\n\tshow: boolean;\n\tembedded?: boolean;\n\tsetShow(boolean): void;\n\trefreshCallback(): void;\n}\n\nconst OccasionsPaymentModal = (props: OccasionsPaymentModalProps) => {\n\tconst initialAmount: number = 10;\n\tconst initialBoost: number = 0.03;\n\n\tconst { occasion, contextPartner, user, show, setShow, refreshCallback } = props;\n\tconst [showSubmitting, setShowSubmitting] = useState(false);\n\tconst [showSuccess, setShowSuccess] = useState(false);\n\n\tconst [sponsoreds, setSponsoreds] = useState([]);\n\tconst [sponsoredsId, setSponsoredsId] = useState();\n\tconst [amount, setAmount] = useState(initialAmount);\n\tconst [boost, setBoost] = useState(initialBoost);\n\tconst [tipAmount, setTipAmount] = useState(0);\n\n\tconst [message, setMessage] = useState(\"\");\n\tconst [email, setEmail] = useState(user ? user.email : \"\");\n\tconst [displayName, setDisplayName] = useState(user ? user.getName() : \"\");\n\tconst [firstName, setFirstName] = useState(user ? user.firstName : \"\");\n\tconst [lastName, setLastName] = useState(user ? user.lastName : \"\");\n\n\tconst [postAnonymously, setPostAnonymously] = useState(false);\n\tconst [paymentTrigger, setPaymentTrigger] = useState(false);\n\n\tconst [errors, setErrors] = useState>([]);\n\n\tuseEffect(() => {\n\t\tsetDisplayName(user?.getName());\n\t\tsetEmail(user?.email);\n\t\tsetFirstName(user ? user.firstName : \"\");\n\t\tsetLastName(user ? user.lastName : \"\");\n\n\t\tif (!!occasion?.sponsoredsId) {\n\t\t\tsetSponsoredsId(occasion?.sponsoredsId);\n\t\t} else if (user && occasion.allowAssignment) {\n\t\t\tuser.fetchSponsoreds(contextPartner.id).then(us => {\n\t\t\t\tconst applicableSponsoreds = us\n\t\t\t\t\t.map(us => us.sponsoreds)\n\t\t\t\t\t.filter(s => occasion.isGlobalOccasion || s.partnerSponsoredTypesId === occasion.partnerSponsoredTypesId);\n\t\t\t\tsetSponsoreds(applicableSponsoreds);\n\t\t\t\tif (us.length > 0) setSponsoredsId(us[0].sponsoredsId);\n\t\t\t});\n\t\t}\n\t}, [user]);\n\n\tconst close = () => {\n\t\tsetAmount(initialAmount);\n\t\tsetMessage(\"\");\n\t\tsetDisplayName(user ? user.getName() : \"\");\n\t\tsetEmail(user ? user.email : \"\");\n\t\tsetFirstName(user ? user.firstName : \"\");\n\t\tsetLastName(user ? user.lastName : \"\");\n\t\tsetErrors([]);\n\t\tsetShow(false);\n\t};\n\n\tconst closeSucessModal = () => {\n\t\tsetShowSuccess(false);\n\t};\n\n\tconst setPaymentTokenCallback = async ({ error, paymentMethod }) => {\n\t\tsetShowSubmitting(true);\n\t\tsetPaymentTrigger(false);\n\t\tif (error) {\n\t\t\tsetShowSubmitting(false);\n\t\t\tsetShow(true);\n\t\t\tsetErrors([error.message]);\n\t\t\treturn;\n\t\t}\n\n\t\tvar request: OccasionPaymentInterface = {\n\t\t\tpartnersId: contextPartner.id,\n\t\t\tusersId: user ? user.id : undefined,\n\t\t\temail,\n\t\t\tmessage,\n\t\t\tfirstName,\n\t\t\tlastName,\n\t\t\tdisplayName,\n\t\t\toccasionsId: occasion.id!,\n\t\t\tsponsoredsId: sponsoredsId!,\n\t\t\tpostAnonymously,\n\t\t\tpaymentMethodId: paymentMethod.id,\n\t\t\tchargeDetailsRequest: {\n\t\t\t\tbaseAmount: amount,\n\t\t\t\tadditionalCoverFeesAmount: boost,\n\t\t\t\ttipAmount,\n\t\t\t\tBrowserDisplayTotalAmount: amount + boost + tipAmount\n\t\t\t}\n\t\t};\n\n\t\tprocessOccasionPayment(request)\n\t\t\t.then(results => {\n\t\t\t\tclose();\n\t\t\t\tsetShowSubmitting(false);\n\t\t\t\tsetShowSuccess(true);\n\t\t\t\trefreshCallback();\n\t\t\t})\n\t\t\t.catch(e => {\n\t\t\t\tif (typeof e !== \"string\") e = \"An error occurred while processing your payment.\";\n\n\t\t\t\tsetErrors([e]);\n\t\t\t\tsetShow(true);\n\t\t\t\tsetShowSubmitting(false);\n\t\t\t});\n\t};\n\n\tconst submitDonation = async event => {\n\t\tsetShowSubmitting(true);\n\n\t\tsetErrors([]); //new submit, clear any previous errors\n\t\tconst errors: Array = [];\n\t\tevent.persist();\n\t\tevent.preventDefault();\n\n\t\tif (amount < 1) errors.push(\"Please select a donation amount of at least $1\");\n\n\t\tif (errors.length > 0 || !occasion.isOpen) {\n\t\t\tsetShowSubmitting(false);\n\n\t\t\tsetErrors(errors);\n\t\t\treturn;\n\t\t}\n\n\t\tsetPaymentTrigger(true);\n\t};\n\n\tif (showSuccess)\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\tPayment succesful!\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tYour donation has been successfully processed! A receipt of your transaction will be emailed to you.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nexport default OccasionsPaymentModal;\n","//core imports\nimport React, { useEffect, useState } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { useHistory } from \"react-router-dom\";\n\n//model imports\nimport PartnerModel from \"models/PartnerModel\";\nimport UserModel from \"models/UserModel\";\n\n//components and helper imports\nimport { Container, Row, Col, Image, Card, Button, Alert } from \"react-bootstrap\";\nimport LoadingIndicator from \"components/LoadingIndicator/LoadingIndicator\";\nimport OccasionsPaymentModal from \"./OccasionsPaymentModal\";\nimport { formatMoney, formatDbDate } from \"helpers\";\n\nimport { getOccasion } from \"services/occasions.service\";\nimport OccasionModel from \"models/OccasionModel\";\n\n//style imports\nimport style from \"./styles.module.css\";\nimport OptionalLoginAlert from \"components/UIComponents/OptionalLoginAlert\";\nimport { OccasionUsersInterface } from \"interfaces/OccasionsInterface\";\nimport ShareButton from \"./ShareButton\";\n\ninterface OccasionsProfileProps {\n\tcontextPartner: PartnerModel;\n\toccasionId: number;\n\tuser: UserModel;\n\tembedded?: boolean;\n}\n\nconst OccasionsProfile = ({ contextPartner, occasionId, user, embedded }: OccasionsProfileProps) => {\n\tconst [occasion, setOccasion] = useState();\n\tconst [loaded, setLoaded] = useState(false);\n\tconst [showModal, setShowModal] = useState(false);\n\tconst [loadError, setLoadError] = useState();\n\n\tconst history = useHistory();\n\n\tuseEffect(() => {\n\t\tloadOccasion();\n\t}, []);\n\n\tconst loadOccasion = () => {\n\t\twindow.scrollTo(0, 0);\n\t\tsetLoaded(false);\n\t\tgetOccasion(occasionId)\n\t\t\t.then(i => setOccasion(new OccasionModel(i)))\n\t\t\t.catch(e => setLoadError(e))\n\t\t\t.finally(() => setLoaded(true));\n\t};\n\n\tif (!!occasion) {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{contextPartner.name + \" - \" + occasion.name}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t{!occasion.isOpen && This occasion is not currently open for accepting donations.}\n\t\t\t\t\t\t{!!loadError && {loadError}}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t{!embedded &&\n\t\t\t\t\t\t\t\t\t\toccasion.allowAssignment &&\n\t\t\t\t\t\t\t\t\t\t(!user ? (\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tCurrent sponor? You can optionally login to link your donation to your sponsorship!\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tWelcome, {user.firstName}!{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t{user.getActiveSponsoreds().length > 0\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"You will have the option to designate your sponsorship on the payment form.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\"}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{embedded && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\tBe the first to give!\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n\treturn ;\n};\n\nexport default OccasionsProfile;\n","import React from \"react\";\nimport { Alert } from \"react-bootstrap\";\nimport LoginButton from \"./LoginButton\";\n\ninterface OptionalLoginAlertProps {\n\tchildren?: JSX.Element | string;\n\tdefaultToUserLogin?: boolean; //if true will load auth screen assuming user has account, default false\n}\n\nconst OptionalLoginAlert = (props: OptionalLoginAlertProps) => {\n\tconst defaultMessage: string =\n\t\t\"Hey! If you'd like to be able to track your donation history, you can create an account or login before you create this gift. Otherwise feel free to continue without an account. Either way, an email receipt will be sent to you.\";\n\tconst message: JSX.Element | string = props.children ?? defaultMessage;\n\n\treturn (\n\t\t\n\t\t\t
{message}
\n\t\t\t
\n\t\t\t\tLogin or Sign Up\n\t\t\t
\n\t\t\n\t);\n};\n\nexport default OptionalLoginAlert;\n","import OccasionsInterface, { OccasionUsersInterface } from \"interfaces/OccasionsInterface\";\n//import OccasionUsersInterface from \"interfaces/OccasionsUsersInterface\";\nimport apiWrapper, { convertFilters } from \"helpers/ApiWrapper\";\nimport { getStorageUrl } from \"helpers\";\n\nexport default class OccasionModel {\n\tstate: OccasionsInterface;\n\n\tconstructor(obj: OccasionsInterface) {\n\t\tthis.state = obj;\n\t}\n\n\tstatic async fetchOccasionById(id: number, expanded: boolean = false): Promise {\n\t\tconst url = `occasions/${id}`;\n\t\tconst result = (await apiWrapper(url, {\n\t\t\tmethod: \"get\",\n\t\t\tauthorized: false\n\t\t})) as OccasionsInterface;\n\t\treturn new OccasionModel(result);\n\t}\n\n\tstatic async fetchOccasions(filters: object): Promise {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tapiWrapper(\"occasions\", {\n\t\t\t\tmethod: \"get\",\n\t\t\t\tauthorized: true,\n\t\t\t\tfilters: convertFilters(filters)\n\t\t\t}).then(data => {\n\t\t\t\t//since \"data\" comes back as an object rather than array, gotta do it the hard way\n\t\t\t\tconst results: OccasionModel[] = Object.keys(data).map(key => new OccasionModel(data[key]));\n\t\t\t\tresolve(results);\n\t\t\t});\n\t\t});\n\t}\n\n\tstatic async fetchOccasionsForSponsoredType(sponsorshipTypeId: number): Promise {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tapiWrapper(`occasions/forSponsoredType/${sponsorshipTypeId}`, {\n\t\t\t\tmethod: \"get\",\n\t\t\t\tauthorized: false\n\t\t\t})\n\t\t\t\t.then(data => {\n\t\t\t\t\t//since \"data\" comes back as an object rather than array, gotta do it the hard way\n\t\t\t\t\tconst results: OccasionModel[] = Object.keys(data).map(key => new OccasionModel(data[key]));\n\t\t\t\t\tresolve(results);\n\t\t\t\t})\n\t\t\t\t.catch(e => {\n\t\t\t\t\tthrow e;\n\t\t\t\t});\n\t\t});\n\t}\n\n\tget id(): number | undefined {\n\t\treturn this.state.id;\n\t}\n\tget name(): string {\n\t\treturn this.state.name;\n\t}\n\tget sponsoredsName(): string {\n\t\treturn this.state.sponsoredsName ?? \"\";\n\t}\n\tget description(): string {\n\t\treturn this.state.description;\n\t}\n\tget active(): boolean {\n\t\treturn this.state.active;\n\t}\n\tget dynamic(): boolean {\n\t\treturn this.state.dynamic ?? false;\n\t}\n\tget createdDate(): string | undefined {\n\t\treturn this.state.createdDate;\n\t}\n\tget createdDateObj(): Date | undefined {\n\t\treturn this.state.createdDate ? new Date(this.state.createdDate) : undefined;\n\t}\n\tget imageUrl(): string | undefined {\n\t\treturn this.state.imageUrl;\n\t}\n\tget goalAmount(): number {\n\t\treturn this.state.goalAmount ?? 0;\n\t}\n\tget showGoal(): boolean {\n\t\treturn this.state.showGoal;\n\t}\n\tget sendEmails(): boolean {\n\t\treturn this.state.sendEmails;\n\t}\n\tget allowAssignment(): boolean {\n\t\treturn this.state.allowAssignment;\n\t}\n\tget partnerSponsoredTypesId(): number {\n\t\treturn this.state.partnerSponsoredTypesId;\n\t}\n\tget partnerSponsoredTypesName(): string {\n\t\treturn this.state.partnerSponsoredTypesName ?? \"\";\n\t}\n\tget endDateObj(): Date | undefined {\n\t\treturn this.state.endDate ? new Date(this.state.endDate) : undefined;\n\t}\n\tget endDate(): string | undefined {\n\t\treturn this.state.endDate;\n\t}\n\tget initiatedDateObj(): Date | undefined {\n\t\treturn this.state.initiatedDate ? new Date(this.state.initiatedDate) : undefined;\n\t}\n\tget initiatedDate(): string | undefined {\n\t\treturn this.state.initiatedDate;\n\t}\n\tget raisedAmount(): number {\n\t\treturn this.state.raisedAmount ?? 0;\n\t}\n\tget showDonors(): boolean {\n\t\treturn this.state.showDonors;\n\t}\n\tget donorCount(): number {\n\t\treturn this.state.donorCount ?? 0;\n\t}\n\tget isGlobalOccasion(): boolean {\n\t\treturn this.state.isGlobalOccasion ?? false;\n\t}\n\tget isOpen(): boolean {\n\t\treturn this.state.isOpen ?? false;\n\t}\n\n\tget occasionUsers(): OccasionUsersInterface[] {\n\t\treturn this.state.occasionUsers ?? [];\n\t}\n\tget slug(): string | undefined {\n\t\treturn this.state.slug;\n\t}\n\n\tgetImage(): string {\n\t\tif (this.imageUrl) return getStorageUrl(this.imageUrl);\n\t\treturn \"/images/occasion.jpg\";\n\t}\n\n\tgetPercentRaised(): number {\n\t\tif (this.goalAmount > 0) return Math.min(this.raisedAmount / this.goalAmount, 1);\n\t\treturn 0;\n\t}\n}\n","import apiWrapper, { convertFilters } from \"helpers/ApiWrapper\";\nimport OccasionsInterface, { OccasionsReportInterface } from \"interfaces/OccasionsInterface\";\n\nconst controller: string = \"occasions\";\n\nexport const addOrEditOccasion = (occasion: OccasionsInterface): Promise => {\n\treturn apiWrapper(`${controller}/${occasion.id ?? \"\"}`, {\n\t\tmethod: !!occasion.id ? \"put\" : \"post\",\n\t\tauthorized: true,\n\t\tbody: occasion\n\t}) as Promise;\n};\n\nexport const initiateOccasion = (occasionsId: number): Promise => {\n\treturn apiWrapper(`${controller}/${occasionsId}/initiate`, {\n\t\tmethod: \"put\",\n\t\tauthorized: true\n\t}) as Promise;\n};\n\nexport const getOccasionsReports = (filters?: object): Promise => {\n\treturn apiWrapper(`${controller}/reports`, {\n\t\tmethod: \"get\",\n\t\tauthorized: true,\n\t\tfilters: convertFilters(filters ?? {})\n\t}) as Promise;\n};\n\nexport const getOccasionsReport = (id: number): Promise => {\n\treturn apiWrapper(`${controller}/${id}/report`, {\n\t\tmethod: \"get\",\n\t\tauthorized: true\n\t}) as Promise;\n};\n\nexport const getOccasion = (id: number): Promise => {\n\treturn apiWrapper(`${controller}/${id}`, {\n\t\tmethod: \"get\",\n\t\tauthorized: false\n\t}) as Promise;\n};\n\nexport const deleteOccasion = (id: number): Promise => {\n\treturn apiWrapper(`${controller}/${id}`, {\n\t\tmethod: \"delete\",\n\t\tauthorized: true\n\t}) as Promise;\n};\n\nexport const getOccasions = (filters?: object): Promise => {\n\treturn apiWrapper(`${controller}`, {\n\t\tmethod: \"get\",\n\t\tauthorized: false,\n\t\tfilters: convertFilters(filters ?? {})\n\t}) as Promise;\n};\n\nexport const getOccasionsAdmin = (filters?: object): Promise => {\n\treturn apiWrapper(`${controller}/admin`, {\n\t\tmethod: \"get\",\n\t\tauthorized: true,\n\t\tfilters: convertFilters(filters ?? {})\n\t}) as Promise;\n};\n\nexport const sendPreviewEmail = (id: number): Promise